diff options
| -rw-r--r-- | .gitattributes | 1 | ||||
| -rw-r--r-- | framework/I18N/TTranslate.php | 64 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TExpression.php | 2 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TPlaceHolder.php | 2 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TStatements.php | 2 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TTextHighlighter.php | 1 | ||||
| -rw-r--r-- | framework/core.php | 22 | ||||
| -rw-r--r-- | framework/pradolite.php | 14631 | ||||
| -rw-r--r-- | tools/phpbuilder/build.php | 8 | ||||
| -rw-r--r-- | tools/phpbuilder/files.txt | 66 | 
10 files changed, 14756 insertions, 43 deletions
diff --git a/.gitattributes b/.gitattributes index e3cbd8ed..cc104658 100644 --- a/.gitattributes +++ b/.gitattributes @@ -580,6 +580,7 @@ framework/Web/UI/WebControls/TValidationSummary.php -text  framework/Web/UI/WebControls/TWebControl.php -text  framework/core.php -text  framework/prado.php -text +framework/pradolite.php -text  /index.html -text  requirements/index.php -text  requirements/messages-zh.txt -text diff --git a/framework/I18N/TTranslate.php b/framework/I18N/TTranslate.php index ac708191..d38e3281 100644 --- a/framework/I18N/TTranslate.php +++ b/framework/I18N/TTranslate.php @@ -2,11 +2,11 @@  /**
   * TTranslate, I18N translation component.
 - * 
 + *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the BSD License.
   *
 - * Copyright(c) 2004 by Xiang Wei Zhuo. 
 + * Copyright(c) 2004 by Xiang Wei Zhuo.
   *
   * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
   * The latest version of PRADO can be obtained from:
 @@ -17,11 +17,9 @@   * @package System.I18N
   */
 - Prado::using('System.IO.TTextWriter');
 -
  /**
   * TTranslate class.
 - * 
 + *
   * This component performs message/string translation. The translation
   * source is set in the TGlobalization handler. The following example
   * demonstrated a simple message translation.
 @@ -32,9 +30,9 @@   * Depending on the culture set on the page, the phrase "Goodbye" will
   * be translated.
   *
 - * The values of any attribute in TTranslate are consider as values for 
 - * substitution. Strings enclosed with "{" and "}" are consider as the 
 - * parameters. The following example will substitution the string 
 + * The values of any attribute in TTranslate are consider as values for
 + * substitution. Strings enclosed with "{" and "}" are consider as the
 + * parameters. The following example will substitution the string
   * "{time}" with the value of the attribute "time="#time()". Note that
   * the value of the attribute time is evaluated.
   * <code>
 @@ -44,17 +42,17 @@   * </code>
   *
   * More complex string substitution can be applied using the
 - * TParam component. 
 + * TParam component.
   *
   * Namespace: System.I18N
   *
   * Properties
 - * - <b>Text</b>, string, 
 - *   <br>Gets or sets the string to translate. 
 + * - <b>Text</b>, string,
 + *   <br>Gets or sets the string to translate.
   * - <b>Catalogue</b>, string,
   *   <br>Gets or sets the catalogue for message translation. The
   *    default catalogue can be set by the @Page directive.
 - * - <b>Key</b>, string, 
 + * - <b>Key</b>, string,
   *   <br>Gets or sets the key used to message look up.
   * - <b>Trim</b>, boolean,
   *   <br>Gets or sets an option to trim the contents.
 @@ -65,7 +63,7 @@   * @package System.I18N
   */
  class TTranslate extends TI18NControl
 -{	
 +{
  	/**
  	 * @return string the text to be localized/translated.
  	 */
 @@ -91,52 +89,52 @@ class TTranslate extends TI18NControl  	{
  		$this->setViewState('Key',$value,'');
  	}
 -	
 +
  	/**
  	 * Get the key for message lookup.
  	 * @return string key
 -	 */	
 +	 */
  	function getKey()
  	{
  		return $this->getViewState('Key','');
  	}
 -	
 +
  	/**
  	 * Get the message catalogue.
 -	 * @return string catalogue. 
 +	 * @return string catalogue.
  	 */
  	function getCatalogue()
  	{
  		return $this->getViewState('Catalogue','');
  	}
 -	
 +
  	/**
  	 * Set the message catalogue.
 -	 * @param string catalogue. 
 -	 */	
 +	 * @param string catalogue.
 +	 */
  	function setCatalogue($value)
  	{
  		$this->setViewState('Catalogue',$value,'');
  	}
 -	
 +
  	/**
  	 * Set the option to trim the contents.
  	 * @param boolean trim or not.
 -	 */	
 +	 */
  	function setTrim($value)
  	{
  		$this->setViewState('Trim',TPropertyValue::ensureBoolean($value),true);
  	}
 -	
 +
  	/**
  	 * Trim the content or not.
 -	 * @return boolean trim or not. 
 -	 */	
 +	 * @return boolean trim or not.
 +	 */
  	function getTrim()
  	{
  		return $this->getViewState('Trim',true);
  	}
 -	
 +
  	/**
  	 * renders the translated string.
  	 */
 @@ -157,8 +155,8 @@ class TTranslate extends TI18NControl  		$text = $this->getText();
  		if(strlen($text)==0)
 -			$text = $textWriter->flush();		
 -		if($this->getTrim()) 
 +			$text = $textWriter->flush();
 +		if($this->getTrim())
  			$text = trim($text);
  		$writer->write($this->translateText($text, $subs));
 @@ -177,20 +175,20 @@ class TTranslate extends TI18NControl  		//no translation handler provided
  		if(is_null($config = $app->getTranslationConfiguration()))
  			return strtr($text, $subs);
 -		
 +
  		Translation::init();
 -		
 +
  		$catalogue = $this->getCatalogue();
  		if(empty($catalogue) && isset($config['catalogue']))
  			$catalogue = $config['catalogue'];
 -		
 +
  		$key = $this->getKey();
  		if(!empty($key)) $text = $key;
 -		
 +
  		//translate it
  		return Translation::formatter()->format($text,
  										$subs, $catalogue, $this->getCharset());
 -	}	
 +	}
  }
  ?>
\ No newline at end of file diff --git a/framework/Web/UI/WebControls/TExpression.php b/framework/Web/UI/WebControls/TExpression.php index eb1151b0..a1c00c9a 100644 --- a/framework/Web/UI/WebControls/TExpression.php +++ b/framework/Web/UI/WebControls/TExpression.php @@ -60,4 +60,4 @@ class TExpression extends TControl  	}
  }
 -?>
 +?>
\ No newline at end of file diff --git a/framework/Web/UI/WebControls/TPlaceHolder.php b/framework/Web/UI/WebControls/TPlaceHolder.php index 91979a26..bc6858ff 100644 --- a/framework/Web/UI/WebControls/TPlaceHolder.php +++ b/framework/Web/UI/WebControls/TPlaceHolder.php @@ -26,4 +26,4 @@ class TPlaceHolder extends TControl  {
  }
 -?>
 +?>
\ No newline at end of file diff --git a/framework/Web/UI/WebControls/TStatements.php b/framework/Web/UI/WebControls/TStatements.php index 0474acf1..28e25500 100644 --- a/framework/Web/UI/WebControls/TStatements.php +++ b/framework/Web/UI/WebControls/TStatements.php @@ -61,4 +61,4 @@ class TStatements extends TControl  	}
  }
 -?>
 +?>
\ No newline at end of file diff --git a/framework/Web/UI/WebControls/TTextHighlighter.php b/framework/Web/UI/WebControls/TTextHighlighter.php index 56ae406e..be104896 100644 --- a/framework/Web/UI/WebControls/TTextHighlighter.php +++ b/framework/Web/UI/WebControls/TTextHighlighter.php @@ -14,7 +14,6 @@   * Using GeSHi and TTextWriter classes
   */
  Prado::using('System.3rdParty.geshi.geshi');
 -Prado::using('System.IO.TTextWriter');
  /**
   * TTextHighlighter class.
 diff --git a/framework/core.php b/framework/core.php index de307cad..57c683b2 100644 --- a/framework/core.php +++ b/framework/core.php @@ -771,6 +771,28 @@ class PradoBase  	}
  }
 +class TTextWriter extends TComponent implements ITextWriter
 +{
 +	private $_str='';
 +
 +	public function flush()
 +	{
 +		$str=$this->_str;
 +		$this->_str='';
 +		return $str;
 +	}
 +
 +	public function write($str)
 +	{
 +		$this->_str.=$str;
 +	}
 +
 +	public function writeLine($str='')
 +	{
 +		$this->write($str."\n");
 +	}
 +}
 +
  class TDate extends TComponent
  {
  }
 diff --git a/framework/pradolite.php b/framework/pradolite.php new file mode 100644 index 00000000..6b8a5e2f --- /dev/null +++ b/framework/pradolite.php @@ -0,0 +1,14631 @@ +<?php +class TComponent  +{ +private $_e=array(); +public function __construct()  +	{  +	} +public function __destruct()  +	{  +	} +public function __get($name)  +	{  +		$getter='get'.$name;  +		if(method_exists($this,$getter))  +		{  +						return $this->$getter();  +		}  +		else if(method_exists($this,'on'.$name))  +		{  +						$name=strtolower($name);  +			if(!isset($this->_e[$name]))  +				$this->_e[$name]=new TList;  +			return $this->_e[$name];  +		}  +		else  +		{  +			throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);  +		}  +	} +public function __set($name,$value)  +	{  +		$setter='set'.$name;  +		if(method_exists($this,$setter))  +		{  +			$this->$setter($value);  +		}  +		else if(method_exists($this,'on'.$name))  +		{  +			$this->attachEventHandler($name,$value);  +		}  +		else if(method_exists($this,'get'.$name))  +		{  +			throw new TInvalidOperationException('component_property_readonly',get_class($this),$name);  +		}  +		else  +		{  +			throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);  +		}  +	} +final public function hasProperty($name)  +	{  +		return method_exists($this,'get'.$name) || method_exists($this,'set'.$name);  +	} +final public function canGetProperty($name)  +	{  +		return method_exists($this,'get'.$name);  +	} +final public function canSetProperty($name)  +	{  +		return method_exists($this,'set'.$name);  +	} +public function getSubProperty($path)  +	{  +		$object=$this;  +		foreach(explode('.',$path) as $property)  +			$object=$object->$property;  +		return $object;  +	} +public function setSubProperty($path,$value)  +	{  +		$object=$this;  +		if(($pos=strrpos($path,'.'))===false)  +			$property=$path;  +		else  +		{  +			$object=$this->getSubProperty(substr($path,0,$pos));  +			$property=substr($path,$pos+1);  +		}  +		$object->$property=$value;  +	} +public function hasEvent($name)  +	{  +		return method_exists($this,'on'.$name);  +	} +public function hasEventHandler($name)  +	{  +		$name=strtolower($name);  +		return isset($this->_e[$name]) && $this->_e[$name]->getCount()>0;  +	} +public function getEventHandlers($name)  +	{  +		if(method_exists($this,'on'.$name))  +		{  +			$name=strtolower($name);  +			if(!isset($this->_e[$name]))  +				$this->_e[$name]=new TList;  +			return $this->_e[$name];  +		}  +		else  +			throw new TInvalidOperationException('component_event_undefined',get_class($this),$name);  +	} +public function attachEventHandler($name,$handler)  +	{  +		$this->getEventHandlers($name)->add($handler);  +	} +public function detachEventHandler($name,$handler)  +	{  +		if($this->hasEventHandler($name))  +		{  +			try  +			{  +				$this->getEventHandlers($name)->remove($handler);  +				return true;  +			}  +			catch(Exception $e)  +			{  +			}  +		}  +		return false;  +	} +public function raiseEvent($name,$sender,$param)  +	{  +		$name=strtolower($name);  +		if(isset($this->_e[$name]))  +		{  +			foreach($this->_e[$name] as $handler)  +			{  +				if(is_string($handler))  +				{  +					call_user_func($handler,$sender,$param);  +				}  +				else if(is_callable($handler,true))  +				{  +										list($object,$method)=$handler;  +					if(is_string($object))							call_user_func($handler,$sender,$param);  +					else  +					{  +						if(($pos=strrpos($method,'.'))!==false)  +						{  +							$object=$this->getSubProperty(substr($method,0,$pos));  +							$method=substr($method,$pos+1);  +						}  +						$object->$method($sender,$param);  +					}  +				}  +				else  +					throw new TInvalidDataValueException('component_eventhandler_invalid',get_class($this),$name);  +			}  +		}  +		else if(!$this->hasEvent($name))  +			throw new TInvalidOperationException('component_event_undefined',get_class($this),$name);  +	} +public function evaluateExpression($expression)  +	{  +		try  +		{  +			if(eval("\$result=$expression;")===false)  +				throw new Exception('');  +			return $result;  +		}  +		catch(Exception $e)  +		{  +			throw new TInvalidOperationException('component_expression_invalid',get_class($this),$expression,$e->getMessage());  +		}  +	} +public function evaluateStatements($statements)  +	{  +		try  +		{  +			ob_start();  +			if(eval($statements)===false)  +				throw new Exception('');  +			$content=ob_get_contents();  +			ob_end_clean();  +			return $content;  +		}  +		catch(Exception $e)  +		{  +			throw new TInvalidOperationException('component_statements_invalid',get_class($this),$statements,$e->getMessage());  +		}  +	} +public function getApplication()  +	{  +		return Prado::getApplication();  +	} +public function getService()  +	{  +		return Prado::getApplication()->getService();  +	} +public function getRequest()  +	{  +		return Prado::getApplication()->getRequest();  +	} +public function getResponse()  +	{  +		return Prado::getApplication()->getResponse();  +	} +public function getSession()  +	{  +		return Prado::getApplication()->getSession();  +	} +public function getUser()  +	{  +		return Prado::getApplication()->getUser();  +	}  +} +class TPropertyValue  +{ +public static function ensureBoolean($value)  +	{  +		if (is_string($value))  +			return strcasecmp($value,'true')==0 || $value!=0;  +		else  +			return (boolean)$value;  +	} +public static function ensureString($value)  +	{  +		if (is_bool($value))  +			return $value?'true':'false';  +		else  +			return (string)$value;  +	} +public static function ensureInteger($value)  +	{  +		return (integer)$value;  +	} +public static function ensureFloat($value)  +	{  +		return (float)$value;  +	} +public static function ensureArray($value)  +	{  +		if(is_string($value))  +		{  +			$trimmed = trim($value);  +			$len = strlen($value);  +			if ($len >= 2 && $trimmed[0] == '(' && $trimmed[$len-1] == ')')  +			{  +				eval('$array=array'.$trimmed.';');  +				return $array;  +			}  +			else  +				return $len>0?array($value):array();  +		}  +		else  +			return (array)$value;  +	} +public static function ensureObject($value)  +	{  +		return (object)$value;  +	} +public static function ensureEnum($value,$enums)  +	{  +		if(!is_array($enums))  +		{  +			$enums=func_get_args();  +			array_shift($enums);  +		}  +		if(in_array($value,$enums,true))  +			return $value;  +		else  +			throw new TInvalidDataValueException('propertyvalue_enumvalue_invalid',$value,implode(' | ',$enums));  +	}  +} +class TEventParameter extends TComponent  +{  +} +?><?php +class TException extends Exception  +{  +	private $_errorCode=''; +public function __construct($errorMessage)  +	{  +		$this->_errorCode=$errorMessage;  +		$args=func_get_args();  +		$args[0]=$this->translateErrorMessage($errorMessage);  +		$str=call_user_func_array('sprintf',$args);  +		parent::__construct($str);  +	} +protected function translateErrorMessage($key)  +	{  +		$lang=Prado::getPreferredLanguage();  +		$msgFile=Prado::getFrameworkPath().'/Exceptions/messages-'.$lang.'.txt';  +		if(!is_file($msgFile))  +			$msgFile=Prado::getFrameworkPath().'/Exceptions/messages.txt';  +		if(($entries=@file($msgFile))===false)  +			return $key;  +		else  +		{  +			foreach($entries as $entry)  +			{  +				@list($code,$message)=explode('=',$entry,2);  +				if(trim($code)===$key)  +					return trim($message);  +			}  +			return $key;  +		}  +	} +public function getErrorCode()  +	{  +		return $this->_errorCode;  +	} +public function getErrorMessage()  +	{  +		return $this->getMessage();  +	}  +} +class TSystemException extends TException  +{  +} +class TApplicationException extends TException  +{  +} +class TInvalidOperationException extends TSystemException  +{  +} +class TInvalidDataTypeException extends TSystemException  +{  +} +class TInvalidDataValueException extends TSystemException  +{  +} +class TInvalidDataFormatException extends TSystemException  +{  +} +class TConfigurationException extends TSystemException  +{  +} +class TIOException extends TSystemException  +{  +} +class TDBException extends TSystemException  +{  +} +class TSecurityException extends TSystemException  +{  +} +class TNotSupportedException extends TSystemException  +{  +} +class TTemplateParsingException extends TSystemException  +{  +} +class TTemplateRuntimeException extends TSystemException  +{  +} +class TPhpErrorException extends TException  +{  +	public function __construct($errno,$errstr,$errfile,$errline)  +	{  +		static $errorTypes=array(  +			E_ERROR           => "Error",  +			E_WARNING         => "Warning",  +			E_PARSE           => "Parsing Error",  +			E_NOTICE          => "Notice",  +			E_CORE_ERROR      => "Core Error",  +			E_CORE_WARNING    => "Core Warning",  +			E_COMPILE_ERROR   => "Compile Error",  +			E_COMPILE_WARNING => "Compile Warning",  +			E_USER_ERROR      => "User Error",  +			E_USER_WARNING    => "User Warning",  +			E_USER_NOTICE     => "User Notice",  +			E_STRICT          => "Runtime Notice"  +		);  +		$errorType=isset($errorTypes[$errno])?$errorTypes[$errno]:'Unknown Error';  +		parent::__construct("[$errorType] $errstr (@line $errline in file $errfile).");  +	}  +} +class THttpException extends TException  +{  +	private $_statusCode; +public function __construct($statusCode,$errorMessage)  +	{  +		$args=func_get_args();  +		array_shift($args);  +		call_user_func_array(array('TException', '__construct'), $args);  +		$this->_statusCode=TPropertyValue::ensureInteger($statusCode);  +	} +public function getStatusCode()  +	{  +		return $this->_statusCode;  +	}  +} +?><?php +class TList extends TComponent implements IteratorAggregate,ArrayAccess  +{ +private $_d=array(); +private $_c=0; +public function __construct($data=null)  +	{  +		parent::__construct();  +		if($data!==null)  +			$this->copyFrom($data);  +	} +public function getIterator()  +	{  +		return new TListIterator($this->_d);  +	} +public function getCount()  +	{  +		return $this->_c;  +	} +public function itemAt($index)  +	{  +		if(isset($this->_d[$index]))  +			return $this->_d[$index];  +		else  +			throw new TInvalidDataValueException('list_index_invalid',$index);  +	} +public function add($item)  +	{  +		if($this->canAddItem($item))  +		{  +			$this->_d[$this->_c++]=$item;  +			$this->addedItem($item);  +		}  +		else  +			throw new TInvalidOperationException('list_addition_disallowed');  +	} +public function insert($index,$item)  +	{  +		if($this->canAddItem($item))  +		{  +			if($index===$this->_c)  +				$this->add($item);  +			else if($index>=0 && $index<$this->_c)  +			{  +				array_splice($this->_d,$index,0,array($item));  +				$this->_c++;  +				$this->addedItem($item);  +			}  +			else  +				throw new TInvalidDataValueException('list_index_invalid',$index);  +		}  +		else  +			throw new TInvalidOperationException('list_addition_disallowed'); +} +public function remove($item)  +	{  +		if(($index=$this->indexOf($item))>=0)  +		{  +			if($this->canRemoveItem($item))  +				$this->removeAt($index);  +			else  +				throw new TInvalidOperationException('list_item_unremovable');  +		}  +		else  +			throw new TInvalidDataValueException('list_item_inexistent');  +	} +public function removeAt($index)  +	{  +		if(isset($this->_d[$index]))  +		{  +			$item=$this->_d[$index];  +			if($this->canRemoveItem($item))  +			{  +				if($index===$this->_c-1)  +					unset($this->_d[$index]);  +				else  +					array_splice($this->_d,$index,1);  +				$this->_c--;  +				$this->removedItem($item);  +				return $item;  +			}  +			else  +				throw new TInvalidOperationException('list_item_unremovable');  +		}  +		else  +			throw new TInvalidDataValueException('list_index_invalid',$index);  +	} +public function clear()  +	{  +		for($i=$this->_c-1;$i>=0;--$i)  +			$this->removeAt($i);  +	} +public function contains($item)  +	{  +		return $this->indexOf($item)>=0;  +	} +public function indexOf($item)  +	{  +		if(($index=array_search($item,$this->_d,true))===false)  +			return -1;  +		else  +			return $index;  +	} +public function toArray()  +	{  +		return $this->_d;  +	} +public function copyFrom($data)  +	{  +		if(is_array($data) || ($data instanceof Traversable))  +		{  +			if($this->_c>0)  +				$this->clear();  +			foreach($data as $item)  +				$this->add($item);  +		}  +		else if($data!==null)  +			throw new TInvalidDataTypeException('list_data_not_iterable');  +	} +public function mergeWith($data)  +	{  +		if(is_array($data) || ($data instanceof Traversable))  +		{  +			foreach($data as $item)  +				$this->add($item);  +		}  +		else if($data!==null)  +			throw new TInvalidDataTypeException('list_data_not_iterable');  +	} +public function offsetExists($offset)  +	{  +		return isset($this->_d[$offset]);  +	} +public function offsetGet($offset)  +	{  +		if(isset($this->_d[$offset]))  +			return $this->_d[$offset];  +		else  +			throw new TInvalidDataValueException('list_index_invalid',$offset);  +	} +public function offsetSet($offset,$item)  +	{  +		if($offset===null || $offset===$this->_c)  +			$this->add($item);  +		else  +		{  +			$this->removeAt($offset);  +			$this->insert($offset,$item);  +		}  +	} +public function offsetUnset($offset)  +	{  +		$this->removeAt($offset);  +	} +protected function addedItem($item)  +	{  +	} +protected function removedItem($item)  +	{  +	} +protected function canAddItem($item)  +	{  +		return true;  +	} +protected function canRemoveItem($item)  +	{  +		return true;  +	}  +} +class TListIterator implements Iterator  +{ +private $_d; +private $_i; +public function __construct(&$data)  +	{  +		$this->_d=&$data;  +		$this->_i=0;  +	} +public function rewind()  +	{  +		$this->_i=0;  +	} +public function key()  +	{  +		return $this->_i;  +	} +public function current()  +	{  +		return $this->_d[$this->_i];  +	} +public function next()  +	{  +		$this->_i++;  +	} +public function valid()  +	{  +		return isset($this->_d[$this->_i]);  +	}  +} +?><?php +class TMap extends TComponent implements IteratorAggregate,ArrayAccess  +{ +private $_d=array(); +public function __construct($data=null)  +	{  +		parent::__construct();  +		if($data!==null)  +			$this->copyFrom($data);  +	} +public function getIterator()  +	{  +		return new TMapIterator($this->_d);  +	} +public function getCount()  +	{  +		return count($this->_d);  +	} +public function getKeys()  +	{  +		return array_keys($this->_d);  +	} +public function itemAt($key)  +	{  +		return isset($this->_d[$key]) ? $this->_d[$key] : null;  +	} +public function add($key,$value)  +	{  +		if($this->canAddItem($key,$value))  +		{  +			if(isset($this->_d[$key]))  +				$this->remove($key);  +			$this->_d[$key]=$value;  +			$this->addedItem($key,$value);  +		}  +		else  +			throw new TInvalidOperationException('map_addition_disallowed');  +	} +public function remove($key)  +	{  +		if(isset($this->_d[$key]))  +		{  +			$value=$this->_d[$key];  +			if($this->canRemoveItem($key,$value))  +			{  +				unset($this->_d[$key]);  +				$this->removedItem($key,$value);  +				return $value;  +			}  +			else  +				throw new TInvalidOperationException('map_item_unremovable');  +		}  +		else  +			return null;  +	} +public function clear()  +	{  +		foreach(array_keys($this->_d) as $key)  +			$this->remove($key);  +	} +public function contains($key)  +	{  +		return isset($this->_d[$key]);  +	} +public function toArray()  +	{  +		return $this->_d;  +	} +public function copyFrom($data)  +	{  +		if(is_array($data) || $data instanceof Traversable)  +		{  +			if($this->getCount()>0)  +				$this->clear();  +			foreach($data as $key=>$value)  +				$this->add($key,$value);  +		}  +		else if($data!==null)  +			throw new TInvalidDataTypeException('map_data_not_iterable');  +	} +public function mergeWith($data)  +	{  +		if(is_array($data) || $data instanceof Traversable)  +		{  +			foreach($data as $key=>$value)  +				$this->add($key,$value);  +		}  +		else if($data!==null)  +			throw new TInvalidDataTypeException('map_data_not_iterable');  +	} +public function offsetExists($offset)  +	{  +		return $this->contains($offset);  +	} +public function offsetGet($offset)  +	{  +		return isset($this->_d[$offset]) ? $this->_d[$offset] : null;  +	} +public function offsetSet($offset,$item)  +	{  +		$this->add($offset,$item);  +	} +public function offsetUnset($offset)  +	{  +		$this->remove($offset);  +	} +protected function addedItem($key,$item)  +	{  +	} +protected function removedItem($key,$item)  +	{  +	} +protected function canAddItem($key,$item)  +	{  +		return true;  +	} +protected function canRemoveItem($key,$item)  +	{  +		return true;  +	}  +} +class TMapIterator implements Iterator  +{ +private $_d; +private $_keys; +private $_key; +public function __construct(&$data)  +	{  +		$this->_d=&$data;  +		$this->_keys=array_keys($data);  +	} +public function rewind()  +	{  +		$this->_key=reset($this->_keys);  +	} +public function key()  +	{  +		return $this->_key;  +	} +public function current()  +	{  +		return $this->_d[$this->_key];  +	} +public function next()  +	{  +		do  +		{  +			$this->_key=next($this->_keys);  +		}  +		while(!isset($this->_d[$this->_key]) && $this->_key!==false);  +	} +public function valid()  +	{  +		return $this->_key!==false;  +	}  +}  +?><?php +class TXmlElement extends TComponent +{ +private $_parent=null; +private $_tagName; +private $_value; +private $_elements=null; +private $_attributes=null; +public function __construct($tagName) +	{ +		parent::__construct(); +		$this->setTagName($tagName); +	} +public function getParent() +	{ +		return $this->_parent; +	} +public function setParent($parent) +	{ +		$this->_parent=$parent; +	} +public function getTagName() +	{ +		return $this->_tagName; +	} +public function setTagName($tagName) +	{ +		$this->_tagName=$tagName; +	} +public function getValue() +	{ +		return $this->_value; +	} +public function setValue($value) +	{ +		$this->_value=$value; +	} +public function getHasElement() +	{ +		return $this->_elements!==null && $this->_elements->getCount()>0; +	} +public function getHasAttribute() +	{ +		return $this->_attributes!==null && $this->_attributes->getCount()>0; +	} +public function getAttribute($name) +	{ +		if($this->_attributes!==null) +			return $this->_attributes->itemAt($name); +		else +			return null; +	} +public function getElements() +	{ +		if(!$this->_elements) +			$this->_elements=new TXmlElementList($this); +		return $this->_elements; +	} +public function getAttributes() +	{ +		if(!$this->_attributes) +			$this->_attributes=new TMap; +		return $this->_attributes; +	} +public function getElementByTagName($tagName) +	{ +		if($this->_elements) +		{ +			foreach($this->_elements as $element) +				if($element->_tagName===$tagName) +					return $element; +		} +		return null; +	} +public function getElementsByTagName($tagName) +	{ +		$list=new TList; +		if($this->_elements) +		{ +			foreach($this->_elements as $element) +				if($element->_tagName===$tagName) +					$list->add($element); +		} +		return $list; +	} +public function toString($indent=0) +	{ +		$attr=''; +		if($this->_attributes!==null) +		{ +			foreach($this->_attributes as $name=>$value) +				$attr.=" $name=\"$value\""; +		} +		$prefix=str_repeat(' ',$indent*4); +		if($this->getHasElement()) +		{ +			$str=$prefix."<{$this->_tagName}$attr>\n"; +			foreach($this->getElements() as $element) +				$str.=$element->toString($indent+1)."\n"; +			$str.=$prefix."</{$this->_tagName}>"; +			return $str; +		} +		else if($this->getValue()!=='') +		{ +			return $prefix."<{$this->_tagName}$attr>{$this->_value}</{$this->_tagName}>"; +		} +		else +			return $prefix."<{$this->_tagName}$attr />"; +	} +} +class TXmlDocument extends TXmlElement +{ +private $_version; +private $_encoding; +public function __construct($version='1.0',$encoding='') +	{ +		parent::__construct(''); +		$this->setversion($version); +		$this->setEncoding($encoding); +	} +public function getVersion() +	{ +		return $this->_version; +	} +public function setVersion($version) +	{ +		$this->_version=$version; +	} +public function getEncoding() +	{ +		return $this->_encoding; +	} +public function setEncoding($encoding) +	{ +		$this->_encoding=$encoding; +	} +public function loadFromFile($file) +	{ +		if(($str=@file_get_contents($file))!==false) +			return $this->loadFromString($str); +		else +			throw new TIOException('xmldocument_file_read_failed',$file); +	} +public function loadFromString($string) +	{ +				$doc=new DOMDocument(); +		if($doc->loadXML($string)===false) +			return false; +$this->setEncoding($doc->encoding); +		$this->setVersion($doc->version); +$element=$doc->documentElement; +		$this->setTagName($element->tagName); +		$this->setValue($element->nodeValue); +		$elements=$this->getElements(); +		$attributes=$this->getAttributes(); +		$elements->clear(); +		$attributes->clear(); +		foreach($element->attributes as $name=>$attr) +			$attributes->add($name,$attr->value); +		foreach($element->childNodes as $child) +		{ +			if($child instanceof DOMElement) +				$elements->add($this->buildElement($child)); +		} +return true; +	} +public function saveToFile($file) +	{ +		if(($fw=fopen($file,'w'))!==false) +		{ +			fwrite($fw,$this->saveToString()); +			fclose($fw); +		} +		else +			throw new TIOException('xmldocument_file_write_failed',$file); +	} +public function saveToString() +	{ +		$version=empty($this->_version)?' version="1.0"':' version="'.$this->_version.'"'; +		$encoding=empty($this->_encoding)?'':' encoding="'.$this->_encoding.'"'; +		return "<?xml{$version}{$encoding}?>\n".$this->toString(0); +	} +private function buildElement($node) +	{ +		$element=new TXmlElement($node->tagName); +		$element->setValue($node->nodeValue); +		foreach($node->attributes as $name=>$attr) +			$element->getAttributes()->add($name,$attr->value); +		foreach($node->childNodes as $child) +		{ +			if($child instanceof DOMElement) +				$element->getElements()->add($this->buildElement($child)); +		} +		return $element; +	} +} +class TXmlElementList extends TList +{ +private $_o; +public function __construct(TXmlElement $owner) +	{ +		parent::__construct(); +		$this->_o=$owner; +	} +protected function getOwner() +	{ +		return $this->_o; +	} +protected function addedItem($item) +	{ +		if($item->getParent()!==null) +			$item->getParent()->getElements()->remove($item); +		$item->setParent($this->_o); +	} +protected function removedItem($item) +	{ +		$item->setParent(null); +	} +protected function canAddItem($item) +	{ +		return ($item instanceof TXmlElement); +	} +} +?><?php +class THttpUtility  +{  +	private static $_entityTable=null; +public static function htmlEncode($s)  +	{  +		return htmlspecialchars($s);  +	} +public static function htmlDecode($s)  +	{  +		if(!self::$_entityTable)  +			self::buildEntityTable();  +		return strtr($s,self::$_entityTable);  +	} +private static function buildEntityTable()  +	{  +		self::$_entityTable=array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES));  +	} +public static function quoteJavaScriptString($js,$forUrl=false)  +	{  +		if($forUrl)  +			return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));  +		else  +			return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));  +	} +public static function trimJavaScriptString($js)  +	{  +		if($js!=='' && $js!==null)  +		{  +			$js=trim($js);  +			if(($pos=strpos($js,'javascript:'))===0)  +				$js=substr($js,11);  +			$js=rtrim($js,';').';';  +		}  +		return $js;  +	}  +} +?><?php +interface ICache  +{ +public function get($id); +public function set($id,$value,$expire=0); +public function add($id,$value,$expire=0); +public function replace($id,$value,$expire=0); +public function delete($id); +public function flush();  +} +interface IDependency  +{ +} +class TTimeDependency  +{  +} +class TFileDependency  +{  +} +class TDirectoryDependency  +{  +} +?><?php +class TLogger extends TComponent  +{ +const DEBUG=0x01;  +	const INFO=0x02;  +	const NOTICE=0x04;  +	const WARNING=0x08;  +	const ERROR=0x10;  +	const ALERT=0x20;  +	const FATAL=0x40; +private $_logs=array(); +private $_levels; +private $_categories; +public function log($message,$level,$category='Uncategorized')  +	{  +		$this->_logs[]=array($message,$level,$category,microtime(true));  +	} +public function getLogs($levels=null,$categories=null)  +	{  +		$this->_levels=$levels;  +		$this->_categories=$categories;  +		if(empty($levels) && empty($categories))  +			return $this->_logs;  +		else if(empty($levels))  +			return array_values(array_filter(array_filter($this->_logs,array($this,'filterByCategories'))));  +		else if(empty($categories))  +			return array_values(array_filter(array_filter($this->_logs,array($this,'filterByLevels'))));  +		else  +		{  +			$ret=array_values(array_filter(array_filter($this->_logs,array($this,'filterByLevels'))));  +			return array_values(array_filter(array_filter($ret,array($this,'filterByCategories'))));  +		}  +	} +private function filterByCategories($value)  +	{  +		foreach($this->_categories as $category)  +		{  +			if(strpos($value[2],$category)===0)  +				return $value;  +		}  +		return false;  +	} +private function filterByLevels($value)  +	{  +		if($value[1] & $this->_levels)  +			return $value;  +		else  +			return false;  +	}  +} +?><?php +define('PRADO_DIR',dirname(__FILE__)); + + + + + + + + +interface IModule  +{ +public function init($config); +public function getID(); +public function setID($id);  +} +interface IService  +{ +public function init($config); +public function getID(); +public function setID($id); +public function run();  +} +interface ITextWriter  +{ +public function write($str); +public function flush();  +} +interface ITheme  +{ +public function apply($control);  +} +interface ITemplate  +{ +public function instantiateIn($parent);  +} +interface IUser  +{ +public function getName(); +public function setName($value); +public function getIsGuest(); +public function setIsGuest($value); +public function getRoles(); +public function setRoles($value); +public function isInRole($role); +public function saveToString(); +public function loadFromString($string);  +} +interface IStatePersister  +{ +public function load(); +public function save($state);  +} +abstract class TModule extends TComponent implements IModule  +{ +private $_id; +public function init($config)  +	{  +	} +public function getID()  +	{  +		return $this->_id;  +	} +public function setID($value)  +	{  +		$this->_id=$value;  +	}  +} +abstract class TService extends TComponent implements IService  +{ +private $_id; +public function init($config)  +	{  +	} +public function getID()  +	{  +		return $this->_id;  +	} +public function setID($value)  +	{  +		$this->_id=$value;  +	} +public function run()  +	{  +	}  +} +class PradoBase  +{ +const CLASS_FILE_EXT='.php'; +private static $_aliases=array('System'=>PRADO_DIR); +private static $_usings=array(); +private static $_application=null; +private static $_logger=null; +public static function getVersion()  +	{  +		return '3.0a';  +	} +public static function phpErrorHandler($errno,$errstr,$errfile,$errline)  +	{  +		if(error_reporting()!=0)  +			throw new TPhpErrorException($errno,$errstr,$errfile,$errline);  +	} +public static function exceptionHandler($exception)  +	{  +		if(self::$_application!==null && ($errorHandler=self::$_application->getErrorHandler())!==null)  +		{  +			$errorHandler->handleError(null,$exception);  +		}  +		else  +		{  +			echo $exception;  +		}  +		exit(1);  +	} +public static function setApplication($application)  +	{  +		if(self::$_application!==null)  +			throw new TInvalidOperationException('prado_application_singleton_required');  +		self::$_application=$application;  +	} +public static function getApplication()  +	{  +		return self::$_application;  +	} +public static function getFrameworkPath()  +	{  +		return PRADO_DIR;  +	} +public static function serialize($data)  +	{  +		$arr[0]=$data;  +		return serialize($arr);  +	} +public static function unserialize($str)  +	{  +		$arr=unserialize($str);  +		return isset($arr[0])?$arr[0]:null;  +	} +public static function createComponent($type)  +	{  +		if(!class_exists($type,false))  +		{  +			if(($pos=strrpos($type,'.'))===false)  +			{  +				include_once($type.self::CLASS_FILE_EXT);  +				if(!class_exists($type,false))  +					throw new TInvalidOperationException('prado_component_unknown',$type);  +			}  +			else  +			{  +				$className=substr($type,$pos+1);  +				if(!class_exists($className,false) && ($path=self::getPathOfNamespace($type))!==null)  +				{  +					include_once($path.self::CLASS_FILE_EXT);  +					if(!class_exists($className,false))  +						throw new TInvalidOperationException('prado_component_unknown',$type);  +				}  +				$type=$className;  +			}  +		}  +		if(($n=func_num_args())>1)  +		{  +			$args=func_get_args();  +			$s='$args[1]';  +			for($i=2;$i<$n;++$i)  +				$s.=",\$args[$i]";  +			eval("\$component=new $type($s);");  +			return $component;  +		}  +		else  +			return new $type;  +	} +public static function using($namespace)  +	{  +		if(!isset(self::$_usings[$namespace]))  +		{  +			if(($path=self::getPathOfNamespace($namespace,self::CLASS_FILE_EXT))===null)  +				throw new TInvalidDataValueException('prado_using_invalid',$namespace);  +			else  +			{  +				if($namespace[strlen($namespace)-1]==='*')  				{  +					if(is_dir($path))  +					{  +						self::$_usings[$namespace]=$path;  +						set_include_path(get_include_path().PATH_SEPARATOR.$path);  +					}  +					else  +						throw new TInvalidDataValueException('prado_using_invalid',$namespace);  +				}  +				else  				{  +					if(is_file($path))  +					{  +						self::$_usings[$namespace]=$path;  +						if(!class_exists(substr(strrchr($namespace,'.'),1),false))  +							require_once($path);  +					}  +					else  +						throw new TInvalidDataValueException('prado_using_invalid',$namespace);  +				}  +			}  +		}  +	} +public static function getPathOfNamespace($namespace,$ext='')  +	{  +		if(isset(self::$_usings[$namespace]))  +			return self::$_usings[$namespace];  +		else if(isset(self::$_aliases[$namespace]))  +			return self::$_aliases[$namespace];  +		else  +		{  +			$segs=explode('.',$namespace);  +			$alias=array_shift($segs);  +			if(($file=array_pop($segs))!==null && ($root=self::getPathOfAlias($alias))!==null)  +				return rtrim($root.'/'.implode('/',$segs),'/').(($file==='*')?'':'/'.$file.$ext);  +			else  +				return null;  +		}  +	} +public static function getPathOfAlias($alias)  +	{  +		if(isset(self::$_aliases[$alias]))  +			return self::$_aliases[$alias];  +		else  +			return null;  +	} +public static function setPathOfAlias($alias,$path)  +	{  +		if(isset(self::$_aliases[$alias]))  +			throw new TInvalidOperationException('prado_alias_redefined',$alias);  +		else if(($rp=realpath($path))!==false && is_dir($rp))  +			self::$_aliases[$alias]=$rp;  +		else  +			throw new TInvalidDataValueException('prado_alias_invalid',$alias,$path);  +	} +public static function fatalError($msg)  +	{  +		echo '<h1>Fatal Error</h1>';  +		echo '<p>'.$msg.'</p>';  +		if(!function_exists('debug_backtrace'))  +			return;  +		echo '<h2>Debug Backtrace</h2>';  +		echo '<pre>';  +		$index=-1;  +		foreach(debug_backtrace() as $t)  +		{  +			$index++;  +			if($index==0)  				continue;  +			echo '#'.$index.' ';  +			if(isset($t['file']))  +				echo basename($t['file']) . ':' . $t['line'];  +			else  +			   echo '<PHP inner-code>';  +			echo ' -- ';  +			if(isset($t['class']))  +				echo $t['class'] . $t['type'];  +			echo $t['function'];  +			if(isset($t['args']) && sizeof($t['args']) > 0)  +				echo '(...)';  +			else  +				echo '()';  +			echo "\n";  +		}  +		echo '</pre>';  +		exit(1);  +	} +public static function getUserLanguages()  +	{  +		static $languages=null;  +		if($languages===null)  +		{  +			$languages=array();  +			foreach(explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $language)  +			{  +				$array=split(';q=',trim($language));  +				$languages[trim($array[0])]=isset($array[1])?(float)$array[1]:1.0;  +			}  +			arsort($languages);  +			$languages=array_keys($languages);  +			if(empty($languages))  +				$languages[0]='en';  +		}  +		return $languages;  +	} +public static function getPreferredLanguage()  +	{  +		static $language=null;  +		if($language===null)  +		{  +			$langs=Prado::getUserLanguages();  +			$lang=explode('-',$langs[0]);  +			if(empty($lang[0]) || !ctype_alpha($lang[0]))  +				$language='en';  +			else  +				$language=$lang[0];  +		}  +		return $language;  +	} +public static function trace($msg,$category='Uncategorized')  +	{  +		if(self::$_application && self::$_application->getMode()==='Performance')  +			return;  +		if(!self::$_application || self::$_application->getMode()==='Debug')  +		{  +			$trace=debug_backtrace();  +			if(isset($trace[0]['file']) && isset($trace[0]['line']))  +				$msg.=" (line {$trace[0]['line']}, {$trace[0]['file']})";  +			$level=TLogger::DEBUG;  +		}  +		else  +			$level=TLogger::INFO;  +		self::log($msg,$level,$category);  +	} +public static function log($msg,$level=TLogger::INFO,$category='Uncategorized')  +	{  +		if(self::$_logger===null)  +			self::$_logger=new TLogger;  +		self::$_logger->log($msg,$level,$category);  +	} +public static function getLogger()  +	{  +		if(self::$_logger===null)  +			self::$_logger=new TLogger;  +		return self::$_logger;  +	}  +} +class TTextWriter extends TComponent implements ITextWriter  +{  +	private $_str=''; +public function flush()  +	{  +		$str=$this->_str;  +		$this->_str='';  +		return $str;  +	} +public function write($str)  +	{  +		$this->_str.=$str;  +	} +public function writeLine($str='')  +	{  +		$this->write($str."\n");  +	}  +} +class TDate extends TComponent  +{  +}  +?><?php + +if(!class_exists('Prado',false))  +{  +	class Prado extends PradoBase  +	{  +	}  +} +if(!function_exists('__autoload'))  +{  +	function __autoload($className)  +	{  +		include_once($className.Prado::CLASS_FILE_EXT);  +		if(!class_exists($className,false))  +			Prado::fatalError("Class file for '$className' cannot be found.");  +	}  +} +set_error_handler(array('Prado','phpErrorHandler'),error_reporting()); +set_exception_handler(array('Prado','exceptionHandler')); + +?><?php + + + + + + +class TApplication extends TComponent +{ +const STATE_OFF='Off'; +	const STATE_DEBUG='Debug'; +	const STATE_NORMAL='Normal'; +	const STATE_PERFORMANCE='Performance'; +const PAGE_SERVICE_ID='page'; +const CONFIG_FILE='application.xml'; +const RUNTIME_PATH='runtime'; +const CONFIGCACHE_FILE='config.cache'; +const GLOBAL_FILE='global.cache'; +private static $_steps=array( +		'BeginRequest', +		'Authentication', +		'PostAuthentication', +		'Authorization', +		'PostAuthorization', +		'LoadState', +		'PostLoadState', +		'PreRunService', +		'RunService', +		'PostRunService', +		'SaveState', +		'PostSaveState', +		'EndRequest' +	); +private $_id; +private $_uniqueID; +private $_requestCompleted=false; +private $_step; +private $_service=null; +private $_pageService=null; +private $_modules; +private $_parameters; +private $_configFile; +private $_basePath; +private $_runtimePath; +private $_stateChanged=false; +private $_globals=array(); +private $_cacheFile; +private $_errorHandler=null; +private $_request=null; +private $_response=null; +private $_session=null; +private $_cache=null; +private $_statePersister=null; +private $_user=null; +private $_globalization=null; +private $_authRules=null; +private $_mode='Debug'; +public function __construct($basePath='protected',$cacheConfig=true) +	{ +		parent::__construct(); +Prado::setApplication($this); +if(($this->_basePath=realpath($basePath))===false || !is_dir($this->_basePath)) +			throw new TConfigurationException('application_basepath_invalid',$basePath); +		$configFile=$this->_basePath.'/'.self::CONFIG_FILE; +		$this->_configFile=is_file($configFile) ? $configFile : null; +		$this->_runtimePath=$this->_basePath.'/'.self::RUNTIME_PATH; +		if(!is_dir($this->_runtimePath) || !is_writable($this->_runtimePath)) +			throw new TConfigurationException('application_runtimepath_invalid',$this->_runtimePath); +$this->_cacheFile=$cacheConfig ? $this->_runtimePath.'/'.self::CONFIGCACHE_FILE : null; +$this->_uniqueID=md5($this->_basePath); +	} +public function run() +	{ +		try +		{ +			$this->initApplication(); +			$n=count(self::$_steps); +			$this->_step=0; +			$this->_requestCompleted=false; +			while($this->_step<$n) +			{ +				if($this->_mode===self::STATE_OFF) +					throw new THttpException(503,'application_service_unavailable'); +				$method='on'.self::$_steps[$this->_step]; + +				$this->$method($this); +				if($this->_requestCompleted && $this->_step<$n-1) +					$this->_step=$n-1; +				else +					$this->_step++; +			} +		} +		catch(Exception $e) +		{ +			$this->onError($e); +		} +	} +public function completeRequest() +	{ +		$this->_requestCompleted=true; +	} +public function getGlobalState($key,$defaultValue=null) +	{ +		return isset($this->_globals[$key])?$this->_globals[$key]:$defaultValue; +	} +public function setGlobalState($key,$value,$defaultValue=null) +	{ +		$this->_stateChanged=true; +		if($value===$defaultValue) +			unset($this->_globals[$key]); +		else +			$this->_globals[$key]=$value; +	} +public function clearGlobalState($key) +	{ +		$this->_stateChanged=true; +		unset($this->_globals[$key]); +	} +protected function loadGlobals() +	{ +		$this->_globals=$this->getApplicationStatePersister()->load(); +	} +protected function saveGlobals() +	{ +		if(!$this->_stateChanged) +			return; +		$this->getApplicationStatePersister()->save($this->_globals); +	} +public function getID() +	{ +		return $this->_id; +	} +public function setID($value) +	{ +		$this->_id=$value; +	} +public function getUniqueID() +	{ +		return $this->_uniqueID; +	} +public function getMode() +	{ +		return $this->_mode; +	} +public function setMode($value) +	{ +		$this->_mode=TPropertyValue::ensureEnum($value,array(self::STATE_OFF,self::STATE_DEBUG,self::STATE_NORMAL,self::STATE_PERFORMANCE)); +	} +public function getBasePath() +	{ +		return $this->_basePath; +	} +public function getConfigurationFile() +	{ +		return $this->_configFile; +	} +public function getRuntimePath() +	{ +		return $this->_runtimePath; +	} +public function getService() +	{ +		return $this->_service; +	} +public function setModule($id,IModule $module) +	{ +		if(isset($this->_modules[$id])) +			throw new TConfigurationException('application_moduleid_duplicated',$id); +		else +			$this->_modules[$id]=$module; +	} +public function getModule($id) +	{ +		return isset($this->_modules[$id])?$this->_modules[$id]:null; +	} +public function getModules() +	{ +		return $this->_modules; +	} +public function getParameters() +	{ +		return $this->_parameters; +	} +public function getPageService() +	{ +		if(!$this->_pageService) +		{ +			$this->_pageService=new TPageService; +			$this->_pageService->init(null); +		} +		return $this->_pageService; +	} +public function setPageService(TPageService $service) +	{ +		$this->_pageService=$service; +	} +public function getRequest() +	{ +		if(!$this->_request) +		{ +			$this->_request=new THttpRequest; +			$this->_request->init(null); +		} +		return $this->_request; +	} +public function setRequest(THttpRequest $request) +	{ +		$this->_request=$request; +	} +public function getResponse() +	{ +		if(!$this->_response) +		{ +			$this->_response=new THttpResponse; +			$this->_response->init(null); +		} +		return $this->_response; +	} +public function setResponse(THttpResponse $response) +	{ +		$this->_response=$response; +	} +public function getSession() +	{ +		if(!$this->_session) +		{ +			$this->_session=new THttpSession; +			$this->_session->init(null); +		} +		return $this->_session; +	} +public function setSession(THttpSession $session) +	{ +		$this->_session=$session; +	} +public function getErrorHandler() +	{ +		if(!$this->_errorHandler) +		{ +			$this->_errorHandler=new TErrorHandler; +			$this->_errorHandler->init(null); +		} +		return $this->_errorHandler; +	} +public function setErrorHandler(TErrorHandler $handler) +	{ +		$this->_errorHandler=$handler; +	} +public function getApplicationStatePersister() +	{ +		if(!$this->_statePersister) +		{ +			$this->_statePersister=new TApplicationStatePersister; +			$this->_statePersister->init(null); +		} +		return $this->_statePersister; +	} +public function setApplicationStatePersister(IStatePersister $persister) +	{ +		$this->_statePersister=$persister; +	} +public function getCache() +	{ +		return $this->_cache; +	} +public function setCache(ICache $cache) +	{ +		$this->_cache=$cache; +	} +public function getUser() +	{ +		return $this->_user; +	} +public function setUser(IUser $user) +	{ +		$this->_user=$user; +	} +public function getGlobalization() +	{ +		return $this->_globalization; +	} +public function setGlobalization(TGlobalization $handler) +	{ +		$this->_globalization = $handler; +	} +public function getAuthorizationRules() +	{ +		if($this->_authRules===null) +			$this->_authRules=new TAuthorizationRuleCollection; +		return $this->_authRules; +	} +protected function initApplication() +	{ + +Prado::setPathOfAlias('Application',$this->_basePath); +if($this->_configFile===null) +		{ +			$this->getRequest()->setAvailableServices(array(self::PAGE_SERVICE_ID)); +			$this->_service=$this->getPageService(); +			return; +		} +if($this->_cacheFile===null || @filemtime($this->_cacheFile)<filemtime($this->_configFile)) +		{ +			$config=new TApplicationConfiguration; +			$config->loadFromFile($this->_configFile); +			if($this->_cacheFile!==null) +			{ +				if(($fp=fopen($this->_cacheFile,'wb'))!==false) +				{ +					fputs($fp,Prado::serialize($config)); +					fclose($fp); +				} +				else +					syslog(LOG_WARNING, 'Prado application config cache file "'.$this->_cacheFile.'" cannot be created.'); +			} +		} +		else +		{ +			$config=Prado::unserialize(file_get_contents($this->_cacheFile)); +		} +foreach($config->getAliases() as $alias=>$path) +			Prado::setPathOfAlias($alias,$path); +		foreach($config->getUsings() as $using) +			Prado::using($using); +foreach($config->getProperties() as $name=>$value) +			$this->setSubProperty($name,$value); +$this->_parameters=new TMap; +		foreach($config->getParameters() as $id=>$parameter) +		{ +			if(is_string($parameter)) +				$this->_parameters->add($id,$parameter); +			else +			{ +				$component=Prado::createComponent($parameter[0]); +				foreach($parameter[1] as $name=>$value) +					$component->setSubProperty($name,$value); +				$this->_parameters->add($id,$component); +			} +		} +$this->_modules=array(); +		foreach($config->getModules() as $id=>$moduleConfig) +		{ + +$module=Prado::createComponent($moduleConfig[0]); +			$this->setModule($id,$module); +			foreach($moduleConfig[1] as $name=>$value) +				$module->setSubProperty($name,$value); +			$module->init($moduleConfig[2]); +		} +$services=$config->getServices(); +		$serviceIDs=array_keys($services); +		array_unshift($serviceIDs,self::PAGE_SERVICE_ID); +		$request=$this->getRequest(); +		$request->setAvailableServices($serviceIDs); +if(($serviceID=$request->getServiceID())===null) +			$serviceID=self::PAGE_SERVICE_ID; +		if(isset($services[$serviceID])) +		{ +			$serviceConfig=$services[$serviceID]; +			$service=Prado::createComponent($serviceConfig[0]); +			if(!($service instanceof IService)) +				throw new THttpException(500,'application_service_unknown',$serviceID); +			$this->_service=$service; +			foreach($serviceConfig[1] as $name=>$value) +				$service->setSubProperty($name,$value); +			$service->init($serviceConfig[2]); +		} +		else +			$this->_service=$this->getPageService(); +	} +public function onError($param) +	{ +		if($this->hasEventHandler('Error')) +			$this->raiseEvent('Error',$this,$param); +		else +			$this->getErrorHandler()->handleError($this,$param); +	} +public function onBeginRequest($param) +	{ +		$this->raiseEvent('BeginRequest',$this,$param); +	} +public function onAuthentication($param) +	{ +		$this->raiseEvent('Authentication',$this,$param); +	} +public function onPostAuthentication($param) +	{ +		$this->raiseEvent('PostAuthentication',$this,$param); +	} +public function onAuthorization($param) +	{ +		$this->raiseEvent('Authorization',$this,$param); +	} +public function onPostAuthorization($param) +	{ +		$this->raiseEvent('PostAuthorization',$this,$param); +	} +public function onLoadState($param) +	{ +		$this->loadGlobals(); +		$this->raiseEvent('LoadState',$this,$param); +	} +public function onPostLoadState($param) +	{ +		$this->raiseEvent('PostLoadState',$this,$param); +	} +public function onPreRunService($param) +	{ +		$this->raiseEvent('PreRunService',$this,$param); +	} +public function onRunService($param) +	{ +		$this->raiseEvent('RunService',$this,$param); +		if($this->_service) +			$this->_service->run(); +	} +public function onPostRunService($param) +	{ +		$this->raiseEvent('PostRunService',$this,$param); +	} +public function onSaveState($param) +	{ +		$this->raiseEvent('SaveState',$this,$param); +		$this->saveGlobals(); +	} +public function onPostSaveState($param) +	{ +		$this->raiseEvent('PostSaveState',$this,$param); +	} +public function onEndRequest($param) +	{ +		$this->raiseEvent('EndRequest',$this,$param); +	} +} +class TApplicationConfiguration extends TComponent +{ +private $_properties=array(); +private $_usings=array(); +private $_aliases=array(); +private $_modules=array(); +private $_services=array(); +private $_parameters=array(); +public function loadFromFile($fname) +	{ +		$configPath=dirname($fname); +		$dom=new TXmlDocument; +		$dom->loadFromFile($fname); +foreach($dom->getAttributes() as $name=>$value) +			$this->_properties[$name]=$value; +if(($pathsNode=$dom->getElementByTagName('paths'))!==null) +		{ +			foreach($pathsNode->getElementsByTagName('alias') as $aliasNode) +			{ +				if(($id=$aliasNode->getAttribute('id'))!==null && ($path=$aliasNode->getAttribute('path'))!==null) +				{ +					$path=str_replace('\\','/',$path); +					if(preg_match('/^\\/|.:\\/|.:\\\\/',$path))							$p=realpath($path); +					else +						$p=realpath($configPath.'/'.$path); +					if($p===false || !is_dir($p)) +						throw new TConfigurationException('appconfig_aliaspath_invalid',$id,$path); +					if(isset($this->_aliases[$id])) +						throw new TConfigurationException('appconfig_alias_redefined',$id); +					$this->_aliases[$id]=$p; +				} +				else +					throw new TConfigurationException('appconfig_alias_invalid'); +			} +			foreach($pathsNode->getElementsByTagName('using') as $usingNode) +			{ +				if(($namespace=$usingNode->getAttribute('namespace'))!==null) +					$this->_usings[]=$namespace; +				else +					throw new TConfigurationException('appconfig_using_invalid'); +			} +		} +if(($modulesNode=$dom->getElementByTagName('modules'))!==null) +		{ +			foreach($modulesNode->getElementsByTagName('module') as $node) +			{ +				$properties=$node->getAttributes(); +				if(($id=$properties->itemAt('id'))===null) +					throw new TConfigurationException('appconfig_moduleid_required'); +				if(($type=$properties->remove('class'))===null && isset($this->_modules[$id]) && $this->_modules[$id][2]===null) +					$type=$this->_modules[$id][0]; +				if($type===null) +					throw new TConfigurationException('appconfig_moduletype_required',$id); +				$node->setParent(null); +				$this->_modules[$id]=array($type,$properties->toArray(),$node); +			} +		} +if(($servicesNode=$dom->getElementByTagName('services'))!==null) +		{ +			foreach($servicesNode->getElementsByTagName('service') as $node) +			{ +				$properties=$node->getAttributes(); +				if(($id=$properties->itemAt('id'))===null) +					throw new TConfigurationException('appconfig_serviceid_required'); +				if(($type=$properties->remove('class'))===null && isset($this->_services[$id]) && $this->_services[$id][2]===null) +					$type=$this->_services[$id][0]; +				if($type===null) +					throw new TConfigurationException('appconfig_servicetype_required',$id); +				$node->setParent(null); +				$this->_services[$id]=array($type,$properties->toArray(),$node); +			} +		} +if(($parametersNode=$dom->getElementByTagName('parameters'))!==null) +		{ +			foreach($parametersNode->getElementsByTagName('parameter') as $node) +			{ +				$properties=$node->getAttributes(); +				if(($id=$properties->remove('id'))===null) +					throw new TConfigurationException('appconfig_parameterid_required'); +				if(($type=$properties->remove('class'))===null) +					$this->_parameters[$id]=$node->getValue(); +				else +					$this->_parameters[$id]=array($type,$properties->toArray()); +			} +		} +	} +public function getProperties() +	{ +		return $this->_properties; +	} +public function getAliases() +	{ +		return $this->_aliases; +	} +public function getUsings() +	{ +		return $this->_usings; +	} +public function getModules() +	{ +		return $this->_modules; +	} +public function getServices() +	{ +		return $this->_services; +	} +public function getParameters() +	{ +		return $this->_parameters; +	} +} +class TApplicationStatePersister extends TModule implements IStatePersister +{ +const CACHE_NAME='prado:appstate'; +public function init($config) +	{ +		$this->getApplication()->setApplicationStatePersister($this); +	} +protected function getStateFilePath() +	{ +		return $this->getApplication()->getRuntimePath().'/global.cache'; +	} +public function load() +	{ +		if(($cache=$this->getApplication()->getCache())!==null && ($value=$cache->get(self::CACHE_NAME))!==false) +			return unserialize($value); +		else +		{ +			if(($content=@file_get_contents($this->getStateFilePath()))!==false) +				return unserialize($content); +			else +				return null; +		} +	} +public function save($state) +	{ +		$content=serialize($state); +		$saveFile=true; +		if(($cache=$this->getApplication()->getCache())!==null) +		{ +			if($cache->get(self::CACHE_NAME)===$content) +				$saveFile=false; +			else +				$cache->set(self::CACHE_NAME,$content); +		} +		if($saveFile) +		{ +			$fileName=$this->getStateFilePath(); +			if(version_compare(phpversion(),'5.1.0','>=')) +				file_put_contents($fileName,$content,LOCK_EX); +			else +				file_put_contents($fileName,$content); +		} +	} +} +?><?php +class TErrorHandler extends TModule  +{ +const ERROR_FILE_NAME='error'; +const EXCEPTION_FILE_NAME='exception'; +const SOURCE_LINES=12; +private $_templatePath=null; +public function init($config)  +	{  +		$this->getApplication()->setErrorHandler($this);  +	} +public function getErrorTemplatePath()  +	{  +		return $this->_templatePath;  +	} +public function setErrorTemplatePath($value)  +	{  +		if(($templatePath=Prado::getPathOfNamespace($this->_templatePath))!==null && is_dir($templatePath))  +			$this->_templatePath=$templatePath;  +		else  +			throw new TConfigurationException('errorhandler_errortemplatepath_invalid',$value);  +	} +public function handleError($sender,$param)  +	{  +		static $handling=false;  +								restore_error_handler();  +		restore_exception_handler();  +				if($handling)  +			$this->handleRecursiveError($param);  +		else  +		{  +			$handling=true;  +			if(($response=$this->getResponse())!==null)  +				$response->clear();  +			if(!headers_sent())  +				header('Content-Type: text/html; charset=UTF-8');  +			if($param instanceof THttpException)  +				$this->handleExternalError($param->getStatusCode(),$param);  +			else if($this->getApplication()->getMode()===TApplication::STATE_DEBUG)  +				$this->displayException($param);  +			else  +				$this->handleExternalError(500,$param);  +		}  +		exit(1);  +	} +protected function handleExternalError($statusCode,$exception)  +	{  +		if(!($exception instanceof THttpException))  +			error_log($exception->__toString());  +		if($this->_templatePath===null)  +			$this->_templatePath=Prado::getFrameworkPath().'/Exceptions/templates';  +		$base=$this->_templatePath.'/'.self::ERROR_FILE_NAME;  +		$lang=Prado::getPreferredLanguage();  +		if(is_file("$base$statusCode-$lang.html"))  +			$errorFile="$base$statusCode-$lang.html";  +		else if(is_file("$base$statusCode.html"))  +			$errorFile="$base$statusCode.html";  +		else if(is_file("$base-$lang.html"))  +			$errorFile="$base-$lang.html";  +		else  +			$errorFile="$base.html";  +		if(($content=@file_get_contents($errorFile))===false)  +			die("Unable to open error template file '$errorFile'."); +$serverAdmin=isset($_SERVER['SERVER_ADMIN'])?$_SERVER['SERVER_ADMIN']:'';  +		$tokens=array(  +			'%%StatusCode%%' => "$statusCode",  +			'%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()),  +			'%%ServerAdmin%%' => $serverAdmin,  +			'%%Version%%' => $_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(),  +			'%%Time%%' => @strftime('%Y-%m-%d %H:%M',time())  +		);  +		echo strtr($content,$tokens);  +	} +protected function handleRecursiveError($exception)  +	{  +		if($this->getApplication()->getMode()===TApplication::STATE_DEBUG)  +		{  +			echo "<html><head><title>Recursive Error</title></head>\n";  +			echo "<body><h1>Recursive Error</h1>\n";  +			echo "<pre>".$exception->__toString()."</pre>\n";  +			echo "</body></html>";  +		}  +		else  +		{  +			error_log("Error happened while processing an existing error:\n".$param->__toString());  +			header('HTTP/1.0 500 Internal Error');  +		}  +	} +protected function displayException($exception)  +	{  +		$lines=file($exception->getFile());  +		$errorLine=$exception->getLine();  +		$beginLine=$errorLine-self::SOURCE_LINES>=0?$errorLine-self::SOURCE_LINES:0;  +		$endLine=$errorLine+self::SOURCE_LINES<=count($lines)?$errorLine+self::SOURCE_LINES:count($lines); +$source='';  +		for($i=$beginLine-1;$i<$endLine;++$i)  +		{  +			if($i===$errorLine-1)  +			{  +				$line=htmlspecialchars(sprintf("%04d: %s",$i+1,str_replace("\t",'    ',$lines[$i])));  +				$source.="<div class=\"error\">".$line."</div>";  +			}  +			else  +				$source.=htmlspecialchars(sprintf("%04d: %s",$i+1,str_replace("\t",'    ',$lines[$i])));  +		} +$tokens=array(  +			'%%ErrorType%%' => get_class($exception),  +			'%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()),  +			'%%SourceFile%%' => htmlspecialchars($exception->getFile()).' ('.$exception->getLine().')',  +			'%%SourceCode%%' => $source,  +			'%%StackTrace%%' => htmlspecialchars($exception->getTraceAsString()),  +			'%%Version%%' => $_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(),  +			'%%Time%%' => @strftime('%Y-%m-%d %H:%M',time())  +		);  +		$lang=Prado::getPreferredLanguage();  +		$exceptionFile=Prado::getFrameworkPath().'/Exceptions/templates/'.self::EXCEPTION_FILE_NAME.'-'.$lang.'.html';  +		if(!is_file($exceptionFile))  +			$exceptionFile=Prado::getFrameworkPath().'/Exceptions/templates/'.self::EXCEPTION_FILE_NAME.'.html';  +		if(($content=@file_get_contents($exceptionFile))===false)  +			die("Unable to open exception template file '$exceptionFile'.");  +		echo strtr($content,$tokens);  +	}  +} +?><?php +class THttpRequest extends TModule  +{ +const SERVICE_VAR='sp'; +private $_initialized=false; +private $_serviceID=null; +private $_serviceParam=null; +private $_cookies=null; +private $_requestUri; +private $_pathInfo; +private $_items; +private $_services;  +	private $_requestResolved=false; +public function init($config)  +	{  +														if(isset($_SERVER['REQUEST_URI']))  +			$this->_requestUri=$_SERVER['REQUEST_URI'];  +		else  			$this->_requestUri=$_SERVER['SCRIPT_NAME'].(empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING']); +if(isset($_SERVER['PATH_INFO']))  +			$this->_pathInfo=$_SERVER['PATH_INFO'];  +		else if(strpos($_SERVER['PHP_SELF'],$_SERVER['SCRIPT_NAME'])===0)  +			$this->_pathInfo=substr($_SERVER['PHP_SELF'],strlen($_SERVER['SCRIPT_NAME']));  +		else  +			$this->_pathInfo=''; +if(get_magic_quotes_gpc())  +		{  +			if(isset($_GET))  +				$_GET=$this->stripSlashes($_GET);  +			if(isset($_POST))  +				$_POST=$this->stripSlashes($_POST);  +			if(isset($_REQUEST))  +				$_REQUEST=$this->stripSlashes($_REQUEST);  +			if(isset($_COOKIE))  +				$_COOKIE=$this->stripSlashes($_COOKIE);  +		} +$this->_items=new TMap(array_merge($_POST,$_GET)); +$this->_initialized=true;  +		$this->getApplication()->setRequest($this);  +	} +public function stripSlashes(&$data)  +	{  +		return is_array($data)?array_map(array($this,'stripSlashes'),$data):stripslashes($data);  +	} +public function getUrl()  +	{  +		if($this->_url===null)  +		{  +			$secure=$this->getIsSecureConnection();  +			$url=$secure?'https://':'http://';  +			if(empty($_SERVER['HTTP_HOST']))  +			{  +				$url.=$_SERVER['SERVER_NAME'];  +				$port=$_SERVER['SERVER_PORT'];  +				if(($port!=80 && !$secure) || ($port!=443 && $secure))  +					$url.=':'.$port;  +			}  +			else  +				$url.=$_SERVER['HTTP_HOST'];  +			$url.=$this->getRequestUri();  +			$this->_url=new TUri($url);  +		}  +		return $this->_url;  +	} +public function getRequestType()  +	{  +		return $_SERVER['REQUEST_METHOD'];  +	} +public function getIsSecureConnection()  +	{  +		return !empty($_SERVER['HTTPS']);  +	} +public function getPathInfo()  +	{  +		return $this->_pathInfo;  +	} +public function getQueryString()  +	{  +		return isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:'';  +	} +public function getRequestUri()  +	{  +		return $this->_requestUri;  +	} +public function getApplicationPath()  +	{  +		return $_SERVER['SCRIPT_NAME'];  +	} +public function getPhysicalApplicationPath()  +	{  +		return realpath($_SERVER['SCRIPT_FILENAME']);  +	} +public function getServerName()  +	{  +		return $_SERVER['SERVER_NAME'];  +	} +public function getServerPort()  +	{  +		return $_SERVER['SERVER_PORT'];  +	} +public function getUrlReferrer()  +	{  +		return isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:null;  +	} +public function getBrowser()  +	{  +		return get_browser();  +	} +public function getUserAgent()  +	{  +		return $_SERVER['HTTP_USER_AGENT'];  +	} +public function getUserHostAddress()  +	{  +		return $_SERVER['REMOTE_ADDR'];  +	} +public function getUserHost()  +	{  +		return isset($_SERVER['REMOTE_HOST'])?$_SERVER['REMOTE_HOST']:null;  +	} +public function getAcceptTypes()  +	{  +				return $_SERVER['HTTP_ACCEPT'];  +	} +public function getUserLanguages()  +	{  +		return Prado::getUserLanguages();  +	} +public function getItems()  +	{  +		return $this->_items;  +	} +public function getParameters()  +	{  +		return $this->_items;  +	} +public function getCookies()  +	{  +		if($this->_cookies===null)  +		{  +			$this->_cookies=new THttpCookieCollection;  +			foreach($_COOKIE as $key=>$value)  +				$this->_cookies->add(new THttpCookie($key,$value));  +		}  +		return $this->_cookies;  +	} +public function getUploadedFiles()  +	{  +		return $_FILES;  +	} +public function getServerVariables()  +	{  +		return $_SERVER;  +	} +public function getEnvironmentVariables()  +	{  +		return $_ENV;  +	} +public function constructUrl($serviceID,$serviceParam,$getItems=null,$encodeAmpersand=false)  +	{  +		$url=$this->getApplicationPath();  +		$url.='?'.$serviceID.'=';  +		if(!empty($serviceParam))  +			$url.=$serviceParam;  +		$amp=$encodeAmpersand?'&':'&';  +		if(is_array($getItems) || $getItems instanceof Traversable)  +		{  +			foreach($getItems as $name=>$value)  +				$url.=$amp.urlencode($name).'='.urlencode($value);  +		}  +		if(defined('SID') && SID != '')  +			$url.=$amp.SID;  +		return $url;  +	} +protected function resolveRequest()  +	{  + +		$this->_requestResolved=true;  +		foreach($this->_services as $id)  +		{  +			if(isset($_GET[$id]))  +			{  +				$this->setServiceID($id);  +				$this->setServiceParameter($_GET[$id]);  +				break;  +			}  +		}  +	} +public function getAvailableServices()  +	{  +		return $this->_services;  +	} +public function setAvailableServices($services)  +	{  +		$this->_services=$services;  +	} +public function getServiceID()  +	{  +		if(!$this->_requestResolved)  +			$this->resolveRequest();  +		return $this->_serviceID;  +	} +protected function setServiceID($value)  +	{  +		$this->_serviceID=$value;  +	} +public function getServiceParameter()  +	{  +		if(!$this->_requestResolved)  +			$this->resolveRequest();  +		return $this->_serviceParam;  +	} +protected function setServiceParameter($value)  +	{  +		$this->_serviceParam=$value;  +	}  +} +class THttpCookieCollection extends TList  +{ +private $_o; +public function __construct($owner=null)  +	{  +		parent::__construct();  +		$this->_o=$owner;  +	} +protected function addedItem($item)  +	{  +		if($this->_o instanceof THttpResponse)  +			$this->_o->addCookie($item);  +	} +protected function removedItem($item)  +	{  +		if($this->_o instanceof THttpResponse)  +			$this->_o->removeCookie($item);  +	} +protected function canAddItem($item)  +	{  +		return ($item instanceof THttpCookie);  +	}  +} +class THttpCookie extends TComponent  +{ +private $_domain=''; +private $_name; +private $_value=0; +private $_expire=0; +private $_path='/'; +private $_secure=false; +public function __construct($name,$value)  +	{  +		parent::__construct();  +		$this->_name=$name;  +		$this->_value=$value;  +	} +public function getDomain()  +	{  +		return $this->_domain;  +	} +public function setDomain($value)  +	{  +		$this->_domain=$value;  +	} +public function getExpire()  +	{  +		return $this->_expire;  +	} +public function setExpire($value)  +	{  +		$this->_expire=TPropertyValue::ensureInteger($value);  +	} +public function getName()  +	{  +		return $this->_name;  +	} +public function setName($value)  +	{  +		$this->_name=$value;  +	} +public function getValue()  +	{  +		return $this->_value;  +	} +public function setValue($value)  +	{  +		$this->_value=$value;  +	} +public function getPath()  +	{  +		return $this->_path;  +	} +public function setPath($value)  +	{  +		$this->_path=$value;  +	} +public function getSecure()  +	{  +		return $this->_secure;  +	} +public function setSecure($value)  +	{  +		$this->_secure=TPropertyValue::ensureBoolean($value);  +	}  +} +class TUri extends TComponent  +{ +private static $_defaultPort=array(  +		'ftp'=>21,  +		'gopher'=>70,  +		'http'=>80,  +		'https'=>443,  +		'news'=>119,  +		'nntp'=>119,  +		'wais'=>210,  +		'telnet'=>23  +	); +private $_scheme; +private $_host; +private $_port; +private $_user; +private $_pass; +private $_path; +private $_query; +private $_fragment; +private $_uri; +public function __construct($uri)  +	{  +		parent::__construct();  +		if(($ret=@parse_url($uri))!==false)  +		{  +						$this->_scheme=$ret['scheme'];  +			$this->_host=$ret['host'];  +			$this->_port=$ret['port'];  +			$this->_user=$ret['user'];  +			$this->_pass=$ret['pass'];  +			$this->_path=$ret['path'];  +			$this->_query=$ret['query'];  +			$this->_fragment=$ret['fragment'];  +			$this->_uri=$uri;  +		}  +		else  +		{  +			throw new TInvalidDataValueException('uri_format_invalid',$uri);  +		}  +	} +public function getUri()  +	{  +		return $this->_uri;  +	} +public function getScheme()  +	{  +		return $this->_scheme;  +	} +public function getHost()  +	{  +		return $this->_host;  +	} +public function getPort()  +	{  +		return $this->_port;  +	} +public function getUser()  +	{  +		return $this->_user;  +	} +public function getPassword()  +	{  +		return $this->_pass;  +	} +public function getPath()  +	{  +		return $this->_path;  +	} +public function getQuery()  +	{  +		return $this->_query;  +	} +public function getFragment()  +	{  +		return $this->_fragment;  +	}  +} +?><?php +class THttpResponse extends TModule implements ITextWriter  +{ +private $_bufferOutput=true; +private $_initialized=false; +private $_cookies=null; +private $_status=200; +private $_htmlWriterType='System.Web.UI.THtmlWriter'; +private $_contentType='text/html'; +private $_charset; +public function __destruct()  +	{  +		if($this->_bufferOutput)  +			@ob_end_flush();  +		parent::__destruct();  +	} +public function init($config)  +	{  +		if($this->_bufferOutput)  +			ob_start();  +		$this->_initialized=true;  +		$this->getApplication()->setResponse($this);  +	} +public function getCacheExpire()  +	{  +		return session_cache_expire();  +	} +public function setCacheExpire($value)  +	{  +		session_cache_expire(TPropertyValue::ensureInteger($value));  +	} +public function getCacheControl()  +	{  +		return session_cache_limiter();  +	} +public function setCacheControl($value)  +	{  +		session_cache_limiter(TPropertyValue::ensureEnum($value,array('none','nocache','private','private_no_expire','public')));  +	} +public function setContentType($type)  +	{  +		$this->_contentType = $type;  +	} +public function getContentType()  +	{  +		return $this->_contentType;  +	} +public function getCharset()  +	{  +		return $this->_charset;  +	} +public function setCharset($charset)  +	{  +		$this->_charset = $charset;  +	} +public function getBufferOutput()  +	{  +		return $this->_bufferOutput;  +	} +public function setBufferOutput($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('httpresponse_bufferoutput_unchangeable');  +		else  +			$this->_bufferOutput=TPropertyValue::ensureBoolean($value);  +	} +public function getStatusCode()  +	{  +		return $this->_status;  +	} +public function setStatusCode($status)  +	{  +		$this->_status=TPropertyValue::ensureInteger($status);  +	} +public function getCookies()  +	{  +		if($this->_cookies===null)  +			$this->_cookies=new THttpCookieCollection($this);  +		return $this->_cookies;  +	} +public function write($str)  +	{  +		echo $str;  +	} +public function writeFile($fileName)  +	{  +		static $defaultMimeTypes=array(  +			'css'=>'text/css',  +			'gif'=>'image/gif',  +			'jpg'=>'image/jpeg',  +			'jpeg'=>'image/jpeg',  +			'htm'=>'text/html',  +			'html'=>'text/html',  +			'js'=>'javascript/js'  +		); +if(!is_file($fileName))  +			throw new TInvalidDataValueException('httpresponse_file_inexistent',$fileName);  +		header('Pragma: public');  +		header('Expires: 0');  +		header('Cache-Component: must-revalidate, post-check=0, pre-check=0');  +		$mimeType='text/plain';  +		if(function_exists('mime_content_type'))  +			$mimeType=mime_content_type($fileName);  +		else  +		{  +			$ext=array_pop(explode('.',$fileName));  +			if(isset($defaultMimeTypes[$ext]))  +				$mimeType=$defaultMimeTypes[$ext];  +		}  +		$fn=basename($fileName);  +		header("Content-type: $mimeType");  +		header('Content-Length: '.filesize($fileName));  +		header("Content-Disposition: attachment; filename=\"$fn\"");  +		header('Content-Transfer-Encoding: binary');  +		readfile($fileName);  +	} +public function redirect($url)  +	{  +		header('Location:'.$url);  +		exit();  +	} +public function flush()  +	{  +		$header = $this->getContentTypeHeader();  +		$this->appendHeader($header);  +		if($this->_bufferOutput)  +			ob_flush();  + +	} +protected function getContentTypeHeader()  +	{  +		$app = $this->getApplication()->getGlobalization();  +		$charset = $this->getCharset();  +		if(empty($charset))  +			$charset = !is_null($app) ? $app->getCharset() : 'UTF-8';  +		$type = $this->getContentType();  +		return "Content-Type: $type; charset=$charset";  +	} +public function clear()  +	{  +		if($this->_bufferOutput)  +			ob_clean();  + +	} +public function appendHeader($value)  +	{  +		header($value);  +	} +public function sendContentTypeHeader($type=null)  +	{ +} +public function appendLog($message,$messageType=0,$destination='',$extraHeaders='')  +	{  +		error_log($message,$messageType,$destination,$extraHeaders);  +	} +public function addCookie($cookie)  +	{  +		setcookie($cookie->getName(),$cookie->getValue(),$cookie->getExpire(),$cookie->getPath(),$cookie->getDomain(),$cookie->getSecure());  +	} +public function removeCookie($cookie)  +	{  +		setcookie($cookie->getName(),null,0,$cookie->getPath(),$cookie->getDomain(),$cookie->getSecure());  +	} +public function getHtmlWriterType()  +	{  +		return $this->_htmlWriterType;  +	} +public function setHtmlWriterType($value)  +	{  +		$this->_htmlWriterType=$value;  +	} +public function createHtmlWriter($type=null)  +	{  +		if($type===null)  +			$type=$this->_htmlWriterType;  +		return Prado::createComponent($type,$this);  +	}  +} +?><?php +class THttpSession extends TModule  +{ +private $_items; +private $_initialized=false; +private $_started=false; +private $_autoStart=false; +private $_cookie=null; +public function init($config)  +	{  +		if($this->_autoStart)  +			session_start();  +		$this->_initialized=true;  +		$this->getApplication()->setSession($this);  +	} +public function open()  +	{  +		if(!$this->_started)  +		{  +			if($this->_cookie!==null)  +				session_set_cookie_params($this->_cookie->getExpire(),$this->_cookie->getPath(),$this->_cookie->getDomain(),$this->_cookie->getSecure());  +			session_start();  +			$this->_started=true;  +		}  +	} +public function close()  +	{  +		if($this->_started)  +		{  +			session_write_close();  +			$this->_started=false;  +		}  +	} +public function destroy()  +	{  +		if($this->_started)  +		{  +			session_destroy();  +			$this->_started=false;  +		}  +	} +public function getItems()  +	{  +		if($this->_items===null)  +			$this->_items=new THttpSessionCollection($_SESSION);  +		return $this->_items;  +	} +public function getIsStarted()  +	{  +		return $this->_started;  +	} +public function getSessionID()  +	{  +		return session_id();  +	} +public function setSessionID($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_sessionid_unchangeable');  +		else  +			session_id($value);  +	} +public function getSessionName()  +	{  +		return session_name();  +	} +public function setSessionName($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_sessionname_unchangeable');  +		else if(ctype_alnum($value))  +			session_name($value);  +		else  +			throw new TInvalidDataValueException('httpsession_sessionname_invalid',$name);  +	} +public function getSavePath()  +	{  +		return session_save_path();  +	} +public function setSavePath($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_savepath_unchangeable');  +		else if(is_dir($value))  +			session_save_path($value);  +		else  +			throw new TInvalidDataValueException('httpsession_savepath_invalid',$value);  +	} +public function getStorage()  +	{  +		switch(session_module_name())  +		{  +			case 'files': return 'File';  +			case 'mm': return 'SharedMemory';  +			case 'user': return 'Custom';  +			default: return 'Unknown';  +		}  +	} +public function setStorage($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_storage_unchangeable');  +		else  +		{  +			$value=TPropertyValue::ensureEnum($value,array('File','SharedMemory','Custom'));  +			if($value==='Custom')  +				session_set_save_handler(array($this,'_open'),array($this,'_close'),array($this,'_read'),array($this,'_write'),array($this,'_destroy'),array($this,'_gc'));  +			switch($value)  +			{  +				case 'Custom':  +					session_module_name('user');  +					break;  +				case 'SharedMemory':  +					session_module_name('mm');  +					break;  +				default:  +					session_module_name('files');  +					break;  +			}  +		}  +	} +public function getCookie()  +	{  +		if($this->_cookie===null)  +			$this->_cookie=new THttpCookie($this->getSessionName(),$this->getSessionID());  +		return $this->_cookie;  +	} +public function getCookieMode()  +	{  +		if(ini_get('session.use_cookies')==='0')  +			return 'None';  +		else if(ini_get('session.use_only_cookies')==='0')  +			return 'Allow';  +		else  +			return 'Only';  +	} +public function setCookieMode($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_cookiemode_unchangeable');  +		else  +		{  +			$value=TPropertyValue::ensureEnum($value,array('None','Allow','Only'));  +			if($value==='None')  +				ini_set('session.use_cookies','0');  +			else if($value==='Allow')  +			{  +				ini_set('session.use_cookies','1');  +				ini_set('session.use_only_cookies','0');  +			}  +			else  +			{  +				ini_set('session.use_cookies','1');  +				ini_set('session.use_only_cookies','1');  +			}  +		}  +	} +public function getAutoStart()  +	{  +		return $this->_autoStart;  +	} +public function setAutoStart($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('httpsession_autostart_unchangeable');  +		else  +			$this->_autoStart=TPropertyValue::ensureBoolean($value);  +	} +public function getGCProbability()  +	{  +		return TPropertyValue::ensureInteger(ini_get('session.gc_probability'));  +	} +public function setGCProbability($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_gcprobability_unchangeable');  +		else  +		{  +			$value=TPropertyValue::ensureInteger($value);  +			if($value>=0 && $value<=100)  +			{  +				ini_set('session.gc_probability',$value);  +				ini_set('session.gc_divisor','100');  +			}  +			else  +				throw new TInvalidDataValueException('httpsession_gcprobability_invalid',$value);  +		}  +	} +public function getUseTransparentSessionID()  +	{  +		return ini_get('session.use_trans_sid')==='1';  +	} +public function setUseTransparentSessionID($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_transid_unchangeable');  +		else  +			ini_set('session.use_only_cookies',TPropertyValue::ensureBoolean($value)?'1':'0');  +	} +public function getTimeout()  +	{  +		return TPropertyValue::ensureInteger(ini_get('session.gc_maxlifetime'));  +	} +public function setTimeout($value)  +	{  +		if($this->_started)  +			throw new TInvalidOperationException('httpsession_maxlifetime_unchangeable');  +		else  +			ini_set('session.gc_maxlifetime',$value);  +	} +public function _open($savePath,$sessionName)  +	{  +		return true;  +	} +public function _close()  +	{  +		return true;  +	} +public function _read($id)  +	{  +		return '';  +	} +public function _write($id,$data)  +	{  +		return true;  +	} +public function _destroy($id)  +	{  +		return true;  +	} +public function _gc($maxLifetime)  +	{  +		return true;  +	}  +} +class THttpSessionCollection extends TMap  +{ +private $_initialized=false; +public function __construct($data=null)  +	{  +		parent::__construct($data);  +		$this->_initialized=true;  +	} +protected function addedItem($key,$value)  +	{  +		if($this->_initialized)  +			$_SESSION[$key]=$value;  +	} +protected function removedItem($key,$value)  +	{  +		unset($_SESSION[$key]);  +	}  +}  +?><?php +class TAuthorizationRule extends TComponent  +{ +private $_action; +private $_users; +private $_roles; +private $_verb; +private $_everyone; +private $_guest; +public function __construct($action,$users,$roles,$verb='')  +	{  +		parent::__construct();  +		$action=strtolower(trim($action));  +		if($action==='allow' || $action==='deny')  +			$this->_action=$action;  +		else  +			throw new TInvalidDataValueException('authorizationrule_action_invalid',$action);  +		$this->_users=array();  +		$this->_roles=array();  +		$this->_everyone=false;  +		$this->_guest=false;  +		foreach(explode(',',$users) as $user)  +		{  +			if(($user=trim(strtolower($user)))!=='')  +			{  +				if($user==='*')  +					$this->_everyone=true;  +				else if($user==='?')  +					$this->_guest=true;  +				else  +					$this->_users[]=$user;  +			}  +		}  +		foreach(explode(',',$roles) as $role)  +		{  +			if(($role=trim(strtolower($role)))!=='')  +				$this->_roles[]=$role;  +		}  +		$verb=trim(strtolower($verb));  +		if($verb==='' || $verb==='get' || $verb==='post')  +			$this->_verb=$verb;  +		else  +			throw new TInvalidDataValueException('authorizationrule_verb_invalid',$verb);  +	} +public function getAction()  +	{  +		return $this->_action;  +	} +public function getUsers()  +	{  +		return $this->_users;  +	} +public function getRoles()  +	{  +		return $this->_roles;  +	} +public function getVerb()  +	{  +		return $this->_verb;  +	} +public function getGuestApplied()  +	{  +		return $this->_guest;  +	} +public function getEveryoneApplied()  +	{  +		return $this->_everyone;  +	} +public function isUserAllowed(IUser $user,$verb)  +	{  +		$decision=($this->_action==='allow')?1:-1;  +		if($this->_verb==='' || strcasecmp($verb,$this->_verb)===0)  +		{  +			if($this->_everyone || ($this->_guest && $user->getIsGuest()))  +				return $decision;  +			if(in_array(strtolower($user->getName()),$this->_users))  +				return $decision;  +			foreach($this->_roles as $role)  +				if($user->isInRole($role))  +					return $decision;  +		}  +		return 0;  +	}  +} +class TAuthorizationRuleCollection extends TList  +{ +public function isUserAllowed($user,$verb)  +	{  +		if($user instanceof IUser)  +		{  +			$verb=strtolower(trim($verb));  +			foreach($this as $rule)  +			{  +				if(($decision=$rule->isUserAllowed($user,$verb))!==0)  +					return ($decision>0);  +			}  +			return true;  +		}  +		else  +			return false;  +	} +protected function canAddItem($item)  +	{  +		return ($item instanceof TAuthorizationRule);  +	}  +} +?><?php +  +  +  +  + +class TPageService extends TService  +{ +const CONFIG_FILE='config.xml'; +const DEFAULT_BASEPATH='pages'; +const CONFIG_CACHE_PREFIX='prado:pageservice:'; +const PAGE_FILE_EXT='.page'; +private $_id='page'; +private $_basePath=null; +private $_defaultPage='Home'; +private $_pagePath; +private $_page=null; +private $_properties; +private $_initialized=false; +private $_assetManager=null; +private $_themeManager=null; +private $_templateManager=null; +private $_pageStatePersister=null; +public function init($config)  +	{  + +		$application=$this->getApplication(); +$application->setPageService($this); +if($this->_basePath===null)  +		{  +			$basePath=$application->getBasePath().'/'.self::DEFAULT_BASEPATH;  +			if(($this->_basePath=realpath($basePath))===false || !is_dir($this->_basePath))  +				throw new TConfigurationException('pageservice_basepath_invalid',$basePath);  +		} +$this->_pagePath=$application->getRequest()->getServiceParameter();  +		if(empty($this->_pagePath))  +			$this->_pagePath=$this->_defaultPage;  +		if(empty($this->_pagePath))  +			throw new THttpException(404,'pageservice_page_required'); +if(($cache=$application->getCache())===null)  +		{  +			$pageConfig=new TPageConfiguration;  +			if($config!==null)  +				$pageConfig->loadXmlElement($config,$application->getBasePath(),null);  +			$pageConfig->loadConfigurationFiles($this->_pagePath,$this->_basePath);  +		}  +		else  +		{  +			$configCached=true;  +			$currentTimestamp=array();  +			$arr=$cache->get(self::CONFIG_CACHE_PREFIX.$this->_pagePath);  +			if(is_array($arr))  +			{  +				list($pageConfig,$timestamps)=$arr;  +				if($application->getMode()!==TApplication::STATE_PERFORMANCE)  +				{  +					foreach($timestamps as $fileName=>$timestamp)  +					{  +						if($fileName===0) 						{  +							$appConfigFile=$application->getConfigurationFile();  +							$currentTimestamp[0]=$appConfigFile===null?0:@filemtime($appConfigFile);  +							if($currentTimestamp[0]>$timestamp || ($timestamp>0 && !$currentTimestamp[0]))  +								$configCached=false;  +						}  +						else  +						{  +							$currentTimestamp[$fileName]=@filemtime($fileName);  +							if($currentTimestamp[$fileName]>$timestamp || ($timestamp>0 && !$currentTimestamp[$fileName]))  +								$configCached=false;  +						}  +					}  +				}  +			}  +			else  +			{  +				$configCached=false;  +				$paths=explode('.',$this->_pagePath);  +				array_pop($paths);  +				$configPath=$this->_basePath;  +				foreach($paths as $path)  +				{  +					$configFile=$configPath.'/'.self::CONFIG_FILE;  +					$currentTimestamp[$configFile]=@filemtime($configFile);  +					$configPath.='/'.$path;  +				}  +				$appConfigFile=$application->getConfigurationFile();  +				$currentTimestamp[0]=$appConfigFile===null?0:@filemtime($appConfigFile);  +			}  +			if(!$configCached)  +			{  +				$pageConfig=new TPageConfiguration;  +				if($config!==null)  +					$pageConfig->loadXmlElement($config,$application->getBasePath(),null);  +				$pageConfig->loadConfigurationFiles($this->_pagePath,$this->_basePath);  +				$cache->set(self::CONFIG_CACHE_PREFIX.$this->_pagePath,array($pageConfig,$currentTimestamp));  +			}  +		} +foreach($pageConfig->getAliases() as $alias=>$path)  +			Prado::setPathOfAlias($alias,$path);  +		foreach($pageConfig->getUsings() as $using)  +			Prado::using($using); +$this->_properties=$pageConfig->getProperties(); +$parameters=$application->getParameters();  +		foreach($pageConfig->getParameters() as $id=>$parameter)  +		{  +			if(is_string($parameter))  +				$parameters->add($id,$parameter);  +			else  +			{  +				$component=Prado::createComponent($parameter[0]);  +				foreach($parameter[1] as $name=>$value)  +					$component->setSubProperty($name,$value);  +				$parameters->add($id,$component);  +			}  +		} +foreach($pageConfig->getModules() as $id=>$moduleConfig)  +		{  + +			$module=Prado::createComponent($moduleConfig[0]);  +			$application->setModule($id,$module);  +			foreach($moduleConfig[1] as $name=>$value)  +				$module->setSubProperty($name,$value);  +			$module->init($moduleConfig[2]);  +		} +$application->getAuthorizationRules()->mergeWith($pageConfig->getRules()); +$this->_initialized=true;  +	} +public function getID()  +	{  +		return $this->_id;  +	} +public function setID($value)  +	{  +		$this->_id=$value;  +	} +public function getTemplateManager()  +	{  +		if(!$this->_templateManager)  +		{  +			$this->_templateManager=new TTemplateManager;  +			$this->_templateManager->init(null);  +		}  +		return $this->_templateManager;  +	} +public function setTemplateManager(TTemplateManager $value)  +	{  +		$this->_templateManager=$value;  +	} +public function getAssetManager()  +	{  +		if(!$this->_assetManager)  +		{  +			$this->_assetManager=new TAssetManager;  +			$this->_assetManager->init(null);  +		}  +		return $this->_assetManager;  +	} +public function setAssetManager(TAssetManager $value)  +	{  +		$this->_assetManager=$value;  +	} +public function getThemeManager()  +	{  +		if(!$this->_themeManager)  +		{  +			$this->_themeManager=new TThemeManager;  +			$this->_themeManager->init(null);  +		}  +		return $this->_themeManager;  +	} +public function setThemeManager(TThemeManager $value)  +	{  +		$this->_themeManager=$value;  +	} +public function getPageStatePersister()  +	{  +		if(!$this->_pageStatePersister)  +		{  +			$this->_pageStatePersister=new TPageStatePersister;  +			$this->_pageStatePersister->init(null);  +		}  +		return $this->_pageStatePersister;  +	} +public function setPageStatePersister(IStatePersister $value)  +	{  +		$this->_pageStatePersister=$value;  +	} +public function getRequestedPagePath()  +	{  +		return $this->_pagePath;  +	} +public function getRequestedPage()  +	{  +		return $this->_page;  +	} +public function getDefaultPage()  +	{  +		return $this->_defaultPage;  +	} +public function setDefaultPage($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('pageservice_defaultpage_unchangeable');  +		else  +			$this->_defaultPage=$value;  +	} +public function getBasePath()  +	{  +		return $this->_basePath;  +	} +public function setBasePath($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('pageservice_basepath_unchangeable');  +		else if(($this->_basePath=realpath(Prado::getPathOfNamespace($value)))===false || !is_dir($this->_basePath))  +			throw new TConfigurationException('pageservice_basepath_invalid',$value);  +	} +public function run()  +	{  + +		$page=null;  +		$path=$this->_basePath.'/'.strtr($this->_pagePath,'.','/');  +		if(is_file($path.self::PAGE_FILE_EXT))  +		{  +			if(is_file($path.Prado::CLASS_FILE_EXT))  +			{  +				$className=basename($path);  +				if(!class_exists($className,false))  +					include_once($path.Prado::CLASS_FILE_EXT);  +				if(!class_exists($className,false))  +					throw new TConfigurationException('pageservice_pageclass_unknown',$className);  +			}  +			else  +				$className='TPage';  +			$this->_properties['Template']=$this->getTemplateManager()->getTemplateByFileName($path.self::PAGE_FILE_EXT);  +			$this->_page=new $className($this->_properties);  +		}  +		else  +			throw new THttpException(404,'pageservice_page_unknown',$this->_pagePath); +$writer=$this->getResponse()->createHtmlWriter();  +		$this->_page->run($writer);  +		$writer->flush();  +	} +public function constructUrl($pagePath,$getParams=null,$encodeAmpersand=false)  +	{  +		return $this->getRequest()->constructUrl($this->_id,$pagePath,$getParams,$encodeAmpersand);  +	} +public function getAsset($path)  +	{  +		return $this->getAssetManager()->publishFilePath($path);  +	}  +} +class TPageConfiguration extends TComponent  +{ +private $_properties=array(); +private $_usings=array(); +private $_aliases=array(); +private $_modules=array(); +private $_parameters=array(); +private $_rules=array(); +public function getProperties()  +	{  +		return $this->_properties;  +	} +public function getAliases()  +	{  +		return $this->_aliases;  +	} +public function getUsings()  +	{  +		return $this->_usings;  +	} +public function getModules()  +	{  +		return $this->_modules;  +	} +public function getParameters()  +	{  +		return $this->_parameters;  +	} +public function getRules()  +	{  +		return $this->_rules;  +	} +public function loadConfigurationFiles($pagePath,$basePath)  +	{  +		$paths=explode('.',$pagePath);  +		$page=array_pop($paths);  +		$path=$basePath;  +		foreach($paths as $p)  +		{  +			$this->loadFromFile($path.'/'.TPageService::CONFIG_FILE,null);  +			$path.='/'.$p;  +		}  +		$this->loadFromFile($path.'/'.TPageService::CONFIG_FILE,$page);  +		$this->_rules=new TAuthorizationRuleCollection($this->_rules);  +	} +private function loadFromFile($fname,$page)  +	{  + +		if(empty($fname) || !is_file($fname))  +			return;  +		$dom=new TXmlDocument;  +		if($dom->loadFromFile($fname))  +			$this->loadXmlElement($dom,dirname($fname),$page);  +		else  +			throw new TConfigurationException('pageserviceconf_file_invalid',$fname);  +	} +public function loadXmlElement($dom,$configPath,$page)  +	{  +				if(($pathsNode=$dom->getElementByTagName('paths'))!==null)  +		{  +			foreach($pathsNode->getElementsByTagName('alias') as $aliasNode)  +			{  +				if(($id=$aliasNode->getAttribute('id'))!==null && ($p=$aliasNode->getAttribute('path'))!==null)  +				{  +					$p=str_replace('\\','/',$p);  +					$path=realpath(preg_match('/^\\/|.:\\//',$p)?$p:$configPath.'/'.$p);  +					if($path===false || !is_dir($path))  +						throw new TConfigurationException('pageserviceconf_aliaspath_invalid',$id,$p,$configPath);  +					if(isset($this->_aliases[$id]))  +						throw new TConfigurationException('pageserviceconf_alias_redefined',$id,$configPath);  +					$this->_aliases[$id]=$path;  +				}  +				else  +					throw new TConfigurationException('pageserviceconf_alias_invalid',$configPath);  +			}  +			foreach($pathsNode->getElementsByTagName('using') as $usingNode)  +			{  +				if(($namespace=$usingNode->getAttribute('namespace'))!==null)  +					$this->_usings[]=$namespace;  +				else  +					throw new TConfigurationException('pageserviceconf_using_invalid',$configPath);  +			}  +		} +if(($modulesNode=$dom->getElementByTagName('modules'))!==null)  +		{  +			foreach($modulesNode->getElementsByTagName('module') as $node)  +			{  +				$properties=$node->getAttributes();  +				$type=$properties->remove('class');  +				if(($id=$properties->itemAt('id'))===null)  +					throw new TConfigurationException('pageserviceconf_module_invalid',$configPath);  +				if(isset($this->_modules[$id]))  +				{  +					if($type===null || $type===$this->_modules[$id][0])  +					{  +						$this->_modules[$id][1]=array_merge($this->_modules[$id][1],$properties->toArray());  +						$elements=$this->_modules[$id][2]->getElements();  +						foreach($node->getElements() as $element)  +							$elements->add($element);  +					}  +					else  +					{  +						$node->setParent(null);  +						$this->_modules[$id]=array($type,$properties->toArray(),$node);  +					}  +				}  +				else if($type===null)  +					throw new TConfigurationException('pageserviceconf_moduletype_required',$id,$configPath);  +				else  +				{  +					$node->setParent(null);  +					$this->_modules[$id]=array($type,$properties->toArray(),$node);  +				}  +			}  +		} +if(($parametersNode=$dom->getElementByTagName('parameters'))!==null)  +		{  +			foreach($parametersNode->getElementsByTagName('parameter') as $node)  +			{  +				$properties=$node->getAttributes();  +				if(($id=$properties->remove('id'))===null)  +					throw new TConfigurationException('pageserviceconf_parameter_invalid',$configPath);  +				if(($type=$properties->remove('class'))===null)  +					$this->_parameters[$id]=$node->getValue();  +				else  +					$this->_parameters[$id]=array($type,$properties->toArray());  +			}  +		} +if(($authorizationNode=$dom->getElementByTagName('authorization'))!==null)  +		{  +			$rules=array();  +			foreach($authorizationNode->getElements() as $node)  +			{  +				$pages=$node->getAttribute('pages');  +				$ruleApplies=false;  +				if(empty($pages))  +					$ruleApplies=true;  +				else if($page!==null)  +				{  +					$ps=explode(',',$pages);  +					foreach($ps as $p)  +					{  +						if($page===trim($p))  +						{  +							$ruleApplies=true;  +							break;  +						}  +					}  +				}  +				if($ruleApplies)  +					$rules[]=new TAuthorizationRule($node->getTagName(),$node->getAttribute('users'),$node->getAttribute('roles'),$node->getAttribute('verb'));  +			}  +			$this->_rules=array_merge($rules,$this->_rules);  +		} +if(($pagesNode=$dom->getElementByTagName('pages'))!==null)  +		{  +			$this->_properties=array_merge($this->_properties,$pagesNode->getAttributes()->toArray());  +			if($page!==null)   			{  +				foreach($pagesNode->getElementsByTagName('page') as $node)  +				{  +					$properties=$node->getAttributes();  +					if(($id=$properties->itemAt('id'))===null)  +						throw new TConfigurationException('pageserviceconf_page_invalid',$configPath);  +					if($id===$page)  +						$this->_properties=array_merge($this->_properties,$properties->toArray());  +				}  +			}  +		}  +	}  +} +?><?php +class THtmlWriter extends TComponent implements ITextWriter  +{  +	const TAG_INLINE=0;  +	const TAG_NONCLOSING=1;  +	const TAG_OTHER=2;  +	const CHAR_NEWLINE="\n";  +	const CHAR_TAB="\t";  +	private static $_tagTypes=array(  +		'*'=>2,  +		'a'=>0,  +		'acronym'=>0,  +		'address'=>2,  +		'area'=>1,  +		'b'=>0,  +		'base'=>1,  +		'basefont'=>1,  +		'bdo'=>0,  +		'bgsound'=>1,  +		'big'=>0,  +		'blockquote'=>2,  +		'body'=>2,  +		'br'=>2,  +		'button'=>0,  +		'caption'=>2,  +		'center'=>2,  +		'cite'=>0,  +		'code'=>0,  +		'col'=>1,  +		'colgroup'=>2,  +		'del'=>0,  +		'dd'=>0,  +		'dfn'=>0,  +		'dir'=>2,  +		'div'=>2,  +		'dl'=>2,  +		'dt'=>0,  +		'em'=>0,  +		'embed'=>1,  +		'fieldset'=>2,  +		'font'=>0,  +		'form'=>2,  +		'frame'=>1,  +		'frameset'=>2,  +		'h1'=>2,  +		'h2'=>2,  +		'h3'=>2,  +		'h4'=>2,  +		'h5'=>2,  +		'h6'=>2,  +		'head'=>2,  +		'hr'=>1,  +		'html'=>2,  +		'i'=>0,  +		'iframe'=>2,  +		'img'=>1,  +		'input'=>1,  +		'ins'=>0,  +		'isindex'=>1,  +		'kbd'=>0,  +		'label'=>0,  +		'legend'=>2,  +		'li'=>0,  +		'link'=>1,  +		'map'=>2,  +		'marquee'=>2,  +		'menu'=>2,  +		'meta'=>1,  +		'nobr'=>0,  +		'noframes'=>2,  +		'noscript'=>2,  +		'object'=>2,  +		'ol'=>2,  +		'option'=>2,  +		'p'=>0,  +		'param'=>2,  +		'pre'=>2,  +		'ruby'=>2,  +		'rt'=>2,  +		'q'=>0,  +		's'=>0,  +		'samp'=>0,  +		'script'=>2,  +		'select'=>2,  +		'small'=>2,  +		'span'=>0,  +		'strike'=>0,  +		'strong'=>0,  +		'style'=>2,  +		'sub'=>0,  +		'sup'=>0,  +		'table'=>2,  +		'tbody'=>2,  +		'td'=>0,  +		'textarea'=>0,  +		'tfoot'=>2,  +		'th'=>0,  +		'thead'=>2,  +		'title'=>2,  +		'tr'=>2,  +		'tt'=>0,  +		'u'=>0,  +		'ul'=>2,  +		'var'=>0,  +		'wbr'=>1,  +		'xml'=>2  +	);  +	private static $_attrEncode=array(  +		'abbr'=>true,  +		'accesskey'=>true,  +		'alt'=>true,  +		'axis'=>true,  +		'background'=>true,  +		'class'=>true,  +		'content'=>true,  +		'headers'=>true,  +		'href'=>true,  +		'longdesc'=>true,  +		'onclick'=>true,  +		'onchange'=>true,  +		'src'=>true,  +		'title'=>true,  +		'value'=>true  +	);  +	private static $_styleEncode=array(  +		'background-image'=>true,  +		'list-style-image'=>true  +	);  +	private $_attributes=array();  +	private $_openTags=array();  +	private $_writer=null;  +	private $_styles=array(); +public function __construct($writer)  +	{  +		$this->_writer=$writer;  +	} +public function isValidFormAttribute($name)  +	{  +		return true;  +	} +public function addAttributes($attrs)  +	{  +		foreach($attrs as $name=>$value)  +			$this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value;  +	} +public function addAttribute($name,$value)  +	{  +		$this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value;  +	} +public function addStyleAttribute($name,$value)  +	{  +		$this->_styles[$name]=isset(self::$_styleEncode[$name])?THttpUtility::htmlEncode($value):$value;  +	} +public function flush()  +	{  +		$this->_writer->flush();  +	} +public function write($str)  +	{  +		$this->_writer->write($str);  +	} +public function writeLine($str='')  +	{  +		$this->_writer->write($str.self::CHAR_NEWLINE);  +	} +public function writeBreak()  +	{  +		$this->_writer->write('<br/>');  +	} +public function writeAttribute($name,$value,$encode=false)  +	{  +		$this->_writer->write(' '.$name.='"'.($encode?THttpUtility::htmlEncode($value):$value).'"');  +	} +public function renderBeginTag($tagName)  +	{  +		$tagType=isset(self::$_tagTypes[$tagName])?self::$_tagTypes[$tagName]:self::TAG_OTHER;  +		$str='<'.$tagName;  +		foreach($this->_attributes as $name=>$value)  +			$str.=' '.$name.'="'.$value.'"';  +		if(!empty($this->_styles))  +		{  +			$str.=' style="';  +			foreach($this->_styles as $name=>$value)  +				$str.=$name.':'.$value.';';  +			$str.='"';  +		}  +		if($tagType===self::TAG_NONCLOSING)  +		{  +			$str.=' />';  +			array_push($this->_openTags,'');  +		}  +		else  +		{  +			$str.='>';  +			array_push($this->_openTags,$tagName);  +		}  +		$this->_writer->write($str);  +		$this->_attributes=array();  +		$this->_styles=array();  +	} +public function renderEndTag()  +	{  +		if(!empty($this->_openTags) && ($tagName=array_pop($this->_openTags))!=='')  +			$this->_writer->write('</'.$tagName.'>');  +	}  +} +?><?php +class TTemplateManager extends TModule  +{ +const TEMPLATE_FILE_EXT='.tpl'; +const TEMPLATE_CACHE_PREFIX='prado:template:'; +public function init($config)  +	{  +		$this->getService()->setTemplateManager($this);  +	} +public function getTemplateByClassName($className)  +	{  +		$class=new ReflectionClass($className);  +		$tplFile=dirname($class->getFileName()).'/'.$className.self::TEMPLATE_FILE_EXT;  +		return $this->getTemplateByFileName($tplFile);  +	} +public function getTemplateByFileName($fileName)  +	{  +		if(!is_null($fileName=$this->getLocalizedTemplate($fileName)))  +		{  + +			if(($cache=$this->getApplication()->getCache())===null)  +				return new TTemplate(file_get_contents($fileName),dirname($fileName),$fileName);  +			else  +			{  +				$array=$cache->get(self::TEMPLATE_CACHE_PREFIX.$fileName);  +				if(is_array($array))  +				{  +					list($template,$timestamp)=$array;  +					if(filemtime($fileName)<$timestamp)  +						return $template;  +				}  +				$template=new TTemplate(file_get_contents($fileName),dirname($fileName),$fileName);  +				$cache->set(self::TEMPLATE_CACHE_PREFIX.$fileName,array($template,time()));  +				return $template;  +			}  +		}  +		else  +			return null;  +	} +protected function getLocalizedTemplate($filename)  +	{  +		$app = $this->getApplication()->getGlobalization();  +		if(is_null($app)) return $filename;  +		foreach($app->getLocalizedResource($filename) as $file)  +		{  +			if(($file=realpath($file))!==false && is_file($file))  +				return $file;  +		} +}  +} +class TTemplate extends TComponent implements ITemplate  +{ +const REGEX_RULES='/<!.*?!>|<!--.*?-->|<\/?com:([\w\.]+)((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?"|\s*[\w\.]+=<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?")*)\s*%>|<%[%#~\\$=\\[](.*?)%>/msS'; +const CONFIG_DATABIND=0;  +	const CONFIG_EXPRESSION=1;  +	const CONFIG_ASSET=2;  +	const CONFIG_PARAMETER=3;  +	const CONFIG_LOCALIZATION=4; +private $_tpl=array(); +private $_directive=array(); +private $_contextPath; +private $_tplFile=null; +private $_assetManager; +public function __construct($template,$contextPath,$tplFile=null)  +	{  +		$this->_contextPath=$contextPath;  +		$this->_tplFile=$tplFile;  +		$this->parse($template);  +	} +public function getContextPath()  +	{  +		return $this->_contextPath;  +	} +public function getDirective()  +	{  +		return $this->_directive;  +	} +public function &getItems()  +	{  +		return $this->_tpl;  +	} +public function instantiateIn($tplControl)  +	{  +		if(($page=$tplControl->getPage())===null)  +			$page=$this->getService()->getRequestedPage();  +		$this->_assetManager=$this->getService()->getAssetManager();  +		$controls=array();  +		foreach($this->_tpl as $key=>$object)  +		{  +			if(isset($object[2]))				{  +				$component=Prado::createComponent($object[1]);  +				if($component instanceof TControl)  +				{  +					$controls[$key]=$component;  +					$component->setTemplateControl($tplControl);  +					if(isset($object[2]['id']))  +						$tplControl->registerObject($object[2]['id'],$component);  +					if(isset($object[2]['skinid']))  +					{  +						$component->setSkinID($object[2]['skinid']);  +						unset($object[2]['skinid']);  +					}  +					$component->applyStyleSheetSkin($page);  +										foreach($object[2] as $name=>$value)  +						$this->configureControl($component,$name,$value);  +					$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;  +					$component->createdOnTemplate($parent);  +				}  +				else if($component instanceof TComponent)  +				{  +					if(isset($object[2]['id']))  +					{  +						$tplControl->registerObject($object[2]['id'],$component);  +						if(!$component->hasProperty('id'))  +							unset($object[2]['id']);  +					}  +					foreach($object[2] as $name=>$value)  +						$this->configureComponent($component,$name,$value);  +					$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;  +					$parent->addParsedObject($component);  +				}  +				else  +					throw new TTemplateRuntimeException('template_component_required',$object[1]);  +			}  +			else				{  +				if(isset($controls[$object[0]]))  +					$controls[$object[0]]->addParsedObject($object[1]);  +				else  +					$tplControl->addParsedObject($object[1]);  +			}  +		}  +	} +protected function configureControl($control,$name,$value)  +	{  +		if(is_string($value) && $control->hasEvent($name))					$this->configureEvent($control,$name,$value);  +		else if(strpos($name,'.')===false)			{  +			if($control->hasProperty($name))  +				$this->configureProperty($control,$name,$value);  +			else if($control->getAllowCustomAttributes())  +				$this->configureAttribute($control,$name,$value);  +			else  +				throw new TTemplateRuntimeException('template_property_undefined',get_class($control),$name);  +		}  +		else			{  +			$this->configureSubProperty($control,$name,$value);  +		}  +	} +protected function configureComponent($component,$name,$value)  +	{  +		if(strpos($name,'.')===false)			{  +			if($component->hasProperty($name))  +				$this->configureProperty($component,$name,$value);  +			else  +				throw new TTemplateRuntimeException('template_property_undefined',get_class($component),$name);  +		}  +		else			{  +			$this->configureSubProperty($component,$name,$value);  +		}  +	} +protected function configureEvent($component,$name,$value)  +	{  +		$value=THttpUtility::htmlDecode($value);  +		if(strpos($value,'.')===false)  +			$component->attachEventHandler($name,array($component,'TemplateControl.'.$value));  +		else  +			$component->attachEventHandler($name,array($component,$value));  +	} +protected function configureProperty($component,$name,$value)  +	{  +		if($component->canSetProperty($name))  +		{  +			$setter='set'.$name;  +			if(is_array($value))  +			{  +				$v=THttpUtility::htmlDecode($value[1]);  +				switch($value[0])  +				{  +					case self::CONFIG_DATABIND:  +						$component->bindProperty($name,$v);  +						break;  +					case self::CONFIG_EXPRESSION:  +						$component->$setter($component->evaluateExpression($v));  +						break;  +					case self::CONFIG_ASSET:								$url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$v);  +						$component->$setter($url);  +						break;  +					case self::CONFIG_PARAMETER:								$component->$setter($this->getApplication()->getParameters()->itemAt($v));  +						break;  +					case self::CONFIG_LOCALIZATION:  +						$component->$setter(localize($v));  +						break;  +					default:							break;  +				}  +			}  +			else  +				$component->$setter(THttpUtility::htmlDecode($value));  +		}  +		else  +			throw new TTemplateRuntimeException('template_property_readonly',get_class($component),$name);  +	} +protected function configureSubProperty($component,$name,$value)  +	{  +		if(is_array($value))  +		{  +			$v=THttpUtility::htmlDecode($value[1]);  +			switch($value[0])  +			{  +				case self::CONFIG_DATABIND:							$component->bindProperty($name,$v);  +					break;  +				case self::CONFIG_EXPRESSION:							$component->setSubProperty($name,$component->evaluateExpression($v));  +					break;  +				case self::CONFIG_ASSET:							$url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$v);  +					$component->setSubProperty($name,$url);  +					break;  +				case self::CONFIG_PARAMETER:							$component->setSubProperty($name,$this->getApplication()->getParameters()->itemAt($v));  +					break;  +				case self::CONFIG_LOCALIZATION:  +					$component->setSubProperty($name,localize($v));  +					break;  +				default:						break;  +			}  +		}  +		else  +			$component->setSubProperty($name,THttpUtility::htmlDecode($value));  +	} +protected function configureAttribute($control,$name,$value)  +	{  +		if(is_array($value))  +		{  +			switch($value[0])  +			{  +				case self::CONFIG_DATABIND:							throw new TTemplateRuntimeException('template_attribute_unbindable',get_class($control),$name);  +				case self::CONFIG_EXPRESSION:  +					$value=$control->evaluateExpression($value[1]);  +					break;  +				case self::CONFIG_ASSET:  +					$value=$this->_assetManager->publishFilePath($this->_contextPath.'/'.ltrim($value[1],'/'));  +					break;  +				case self::CONFIG_PARAMETER:  +					$value=$this->getApplication()->getParameters()->itemAt($value[1]);  +					break;  +				case self::CONFIG_LOCALIZATION:  +					$value=localize($value[1]);  +					break;  +				default:  +					break;  +			}  +		}  +		$control->getAttributes()->add($name,$value);  +	} +protected function parse($input)  +	{  +		$tpl=&$this->_tpl;  +		$n=preg_match_all(self::REGEX_RULES,$input,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE);  +		$expectPropEnd=false;  +		$textStart=0;  +        $stack=array();  +		$container=-1;  +		$c=0;  +		for($i=0;$i<$n;++$i)  +		{  +			$match=&$matches[$i];  +			$str=$match[0][0];  +			$matchStart=$match[0][1];  +			$matchEnd=$matchStart+strlen($str)-1;  +			if(strpos($str,'<com:')===0)				{  +				if($expectPropEnd)  +					continue;  +				if($matchStart>$textStart)  +					$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));  +				$textStart=$matchEnd+1;  +				$type=$match[1][0];  +				$attributes=$this->parseAttributes($match[2][0]);  +				$tpl[$c++]=array($container,$type,$attributes);  +				if($str[strlen($str)-2]!=='/')  				{  +					array_push($stack,$type);  +					$container=$c-1;  +				}  +			}  +			else if(strpos($str,'</com:')===0)				{  +				if($expectPropEnd)  +					continue;  +				if($matchStart>$textStart)  +					$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));  +				$textStart=$matchEnd+1;  +				$type=$match[1][0]; +if(empty($stack))  +				{  +					$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +					if($this->_tplFile===null)  +						throw new TTemplateParsingException('template_closingtag_unexpected',"Line $line","</com:$type>");  +					else  +						throw new TTemplateParsingException('template_closingtag_unexpected',"{$this->_tplFile} (Line $line)","</com:$type>");  +				} +$name=array_pop($stack);  +				if($name!==$type)  +				{  +					if($name[0]==='@')  +						$tag='</prop:'.substr($name,1).'>';  +					else  +						$tag='</com:'.$name.'>';  +					$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +					if($this->_tplFile===null)  +						throw new TTemplateParsingException('template_closingtag_expected',"Line $line",$tag);  +					else  +						throw new TTemplateParsingException('template_closingtag_expected',"{$this->_tplFile} (Line $line)",$tag);  +				}  +				$container=$tpl[$container][0];  +			}  +			else if(strpos($str,'<%@')===0)				{  +				if($expectPropEnd)  +					continue;  +				if($matchStart>$textStart)  +					$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));  +				$textStart=$matchEnd+1;  +				if(isset($tpl[0]))  +				{  +					$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +					if($this->_tplFile===null)  +						throw new TTemplateParsingException('template_directive_nonunique',"Line $line");  +					else  +						throw new TTemplateParsingException('template_directive_nonunique',"{$this->_tplFile} (Line $line)");  +				}  +				$this->_directive=$this->parseAttributes($match[4][0]);  +			}  +			else if(strpos($str,'<%')===0)				{  +				if($expectPropEnd)  +					continue;  +				if($matchStart>$textStart)  +					$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));  +				$textStart=$matchEnd+1;  +				if($str[2]==='=')						$tpl[$c++]=array($container,'TExpression',array('Expression'=>$match[5][0]));  +				else if($str[2]==='%')  					$tpl[$c++]=array($container,'TStatements',array('Statements'=>$match[5][0]));  +				else  +					$tpl[$c++]=array($container,'TLiteral',array('Text'=>$this->parseAttribute($str)));  +			}  +			else if(strpos($str,'<prop:')===0)				{  +				$prop=strtolower($match[3][0]);  +				array_push($stack,'@'.$prop);  +				if(!$expectPropEnd)  +				{  +					if($matchStart>$textStart)  +						$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));  +					$textStart=$matchEnd+1;  +					$expectPropEnd=true;  +				}  +			}  +			else if(strpos($str,'</prop:')===0)				{  +				$prop=strtolower($match[3][0]);  +				if(empty($stack))  +				{  +					$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +					if($this->_tplFile===null)  +						throw new TTemplateParsingException('template_closingtag_unexpected',"Line $line","</prop:$prop>");  +					else  +						throw new TTemplateParsingException('template_closingtag_unexpected',"{$this->_tplFile} (Line $line)","</prop:$prop>");  +				}  +				$name=array_pop($stack);  +				if($name!=='@'.$prop)  +				{  +					if($name[0]==='@')  +						$tag='</prop:'.substr($name,1).'>';  +					else  +						$tag='</com:'.$name.'>';  +					$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +					if($this->_tplFile===null)  +						throw new TTemplateParsingException('template_closingtag_expected',"Line $line",$tag);  +					else  +						throw new TTemplateParsingException('template_closingtag_expected',"{$this->_tplFile} (Line $line)",$tag);  +				}  +				if(($last=count($stack))<1 || $stack[$last-1][0]!=='@')  +				{  +					if($matchStart>$textStart && $container>=0)  +					{  +						$value=substr($input,$textStart,$matchStart-$textStart);  +						$tpl[$container][2][$prop]=$this->parseAttribute($value);  +						$textStart=$matchEnd+1;  +					}  +					$expectPropEnd=false;  +				}  +			}  +			else if(strpos($str,'<!--')===0)				{  +				$state=0;  +			}  +			else if(strpos($str,'<!')===0)					{  +				if($expectPropEnd)  +				{  +					$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +					if($this->_tplFile===null)  +						throw new TTemplateParsingException('template_comments_forbidden',"Line $line");  +					else  +						throw new TTemplateParsingException('template_comments_forbidden',"{$this->_tplFile} (Line $line)");  +				}  +				if($matchStart>$textStart)  +					$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));  +				$textStart=$matchEnd+1;  +			}  +			else  +			{  +				$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +				if($this->_tplFile===null)  +					throw new TTemplateParsingException('template_matching_unexpected',"Line $line",$match);  +				else  +					throw new TTemplateParsingException('template_matching_unexpected',"{$this->_tplFile} (Line $line)",$match);  +			}  +		}  +		if(!empty($stack))  +		{  +			$name=array_pop($stack);  +			if($name[0]==='@')  +				$tag='</prop:'.substr($name,1).'>';  +			else  +				$tag='</com:'.$name.'>';  +			$line=count(explode("\n",substr($input,0,$matchEnd+1)));  +			if($this->_tplFile===null)  +				throw new TTemplateParsingException('template_closingtag_expected',"Line $line",$tag);  +			else  +				throw new TTemplateParsingException('template_closingtag_expected',"{$this->_tplFile} (Line $line)",$tag);  +		}  +		if($textStart<strlen($input))  +			$tpl[$c++]=array($container,substr($input,$textStart));  +		return $tpl;  +	} +protected function parseAttributes($str)  +	{  +		if($str==='')  +			return array();  +		$pattern='/([\w\.]+)=(\'.*?\'|".*?"|<%.*?%>)/msS';  +		$attributes=array();  +		$n=preg_match_all($pattern,$str,$matches,PREG_SET_ORDER);  +		for($i=0;$i<$n;++$i)  +		{  +			$name=strtolower($matches[$i][1]);  +			$value=$matches[$i][2];  +			if($value[0]==='\'' || $value[0]==='"')  +				$value=substr($value,1,strlen($value)-2);  +			$attributes[$name]=$this->parseAttribute($value);  +		}  +		return $attributes;  +	} +protected function parseAttribute($value)  +	{  +		$matches=array();  +		if(!preg_match('/^(<%#.*?%>|<%=.*?%>|<%~.*?%>|<%\\$.*?%>|<%\\[.*?\\]%>)$/msS',$value,$matches))  +			return $value;  +		$value=$matches[1];  +		if($value[2]==='#') 			return array(self::CONFIG_DATABIND,substr($value,3,strlen($value)-5));  +		else if($value[2]==='=') 			return array(self::CONFIG_EXPRESSION,substr($value,3,strlen($value)-5));  +		else if($value[2]==='~') 			return array(self::CONFIG_ASSET,trim(substr($value,3,strlen($value)-5)));  +		else if($value[2]==='[')  +			return array(self::CONFIG_LOCALIZATION,trim(substr($value,3,strlen($value)-6)));  +		else if($value[2]==='$')  +			return array(self::CONFIG_PARAMETER,trim(substr($value,3,strlen($value)-5)));  +	}  +} +?><?php +class TThemeManager extends TModule  +{ +const DEFAULT_BASEPATH='themes'; +private $_initialized=false; +private $_basePath=null; +private $_baseUrl=null; +public function init($config)  +	{  +		$this->_initialized=true;  +		$this->getService()->setThemeManager($this);  +	} +public function getTheme($name)  +	{  +		$themePath=$this->getBasePath().'/'.$name;  +		$themeUrl=$this->getBaseUrl().'/'.$name;  +		return new TTheme($themePath,$themeUrl); +} +public function getBasePath()  +	{  +		if($this->_basePath===null)  +		{  +			$this->_basePath=dirname($this->getRequest()->getPhysicalApplicationPath()).'/'.self::DEFAULT_BASEPATH;  +			if(($basePath=realpath($this->_basePath))===false || !is_dir($basePath))  +				throw new TConfigurationException('thememanager_basepath_invalid',$this->_basePath);  +			$this->_basePath=$basePath;  +		}  +		return $this->_basePath;  +	} +public function setBasePath($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('thememanager_basepath_unchangeable');  +		else  +		{  +			$this->_basePath=Prado::getPathOfAlias($value);  +			if($this->_basePath===null || !is_dir($this->_basePath))  +				throw new TInvalidDataValueException('thememanager_basepath_invalid',$value);  +			$this->_basePath=$value;  +		}  +	} +public function getBaseUrl()  +	{  +		if($this->_baseUrl===null)  +		{  +			$appPath=dirname($this->getRequest()->getPhysicalApplicationPath());  +			$basePath=$this->getBasePath();  +			if(strpos($basePath,$appPath)===false)  +				throw new TConfigurationException('thememanager_baseurl_required');  +			$appUrl=dirname($this->getRequest()->getApplicationPath());  +			$this->_baseUrl=$appUrl.strtr(substr($basePath,strlen($appPath)),'\\','/');  +		}  +		return $this->_baseUrl;  +	} +public function setBaseUrl($value)  +	{  +		$this->_baseUrl=rtrim($value,'/');  +	}  +} +class TTheme extends TComponent  +{ +const THEME_CACHE_PREFIX='prado:theme:'; +const SKIN_FILE_EXT='.skin'; +private $_themePath; +private $_themeUrl; +private $_skins=null; +private $_name=''; +private $_cssFiles=array(); +private $_jsFiles=array(); +public function __construct($themePath,$themeUrl)  +	{  +		$this->_themeUrl=$themeUrl;  +		$this->_name=basename($themePath);  +		if(($cache=$this->getApplication()->getCache())!==null)  +		{  +			$array=$cache->get(self::THEME_CACHE_PREFIX.$themePath);  +			if(is_array($array))  +			{  +				list($skins,$cssFiles,$jsFiles,$timestamp)=$array;  +				$cacheValid=true;  +				if($this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE)  +				{  +					if(($dir=opendir($themePath))===false)  +						throw new TIOException('theme_path_inexistent',$themePath);  +					while(($file=readdir($dir))!==false)  +					{  +						if($file==='.' || $file==='..')  +							continue;  +						else if(basename($file,'.css')!==$file)  +							$this->_cssFiles[]=$themeUrl.'/'.$file;  +						else if(basename($file,'.js')!==$file)  +							$this->_jsFiles[]=$themeUrl.'/'.$file;  +						else if(basename($file,self::SKIN_FILE_EXT)!==$file && filemtime($themePath.'/'.$file)>$timestamp)  +						{  +							$cacheValid=false;  +							break;  +						}  +					}  +					closedir($dir);  +					if($cacheValid)  +						$this->_skins=$skins;  +				}  +				else  +				{  +					$this->_cssFiles=$cssFiles;  +					$this->_jsFiles=$jsFiles;  +					$this->_skins=$skins;  +				}  +			}  +		}  +		if($this->_skins===null)  +		{  +			if(($dir=opendir($themePath))===false)  +				throw new TIOException('theme_path_inexistent',$themePath);  +			while(($file=readdir($dir))!==false)  +			{  +				if($file==='.' || $file==='..')  +					continue;  +				else if(basename($file,'.css')!==$file)  +					$this->_cssFiles[]=$themeUrl.'/'.$file;  +				else if(basename($file,'.js')!==$file)  +					$this->_jsFiles[]=$themeUrl.'/'.$file;  +				else if(basename($file,self::SKIN_FILE_EXT)!==$file)  +				{  +					$template=new TTemplate(file_get_contents($themePath.'/'.$file),$themePath,$themePath.'/'.$file);  +					foreach($template->getItems() as $skin)  +					{  +						if($skin[0]!==-1)  +							throw new TConfigurationException('theme_control_nested',$skin[1],dirname($themePath));  +						else if(!isset($skin[2]))  							continue;  +						$type=$skin[1];  +						$id=isset($skin[2]['skinid'])?$skin[2]['skinid']:0;  +						unset($skin[2]['skinid']);  +						if(isset($this->_skins[$type][$id]))  +							throw new TConfigurationException('theme_skinid_duplicated',$type,$id,dirname($themePath));  +						foreach($skin[2] as $name=>$value)  +						{  +							if(is_array($value) && ($value[0]===TTemplate::CONFIG_DATABIND || $value[0]===TTemplate::CONFIG_PARAMETER))  +								throw new TConfigurationException('theme_databind_forbidden',dirname($themePath),$type,$id);  +						}  +						$this->_skins[$type][$id]=$skin[2];  +					}  +				}  +			}  +			closedir($dir);  +			if($cache!==null)  +				$cache->set(self::THEME_CACHE_PREFIX.$themePath,array($this->_skins,$this->_cssFiles,$this->_jsFiles,time()));  +		}  +	} +public function getName()  +	{  +		return $this->_name;  +	} +public function applySkin($control)  +	{  +		$type=get_class($control);  +		if(($id=$control->getSkinID())==='')  +			$id=0;  +		if(isset($this->_skins[$type][$id]))  +		{  +			foreach($this->_skins[$type][$id] as $name=>$value)  +			{  + +				if(is_array($value))  +				{  +					if($value[0]===TTemplate::CONFIG_EXPRESSION)  +						$value=$this->evaluateExpression($value[1]);  +					else if($value[0]===TTemplate::CONFIG_ASSET)  +						$value=$this->_themeUrl.'/'.ltrim($value[1],'/');  +				}  +				if(strpos($name,'.')===false)					{  +					if($control->hasProperty($name))  +					{  +						if($control->canSetProperty($name))  +						{  +							$setter='set'.$name;  +							$control->$setter($value);  +						}  +						else  +							throw new TConfigurationException('theme_property_readonly',$type,$name);  +					}  +					else if($control->getAllowCustomAttributes())  +						$control->getAttributes()->add($name,$value);  +					else  +						throw new TConfigurationException('theme_property_undefined',$type,$name);  +				}  +				else						$control->setSubProperty($name,$value);  +			}  +			return true;  +		}  +		else  +			return false;  +	} +public function getStyleSheetFiles()  +	{  +		return $this->_cssFiles;  +	} +public function getJavaScriptFiles()  +	{  +		return $this->_jsFiles;  +	}  +} +?><?php +class TAssetManager extends TModule  +{ +const DEFAULT_BASEPATH='assets'; +private $_basePath=null; +private $_baseUrl=null; +private $_checkTimestamp=false; +private $_application; +private $_published=array(); +public function init($config)  +	{  +		$application=$this->getApplication();  +		if($this->_basePath===null)  +			$this->_basePath=dirname($application->getRequest()->getPhysicalApplicationPath()).'/'.self::DEFAULT_BASEPATH;  +		if(!is_writable($this->_basePath) || !is_dir($this->_basePath))  +			throw new TConfigurationException('assetmanager_basepath_invalid',$this->_basePath);  +		if($this->_baseUrl===null)  +			$this->_baseUrl=dirname($application->getRequest()->getApplicationPath()).'/'.self::DEFAULT_BASEPATH;  +		$application->getService()->setAssetManager($this);  +	} +public function getBasePath()  +	{  +		return $this->_basePath;  +	} +public function setBasePath($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('assetmanager_basepath_unchangeable');  +		else  +		{  +			$this->_basePath=Prado::getPathOfAlias($value);  +			if($this->_basePath===null || !is_dir($this->_basePath) || !is_writable($this->_basePath))  +				throw new TInvalidDataValueException('assetmanage_basepath_invalid',$value);  +		}  +	} +public function getBaseUrl()  +	{  +		return $this->_baseUrl;  +	} +public function setBaseUrl($value)  +	{  +		if($this->_initialized)  +			throw new TInvalidOperationException('assetmanager_baseurl_unchangeable');  +		else  +			$this->_baseUrl=$value;  +	} +public function publishFilePath($path,$checkTimestamp=false)  +	{  +		if(isset($this->_published[$path]))  +			return $this->_published[$path];  +		else if(($fullpath=realpath($path))===false)  +			return '';  +		else if(is_file($fullpath))  +		{  +			$dir=$this->hash(dirname($fullpath));  +			$file=$this->_basePath.'/'.$dir.'/'.basename($fullpath);  +			if(!is_file($file) || $checkTimestamp || $this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE)  +			{  +				if(!is_dir($this->_basePath.'/'.$dir))  +					@mkdir($this->_basePath.'/'.$dir);  +				if(!is_file($file) || @filemtime($file)<@filemtime($fullpath))  +				{  + +					@copy($fullpath,$file);  +				}  +			}  +			$this->_published[$path]=$this->_baseUrl.'/'.$dir.'/'.basename($fullpath);  +			return $this->_published[$path];  +		}  +		else  +		{  +			$dir=$this->hash($fullpath);  +			if(!is_dir($this->_basePath.'/'.$dir) || $checkTimestamp || $this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE)  +			{  + +				$this->copyDirectory($fullpath,$this->_basePath.'/'.$dir);  +			}  +			$this->_published[$path]=$this->_baseUrl.'/'.$dir;  +			return $this->_published[$path];  +		}  +	} +private function hash($dir)  +	{  +		return sprintf('%x',crc32($dir));  +	} +protected function copyDirectory($src,$dst)  +	{  +		if(!is_dir($dst))  +			@mkdir($dst);  +		$folder=@opendir($src);  +		while($file=@readdir($folder))  +		{  +			if($file==='.' || $file==='..')  +				continue;  +			else if(is_file($src.'/'.$file))  +			{  +				if(@filemtime($dst.'/'.$file)<@filemtime($src.'/'.$file))  +					@copy($src.'/'.$file,$dst.'/'.$file);  +			}  +			else  +				$this->copyDirectory($src.'/'.$file,$dst.'/'.$file);  +		}  +		closedir($folder);  +	}  +} +?><?php +class TPageStatePersister extends TModule implements IStatePersister  +{ +private $_privateKey=null; +public function init($config)  +	{  +		$this->getService()->setPageStatePersister($this);  +	} +public function save($state)  +	{  + +		$data=Prado::serialize($state);  +		$hmac=$this->computeHMAC($data,$this->getPrivateKey());  +		if(extension_loaded('zlib'))  +			$data=gzcompress($hmac.$data);  +		else  +			$data=$hmac.$data;  +		$this->getService()->getRequestedPage()->getClientScript()->registerHiddenField(TPage::FIELD_PAGESTATE,base64_encode($data));  +	} +public function load()  +	{  + +		$str=base64_decode($this->getApplication()->getRequest()->getItems()->itemAt(TPage::FIELD_PAGESTATE));  +		if($str==='')  +			return null;  +		if(extension_loaded('zlib'))  +			$data=gzuncompress($str);  +		else  +			$data=$str;  +		if($data!==false && strlen($data)>32)  +		{  +			$hmac=substr($data,0,32);  +			$state=substr($data,32);  +			if($hmac===$this->computeHMAC($state,$this->getPrivateKey()))  +				return Prado::unserialize($state);  +		}  +		throw new THttpException(400,'pagestatepersister_pagestate_corrupted');  +	} +protected function generatePrivateKey()  +	{  +		$v1=rand();  +		$v2=rand();  +		$v3=rand();  +		return md5("$v1$v2$v3");  +	} +public function getPrivateKey()  +	{  +		if(empty($this->_privateKey))  +		{  +			if(($this->_privateKey=$this->getApplication()->getGlobalState('prado:pagestatepersister:privatekey'))===null)  +			{  +				$this->_privateKey=$this->generatePrivateKey();  +				$this->getApplication()->setGlobalState('prado:pagestatepersister:privatekey',$this->_privateKey,null);  +			}  +		}  +		return $this->_privateKey;  +	} +public function setPrivateKey($value)  +	{  +		if(strlen($value)<8)  +			throw new TInvalidDataValueException('pagestatepersister_privatekey_invalid');  +		$this->_privateKey=$value;  +	} +private function computeHMAC($data,$key)  +	{  +		if (strlen($key) > 64)  +			$key = pack('H32', md5($key));  +		else if (strlen($key) < 64)  +			$key = str_pad($key, 64, "\0");  +		return md5((str_repeat("\x5c", 64) ^ substr($key, 0, 64)) . pack('H32', md5((str_repeat("\x36", 64) ^ substr($key, 0, 64)) . $data)));  +	}  +} +?><?php +class TControl extends TComponent  +{ +const ID_FORMAT='/^\\w*$/'; +const ID_SEPARATOR='$'; +const CLIENT_ID_SEPARATOR='_'; +const AUTOMATIC_ID_PREFIX='ctl'; +const CS_CONSTRUCTED=0;  +	const CS_CHILD_INITIALIZED=1;  +	const CS_INITIALIZED=2;  +	const CS_STATE_LOADED=3;  +	const CS_LOADED=4;  +	const CS_PRERENDERED=5; +const IS_ID_SET=0x01;  +	const IS_DISABLE_VIEWSTATE=0x02;  +	const IS_SKIN_APPLIED=0x04;  +	const IS_STYLESHEET_APPLIED=0x08;  +	const IS_DISABLE_THEMING=0x10;  +	const IS_CHILD_CREATED=0x20;  +	const IS_CREATING_CHILD=0x40; +const RF_CONTROLS=0;				const RF_CHILD_STATE=1;				const RF_NAMED_CONTROLS=2;			const RF_NAMED_CONTROLS_ID=3;		const RF_SKIN_ID=4;					const RF_DATA_BINDINGS=5;			const RF_EVENTS=6;					const RF_CONTROLSTATE=7;			const RF_NAMED_OBJECTS=8; +private $_id=''; +private $_uid=''; +private $_parent=null; +private $_page=null; +private $_namingContainer=null; +private $_tplControl=null; +private $_viewState=array(); +private $_stage=0; +private $_flags=0; +private $_rf=array(); +public function __get($name)  +	{  +		if(isset($this->_rf[self::RF_NAMED_OBJECTS][$name]))  +			return $this->_rf[self::RF_NAMED_OBJECTS][$name];  +		else  +			return parent::__get($name);  +	} +public function getParent()  +	{  +		return $this->_parent;  +	} +public function getNamingContainer()  +	{  +		if(!$this->_namingContainer && $this->_parent)  +		{  +			if($this->_parent instanceof INamingContainer)  +				$this->_namingContainer=$this->_parent;  +			else  +				$this->_namingContainer=$this->_parent->getNamingContainer();  +		}  +		return $this->_namingContainer;  +	} +public function getPage()  +	{  +		if(!$this->_page)  +		{  +			if($this->_parent)  +				$this->_page=$this->_parent->getPage();  +			else if($this->_tplControl)  +				$this->_page=$this->_tplControl->getPage();  +		}  +		return $this->_page;  +	} +public function setPage($page)  +	{  +		$this->_page=$page;  +	} +public function setTemplateControl($control)  +	{  +		$this->_tplControl=$control;  +	} +public function getTemplateControl()  +	{  +		if(!$this->_tplControl && $this->_parent)  +			$this->_tplControl=$this->_parent->getTemplateControl();  +		return $this->_tplControl;  +	} +public function getAsset($assetPath)  +	{  +		$class=new ReflectionClass(get_class($this));  +		$assetPath=dirname($class->getFileName()).'/'.$assetPath;  +		return $this->getService()->getAsset($assetPath);  +	} +public function getID($hideAutoID=true)  +	{  +		if($hideAutoID)  +			return ($this->_flags & self::IS_ID_SET) ? $this->_id : '';  +		else  +			return $this->_id;  +	} +public function setID($id)  +	{  +		if(!preg_match(self::ID_FORMAT,$id))  +			throw new TInvalidDataValueException('control_id_invalid',get_class($this),$id);  +		$this->_id=$id;  +		$this->_flags |= self::IS_ID_SET;  +		$this->clearCachedUniqueID($this instanceof INamingContainer);  +		if($this->_namingContainer)  +			$this->_namingContainer->clearNameTable();  +	} +public function getUniqueID()  +	{  +		if($this->_uid==='')			{  +			if($namingContainer=$this->getNamingContainer())  +			{  +				if($this->getPage()===$namingContainer)  +					return ($this->_uid=$this->_id);  +				else if(($prefix=$namingContainer->getUniqueID())==='')  +					return $this->_id;  +				else  +					return ($this->_uid=$prefix.self::ID_SEPARATOR.$this->_id);  +			}  +			else					return $this->_id;  +		}  +		else  +			return $this->_uid;  +	} +public function focus()  +	{  +		$this->getPage()->setFocus($this);  +	} +public function getClientID()  +	{  +		return strtr($this->getUniqueID(),self::ID_SEPARATOR,self::CLIENT_ID_SEPARATOR);  +	} +public function getSkinID()  +	{  +		return isset($this->_rf[self::RF_SKIN_ID])?$this->_rf[self::RF_SKIN_ID]:'';  +	} +public function setSkinID($value)  +	{  +		if(($this->_flags & self::IS_SKIN_APPLIED) || $this->_stage>=self::CS_CHILD_INITIALIZED)  +			throw new TInvalidOperationException('control_skinid_unchangeable',get_class($this));  +		else  +			$this->_rf[self::RF_SKIN_ID]=$value;  +	} +public function getEnableTheming()  +	{  +		if($this->_flags & self::IS_DISABLE_THEMING)  +			return false;  +		else  +			return $this->_parent?$this->_parent->getEnableTheming():true;  +	} +public function setEnableTheming($value)  +	{  +		if($this->_stage>=self::CS_CHILD_INITIALIZED)  +			throw new TInvalidOperationException('control_enabletheming_unchangeable',get_class($this),$this->getUniqueID());  +		else if(TPropertyValue::ensureBoolean($value))  +			$this->_flags &= ~self::IS_DISABLE_THEMING;  +		else  +			$this->_flags |= self::IS_DISABLE_THEMING;  +	} +public function getHasControls()  +	{  +		return isset($this->_rf[self::RF_CONTROLS]) && $this->_rf[self::RF_CONTROLS]->getCount()>0;  +	} +public function getControls()  +	{  +		if(!isset($this->_rf[self::RF_CONTROLS]))  +			$this->_rf[self::RF_CONTROLS]=new TControlList($this);  +		return $this->_rf[self::RF_CONTROLS];  +	} +public function getVisible($checkParents=true)  +	{  +		if($checkParents)  +		{  +			for($control=$this;$control;$control=$control->_parent)  +				if(!$control->getViewState('Visible',true))  +					return false;  +			return true;  +		}  +		else  +			return $this->getViewState('Visible',true);  +	} +public function setVisible($value)  +	{  +		$this->setViewState('Visible',TPropertyValue::ensureBoolean($value),true);  +	} +public function getEnabled($checkParents=false)  +	{  +		if($checkParents)  +		{  +			for($control=$this;$control;$control=$control->_parent)  +				if(!$control->getViewState('Enabled',true))  +					return false;  +			return true;  +		}  +		else  +			return $this->getViewState('Enabled',true);  +	} +public function setEnabled($value)  +	{  +		$this->setViewState('Enabled',TPropertyValue::ensureBoolean($value),true);  +	} +public function getHasAttributes()  +	{  +		if($attributes=$this->getViewState('Attributes',null))  +			return $attributes->getCount()>0;  +		else  +			return false;  +	} +public function getAttributes()  +	{  +		if($attributes=$this->getViewState('Attributes',null))  +			return $attributes;  +		else  +		{  +			$attributes=new TMap;  +			$this->setViewState('Attributes',$attributes,null);  +			return $attributes;  +		}  +	} +public function hasAttribute($name)  +	{  +		if($attributes=$this->getViewState('Attributes',null))  +			return $attributes->contains($name);  +		else  +			return false;  +	} +public function getAttribute($name)  +	{  +		if($attributes=$this->getViewState('Attributes',null))  +			return $attributes->itemAt($name);  +		else  +			return null;  +	} +public function setAttribute($name,$value)  +	{  +		$this->getAttributes()->add($name,$value);  +	} +public function removeAttribute($name)  +	{  +		if($attributes=$this->getViewState('Attributes',null))  +			return $attributes->remove($name);  +		else  +			return null;  +	} +public function getAllowCustomAttributes()  +	{  +		return true;  +	} +public function getEnableViewState($checkParents=false)  +	{  +		if($checkParents)  +		{  +			for($control=$this;$control!==null;$control=$control->getParent())  +				if($control->_flags & self::IS_DISABLE_VIEWSTATE)  +					return false;  +			return true;  +		}  +		else  +			return !($this->_flags & self::IS_DISABLE_VIEWSTATE);  +	} +public function setEnableViewState($value)  +	{  +		if(TPropertyValue::ensureBoolean($value))  +			$this->_flags &= ~self::IS_DISABLE_VIEWSTATE;  +		else  +			$this->_flags |= self::IS_DISABLE_VIEWSTATE;  +	} +protected function getControlState($key,$defaultValue=null)  +	{  +		return isset($this->_rf[self::RF_CONTROLSTATE][$key])?$this->_rf[self::RF_CONTROLSTATE][$key]:$defaultValue;  +	} +protected function setControlState($key,$value,$defaultValue=null)  +	{  +		if($value===$defaultValue)  +			unset($this->_rf[self::RF_CONTROLSTATE][$key]);  +		else  +			$this->_rf[self::RF_CONTROLSTATE][$key]=$value;  +	} +protected function clearControlState($key)  +	{  +		unset($this->_rf[self::RF_CONTROLSTATE][$key]);  +	} +protected function getViewState($key,$defaultValue=null)  +	{  +		return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue;  +	} +protected function setViewState($key,$value,$defaultValue=null)  +	{  +		if($value===$defaultValue)  +			unset($this->_viewState[$key]);  +		else  +			$this->_viewState[$key]=$value;  +	} +protected function clearViewState($key)  +	{  +		unset($this->_viewState[$key]);  +	} +public function bindProperty($name,$expression)  +	{  +		$this->_rf[self::RF_DATA_BINDINGS][$name]=$expression;  +	} +public function unbindProperty($name)  +	{  +		unset($this->_rf[self::RF_DATA_BINDINGS][$name]);  +	} +public function dataBind()  +	{  + +		$this->dataBindProperties();  + +		$this->onDataBinding(null);  + +		$this->dataBindChildren();  +	} +protected function dataBindProperties()  +	{  +		if(isset($this->_rf[self::RF_DATA_BINDINGS]))  +		{  +			foreach($this->_rf[self::RF_DATA_BINDINGS] as $property=>$expression)  +				$this->setSubProperty($property,$this->evaluateExpression($expression));  +		}  +	} +protected function dataBindChildren()  +	{  +		if(isset($this->_rf[self::RF_CONTROLS]))  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +				if($control instanceof TControl)  +					$control->dataBind();  +		}  +	} +final protected function getChildControlsCreated()  +	{  +		return ($this->_flags & self::IS_CHILD_CREATED)!==0;  +	} +final protected function setChildControlsCreated($value)  +	{  +		if($value)  +			$this->_flags |= self::IS_CHILD_CREATED;  +		else  +		{  +			if($this->hasControl() && ($this->_flags & self::IS_CHILD_CREATED))  +				$this->getControls()->clear();  +			$this->_flags &= ~self::IS_CHILD_CREATED;  +		}  +	} +public function ensureChildControls()  +	{  +		if(!($this->_flags & self::IS_CHILD_CREATED) && !($this->_flags & self::IS_CREATING_CHILD))  +		{  +			try  +			{  +				$this->_flags |= self::IS_CREATING_CHILD;  +				$this->createChildControls();  +				$this->_flags &= ~self::IS_CREATING_CHILD;  +				$this->_flags |= self::IS_CHILD_CREATED;  +			}  +			catch(Exception $e)  +			{  +				$this->_flags &= ~self::IS_CREATING_CHILD;  +				$this->_flags |= self::IS_CHILD_CREATED;  +				throw $e;  +			}  +		}  +	} +protected function createChildControls()  +	{  +	} +public function findControl($id)  +	{  +		$id=strtr($id,'.',self::ID_SEPARATOR);  +		$container=($this instanceof INamingContainer)?$this:$this->getNamingContainer();  +		if(!$container || !$container->getHasControls())  +			return null;  +		if(!isset($container->_rf[self::RF_NAMED_CONTROLS]))  +		{  +			$container->_rf[self::RF_NAMED_CONTROLS]=array();  +			$container->fillNameTable($container,$container->_rf[self::RF_CONTROLS]);  +		}  +		if(($pos=strpos($id,self::ID_SEPARATOR))===false)  +			return isset($container->_rf[self::RF_NAMED_CONTROLS][$id])?$container->_rf[self::RF_NAMED_CONTROLS][$id]:null;  +		else  +		{  +			$cid=substr($id,0,$pos);  +			$sid=substr($id,$pos+1);  +			if(isset($container->_rf[self::RF_NAMED_CONTROLS][$cid]))  +				return $container->_rf[self::RF_NAMED_CONTROLS][$cid]->findControl($sid);  +			else  +				return null;  +		}  +	} +public function findControlsByType($type)  +	{  +		$controls=array();  +		if($this->getHasControls())  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +			{  +				if($control instanceof $type)  +					$controls[]=$control;  +				if(($control instanceof TControl) && $control->getHasControls())  +					$controls=array_merge($controls,$control->findControlsByType($type));  +			}  +		}  +		return $controls;  +	} +public function clearNamingContainer()  +	{  +		unset($this->_rf[self::RF_NAMED_CONTROLS_ID]);  +		$this->clearNameTable();  +	} +public function registerObject($name,$object)  +	{  +		if(isset($this->_rf[self::RF_NAMED_OBJECTS][$name]))  +			throw new TInvalidOperationException('control_object_reregistered',$name);  +		$this->_rf[self::RF_NAMED_OBJECTS][$name]=$object;  +	} +public function unregisterObject($name)  +	{  +		unset($this->_rf[self::RF_NAMED_OBJECTS][$name]);  +	} +public function isObjectRegistered($name)  +	{  +		return isset($this->_rf[self::RF_NAMED_OBJECTS][$name]);  +	} +public function createdOnTemplate($parent)  +	{  +		$parent->addParsedObject($this);  +	} +public function addParsedObject($object)  +	{  +		$this->getControls()->add($object);  +	} +final protected function clearChildState()  +	{  +		unset($this->_rf[self::RF_CHILD_STATE]);  +	} +final protected function isDescendentOf($ancestor)  +	{  +		$control=$this;  +		while($control!==$ancestor && $control->_parent)  +			$control=$control->_parent;  +		return $control===$ancestor;  +	} +public function addedControl($control)  +	{  +		if($control->_parent)  +			$control->_parent->getControls()->remove($control);  +		$control->_parent=$this;  +		$control->_page=$this->getPage();  +		$namingContainer=($this instanceof INamingContainer)?$this:$this->_namingContainer;  +		if($namingContainer)  +		{  +			$control->_namingContainer=$namingContainer;  +			if($control->_id==='')  +				$control->generateAutomaticID();  +			else  +				$namingContainer->clearNameTable();  +		} +if($this->_stage>=self::CS_CHILD_INITIALIZED)  +		{  +			$control->initRecursive($namingContainer);  +			if($this->_stage>=self::CS_STATE_LOADED)  +			{  +				if(isset($this->_rf[self::RF_CHILD_STATE][$control->_id]))  +				{  +					$state=$this->_rf[self::RF_CHILD_STATE][$control->_id];  +					unset($this->_rf[self::RF_CHILD_STATE][$control->_id]);  +				}  +				else  +					$state=null;  +				$control->loadStateRecursive($state,!($this->_flags & self::IS_DISABLE_VIEWSTATE));  +				if($this->_stage>=self::CS_LOADED)  +				{  +					$control->loadRecursive();  +					if($this->_stage>=self::CS_PRERENDERED)  +						$control->preRenderRecursive();  +				}  +			}  +		}  +	} +public function removedControl($control)  +	{  +		if($this->_namingContainer)  +			$this->_namingContainer->clearNameTable();  +		$control->unloadRecursive();  +		$control->_parent=null;  +		$control->_page=null;  +		$control->_namingContainer=null;  +		$control->_tplControl=null;  +		$control->_stage=self::CS_CONSTRUCTED;  +		if(!($control->_flags & self::IS_ID_SET))  +			$control->_id='';  +		$control->clearCachedUniqueID(true);  +	} +protected function initRecursive($namingContainer=null)  +	{  +		if($this->getHasControls())  +		{  +			if($this instanceof INamingContainer)  +				$namingContainer=$this;  +			$page=$this->getPage();  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +			{  +				if($control instanceof TControl)  +				{  +					$control->_namingContainer=$namingContainer;  +					$control->_page=$page;  +					if($control->_id==='' && $namingContainer)  +						$control->generateAutomaticID();  +					$control->initRecursive($namingContainer);  +				}  +			}  +		}  +		if($this->_stage<self::CS_INITIALIZED)  +		{  +			$this->_stage=self::CS_CHILD_INITIALIZED;  +			if(($page=$this->getPage()) && $this->getEnableTheming() && !($this->_flags & self::IS_SKIN_APPLIED))  +			{  +				$page->applyControlSkin($this);  +				$this->_flags |= self::IS_SKIN_APPLIED;  +			}  +			$this->onInit(null);  +			$this->_stage=self::CS_INITIALIZED;  +		}  +	} +protected function loadRecursive()  +	{  +		if($this->_stage<self::CS_LOADED)  +			$this->onLoad(null);  +		if($this->getHasControls())  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +				if($control instanceof TControl)  +					$control->loadRecursive();  +		}  +		if($this->_stage<self::CS_LOADED)  +			$this->_stage=self::CS_LOADED;  +	} +protected function preRenderRecursive()  +	{  +		if($this->getVisible(false))  +		{  +			$this->ensureChildControls();  +			$this->onPreRender(null);  +			if($this->getHasControls())  +			{  +				foreach($this->_rf[self::RF_CONTROLS] as $control)  +					if($control instanceof TControl)  +						$control->preRenderRecursive();  +			}  +		}  +		$this->_stage=self::CS_PRERENDERED;  +	} +protected function unloadRecursive()  +	{  +		if(!($this->_flags & self::IS_ID_SET))  +			$this->_id='';  +		if($this->getHasControls())  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +				if($control instanceof TControl)  +					$control->unloadRecursive();  +		}  +		$this->onUnload(null);  +	} +protected function onInit($param)  +	{  +		$this->raiseEvent('Init',$this,$param);  +	} +protected function onLoad($param)  +	{  +		$this->raiseEvent('Load',$this,$param);  +	} +protected function onDataBinding($param)  +	{  +		$this->raiseEvent('DataBinding',$this,$param);  +	} +protected function onUnload($param)  +	{  +		$this->raiseEvent('Unload',$this,$param);  +	} +protected function onPreRender($param)  +	{  +		$this->raiseEvent('PreRender',$this,$param);  +	} +protected function raiseBubbleEvent($sender,$param)  +	{  +		$control=$this;  +		while($control=$control->_parent)  +		{  +			if($control->onBubbleEvent($sender,$param))  +				break;  +		}  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		return false;  +	} +protected function broadcastEvent($sender,TBroadCastEventParameter $param)  +	{  +		$origin=(($page=$this->getPage())===null)?$this:$page;  +		$origin->broadcastEventInternal($sender,$param);  +	} +final protected function broadcastEventInternal($sender,$param)  +	{  +		if($this instanceof IBroadcastEventReceiver)  +			$this->broadcastEventReceived($sender,$param);  +		if($this->getHasControls())  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +			{  +				if($control instanceof TControl)  +					$control->broadcastEventInternal($sender,$param);  +			}  +		}  +	} +protected function renderControl($writer)  +	{  +		if($this->getVisible(false))  +			$this->render($writer);  +	} +protected function render($writer)  +	{  +		$this->renderChildren($writer);  +	} +protected function renderChildren($writer)  +	{  +		if($this->getHasControls())  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +			{  +				if($control instanceof TControl)  +					$control->renderControl($writer);  +				else if(is_string($control))  +					$writer->write($control);  +			}  +		}  +	} +protected function onSaveState($param)  +	{  +		$this->raiseEvent('SaveState',$this,$param);  +	} +protected function onLoadState($param)  +	{  +		$this->raiseEvent('LoadState',$this,$param);  +	} +final protected function loadStateRecursive(&$state,$needViewState=true)  +	{  +		if($state!==null)  +		{  +									$needViewState=($needViewState && !($this->_flags & self::IS_DISABLE_VIEWSTATE));  +			if(isset($state[1]))  +			{  +				$this->_rf[self::RF_CONTROLSTATE]=&$state[1];  +				unset($state[1]);  +			}  +			else  +				unset($this->_rf[self::RF_CONTROLSTATE]);  +			if($needViewState)  +			{  +				if(isset($state[0]))  +					$this->_viewState=&$state[0];  +				else  +					$this->_viewState=array();  +			}  +			unset($state[0]);  +			if($this->getHasControls())  +			{  +				foreach($this->_rf[self::RF_CONTROLS] as $control)  +				{  +					if($control instanceof TControl)  +					{  +						if(isset($state[$control->_id]))  +						{  +							$s=&$state[$control->_id];  +							unset($state[$control->_id]);  +						}  +						else  +							$s=null;  +						$control->loadStateRecursive($s,$needViewState);  +					}  +				}  +			}  +			if(!empty($state))  +				$this->_rf[self::RF_CHILD_STATE]=&$state;  +			$this->_stage=self::CS_STATE_LOADED;  +			$this->onLoadState(null);  +		}  +		else  			$this->_stage=self::CS_STATE_LOADED;  +	} +final protected function &saveStateRecursive($needViewState=true)  +	{  +		$this->onSaveState(null);  +		$needViewState=($needViewState && !($this->_flags & self::IS_DISABLE_VIEWSTATE));  +		$state=array();  +		if($this->getHasControls())  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +			{  +				if($control instanceof TControl)  +				{  +					$cs=&$control->saveStateRecursive($needViewState);  +					$state[$control->_id]=&$cs;  +				}  +			}  +		}  +		if($needViewState)  +			$state[0]=&$this->_viewState;  +		if(isset($this->_rf[self::RF_CONTROLSTATE]))  +			$state[1]=&$this->_rf[self::RF_CONTROLSTATE];  +		return $state;  +	} +public function applyStyleSheetSkin($page)  +	{  +		if($page && !($this->_flags & self::IS_STYLESHEET_APPLIED))  +		{  +			$page->applyControlStyleSheet($this);  +			$this->_flags |= self::IS_STYLESHEET_APPLIED;  +		}  +		else if($this->_flags & self::IS_STYLESHEET_APPLIED)  +			throw new TInvalidOperationException('control_stylesheet_applied',get_class($this));  +	} +private function clearCachedUniqueID($recursive)  +	{  +		$this->_uid='';  +		if($recursive && isset($this->_rf[self::RF_CONTROLS]))  +		{  +			foreach($this->_rf[self::RF_CONTROLS] as $control)  +				if($control instanceof TControl)  +					$control->clearCachedUniqueID($recursive);  +		}  +	} +private function generateAutomaticID()  +	{  +		$this->_flags &= ~self::IS_ID_SET;  +		if(!isset($this->_namingContainer->_rf[self::RF_NAMED_CONTROLS_ID]))  +			$this->_namingContainer->_rf[self::RF_NAMED_CONTROLS_ID]=0;  +		$id=$this->_namingContainer->_rf[self::RF_NAMED_CONTROLS_ID]++;  +		$this->_id=self::AUTOMATIC_ID_PREFIX . $id;  +		$this->_namingContainer->clearNameTable();  +	} +private function clearNameTable()  +	{  +		unset($this->_rf[self::RF_NAMED_CONTROLS]);  +	} +private function fillNameTable($container,$controls)  +	{  +		foreach($controls as $control)  +		{  +			if($control instanceof TControl)  +			{  +				if($control->_id!=='')  +				{  +					if(isset($container->_rf[self::RF_NAMED_CONTROLS][$control->_id]))  +						throw new TInvalidDataValueException('control_id_nonunique',get_class($control),$control->_id);  +					else  +						$container->_rf[self::RF_NAMED_CONTROLS][$control->_id]=$control;  +				}  +				if(!($control instanceof INamingContainer) && $control->getHasControls())  +					$this->fillNameTable($container,$control->_rf[self::RF_CONTROLS]);  +			}  +		}  +	}  +} +class TControlList extends TList  +{ +private $_o; +public function __construct(TControl $owner)  +	{  +		parent::__construct();  +		$this->_o=$owner;  +	} +protected function getOwner()  +	{  +		return $this->_o;  +	} +protected function addedItem($item)  +	{  +		if($item instanceof TControl)  +			$this->_o->addedControl($item);  +	} +protected function removedItem($item)  +	{  +		if($item instanceof TControl)  +			$this->_o->removedControl($item);  +	} +protected function canAddItem($item)  +	{  +		return is_string($item) || ($item instanceof TControl);  +	} +public function clear()  +	{  +		parent::clear();  +		if($this->_o instanceof INamingContainer)  +			$this->_o->clearNamingContainer();  +	}  +} +interface INamingContainer  +{  +} +interface IPostBackEventHandler  +{ +public function raisePostBackEvent($param);  +} +interface IPostBackDataHandler  +{ +public function loadPostData($key,$values); +public function raisePostDataChangedEvent();  +} +interface IValidator  +{ +public function validate(); +public function getIsValid(); +public function setIsValid($value); +public function getErrorMessage(); +public function setErrorMessage($value);  +} +interface IValidatable  +{ +public function getValidationPropertyValue();  +} +interface IBroadcastEventReceiver  +{ +public function broadcastEventReceived($sender,$param);  +} +class TBroadcastEventParameter extends TEventParameter  +{  +	private $_name;  +	private $_param; +public function __construct($name='',$parameter=null)  +	{  +		$this->_name=$name;  +		$this->_param=$parameter;  +	} +public function getName()  +	{  +		return $this->_name;  +	} +public function setName($value)  +	{  +		$this->_name=$value;  +	} +public function getParameter()  +	{  +		return $this->_param;  +	} +public function setParameter($value)  +	{  +		$this->_param=$value;  +	}  +} +class TCommandEventParameter extends TEventParameter  +{  +	private $_name;  +	private $_param; +public function __construct($name='',$parameter='')  +	{  +		$this->_name=$name;  +		$this->_param=$parameter;  +	} +public function getCommandName()  +	{  +		return $this->_name;  +	} +public function getCommandParameter()  +	{  +		return $this->_param;  +	}  +} +?><?php +class TTemplateControl extends TControl implements INamingContainer  +{ +const EXT_TEMPLATE='.tpl'; +protected static $_template=array(); +protected $_localTemplate=null; +private $_master=null; +private $_masterClass=''; +private $_contents=array(); +private $_placeholders=array(); +public function __construct()  +	{  +		if(($tpl=$this->getTemplate(true))!==null)  +		{  +			foreach($tpl->getDirective() as $name=>$value)  +				$this->setSubProperty($name,$value);  +		}  +	} +public function getTemplate($load=false)  +	{  +		if($this->_localTemplate===null)  +		{  +			$class=get_class($this);  +			$tpl=isset(self::$_template[$class])?self::$_template[$class]:null;  +			return ($tpl===null && $load)?$this->loadTemplate():$tpl;  +		}  +		else  +			return $this->_localTemplate;  +	} +public function setTemplate($value)  +	{  +		$this->_localTemplate=$value;  +	} +protected function loadTemplate()  +	{  + +		$template=$this->getService()->getTemplateManager()->getTemplateByClassName(get_class($this));  +		self::$_template[get_class($this)]=$template;  +		return $template;  +	} +protected function createChildControls()  +	{  +		if($tpl=$this->getTemplate())  +			$tpl->instantiateIn($this);  +	} +public function registerContent(TContent $object)  +	{  +		$this->_contents[$object->getID()]=$object;  +	} +public function getMasterClass()  +	{  +		return $this->_masterClass;  +	} +public function setMasterClass($value)  +	{  +		$this->_masterClass=$value;  +	} +public function getMaster()  +	{  +		return $this->_master;  +	} +public function registerContentPlaceHolder($id,$parent,$loc)  +	{  +		$this->_placeholders[$id]=array($parent,$loc);  +	} +public function injectContent($id,$content)  +	{  +		if(isset($this->_placeholders[$id]))  +		{  +			list($parent,$loc)=$this->_placeholders[$id];  +			$parent->getControls()->insert($loc,$content);  +		}  +	} +protected function initRecursive($namingContainer=null)  +	{  +		$this->ensureChildControls();  +		if($this->_masterClass!=='')  +		{  +			$master=Prado::createComponent($this->_masterClass);  +			if(!($master instanceof TTemplateControl))  +				throw new TInvalidDataValueException('tplcontrol_required',get_class($master));  +			$this->_master=$master;  +			$this->getControls()->clear();  +			$this->getControls()->add($master);  +			$master->ensureChildControls();  +			foreach($this->_contents as $id=>$content)  +				$master->injectContent($id,$content);  +		}  +		parent::initRecursive($namingContainer);  +	}  +} +?><?php +class TForm extends TControl  +{  +	protected function onInit($param)  +	{  +		parent::onInit($param);  +		$this->getPage()->setForm($this);  +	} +protected function addAttributesToRender($writer)  +	{  +		$attributes=$this->getAttributes();  +		$writer->addAttribute('method',$this->getMethod());  +		$writer->addAttribute('action',$this->getRequest()->getRequestURI());  +		if(($enctype=$this->getEnctype())!=='')  +			$writer->addAttribute('enctype',$enctype);  +		$attributes->remove('name');  +		$attributes->remove('method');  +		$attributes->remove('action'); +$page=$this->getPage(); +if($this->getDefaultButton()!=='')  +		{			$control=$this->findControl($this->getDefaultButton());  +			if(!$control)  +				$control=$page->findControl($this->getDefaultButton());  +			if($control instanceof IButtonControl)  +				$page->getClientScript()->registerDefaultButtonScript($control,$writer,false);  +			else  +				throw new Exception('Only IButtonControl can be default button.');  +		}  +		$writer->addAttribute('id',$this->getClientID());  +		foreach($attributes as $name=>$value)  +			$writer->addAttribute($name,$value);  +	} +protected function render($writer)  +	{  +		$this->addAttributesToRender($writer);  +		$writer->renderBeginTag('form');  +		$page=$this->getPage();  +		$page->beginFormRender($writer);  +		$this->renderChildren($writer);  +		$page->endFormRender($writer);  +		$writer->renderEndTag();  +	} +public function getDefaultButton()  +	{  +		return $this->getViewState('DefaultButton','');  +	} +public function setDefaultButton($value)  +	{  +		$this->setViewState('DefaultButton',$value,'');  +	} +public function getDefaultFocus()  +	{  +		return $this->getViewState('DefaultFocus','');  +	} +public function setDefaultFocus($value)  +	{  +		$this->setViewState('DefaultFocus',$value,'');  +	} +public function getMethod()  +	{  +		return $this->getViewState('Method','post');  +	} +public function setMethod($value)  +	{  +		$this->setViewState('Method',$value,'post');  +	} +public function getEnctype()  +	{  +		return $this->getViewState('Enctype','');  +	} +public function setEnctype($value)  +	{  +		$this->setViewState('Enctype',$value,'');  +	} +public function getSubmitDisabledControls()  +	{  +		return $this->getViewState('SubmitDisabledControls',false);  +	} +public function setSubmitDisabledControls($value)  +	{  +		$this->setViewState('SubmitDisabledControls',TPropertyValue::ensureBoolean($value),false);  +	} +public function getName()  +	{  +		return $this->getUniqueID();  +	} +public function getTarget()  +	{  +		return $this->getViewState('Target','');  +	} +public function setTarget($value)  +	{  +		$this->setViewState('Target',$value,'');  +	}  +} +?><?php +class TPostBackOptions extends TComponent +{ +	public $_actionUrl=''; +	public $_autoPostBack=false; +	public $_clientSubmit=true; +	public $_performValidation=false; +	public $_validationGroup=''; +	public $_trackFocus=false; +public function getActionUrl() +	{ +		return $this->_actionUrl; +	} +public function setActionUrl($value) +	{ +		$this->_actionUrl=THttpUtility::quoteJavaScriptString($value); +	} +public function getAutoPostBack() +	{ +		return $this->_autoPostBack; +	} +public function setAutoPostBack($value) +	{ +		$this->_autoPostBack=$value; +	} +public function getClientSubmit() +	{ +		return $this->_clientSubmit; +	} +public function setClientSubmit($value) +	{ +		$this->_clientSubmit=$value; +	} +public function getPerformValidation() +	{ +		return $this->_performValidation; +	} +public function setPerformValidation($value) +	{ +		$this->_performValidation=$value; +	} +public function getValidationGroup() +	{ +		return $this->_validationGroup; +	} +public function setValidationGroup($value) +	{ +		$this->_validationGroup=$value; +	} +public function getTrackFocus() +	{ +		return $this->_trackFocus; +	} +public function setTrackFocus($value) +	{ +		$this->_trackFocus=$value; +	} +} +class TClientScriptManager extends TComponent +{ +	const SCRIPT_DIR='Web/Javascripts/js'; +	const POSTBACK_FUNC='Prado.doPostBack'; +	private $_page; +	private $_hiddenFields=array(); +	private $_beginScripts=array(); +	private $_endScripts=array(); +	private $_scriptFiles=array(); +	private $_headScriptFiles=array(); +	private $_headScripts=array(); +	private $_styleSheetFiles=array(); +	private $_styleSheets=array(); +	private $_onSubmitStatements=array(); +	private $_arrayDeclares=array(); +	private $_expandoAttributes=array(); +	private $_postBackScriptRegistered=false; +	private $_focusScriptRegistered=false; +	private $_scrollScriptRegistered=false; +	private $_publishedScriptFiles=array(); +public function __construct(TPage $owner) +	{ +		$this->_page=$owner; +	} +public function getPostBackEventReference($control,$parameter='',$options=null,$javascriptPrefix=true) +	{ +		if(!$options || (!$options->getPerformValidation() && !$options->getTrackFocus() && $options->getClientSubmit() && $options->getActionUrl()=='')) +		{ +			$this->registerPostBackScript(); +			if(($form=$this->_page->getForm())!==null) +				$formID=$form->getClientID(); +			else +				throw new TConfigurationException('clientscriptmanager_form_required'); +			$postback=self::POSTBACK_FUNC.'(\''.$formID.'\',\''.$control->getUniqueID().'\',\''.THttpUtility::quoteJavaScriptString($parameter).'\')'; +			if($options && $options->getAutoPostBack()) +				$postback='setTimeout(\''.THttpUtility::quoteJavaScriptString($postback).'\',0)'; +			return $javascriptPrefix?'javascript:'.$postback:$postback; +		} +		$opt=''; +		$flag=false; +		if($options->getPerformValidation()) +		{ +			$flag=true; +			$this->registerValidationScript(); +			$opt.=',true,'; +		} +		else +			$opt.=',false,'; +		if($options->getValidationGroup()!=='') +		{ +			$flag=true; +			$opt.='"'.$options->getValidationGroup().'",'; +		} +		else +			$opt.='\'\','; +		if($options->getActionUrl()!=='') +		{ +			$flag=true; +			$this->_page->setCrossPagePostBack(true); +			$opt.='"'.$options->getActionUrl().'",'; +		} +		else +			$opt.='null,'; +		if($options->getTrackFocus()) +		{ +			$flag=true; +			$this->registerFocusScript(); +			$opt.='true,'; +		} +		else +			$opt.='false,'; +		if($options->getClientSubmit()) +		{ +			$flag=true; +			$opt.='true'; +		} +		else +			$opt.='false'; +		if(!$flag) +			return ''; +		$this->registerPostBackScript(); +		if(($form=$this->_page->getForm())!==null) +			$formID=$form->getClientID(); +		else +			throw new TConfigurationException('clientscriptmanager_form_required'); +		$postback=self::POSTBACK_FUNC.'(\''.$formID.'\',\''.$control->getUniqueID().'\',\''.THttpUtility::quoteJavaScriptString($parameter).'\''.$opt.')'; +		if($options && $options->getAutoPostBack()) +			$postback='setTimeout(\''.THttpUtility::quoteJavaScriptString($postback).'\',0)'; +		return $javascriptPrefix?'javascript:'.$postback:$postback; +	} +public function registerPradoScript($script) +	{ +		static $scripts = array(); +		$scripts = array_unique(array_merge($scripts,  +						TPradoClientScript::getScripts($script))); +$this->publishClientScriptAssets($scripts); +$url = $this->publishClientScriptCompressorAsset(); +		$url .= '?js='.implode(',', $scripts); +		if(Prado::getApplication()->getMode() == TApplication::STATE_DEBUG) +			$url .= '&__nocache'; +		$this->registerScriptFile('prado:gzipscripts', $url); +	} +private function publishClientScriptAssets($scripts) +	{ +		foreach($scripts as $lib) +		{ +			if(!isset($this->_publishedScriptFiles[$lib])) +			{ +				$base = Prado::getFrameworkPath(); +				$clientScripts = self::SCRIPT_DIR; +				$assetManager = $this->_page->getService()->getAssetManager(); +				$file = "{$base}/{$clientScripts}/{$lib}.js"; +				$assetManager->publishFilePath($file); +				$this->_publishedScriptFiles[$lib] = true; +			} +		} +	} +private function publishClientScriptCompressorAsset() +	{ +		$scriptFile = 'clientscripts.php'; +		if(isset($this->_publishedScriptFiles[$scriptFile])) +			return $this->_publishedScriptFiles[$scriptFile]; +		else +		{ +			$base = Prado::getFrameworkPath(); +			$clientScripts = self::SCRIPT_DIR; +			$assetManager = $this->_page->getService()->getAssetManager(); +			$file = "{$base}/{$clientScripts}/{$scriptFile}"; +			$url= $assetManager->publishFilePath($file); +			$this->_publishedScriptFiles[$scriptFile] = $url; +			return $url; +		} +	} +protected function registerPostBackScript() +	{ +		if(!$this->_postBackScriptRegistered) +		{ +			$this->_postBackScriptRegistered=true; +			$this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,''); +			$this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,''); +			$this->registerPradoScript('prado'); +		} +	} +public function registerFocusScript($target) +	{ +		if(!$this->_focusScriptRegistered) +		{ +			$this->_focusScriptRegistered=true; +			$this->registerPradoScript('prado'); +			$this->registerEndScript('prado:focus','Prado.Focus.setFocus("'.THttpUtility::quoteJavaScriptString($target).'");'); +		} +	} +public function registerScrollScript($x,$y) +	{ +		if(!$this->_scrollScriptRegistered) +		{ +			$this->_scrollScriptRegistered=true; +			$this->registerHiddenField(TPage::FIELD_SCROLL_X,$x); +			$this->registerHiddenField(TPage::FIELD_SCROLL_Y,$y); +					} +	} +public function registerDefaultButtonScript($source, $target) +	{ +		$this->registerPradoScript('prado'); +		$button = $target->getClientID(); +		$panel = $source->getClientID(); +		return "Event.observe('{$panel}', 'keypress', Prado.Button.fireButton.bindEvent($('{$panel}'), '$button'));"; +	} +public function registerValidationScript() +	{ +	} +public function isHiddenFieldRegistered($key) +	{ +		return isset($this->_hiddenFields[$key]); +	} +public function isScriptRegistered($key) +	{ +		return isset($this->_scripts[$key]); +	} +public function isScriptFileRegistered($key) +	{ +		return isset($this->_scriptFiles[$key]); +	} +public function isBeginScriptRegistered($key) +	{ +		return isset($this->_beginScripts[$key]); +	} +public function isEndScriptRegistered($key) +	{ +		return isset($this->_endScripts[$key]); +	} +public function isHeadScriptFileRegistered($key) +	{ +		return isset($this->_headScriptFiles[$key]); +	} +public function isHeadScriptRegistered($key) +	{ +		return isset($this->_headScripts[$key]); +	} +public function isStyleSheetFileRegistered($key) +	{ +		return isset($this->_styleSheetFiles[$key]); +	} +public function isStyleSheetRegistered($key) +	{ +		return isset($this->_styleSheets[$key]); +	} +public function isOnSubmitStatementRegistered($key) +	{ +		return isset($this->_onSubmitStatements[$key]); +	} +public function registerArrayDeclaration($name,$value) +	{ +		$this->_arrayDeclares[$name][]=$value; +	} +public function registerScriptFile($key,$url) +	{ +		$this->_scriptFiles[$key]=$url; +	} +public function registerHiddenField($name,$value) +	{ +				if(!isset($this->_hiddenFields[$name]) || $this->_hiddenFields[$name]!==null) +			$this->_hiddenFields[$name]=$value; +	} +public function registerOnSubmitStatement($key,$script) +	{ +		$this->_onSubmitStatements[$key]=$script; +	} +public function registerBeginScript($key,$script) +	{ +		$this->_beginScripts[$key]=$script; +	} +public function registerEndScript($key,$script) +	{ +		$this->_endScripts[$key]=$script; +	} +public function registerHeadScriptFile($key,$url) +	{ +		$this->_headScriptFiles[$key]=$url; +	} +public function registerHeadScript($key,$script) +	{ +		$this->_headScripts[$key]=$script; +	} +public function registerStyleSheetFile($key,$url) +	{ +		$this->_styleSheetFiles[$key]=$url; +	} +public function registerStyleSheet($key,$css) +	{ +		$this->_styleSheets[$key]=$css; +	} +public function registerExpandoAttribute($controlID,$name,$value) +	{ +		$this->_expandoAttributes[$controlID][$name]=$value; +	} +public function renderArrayDeclarations($writer) +	{ +		if(count($this->_arrayDeclares)) +		{ +			$str="<script type=\"text/javascript\">\n//<![CDATA[\n"; +			foreach($this->_arrayDeclares as $name=>$array) +				$str.="var $name=new Array(".implode(',',$array).");\n"; +			$str.="\n//]]>\n</script>\n"; +			$writer->write($str); +		} +	} +public function renderScriptFiles($writer) +	{ +		$str=''; +		foreach($this->_scriptFiles as $include) +			$str.="<script type=\"text/javascript\" src=\"".THttpUtility::htmlEncode($include)."\"></script>\n"; +		$writer->write($str); +	} +public function renderOnSubmitStatements($writer) +	{ +			} +public function renderBeginScripts($writer) +	{ +		if(count($this->_beginScripts)) +			$writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_beginScripts)."\n//]]>\n</script>\n"); +	} +public function renderEndScripts($writer) +	{ +		if(count($this->_endScripts)) +			$writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_endScripts)."\n//]]>\n</script>\n"); +	} +public function renderHiddenFields($writer) +	{ +		$str=''; +		foreach($this->_hiddenFields as $name=>$value) +		{ +			if($value!==null) +			{ +				$value=THttpUtility::htmlEncode($value); +				$str.="<input type=\"hidden\" name=\"$name\" id=\"$name\" value=\"$value\" />\n"; +												$this->_hiddenFields[$name]=null; +			} +		} +		if($str!=='') +			$writer->write("<div>\n".$str."</div>\n"); +	} +public function renderExpandoAttributes($writer) +	{ +		if(count($this->_expandoAttributes)) +		{ +			$str="<script type=\"text/javascript\">\n//<![CDATA[\n"; +			foreach($this->_expandoAttributes as $controlID=>$attrs) +			{ +				$str.="var $controlID = document.all ? document.all[\"$controlID\"] : document.getElementById(\"$controlID\");\n"; +				foreach($attrs as $name=>$value) +				{ +					if($value===null) +						$str.="{$key}[\"$name\"]=null;\n"; +					else +						$str.="{$key}[\"$name\"]=\"$value\";\n"; +				} +			} +			$str.="\n//]]>\n</script>\n"; +			$writer->write($str); +		} +	} +public function renderHeadScriptFiles($writer) +	{ +		$str=''; +		foreach($this->_headScriptFiles as $url) +			$str.="<script type=\"text/javascript\" src=\"".THttpUtility::htmlEncode($url)."\"></script>\n"; +		$writer->write($str); +	} +public function renderHeadScripts($writer) +	{ +		if(count($this->_headScripts)) +			$writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_headScripts)."\n//]]>\n</script>\n"); +	} +public function renderStyleSheetFiles($writer) +	{ +		$str=''; +		foreach($this->_styleSheetFiles as $url) +		{ +			$str.="<link rel=\"stylesheet\" type=\"text/css\" href=\"".THttpUtility::htmlEncode($url)."\" />\n"; +		} +		$writer->write($str); +	} +public function renderStyleSheets($writer) +	{ +		if(count($this->_styleSheets)) +			$writer->write("<style type=\"text/css\">\n".implode("\n",$this->_styleSheets)."\n</style>\n"); +	} +public function getHasHiddenFields() +	{ +		return count($this->_hiddenFields)>0; +	} +public function getHasSubmitStatements() +	{ +		return count($this->_onSubmitStatements)>0; +	} +public function registerClientEvent($control, $event, $code) +	{ +		if(empty($code)) return; +		$this->registerPradoScript("prado"); +		$script= "Event.observe('{$control->ClientID}', '{$event}', function(e){ {$code} });"; +		$key = "prado:{$control->ClientID}:{$event}"; +		$this->registerEndScript($key, $script); +	} +} +class TJavascript +{ +public static function toArray($array,$append=null,$strict=false) +	{ +		$results = array(); +		$converter = new TJavascript(); +		foreach($array as $v) +		{ +			if($strict || (!$strict && $v !== '' && $v !== array())) +			{ +				$type = 'to_'.gettype($v); +				if($type == 'to_array') +					$results[] = $converter->toArray($v, $append, $strict); +				else +					$results[] = $converter->{$type}($v); +			} +		} +		$extra = ''; +		if(strlen($append) > 0) +			$extra .= count($results) > 0 ? ','.$append : $append; +		return '['.implode(',', $results).$extra.']'; +	} +public static function toList($array,$append=null, $strict=false) +	{ +		$results = array(); +		$converter = new TJavascript(); +		foreach($array as $k => $v) +		{ +			if($strict || (!$strict && $v !== '' && $v !== array())) +			{ +				$type = 'to_'.gettype($v); +				if($type == 'to_array') +					$results[] = "'{$k}':".$converter->toList($v, $append, $strict); +				else +					$results[] = "'{$k}':".$converter->{$type}($v); +			} +		} +		$extra = ''; +		if(strlen($append) > 0) +			$extra .= count($results) > 0 ? ','.$append : $append; +return '{'.implode(',', $results).$extra.'}'; +	} +public function to_boolean($v) +	{ +		return $v ? 'true' : 'false'; +	} +public function to_integer($v) +	{ +		return "{$v}"; +	} +public function to_double($v) +	{ +		return "{$v}"; +	} +public function to_string($v) +	{ +		if(strlen($v)>1) +		{ +			$first = $v{0}; $last = $v{strlen($v)-1}; +			if($first == '[' && $last == ']' || +				($first == '{' && $last == '}')) +				return $v; +		} +		return "'".addslashes($v)."'"; +	} +public function to_array($v) +	{ +		return TJavascript::toArray($v); +	} +public function to_null($v) +	{ +		return 'null'; +	} +} +class TPradoClientScript +{ +protected static $dependencies = array( +		'prado' => array('prado'), +		'effects' => array('prado', 'effects'), +		'ajax' => array('prado', 'effects', 'ajax'), +		'validator' => array('prado', 'validator'), +		'logger' => array('prado', 'logger'), +		'datepicker' => array('prado', 'datepicker'), +		'rico' => array('prado', 'effects', 'ajax', 'rico') +		); +public static function getScripts($scripts) +	{ +		$files = array(); +		if(!is_array($scripts)) $scripts = array($scripts); +		foreach($scripts as $script) +		{ +			if(isset(self::$dependencies[$script])) +				$files = array_merge($files, self::$dependencies[$script]); +			$files[] = $script; +		} +		$files = array_unique($files); +		return $files; +	} +} +?><?php +Prado::using('System.Web.UI.WebControls.*');  +  +  +  + +class TPage extends TTemplateControl  +{  +	const FIELD_POSTBACK_TARGET='PRADO_POSTBACK_TARGET';  +	const FIELD_POSTBACK_PARAMETER='PRADO_POSTBACK_PARAMETER';  +	const FIELD_LASTFOCUS='PRADO_LASTFOCUS';  +	const FIELD_PAGESTATE='PRADO_PAGESTATE';  +	const FIELD_SCROLLX='PRADO_SCROLLX';  +	const FIELD_SCROLLY='PRADO_SCROLLY'; +private static $_systemPostFields=array(  +		'PRADO_POSTBACK_TARGET'=>true,  +		'PRADO_POSTBACK_PARAMETER'=>true,  +		'PRADO_LASTFOCUS'=>true,  +		'PRADO_PAGESTATE'=>true,  +		'PRADO_SCROLLX'=>true,  +		'PRADO_SCROLLY'=>true,  +		'__PREVPAGE','__CALLBACKID','__CALLBACKPARAM'  +	); +private $_form=null; +private $_head=null; +private $_templateFile=null; +private $_validators=array(); +private $_validated=false; +private $_theme=null; +private $_styleSheet=null; +private $_clientScript=null; +private $_postData; +private $_restPostData; +private $_controlsPostDataChanged=array(); +private $_controlsRequiringPostData=array(); +private $_controlsRegisteredForPostData=array(); +private $_postBackEventTarget=null; +private $_postBackEventParameter=null; +private $_formRendered=false; +private $_inFormRender=false; +private $_focus=null; +private $_maintainScrollPosition=false; +private $_maxPageStateFieldLength=10;  +	private $_enableViewStateMac=true;  +	private $_isCrossPagePostBack=false;  +	private $_previousPagePath=''; +public function __construct($initProperties=null)  +	{  + +		$this->setPage($this);  +		if(is_array($initProperties))  +		{  + +			foreach($initProperties as $name=>$value)  +				$this->setSubProperty($name,$value);  +		}  +		parent::__construct();  +	} +public function run($writer)  +	{  + +		$this->determinePostBackMode(); + +		$this->onPreInit(null);  + +		$this->initRecursive();  + +		$this->onInitComplete(null); +if($this->getIsPostBack())  +		{  +			$this->_restPostData=new TMap;  + +			$this->loadPageState();  + +			$this->processPostData($this->_postData,true);  + +			$this->onPreLoad(null);  + +			$this->loadRecursive();  + +			$this->processPostData($this->_restPostData,false);  + +			$this->raiseChangedEvents();  + +			$this->raisePostBackEvent();  + +			$this->onLoadComplete(null);  +		}  +		else  +		{  + +			$this->onPreLoad(null);  + +			$this->loadRecursive();  + +			$this->onLoadComplete(null);  +		} + +		$this->preRenderRecursive();  + +		$this->onPreRenderComplete(null); + +		$this->savePageState();  + +		$this->onSaveStateComplete(null); + +		$this->renderControl($writer);  + +		$this->unloadRecursive();  +	} +protected function loadTemplate()  +	{  +		if($this->_templateFile===null)  +			return parent::loadTemplate();  +		else  +		{  +			$template=$this->getService()->getTemplateManager()->getTemplateByFileName($this->_templateFile);  +			$this->setTemplate($template);  +			return $template;  +		}  +	} +public function getTemplateFile()  +	{  +		return $this->_templateFile;  +	} +public function setTemplateFile($value)  +	{  +		if(($templateFile=Prado::getPathOfNamespace($value,TTemplateManager::TEMPLATE_FILE_EXT))===null || !is_file($templateFile))  +			throw new TInvalidDataValueException('page_templatefile_invalid',$value);  +		else  +			$this->_templateFile=$templateFile;  +	} +public function setForm(TForm $form)  +	{  +		if($this->_form===null)  +			$this->_form=$form;  +		else  +			throw new TInvalidOperationException('page_form_duplicated');  +	} +public function getForm()  +	{  +		return $this->_form;  +	} +public function getValidators($validationGroup='')  +	{  +		if(!$this->_validators)  +			$this->_validators=new TList;  +		if($validationGroup==='')  +			return $this->_validators;  +		else  +		{  +			$list=new TList;  +			foreach($this->_validators as $validator)  +				if($validator->getValidationGroup()===$validationGroup)  +					$list->add($validator);  +			return $list;  +		}  +	} +public function validate($validationGroup='')  +	{  +		$this->_validated=true;  +		if($this->_validators && $this->_validators->getCount())  +		{  + +			if($validationGroup==='')  +			{  +				foreach($this->_validators as $validator)  +					$validator->validate();  +			}  +			else  +			{  +				foreach($this->_validators as $validator)  +					if($validator->getValidationGroup()===$validationGroup)  +						$validator->validate();  +			}  +		}  +	} +public function getIsValid()  +	{  +		if($this->_validated)  +		{  +			if($this->_validators && $this->_validators->getCount())  +			{  +				foreach($this->_validators as $validator)  +					if(!$validator->getIsValid())  +						return false;  +			}  +			return true;  +		}  +		else  +			throw new TInvalidOperationException('page_isvalid_unknown');  +	} +public function getTheme()  +	{  +		if(is_string($this->_theme))  +			$this->_theme=$this->getService()->getThemeManager()->getTheme($this->_theme);  +		return $this->_theme;  +	} +public function setTheme($value)  +	{  +		$this->_theme=$value;  +	} +public function getStyleSheetTheme()  +	{  +		if(is_string($this->_styleSheet))  +			$this->_styleSheet=$this->getService()->getThemeManager()->getTheme($this->_styleSheet);  +		return $this->_styleSheet;  +	} +public function setStyleSheetTheme($value)  +	{  +		$this->_styleSheet=$value;  +	} +public function applyControlSkin($control)  +	{  +		if(($theme=$this->getTheme())!==null)  +			$theme->applySkin($control);  +	} +public function applyControlStyleSheet($control)  +	{  +		if(($theme=$this->getStyleSheetTheme())!==null)  +			$theme->applySkin($control);  +	} +public function getClientScript()  +	{  +		if(!$this->_clientScript)  +			$this->_clientScript=new TClientScriptManager($this);  +		return $this->_clientScript;  +	} +protected function onPreInit($param)  +	{  +		$this->raiseEvent('PreInit',$this,$param);  +	} +protected function onInitComplete($param)  +	{  +		$this->raiseEvent('InitComplete',$this,$param);  +	} +protected function onPreLoad($param)  +	{  +		$this->raiseEvent('PreLoad',$this,$param);  +	} +protected function onLoadComplete($param)  +	{  +		$this->raiseEvent('LoadComplete',$this,$param);  +	} +protected function onPreRenderComplete($param)  +	{  +		$this->raiseEvent('PreRenderComplete',$this,$param);  +		$cs=$this->getClientScript();  +		if($this->_theme)  +		{  +			foreach($this->_theme->getStyleSheetFiles() as $url)  +				$cs->registerStyleSheetFile($url,$url);  +			foreach($this->_theme->getJavaScriptFiles() as $url)  +				$cs->registerHeadScriptFile($url,$url);  +		}  +		if($this->_styleSheet)  +		{  +			foreach($this->_styleSheet->getStyleSheetFiles() as $url)  +				$cs->registerStyleSheetFile($url,$url);  +			foreach($this->_styleSheet->getJavaScriptFiles() as $url)  +				$cs->registerHeadScriptFile($url,$url);  +		}  +	} +protected function onSaveStateComplete($param)  +	{  +		$this->raiseEvent('SaveStateComplete',$this,$param);  +	} +private function determinePostBackMode()  +	{  +		$postData=$this->getApplication()->getRequest()->getItems();  +		if($postData->contains(self::FIELD_PAGESTATE) || $postData->contains(self::FIELD_POSTBACK_TARGET))  +			$this->_postData=$postData;  +	} +public function getIsPostBack()  +	{  +		return $this->_postData!==null;  +	} +protected function getPageStatePersister()  +	{  +		return $this->getService()->getPageStatePersister();  +	} +protected function onSaveState($param)  +	{  +		parent::onSaveState($param);  +		$this->setViewState('ControlsRequiringPostBack',$this->_controlsRegisteredForPostData,array());  +	} +protected function onLoadState($param)  +	{  +		$this->_controlsRequiringPostData=$this->getViewState('ControlsRequiringPostBack',array());  +		parent::onLoadState($param);  +	} +protected function loadPageState()  +	{  +		$state=$this->getPageStatePersister()->load();  +		$this->loadStateRecursive($state,$this->getEnableViewState());  +	} +protected function savePageState()  +	{  +		$state=&$this->saveStateRecursive($this->getEnableViewState());  +		$this->getPageStatePersister()->save($state);  +	} +protected function isSystemPostField($field)  +	{  +		return isset(self::$_systemPostFields[$field]);  +	} +public function registerRequiresPostData(TControl $control)  +	{  +		$this->_controlsRegisteredForPostData[$control->getUniqueID()]=true;  +	} +public function getPostBackEventTarget()  +	{  +		if($this->_postBackEventTarget===null)  +		{  +			$eventTarget=$this->_postData->itemAt(self::FIELD_POSTBACK_TARGET);  +			if(!empty($eventTarget))  +				$this->_postBackEventTarget=$this->findControl($eventTarget);  +		}  +		return $this->_postBackEventTarget;  +	} +public function setPostBackEventTarget(TControl $control)  +	{  +		$this->_postBackEventTarget=$control;  +	} +public function getPostBackEventParameter()  +	{  +		if($this->_postBackEventParameter===null)  +			$this->_postBackEventParameter=$this->_postData->itemAt(self::FIELD_POSTBACK_PARAMETER);  +		return $this->_postBackEventParameter;  +	} +public function setPostBackEventParameter($value)  +	{  +		$this->_postBackEventParameter=$value;  +	} +public function registerAutoPostBackControl(TControl $control)  +	{  +		$this->_autoPostBackControl=$control;  +	} +protected function processPostData($postData,$beforeLoad)  +	{  +		if($beforeLoad)  +			$this->_restPostData=new TMap;  +		foreach($postData as $key=>$value)  +		{  +			if($this->isSystemPostField($key))  +				continue;  +			else if($control=$this->findControl($key))  +			{  +				if($control instanceof IPostBackDataHandler)  +				{  +					if($control->loadPostData($key,$postData))  +						$this->_controlsPostDataChanged[]=$control;  +				}  +				else if($control instanceof IPostBackEventHandler)  +					$this->setPostBackEventTarget($control);  +				unset($this->_controlsRequiringPostData[$key]);  +			}  +			else if($beforeLoad)  +				$this->_restPostData->add($key,$value);  +		}  +		foreach($this->_controlsRequiringPostData as $key=>$value)  +		{  +			if($control=$this->findControl($key))  +			{  +				if($control instanceof IPostBackDataHandler)  +				{  +					if($control->loadPostData($key,$this->_postData))  +						$this->_controlsPostDataChanged[]=$control;  +				}  +				else  +					throw new TInvalidDataValueException('page_postbackcontrol_invalid',$key);  +				unset($this->_controlsRequiringPostData[$key]);  +			}  +		}  +	} +private function raiseChangedEvents()  +	{  +		foreach($this->_controlsPostDataChanged as $control)  +			$control->raisePostDataChangedEvent();  +	} +private function raisePostBackEvent()  +	{  +		if(($postBackHandler=$this->getPostBackEventTarget())===null)  +			$this->validate();  +		else if($postBackHandler instanceof IPostBackEventHandler)  +			$postBackHandler->raisePostBackEvent($this->getPostBackEventParameter());  +	} +public function ensureRenderInForm($control)  +	{  +		if(!$this->_inFormRender)  +			throw new TConfigurationException('page_control_outofform',get_class($control),$control->getID(false));  +	} +public function beginFormRender($writer)  +	{  +		if($this->_formRendered)  +			throw new TConfigurationException('page_singleform_required');  +		$this->_formRendered=true;  +		$this->_inFormRender=true;  +		$cs=$this->getClientScript();  +		$cs->renderHiddenFields($writer);  +		$cs->renderBeginScripts($writer);  +	} +public function endFormRender($writer)  +	{  +		$cs=$this->getClientScript();  +		if($this->getClientSupportsJavaScript())  +		{  +			if($this->_focus)  +			{  +				if(is_string($this->_focus))  +					$cs->registerFocusScript($this->_focus);  +				else if(($this->_focus instanceof TControl) && $this->_focus->getVisible(true))  +					$cs->registerFocusScript($this->_focus->getClientID());  +			}  +			else if($this->_postData && ($lastFocus=$this->_postData->itemAt(self::FIELD_LASTFOCUS))!==null)  +				$cs->registerFocusScript($lastFocus);  +			if($this->_maintainScrollPosition && $this->_postData)  +			{  +				$x=TPropertyValue::ensureInteger($this->_postData->itemAt(self::PRADO_SCROLLX));  +				$y=TPropertyValue::ensureInteger($this->_postData->itemAt(self::PRADO_SCROLLY));  +				$cs->registerScrollScript($x,$y);  +			}  +			$cs->renderHiddenFields($writer);  +			$cs->renderArrayDeclarations($writer);  +			$cs->renderExpandoAttributes($writer);  +			$cs->renderScriptFiles($writer);  +			$cs->renderEndScripts($writer);  +		}  +		else  +			$cs->renderHiddenFields($writer);  +		$this->_inFormRender=false;  +	} +public function setFocus($value)  +	{  +		$this->_focus=$value;  +	} +public function getMaintainScrollPosition()  +	{  +		return $this->_maintainScrollPosition;  +	} +public function setMaintainScrollPosition($value)  +	{  +		$this->_maintainScrollPosition=TPropertyValue::ensureBoolean($value);  +	} +public function getClientSupportsJavaScript()  +	{  +				return true;  +	} +protected function initializeCulture()  +	{  +	} +public function getHead()  +	{  +		return $this->_head;  +	} +public function setHead(THead $value)  +	{  +		if($this->_head)  +			throw new TInvalidOperationException('page_head_duplicated');  +		$this->_head=$value;  +	} +public function getTitle()  +	{  +		return $this->getViewState('Title','');  +	} +public function setTitle($value)  +	{  +		$this->setViewState('Title',$value,'');  +	}  +} +?><?php +class TFont extends TComponent  +{ +const IS_BOLD=0x01;  +	const IS_ITALIC=0x02;  +	const IS_OVERLINE=0x04;  +	const IS_STRIKEOUT=0x08;  +	const IS_UNDERLINE=0x10; +const IS_SET_BOLD=0x01000;  +	const IS_SET_ITALIC=0x02000;  +	const IS_SET_OVERLINE=0x04000;  +	const IS_SET_STRIKEOUT=0x08000;  +	const IS_SET_UNDERLINE=0x10000;  +	const IS_SET_SIZE=0x20000;  +	const IS_SET_NAME=0x40000; +private $_flags=0; +private $_name=''; +private $_size=''; +public function getBold()  +	{  +		return ($this->_flags & self::IS_BOLD)!==0;  +	} +public function setBold($value)  +	{  +		$this->_flags |= self::IS_SET_BOLD;  +		if($value)  +			$this->_flags |= self::IS_BOLD;  +		else  +			$this->_flags &= ~self::IS_BOLD;  +	} +public function getItalic()  +	{  +		return ($this->_flags & self::IS_ITALIC)!==0;  +	} +public function setItalic($value)  +	{  +		$this->_flags |= self::IS_SET_ITALIC;  +		if($value)  +			$this->_flags |= self::IS_ITALIC;  +		else  +			$this->_flags &= ~self::IS_ITALIC;  +	} +public function getOverline()  +	{  +		return ($this->_flags & self::IS_OVERLINE)!==0;  +	} +public function setOverline($value)  +	{  +		$this->_flags |= self::IS_SET_OVERLINE;  +		if($value)  +			$this->_flags |= self::IS_OVERLINE;  +		else  +			$this->_flags &= ~self::IS_OVERLINE;  +	} +public function getSize()  +	{  +		return $this->_size;  +	} +public function setSize($value)  +	{  +		$this->_flags |= self::IS_SET_SIZE;  +		$this->_size=$value;  +	} +public function getStrikeout()  +	{  +		return ($this->_flags & self::IS_STRIKEOUT)!==0;  +	} +public function setStrikeout($value)  +	{  +		$this->_flags |= self::IS_SET_STRIKEOUT;  +		if($value)  +			$this->_flags |= self::IS_STRIKEOUT;  +		else  +			$this->_flags &= ~self::IS_STRIKEOUT;  +	} +public function getUnderline()  +	{  +		return ($this->_flags & self::IS_UNDERLINE)!==0;  +	} +public function setUnderline($value)  +	{  +		$this->_flags |= self::IS_SET_UNDERLINE;  +		if($value)  +			$this->_flags |= self::IS_UNDERLINE;  +		else  +			$this->_flags &= ~self::IS_UNDERLINE;  +	} +public function getName()  +	{  +		return $this->_name;  +	} +public function setName($value)  +	{  +		$this->_flags |= self::IS_SET_NAME;  +		$this->_name=$value;  +	} +public function getIsEmpty()  +	{  +		return !$this->_flags;  +	} +public function reset()  +	{  +		$this->_flags=0;  +		$this->_name='';  +		$this->_size='';  +	} +public function mergeWith($font)  +	{  +		if($font===null || $font->_flags===0)  +			return;  +		if(($font->_flags & self::IS_SET_BOLD) && !($this->_flags & self::IS_SET_BOLD))  +			$this->setBold($font->getBold());  +		if(($font->_flags & self::IS_SET_ITALIC) && !($this->_flags & self::IS_SET_ITALIC))  +			$this->setItalic($font->getItalic());  +		if(($font->_flags & self::IS_SET_OVERLINE) && !($this->_flags & self::IS_SET_OVERLINE))  +			$this->setOverline($font->getOverline());  +		if(($font->_flags & self::IS_SET_STRIKEOUT) && !($this->_flags & self::IS_SET_STRIKEOUT))  +			$this->setStrikeout($font->getStrikeout());  +		if(($font->_flags & self::IS_SET_UNDERLINE) && !($this->_flags & self::IS_SET_UNDERLINE))  +			$this->setUnderline($font->getUnderline());  +		if(($font->_flags & self::IS_SET_SIZE) && !($this->_flags & self::IS_SET_SIZE))  +			$this->setSize($font->getSize());  +		if(($font->_flags & self::IS_SET_NAME) && !($this->_flags & self::IS_SET_NAME))  +			$this->setName($font->getName());  +	} +public function copyFrom($font)  +	{  +		$this->_flags=$font->_flags;  +		$this->_name=$font->_name;  +		$this->_size=$font->_size;  +	} +public function toString()  +	{  +		if($this->_flags===0)  +			return '';  +		$str='';  +		if($this->_flags & self::IS_SET_BOLD)  +			$str.='font-weight:'.(($this->_flags & self::IS_BOLD)?'bold;':'normal;');  +		if($this->_flags & self::IS_SET_ITALIC)  +			$str.='font-style:'.(($this->_flags & self::IS_ITALIC)?'italic;':'normal;');  +		$textDec='';  +		if($this->_flags & self::IS_UNDERLINE)  +			$textDec.='underline';  +		if($this->_flags & self::IS_OVERLINE)  +			$textDec.=' overline';  +		if($this->_flags & self::IS_STRIKEOUT)  +			$textDec.=' line-through';  +		$textDec=ltrim($textDec);  +		if($textDec!=='')  +			$str.='text-decoration:'.$textDec.';';  +		if($this->_size!=='')  +			$str.='font-size:'.$this->_size.';';  +		if($this->_name!=='')  +			$str.='font-family:'.$this->_name.';';  +		return $str;  +	} +public function addAttributesToRender($writer)  +	{  +		if($this->_flags===0)  +			return;  +		if($this->_flags & self::IS_SET_BOLD)  +			$writer->addStyleAttribute('font-weight',(($this->_flags & self::IS_BOLD)?'bold':'normal'));  +		if($this->_flags & self::IS_SET_ITALIC)  +			$writer->addStyleAttribute('font-style',(($this->_flags & self::IS_ITALIC)?'italic':'normal'));  +		$textDec='';  +		if($this->_flags & self::IS_UNDERLINE)  +			$textDec.='underline';  +		if($this->_flags & self::IS_OVERLINE)  +			$textDec.=' overline';  +		if($this->_flags & self::IS_STRIKEOUT)  +			$textDec.=' line-through';  +		$textDec=ltrim($textDec);  +		if($textDec!=='')  +			$writer->addStyleAttribute('text-decoration',$textDec);  +		if($this->_size!=='')  +			$writer->addStyleAttribute('font-size',$this->_size);  +		if($this->_name!=='')  +			$writer->addStyleAttribute('font-family',$this->_name);  +	}  +}  +?><?php + +class TStyle extends TComponent  +{ +private $_fields=array(); +private $_font=null; +private $_class=null; +private $_customStyle=null; +public function getBackColor()  +	{  +		return isset($this->_fields['background-color'])?$this->_fields['background-color']:'';  +	} +public function setBackColor($value)  +	{  +		if(trim($value)==='')  +			unset($this->_fields['background-color']);  +		else  +			$this->_fields['background-color']=$value;  +	} +public function getBorderColor()  +	{  +		return isset($this->_fields['border-color'])?$this->_fields['border-color']:'';  +	} +public function setBorderColor($value)  +	{  +		if(trim($value)==='')  +			unset($this->_fields['border-color']);  +		else  +			$this->_fields['border-color']=$value;  +	} +public function getBorderStyle()  +	{  +		return isset($this->_fields['border-style'])?$this->_fields['border-style']:'';  +	} +public function setBorderStyle($value)  +	{  +		if(trim($value)==='')  +			unset($this->_fields['border-style']);  +		else  +			$this->_fields['border-style']=$value;  +	} +public function getBorderWidth()  +	{  +		return isset($this->_fields['border-width'])?$this->_fields['border-width']:'';  +	} +public function setBorderWidth($value)  +	{  +		if(trim($value)==='')  +			unset($this->_fields['border-width']);  +		else  +			$this->_fields['border-width']=$value;  +	} +public function getCssClass()  +	{  +		return $this->_class===null?'':$this->_class;  +	} +public function setCssClass($value)  +	{  +		$this->_class=trim($value)===''?null:$value;  +	} +public function getFont()  +	{  +		if($this->_font===null)  +			$this->_font=new TFont;  +		return $this->_font;  +	} +public function getForeColor()  +	{  +		return isset($this->_fields['color'])?$this->_fields['color']:'';  +	} +public function setForeColor($value)  +	{  +		if(trim($value)==='')  +			unset($this->_fields['color']);  +		else  +			$this->_fields['color']=$value;  +	} +public function getHeight()  +	{  +		return isset($this->_fields['height'])?$this->_fields['height']:'';  +	} +public function setHeight($value)  +	{  +		if(trim($value)==='')  +			unset($this->_fields['height']);  +		else  +			$this->_fields['height']=$value;  +	} +public function getCustomStyle()  +	{  +		return $this->_customStyle===null?'':$this->_customStyle;  +	} +public function setCustomStyle($value)  +	{  +		$this->_customStyle=trim($value)===''?null:$value;  +	} +public function getStyleField($name)  +	{  +		return isset($this->_fields[$name])?$this->_fields[$name]:'';  +	} +public function setStyleField($name,$value)  +	{  +		$this->_fields[$name]=$value;  +	} +public function clearStyleField($name)  +	{  +		unset($this->_fields[$name]);  +	} +public function hasStyleField($name)  +	{  +		return isset($this->_fields[$name]);  +	} +public function getWidth()  +	{  +		return isset($this->_fields['width'])?$this->_fields['width']:'';  +	} +public function setWidth($value)  +	{  +		$this->_fields['width']=$value;  +	} +public function reset()  +	{  +		parent::reset();  +		$this->_fields=array();  +		$this->_font=null;  +		$this->_class=null;  +		$this->_customStyle=null;  +	} +public function copyFrom($style)  +	{  +		if($style!==null)  +		{  +			$this->reset();  +			$this->_fields=$style->_fields;  +			$this->_class=$style->_class;  +			$this->_customStyle=$style->_customStyle;  +			if($style->_font!==null)  +				$this->getFont()->copyFrom($style->_font);  +		}  +	} +public function mergeWith($style)  +	{  +		if($style!==null)  +		{  +			$this->_fields=array_merge($style->_fields,$this->_fields);  +			if($this->_class===null)  +				$this->_class=$style->_class;  +			if($this->_font===null && $style->_font!==null)  +				$this->getFont()->mergeWith($style->_font);  +		}  +	} +public function addAttributesToRender($writer)  +	{  +		if($this->_customStyle!=='')  +		{  +			foreach(explode(';',$this->_customStyle) as $style)  +			{  +				$arr=explode(':',$style);  +				if(isset($arr[1]) && trim($arr[0])!=='')  +					$writer->addStyleAttribute(trim($arr[0]),trim($arr[1]));  +			}  +		}  +		foreach($this->_fields as $name=>$value)  +			$writer->addStyleAttribute($name,$value);  +		if($this->_font!==null)  +			$this->_font->addAttributesToRender($writer);  +		if($this->_class!==null)  +			$writer->addAttribute('class',$this->_class);  +	}  +} +class TTableStyle extends TStyle  +{ +private $_backImageUrl=null; +private $_horizontalAlign=null; +private $_cellPadding=null; +private $_cellSpacing=null; +private $_gridLines=null; +public function reset()  +	{  +		$this->_backImageUrl=null;  +		$this->_horizontalAlign=null;  +		$this->_cellPadding=null;  +		$this->_cellSpacing=null;  +		$this->_gridLines=null;  +	} +public function copyFrom($style)  +	{  +		parent::copyFrom($style);  +		if($style instanceof TTableStyle)  +		{  +			$this->_backImageUrl=$style->_backImageUrl;  +			$this->_horizontalAlign=$style->_horizontalAlign;  +			$this->_cellPadding=$style->_cellPadding;  +			$this->_cellSpacing=$style->_cellSpacing;  +			$this->_gridLines=$style->_gridLines;  +		}  +	} +public function mergeWith($style)  +	{  +		parent::mergeWith($style);  +		if($style instanceof TTableStyle)  +		{  +			if($style->_backImageUrl!==null && $this->_backImageUrl===null)  +				$this->_backImageUrl=$style->_backImageUrl;  +			if($style->_horizontalAlign!==null && $this->_horizontalAlign===null)  +				$this->_horizontalAlign=$style->_horizontalAlign;  +			if($style->_cellPadding!==null && $this->_cellPadding===null)  +				$this->_cellPadding=$style->_cellPadding;  +			if($style->_cellSpacing!==null && $this->_cellSpacing===null)  +				$this->_cellSpacing=$style->_cellSpacing;  +			if($style->_gridLines!==null && $this->_gridLines===null)  +				$this->_gridLines=$style->_gridLines;  +		}  +	} +public function addAttributesToRender($writer)  +	{  +		if(($url=trim($this->getBackImageUrl()))!=='')  +			$writer->addStyleAttribute('background-image','url('.$url.')'); +if(($horizontalAlign=$this->getHorizontalAlign())!=='NotSet')  +			$writer->addStyleAttribute('text-align',strtolower($horizontalAlign)); +if(($cellPadding=$this->getCellPadding())>=0)  +			$writer->addAttribute('cellpadding',"$cellPadding"); +if(($cellSpacing=$this->getCellSpacing())>=0)  +		{  +			$writer->addAttribute('cellspacing',"$cellSpacing");  +			if($this->getCellSpacing()===0)  +				$writer->addStyleAttribute('border-collapse','collapse');  +		} +switch($this->getGridLines())  +		{  +			case 'Horizontal' : $writer->addAttribute('rules','rows'); break;  +			case 'Vertical' : $writer->addAttribute('rules','cols'); break;  +			case 'Both' : $writer->addAttribute('rules','all'); break;  +		} +parent::addAttributesToRender($writer);  +	} +public function getBackImageUrl()  +	{  +		return $this->_backImageUrl===null?'':$this->_backImageUrl;  +	} +public function setBackImageUrl($value)  +	{  +		$this->_backImageUrl=trim($value)===''?null:$value;  +	} +public function getHorizontalAlign()  +	{  +		return $this->_horizontalAlign===null?'NotSet':$this->_horizontalAlign;  +	} +public function setHorizontalAlign($value)  +	{  +		$this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify'));  +		if($this->_horizontalAlign==='NotSet')  +			$this->_horizontalAlign=null;  +	} +public function getCellPadding()  +	{  +		return $this->_cellPadding===null?-1:$this->_cellPadding;  +	} +public function setCellPadding($value)  +	{  +		if(($this->_cellPadding=TPropertyValue::ensureInteger($value))<-1)  +			throw new TInvalidDataValueException('tablestyle_cellpadding_invalid');  +		if($this->_cellPadding===-1)  +			$this->_cellPadding=null;  +	} +public function getCellSpacing()  +	{  +		return $this->_cellSpacing===null?-1:$this->_cellSpacing;  +	} +public function setCellSpacing($value)  +	{  +		if(($this->_cellSpacing=TPropertyValue::ensureInteger($value))<-1)  +			throw new TInvalidDataValueException('tablestyle_cellspacing_invalid');  +		if($this->_cellSpacing===-1)  +			$this->_cellSpacing=null;  +	} +public function getGridLines()  +	{  +		return $this->_gridLines===null?'None':$this->_gridLines;  +	} +public function setGridLines($value)  +	{  +		$this->_gridLines=TPropertyValue::ensureEnum($value,array('None', 'Horizontal', 'Vertical', 'Both'));  +	}  +} +class TTableItemStyle extends TStyle  +{ +private $_horizontalAlign=null; +private $_verticalAlign=null; +private $_wrap=null; +public function reset()  +	{  +		parent::reset();  +		$this->_verticalAlign=null;  +		$this->_horizontalAlign=null;  +		$this->_wrap=null;  +	} +public function copyFrom($style)  +	{  +		parent::copyFrom($style);  +		$this->_verticalAlign=$style->_verticalAlign;  +		$this->_horizontalAlign=$style->_horizontalAlign;  +		$this->_wrap=$style->_wrap;  +	} +public function mergeWith($style)  +	{  +		parent::mergeWith($style);  +		if($style instanceof TTableItemStyle)  +		{  +			if($style->_verticalAlign!==null && $this->_verticalAlign===null)  +				$this->_verticalAlign=$style->_verticalAlign;  +			if($style->_horizontalAlign!==null && $this->_horizontalAlign===null)  +				$this->_horizontalAlign=$style->_horizontalAlign;  +			if($style->_wrap!==null && $this->_wrap===null)  +				$this->_wrap=$style->_wrap;  +		}  +	} +public function addAttributesToRender($writer)  +	{  +		if(!$this->getWrap())  +			$writer->addStyleAttribute('nowrap','nowrap'); +if(($horizontalAlign=$this->getHorizontalAlign())!=='NotSet')  +			$writer->addAttribute('align',strtolower($horizontalAlign)); +if(($verticalAlign=$this->getVerticalAlign())!=='NotSet')  +			$writer->addAttribute('valign',strtolower($verticalAlign)); +parent::addAttributesToRender($writer);  +	} +public function getHorizontalAlign()  +	{  +		return $this->_horizontalAlign===null?'NotSet':$this->_horizontalAlign;  +	} +public function setHorizontalAlign($value)  +	{  +		$this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify'));  +		if($this->_horizontalAlign==='NotSet')  +			$this->_horizontalAlign=null;  +	} +public function getVerticalAlign()  +	{  +		return $this->_verticalAlign===null?'NotSet':$this->_verticalAlign;  +	} +public function setVerticalAlign($value)  +	{  +		$this->_verticalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Top','Bottom','Middel'));  +		if($this->_verticalAlign==='NotSet')  +			$this->_verticalAlign=null;  +	} +public function getWrap()  +	{  +		return $this->_wrap===null?true:$this->_wrap;  +	} +public function setWrap($value)  +	{  +		$this->_wrap=TPropertyValue::ensureBoolean($value);  +	}  +} +?><?php + +class TWebControl extends TControl  +{ +public function copyBaseAttributes(TWebControl $control)  +	{  +		$this->setAccessKey($control->getAccessKey());  +		$this->setToolTip($control->getToolTip());  +		$this->setTabIndex($control->getTabIndex());  +		if(!$control->getEnabled())  +			$this->setEnabled(false);  +		if($control->getHasAttributes())  +			$this->getAttributes()->copyFrom($control->getAttributes());  +	} +public function getAccessKey()  +	{  +		return $this->getViewState('AccessKey','');  +	} +public function setAccessKey($value)  +	{  +		if(strlen($value)>1)  +			throw new TInvalidDataValueException('webcontrol_accesskey_invalid',get_class($this),$value);  +		$this->setViewState('AccessKey',$value,'');  +	} +public function getBackColor()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getBackColor();  +		else  +			return '';  +	} +public function setBackColor($value)  +	{  +		$this->getStyle()->setBackColor($value);  +	} +public function getBorderColor()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getBorderColor();  +		else  +			return '';  +	} +public function setBorderColor($value)  +	{  +		$this->getStyle()->setBorderColor($value);  +	} +public function getBorderStyle()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getBorderStyle();  +		else  +			return '';  +	} +public function setBorderStyle($value)  +	{  +		$this->getStyle()->setBorderStyle($value);  +	} +public function getBorderWidth()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getBorderWidth();  +		else  +			return '';  +	} +public function setBorderWidth($value)  +	{  +		$this->getStyle()->setBorderWidth($value);  +	} +public function getFont()  +	{  +		return $this->getStyle()->getFont();  +	} +public function getForeColor()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getForeColor();  +		else  +			return '';  +	} +public function setForeColor($value)  +	{  +		$this->getStyle()->setForeColor($value);  +	} +public function getHeight()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getHeight();  +		else  +			return '';  +	} +public function setCssClass($value)  +	{  +		$this->getStyle()->setCssClass($value);  +	} +public function getCssClass()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getCssClass();  +		else  +			return '';  +	} +public function setHeight($value)  +	{  +		$this->getStyle()->setHeight($value);  +	} +public function getHasStyle()  +	{  +		return $this->getViewState('Style',null)!==null;  +	} +protected function createStyle()  +	{  +		return new TStyle;  +	} +public function getStyle()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style;  +		else  +		{  +			$style=$this->createStyle();  +			$this->setViewState('Style',$style,null);  +			return $style;  +		}  +	} +public function setStyle($value)  +	{  +		if(is_string($value))  +			$this->getStyle()->setCustomStyle($value);  +		else  +			throw new TInvalidDataValueException('webcontrol_style_invalid',get_class($this));  +	} +public function getTabIndex()  +	{  +		return $this->getViewState('TabIndex',0);  +	} +public function setTabIndex($value)  +	{  +		$this->setViewState('TabIndex',TPropertyValue::ensureInteger($value),0);  +	} +protected function getTagName()  +	{  +		return 'span';  +	} +public function getToolTip()  +	{  +		return $this->getViewState('ToolTip','');  +	} +public function setToolTip($value)  +	{  +		$this->setViewState('ToolTip',$value,'');  +	} +public function getWidth()  +	{  +		if($style=$this->getViewState('Style',null))  +			return $style->getWidth();  +		else  +			return '';  +	} +public function setWidth($value)  +	{  +		$this->getStyle()->setWidth($value);  +	} +protected function addAttributesToRender($writer)  +	{  +		if($this->getID()!=='')  +			$writer->addAttribute('id',$this->getClientID());  +		if(($accessKey=$this->getAccessKey())!=='')  +			$writer->addAttribute('accesskey',$accessKey);  +		if(!$this->getEnabled())  +			$writer->addAttribute('disabled','disabled');  +		if(($tabIndex=$this->getTabIndex())>0)  +			$writer->addAttribute('tabindex',"$tabIndex");  +		if(($toolTip=$this->getToolTip())!=='')  +			$writer->addAttribute('title',$toolTip);  +		if($style=$this->getViewState('Style',null))  +			$style->addAttributesToRender($writer);  +		if($this->getHasAttributes())  +		{  +			foreach($this->getAttributes() as $name=>$value)  +				$writer->addAttribute($name,$value);  +		}  +	} +protected function render($writer)  +	{  +		$this->renderBeginTag($writer);  +		$this->renderContents($writer);  +		$this->renderEndTag($writer);  +	} +public function renderBeginTag($writer)  +	{  +		$this->addAttributesToRender($writer);  +		$writer->renderBeginTag($this->getTagName());  +	} +protected function renderContents($writer)  +	{  +		parent::renderChildren($writer);  +	} +public function renderEndTag($writer)  +	{  +		$writer->renderEndTag();  +	}  +} +?><?php +class TPlaceHolder extends TControl  +{  +} +?><?php +class TLiteral extends TControl  +{ +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +public function getEncode()  +	{  +		return $this->getViewState('Encode',false);  +	} +public function setEncode($value)  +	{  +		$this->setViewState('Encode',TPropertyValue::ensureBoolean($value),false);  +	} +protected function render($writer)  +	{  +		if(($text=$this->getText())!=='')  +		{  +			if($this->getEncode())  +				$writer->write(THttpUtility::htmlEncode($text));  +			else  +				$writer->write($text);  +		}  +	}  +} +?><?php +class TLabel extends TWebControl  +{ +protected function getTagName()  +	{  +		return ($this->getAssociatedControlID()==='')?'span':'label';  +	} +protected function addAttributesToRender($writer)  +	{  +		if(($aid=$this->getAssociatedControlID())!=='')  +		{  +			if($control=$this->findControl($aid))  +				$writer->addAttribute('for',$control->getClientID());  +			else  +				throw new TInvalidDataValueException('label_associatedcontrol_invalid',$aid);  +		}  +		parent::addAttributesToRender($writer);  +	} +protected function renderContents($writer)  +	{  +		if(($text=$this->getText())==='')  +			parent::renderContents($writer);  +		else  +			$writer->write($text);  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +public function getAssociatedControlID()  +	{  +		return $this->getViewState('AssociatedControlID','');  +	} +public function setAssociatedControlID($value)  +	{  +		$this->setViewState('AssociatedControlID',$value,'');  +	}  +} +?><?php +class TImage extends TWebControl  +{ +protected function getTagName()  +	{  +		return 'img';  +	} +protected function addAttributesToRender($writer)  +	{  +		$writer->addAttribute('src',$this->getImageUrl());  +		$writer->addAttribute('alt',$this->getAlternateText());  +		if(($desc=$this->getDescriptionUrl())!=='')  +			$writer->addAttribute('longdesc',$desc);  +		if(($align=$this->getImageAlign())!=='')  +			$writer->addAttribute('align',$align);  +		if(($width=$this->getBorderWidth())==='')  +			$writer->addStyleAttribute('border-width','0px');  +		parent::addAttributesToRender($writer);  +	} +protected function renderContents($writer)  +	{  +	} +public function getAlternateText()  +	{  +		return $this->getViewState('AlternateText','');  +	} +public function setAlternateText($value)  +	{  +		$this->setViewState('AlternateText',$value,'');  +	} +public function getImageAlign()  +	{  +		return $this->getViewState('ImageAlign','');  +	} +public function setImageAlign($value)  +	{  +		$this->setViewState('ImageAlign',$value,'');  +	} +public function getImageUrl()  +	{  +		return $this->getViewState('ImageUrl','');  +	} +public function setImageUrl($value)  +	{  +		$this->setViewState('ImageUrl',$value,'');  +	} +public function getDescriptionUrl()  +	{  +		return $this->getViewState('DescriptionUrl','');  +	} +public function setDescriptionUrl($value)  +	{  +		$this->setViewState('DescriptionUrl',$value,'');  +	}  +} +?><?php + +class TImageButton extends TImage implements IPostBackDataHandler, IPostBackEventHandler  +{ +private $_x=0; +private $_y=0; +protected function getTagName()  +	{  +		return 'input';  +	} +protected function addAttributesToRender($writer)  +	{  +		$page=$this->getPage();  +		$page->ensureRenderInForm($this);  +		$writer->addAttribute('type','image');  +		if(($uniqueID=$this->getUniqueID())!=='')  +			$writer->addAttribute('name',$uniqueID);  +		if($this->getEnabled(true))  +		{  +			$scripts = $this->getPage()->getClientScript();  +			$options = $this->getPostBackOptions();  +			$postback = $scripts->getPostBackEventReference($this, '', $options, false);  +			$scripts->registerClientEvent($this, "click", $postback);  +		}  +		else if($this->getEnabled()) 			$writer->addAttribute('disabled','disabled');  +		parent::addAttributesToRender($writer);  +	} +protected function getPostBackOptions()  +	{  +		$options=new TPostBackOptions();  +		if($this->getCausesValidation() && $this->getPage()->getValidators($this->getValidationGroup())->getCount()>0)  +		{  +			$options->setPerformValidation(true);  +			$options->setValidationGroup($this->getValidationGroup());  +		}  +		if($this->getPostBackUrl()!=='')  +			$options->setActionUrl($this->getPostBackUrl());  +		$options->setClientSubmit(false);  +		return $options;  +	} +public function loadPostData($key,$values)  +	{  +		$uid=$this->getUniqueID();  +		if(isset($values["{$uid}_x"]) && isset($values["{$uid}_y"]))  +		{  +			$this->_x=intval($values["{$uid}_x"]);  +			$this->_y=intval($values["{$uid}_y"]);  +			$this->getPage()->setPostBackEventTarget($this);  +		}  +		return false;  +	} +public function raisePostDataChangedEvent()  +	{  +			} +public function onClick($param)  +	{  +		$this->raiseEvent('Click',$this,$param);  +	} +public function onCommand($param)  +	{  +		$this->raiseEvent('Command',$this,$param);  +		$this->raiseBubbleEvent($this,$param);  +	} +public function raisePostBackEvent($param)  +	{  +		if($this->getCausesValidation())  +			$this->getPage()->validate($this->getValidationGroup());  +		$this->onClick(new TImageClickEventParameter($this->_x,$this->_y));  +		$this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter()));  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +	} +public function getCommandName()  +	{  +		return $this->getViewState('CommandName','');  +	} +public function setCommandName($value)  +	{  +		$this->setViewState('CommandName',$value,'');  +	} +public function getCommandParameter()  +	{  +		return $this->getViewState('CommandParameter','');  +	} +public function setCommandParameter($value)  +	{  +		$this->setViewState('CommandParameter',$value,'');  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +public function getPostBackUrl()  +	{  +		return $this->getViewState('PostBackUrl','');  +	} +public function setPostBackUrl($value)  +	{  +		$this->setViewState('PostBackUrl',$value,'');  +	} +public function getText()  +	{  +		return $this->getAlternateText();  +	} +public function setText($value)  +	{  +		$this->setAlternateText($value);  +	} +protected function onPreRender($param)  +	{  +		parent::onPreRender($param);  +		$this->getPage()->registerRequiresPostData($this);  +	}  +} +class TImageClickEventParameter extends TEventParameter  +{ +public $_x=0; +public $_y=0; +public function __construct($x,$y)  +	{  +		$this->_x=$x;  +		$this->_y=$y;  +	} +public function getX()  +	{  +		return $this->_x;  +	} +public function setX($value)  +	{  +		$this->_x=TPropertyValue::ensureInteger($value);  +	} +public function getY()  +	{  +		return $this->_y;  +	} +public function setY($value)  +	{  +		$this->_y=TPropertyValue::ensureInteger($value);  +	}  +} +?><?php +class TButton extends TWebControl implements IPostBackEventHandler  +{ +protected function getTagName()  +	{  +		return 'input';  +	} +protected function addAttributesToRender($writer)  +	{  +		$page=$this->getPage();  +		$page->ensureRenderInForm($this);  +		$writer->addAttribute('type',$this->getUseSubmitBehavior()?'submit':'button');  +		if(($uniqueID=$this->getUniqueID())!=='')  +			$writer->addAttribute('name',$uniqueID);  +		$writer->addAttribute('value',$this->getText());  +		if($this->getEnabled(true))  +		{  +			$scripts = $this->getPage()->getClientScript();  +			if($scripts->isEndScriptRegistered("TBaseValidator"))  +			{  +				$group = $this->getValidationGroup();  +				$group = strlen($group) ? ",'".$group."'" : '';  +				$clientID=$this->getClientID();  +								$script = "Prado.Validation.AddTarget('{$clientID}'{$group});";  +				$scripts->registerEndScript("{$uniqueID}:target", $script);  +			}  +		}  +		else if($this->getEnabled()) 			$writer->addAttribute('disabled','disabled'); +$writer->addAttribute('id',$this->getClientID());  +		parent::addAttributesToRender($writer);  +	} +protected function getPostBackOptions()  +	{  +		$option=new TPostBackOptions();  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		if($this->getCausesValidation() && $hasValidators)  +		{  +			$option->setPerformValidation(true);  +			$option->setValidationGroup($group);  +		}  +		if($this->getPostBackUrl()!=='')  +			$option->setActionUrl($this->getPostBackUrl());  +		$option->setClientSubmit(!$this->getUseSubmitBehavior()); +return $option;  +	} +protected function renderContents($writer)  +	{  +	} +public function onClick($param)  +	{  +		$this->raiseEvent('Click',$this,$param);  +	} +public function onCommand($param)  +	{  +		$this->raiseEvent('Command',$this,$param);  +		$this->raiseBubbleEvent($this,$param);  +	} +public function raisePostBackEvent($param)  +	{  +		if($this->getCausesValidation())  +			$this->getPage()->validate($this->getValidationGroup());  +		$this->onClick(null);  +		$this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter()));  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +	} +public function getCommandName()  +	{  +		return $this->getViewState('CommandName','');  +	} +public function setCommandName($value)  +	{  +		$this->setViewState('CommandName',$value,'');  +	} +public function getCommandParameter()  +	{  +		return $this->getViewState('CommandParameter','');  +	} +public function setCommandParameter($value)  +	{  +		$this->setViewState('CommandParameter',$value,'');  +	} +public function getUseSubmitBehavior()  +	{  +		return $this->getViewState('UseSubmitBehavior',true);  +	} +public function setUseSubmitBehavior($value)  +	{  +		$this->setViewState('UseSubmitBehavior',TPropertyValue::ensureBoolean($value),true);  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +public function getPostBackUrl()  +	{  +		return $this->getViewState('PostBackUrl','');  +	} +public function setPostBackUrl($value)  +	{  +		$this->setViewState('PostBackUrl',$value,'');  +	}  +} +?><?php +class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable  +{ +protected function getTagName()  +	{  +		return 'input';  +	} +public function loadPostData($key,$values)  +	{  +		$checked=$this->getChecked();  +		if(isset($values[$key])!=$checked)  +		{  +			$this->setChecked(!$checked);  +			return true;  +		}  +		else  +			return false;  +	} +public function raisePostDataChangedEvent()  +	{  +		$page=$this->getPage();  +		if($this->getAutoPostBack() && !$page->getPostBackEventTarget())  +		{  +			$page->setPostBackEventTarget($this);  +			if($this->getCausesValidation())  +				$page->validate($this->getValidationGroup());  +		}  +		$this->onCheckedChanged(null);  +	} +protected function onCheckedChanged($param)  +	{  +		$this->raiseEvent('CheckedChanged',$this,$param);  +	} +protected function onPreRender($param)  +	{  +		parent::onPreRender($param);  +		if($this->getEnabled(true))  +			$this->getPage()->registerRequiresPostData($this);  +	} +public function getValidationPropertyValue()  +	{  +		return $this->getChecked();  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +public function getTextAlign()  +	{  +		return $this->getViewState('TextAlign','Right');  +	} +public function setTextAlign($value)  +	{  +		$this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,array('Left','Right')),'Right');  +	} +public function getChecked()  +	{  +		return $this->getViewState('Checked',false);  +	} +public function setChecked($value)  +	{  +		$this->setViewState('Checked',$value,false);  +	} +public function getAutoPostBack()  +	{  +		return $this->getViewState('AutoPostBack',false);  +	} +public function setAutoPostBack($value)  +	{  +		$this->setViewState('AutoPostBack',$value,false);  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +protected function render($writer)  +	{  +		$this->addAttributesToRender($writer);  +		$this->getPage()->ensureRenderInForm($this);  +		$needSpan=false;  +		if($this->getHasStyle())  +		{  +			$this->getStyle()->addAttributesToRender($writer);  +			$needSpan=true;  +		}  +		if(!$this->getEnabled(true))  +		{  +			$writer->addAttribute('disabled','disabled');  +			$needSpan=true;  +		}  +		if(($tooltip=$this->getToolTip())!=='')  +		{  +			$writer->addAttribute('title',$tooltip);  +			$needSpan=true;  +		}  +		$onclick=null;  +		if($this->getHasAttributes())  +		{  +			$attributes=$this->getAttributes();  +			$value=$attributes->remove('value');  +			$onclick=$attributes->remove('onclick');  +			if($attributes->getCount())  +			{  +				$writer->addAttributes($attributes);  +				$needSpan=true;  +			}  +			if($value!==null)  +				$attributes->add('value',$value);  +		}  +		if($needSpan)  +			$writer->renderBeginTag('span');  +		$clientID=$this->getClientID();  +		if(($text=$this->getText())!=='')  +		{  +			if($this->getTextAlign()==='Left')  +			{  +				$this->renderLabel($writer,$clientID,$text);  +				$this->renderInputTag($writer,$clientID,$onclick);  +			}  +			else  +			{  +				$this->renderInputTag($writer,$clientID,$onclick);  +				$this->renderLabel($writer,$clientID,$text);  +			}  +		}  +		else  +			$this->renderInputTag($writer,$clientID,$onclick);  +		if($needSpan)  +			$writer->renderEndTag();  +	} +public function getLabelAttributes()  +	{  +		if($attributes=$this->getViewState('LabelAttributes',null))  +			return $attributes;  +		else  +		{  +			$attributes=new TMap;  +			$this->setViewState('LabelAttributes',$attributes,null);  +			return $attributes;  +		}  +	} +public function getInputAttributes()  +	{  +		if($attributes=$this->getViewState('InputAttributes',null))  +			return $attributes;  +		else  +		{  +			$attributes=new TMap;  +			$this->setViewState('InputAttributes',$attributes,null);  +			return $attributes;  +		}  +	} +protected function renderLabel($writer,$clientID,$text)  +	{  +		$writer->addAttribute('for',$clientID);  +		if($attributes=$this->getViewState('LabelAttributes',null))  +			$writer->addAttributes($attributes);  +		$writer->renderBeginTag('label');  +		$writer->write($text);  +		$writer->renderEndTag();  +	} +protected function renderInputTag($writer,$clientID,$onclick)  +	{  +		if($clientID!=='')  +			$writer->addAttribute('id',$clientID);  +		$writer->addAttribute('type','checkbox');  +		if(($uniqueID=$this->getUniqueID())!=='')  +			$writer->addAttribute('name',$uniqueID);  +		if($this->getChecked())  +			$writer->addAttribute('checked','checked');  +		if(!$this->getEnabled(true))  +			$writer->addAttribute('disabled','disabled'); +$page=$this->getPage();  +		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())  +		{  +			$options = $this->getAutoPostBackOptions();  +			$scripts = $page->getClientScript();  +			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  +			$scripts->registerClientEvent($this, "click", $postback);  +		} +if(($accesskey=$this->getAccessKey())!=='')  +			$writer->addAttribute('accesskey',$accesskey);  +		if(($tabindex=$this->getTabIndex())>0)  +			$writer->addAttribute('tabindex',"$tabindex");  +		if($attributes=$this->getViewState('InputAttributes',null))  +			$writer->addAttributes($attributes);  +		$writer->renderBeginTag('input');  +		$writer->renderEndTag();  +	} +protected function getAutoPostBackOptions()  +	{  +		$option=new TPostBackOptions();  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		if($this->getCausesValidation() && $hasValidators)  +		{  +			$option->setPerformValidation(true);  +			$option->setValidationGroup($group);  +		}  +		$option->setAutoPostBack(true);  +	} +} +?><?php + + +class TRadioButton extends TCheckBox  +{ +private $_uniqueGroupName=null; +public function loadPostData($key,$values)  +	{  +		$uniqueGroupName=$this->getUniqueGroupName();  +		$value=isset($values[$uniqueGroupName])?$values[$uniqueGroupName]:null;  +		if($value!==null && $value===$this->getValueAttribute())  +		{  +			if(!$this->getChecked())  +			{  +				$this->setChecked(true);  +				return true;  +			}  +			else  +				return false;  +		}  +		else if($this->getChecked())  +			$this->setChecked(false);  +		return false;  +	} +public function getGroupName()  +	{  +		return $this->getViewState('GroupName','');  +	} +public function setGroupName($value)  +	{  +		$this->setViewState('GroupName',$value,'');  +	} +private function getUniqueGroupName()  +	{  +		if($this->_uniqueGroupName===null)  +		{  +			$groupName=$this->getGroupName();  +			$uniqueID=$this->getUniqueID();  +			if($uniqueID!=='')  +			{  +				if(($pos=strrpos($uniqueID,TControl::ID_SEPARATOR))!==false)  +				{  +					if($groupName!=='')  +						$groupName=substr($uniqueID,0,$pos+1).$groupName;  +					else if($this->getNamingContainer() instanceof TRadioButtonList)  +						$groupName=substr($uniqueID,0,$pos);  +				}  +				if($groupName==='')  +					$groupName=$uniqueID;  +			}  +			$this->_uniqueGroupName=$groupName;  +		}  +		return $this->_uniqueGroupName;  +	} +private function getValueAttribute()  +	{  +		if(($value=$this->getAttribute('value'))===null)  +		{  +			$value=$this->getID();  +			return $value===''?$this->getUniqueID():$value;  +		}  +		else  +			return $value;  +	} +protected function renderInputTag($writer,$clientID,$onclick)  +	{  +		if($clientID!=='')  +			$writer->addAttribute('id',$clientID);  +		$writer->addAttribute('type','radio');  +		$writer->addAttribute('name',$this->getUniqueGroupName());  +		$writer->addAttribute('value',$this->getValueAttribute());  +		if($this->getChecked())  +			$writer->addAttribute('checked','checked');  +		if(!$this->getEnabled(true))  +			$writer->addAttribute('disabled','disabled'); +$page=$this->getPage();  +		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())  +		{  +			$options = $this->getAutoPostBackOptions();  +			$scripts = $page->getClientScript();  +			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  +			$scripts->registerClientEvent($this, "click", $postback);  +		} +if(($accesskey=$this->getAccessKey())!=='')  +			$writer->addAttribute('accesskey',$accesskey);  +		if(($tabindex=$this->getTabIndex())>0)  +			$writer->addAttribute('tabindex',"$tabindex");  +		if($attributes=$this->getViewState('InputAttributes',null))  +			$writer->addAttributes($attributes);  +		$writer->renderBeginTag('input');  +		$writer->renderEndTag();  +	}  +} +?><?php +class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable  +{ +const DEFAULT_ROWS=4; +const DEFAULT_COLUMNS=20; +private static $_autoCompleteTypes=array('BusinessCity','BusinessCountryRegion','BusinessFax','BusinessPhone','BusinessState','BusinessStreetAddress','BusinessUrl','BusinessZipCode','Cellular','Company','Department','Disabled','DisplayName','Email','FirstName','Gender','HomeCity','HomeCountryRegion','HomeFax','Homepage','HomePhone','HomeState','HomeStreetAddress','HomeZipCode','JobTitle','LastName','MiddleName','None','Notes','Office','Pager','Search'); +private static $_safeTextParser=null; +private $_safeText; +protected function getTagName()  +	{  +		return ($this->getTextMode()==='MultiLine')?'textarea':'input';  +	} +protected function addAttributesToRender($writer)  +	{  +		$page=$this->getPage();  +		$page->ensureRenderInForm($this);  +		if(($uid=$this->getUniqueID())!=='')  +			$writer->addAttribute('name',$uid);  +		if(($textMode=$this->getTextMode())==='MultiLine')  +		{  +			if(($rows=$this->getRows())<=0)  +				$rows=self::DEFAULT_ROWS;  +			if(($cols=$this->getColumns())<=0)  +				$cols=self::DEFAULT_COLUMNS;  +			$writer->addAttribute('rows',"$rows");  +			$writer->addAttribute('cols',"$cols");  +			if(!$this->getWrap())  +				$writer->addAttribute('wrap','off');  +		}  +		else  +		{  +			if($textMode==='SingleLine')  +			{  +				$writer->addAttribute('type','text');  +				if(($text=$this->getText())!=='')  +					$writer->addAttribute('value',$text);  +				if(($act=$this->getAutoCompleteType())!=='None')  +				{  +					if($act==='Disabled')  +						$writer->addAttribute('autocomplete','off');  +					else if($act==='Search')  +						$writer->addAttribute('vcard_name','search');  +					else if($act==='HomeCountryRegion')  +						$writer->addAttribute('vcard_name','HomeCountry');  +					else if($act==='BusinessCountryRegion')  +						$writer->addAttribute('vcard_name','BusinessCountry');  +					else  +					{  +						if(($pos=strpos($act,'Business'))===0)  +							$act='Business'.'.'.substr($act,8);  +						else if(($pos=strpos($act,'Home'))===0)  +							$act='Home'.'.'.substr($act,4);  +						$writer->addAttribute('vcard_name','vCard.'.$act);  +					}  +				}  +			}  +			else  +			{  +				$writer->addAttribute('type','password');  +			}  +			if(($cols=$this->getColumns())>0)  +				$writer->addAttribute('size',"$cols");  +			if(($maxLength=$this->getMaxLength())>0)  +				$writer->addAttribute('maxlength',"$maxLength");  +		}  +		if($this->getReadOnly())  +			$writer->addAttribute('readonly','readonly');  +		if(!$this->getEnabled(true) && $this->getEnabled())  			$writer->addAttribute('disabled','disabled');  +		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())  +		{  +			$writer->addAttribute('id',$this->getClientID());  +			$options = $this->getAutoPostBackOptions();  +			$scripts = $this->getPage()->getClientScript();  +			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  +			$scripts->registerClientEvent($this, "change", $postback); +if($this->getTextMode() !== 'MultiLine')  +			{  +				$code = "if(Prado.TextBox.handleReturnKey(e)==false) Event.stop(e);";  +				$scripts->registerClientEvent($this, "keypress", $code);  +			}  +		}  +		parent::addAttributesToRender($writer);  +	} +protected function getAutoPostBackOptions()  +	{  +		$option=new TPostBackOptions();  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		if($this->getCausesValidation() && $hasValidators)  +		{  +			$option->setPerformValidation(true);  +			$option->setValidationGroup($group);  +		}  +		$option->setAutoPostBack(true);  +	} +public function loadPostData($key,$values)  +	{  +		$value=$values[$key];  +		if(!$this->getReadOnly() && $this->getText()!==$value)  +		{  +			$this->setText($value);  +			return true;  +		}  +		else  +			return false;  +	} +public function getValidationPropertyValue()  +	{  +		return $this->getText();  +	} +protected function onTextChanged($param)  +	{  +		$this->raiseEvent('TextChanged',$this,$param);  +	} +public function raisePostDataChangedEvent()  +	{  +		$page=$this->getPage();  +		if($this->getAutoPostBack() && !$page->getPostBackEventTarget())  +		{  +			$page->setPostBackEventTarget($this);  +			if($this->getCausesValidation())  +				$page->validate($this->getValidationGroup());  +		}  +		$this->onTextChanged(null);  +	} +protected function renderContents($writer)  +	{  +		if($this->getTextMode()==='MultiLine')  +			$writer->write(THttpUtility::htmlEncode($this->getText()));  +	} +public function getAutoCompleteType()  +	{  +		return $this->getViewState('AutoCompleteType','None');  +	} +public function setAutoCompleteType($value)  +	{  +		$this->setViewState('AutoCompleteType',TPropertyValue::ensureEnum($value,self::$_autoCompleteTypes),'None');  +	} +public function getAutoPostBack()  +	{  +		return $this->getViewState('AutoPostBack',false);  +	} +public function setAutoPostBack($value)  +	{  +		$this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false);  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +	} +public function getColumns()  +	{  +		return $this->getViewState('Columns',0);  +	} +public function setColumns($value)  +	{  +		$this->setViewState('Columns',TPropertyValue::ensureInteger($value),0);  +	} +public function getMaxLength()  +	{  +		return $this->getViewState('MaxLength',0);  +	} +public function setMaxLength($value)  +	{  +		$this->setViewState('MaxLength',TPropertyValue::ensureInteger($value),0);  +	} +public function getReadOnly()  +	{  +		return $this->getViewState('ReadOnly',false);  +	} +public function setReadOnly($value)  +	{  +		$this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false);  +	} +public function getRows()  +	{  +		return $this->getViewState('Rows',self::DEFAULT_ROWS);  +	} +public function setRows($value)  +	{  +		$this->setViewState('Rows',TPropertyValue::ensureInteger($value),self::DEFAULT_ROWS);  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +		$this->_safeText = null;  +	} +public function getSafeText()  +	{  +		if($this->_safeText===null)  +			$this->_safeText=$this->getSafeTextParser()->parse($this->getText());  +		return $this->_safeText;  +	} +protected function getSafeTextParser()  +	{  +		if(!self::$_safeTextParser)  +			self::$_safeTextParser=Prado::createComponent('System.3rdParty.SafeHtml.TSafeHtmlParser');  +		return self::$_safeTextParser;  +	} +public function getTextMode()  +	{  +		return $this->getViewState('TextMode','SingleLine');  +	} +public function setTextMode($value)  +	{  +		$this->setViewState('TextMode',TPropertyValue::ensureEnum($value,array('SingleLine','MultiLine','Password')),'SingleLine');  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +public function getWrap()  +	{  +		return $this->getViewState('Wrap',true);  +	} +public function setWrap($value)  +	{  +		$this->setViewState('Wrap',TPropertyValue::ensureBoolean($value),true);  +	}  +} +?><?php +class TPanel extends TWebControl  +{ +private $_defaultButton=''; +protected function getTagName()  +	{  +		return 'div';  +	} +protected function createStyle()  +	{  +		return new TPanelStyle;  +	} +protected function addAttributesToRender($writer)  +	{  +		parent::addAttributesToRender($writer);  +		if(($butt=$this->getDefaultButton())!=='')  +		{  +			if(($button=$this->findControl($butt))===null)  +				throw new TInvalidDataValueException('panel_defaultbutton_invalid',$butt);  +			else  +			{  +				$scripts = $this->getPage()->getClientScript();  +				$js = $scripts->registerDefaultButtonScript($this,$button);  +				$clientID=$this->getClientID();  +				$scripts->registerEndScript($clientID.'defaultButton', $js);  +				$writer->addAttribute('id',$clientID);  +			}  +		}  +	} +public function getWrap()  +	{  +		return $this->getStyle()->getWrap();  +	} +public function setWrap($value)  +	{  +		$this->getStyle()->setWrap($value);  +	} +public function getHorizontalAlign()  +	{  +		return $this->getStyle()->getHorizontalAlign();  +	} +public function setHorizontalAlign($value)  +	{  +		$this->getStyle()->setHorizontalAlign($value);  +	} +public function getBackImageUrl()  +	{  +		return $this->getStyle()->getBackImageUrl();  +	} +public function setBackImageUrl($value)  +	{  +		$this->getStyle()->setBackImageUrl($value);  +	} +public function getDirection()  +	{  +		return $this->getStyle()->getDirection();  +	} +public function setDirection($value)  +	{  +		$this->getStyle()->setDirection($value);  +	} +public function getDefaultButton()  +	{  +		return $this->_defaultButton;  +	} +public function setDefaultButton($value)  +	{  +		$this->_defaultButton=$value;  +	} +public function getGroupingText()  +	{  +		return $this->getViewState('GroupingText','');  +	} +public function setGroupingText($value)  +	{  +		$this->setViewState('GroupingText',$value,'');  +	} +public function getScrollBars()  +	{  +		return $this->getStyle()->getScrollBars();  +	} +public function setScrollBars($value)  +	{  +		$this->getStyle()->setScrollBars($value);  +	} +public function renderBeginTag($writer)  +	{  +		parent::renderBeginTag($writer);  +		if(($text=$this->getGroupingText())!=='')  +		{  +			$writer->renderBeginTag('fieldset');  +			$writer->renderBeginTag('legend');  +			$writer->write($text);  +			$writer->renderEndTag();  +		}  +	} +public function renderEndTag($writer)  +	{  +		if($this->getGroupingText()!=='')  +			$writer->renderEndTag();  +		parent::renderEndTag($writer);  +	}  +} +class TPanelStyle extends TStyle  +{ +private $_backImageUrl=''; +private $_direction='NotSet'; +private $_horizontalAlign='NotSet'; +private $_scrollBars='None'; +private $_wrap=true; +public function addAttributesToRender($writer)  +	{  +		if(($url=trim($this->_backImageUrl))!=='')  +			$this->setStyleField('background-image','url('.$url.')'); +switch($this->_scrollBars)  +		{  +			case 'Horizontal': $this->setStyleField('overflow-x','scroll'); break;  +			case 'Vertical': $this->setStyleField('overflow-y','scroll'); break;  +			case 'Both': $this->setStyleField('overflow','scroll'); break;  +			case 'Auto': $this->setStyleField('overflow','auto'); break;  +		} +if($this->_horizontalAlign!=='NotSet')  +			$this->setStyleField('text-align',strtolower($this->_horizontalAlign)); +if(!$this->_wrap)  +			$this->setStyleField('white-space','nowrap'); +if($this->_direction==='LeftToRight')  +			$this->setStyleField('direction','ltr');  +		else if($this->_direction==='RightToLeft')  +			$this->setStyleField('direction','rtl'); +parent::addAttributesToRender($writer);  +	} +public function getBackImageUrl()  +	{  +		return $this->_backImageUrl;  +	} +public function setBackImageUrl($value)  +	{  +		$this->_backImageUrl=$value;  +	} +public function getDirection()  +	{  +		return $this->_direction;  +	} +public function setDirection($value)  +	{  +		$this->_direction=TPropertyValue::ensureEnum($value,array('NotSet','LeftToRight','RightToLeft'));  +	} +public function getWrap()  +	{  +		return $this->_wrap;  +	} +public function setWrap($value)  +	{  +		$this->_wrap=TPropertyValue::ensureBoolean($value);  +	} +public function getHorizontalAlign()  +	{  +		return $this->_horizontalAlign;  +	} +public function setHorizontalAlign($value)  +	{  +		$this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify'));  +	} +public function getScrollBars()  +	{  +		return $this->_scrollBars;  +	} +public function setScrollBars($value)  +	{  +		$this->_scrollBars=TPropertyValue::ensureEnum($value,array('None','Auto','Both','Horizontal','Vertical'));  +	}  +}  +?><?php +class TContent extends TControl implements INamingContainer  +{ +public function createdOnTemplate($parent)  +	{  +		if(($id=$this->getID())==='')  +			throw new TConfigurationException('content_id_required');  +		$this->getTemplateControl()->registerContent($this);  +	}  +} +?><?php +class TContentPlaceHolder extends TControl  +{ +public function createdOnTemplate($parent)  +	{  +		if(($id=$this->getID())==='')  +			throw new TConfigurationException('contentplaceholder_id_required');  +		$loc=$parent->getHasControls()?$parent->getControls()->getCount():0;  +		$this->getTemplateControl()->registerContentPlaceHolder($id,$parent,$loc);  +		$parent->unregisterObject($id);  +	}  +} +?><?php +class TExpression extends TControl  +{ +private $_e=''; +public function getExpression()  +	{  +		return $this->_e;  +	} +public function setExpression($value)  +	{  +		$this->_e=$value;  +	} +protected function render($writer)  +	{  +		if($this->_e!=='')  +			$writer->write($this->evaluateExpression($this->_e));  +	}  +} +?><?php +class TStatements extends TControl  +{ +private $_s=''; +public function getStatements()  +	{  +		return $this->_s;  +	} +public function setStatements($value)  +	{  +		$this->_s=$value;  +	} +protected function render($writer)  +	{  +		if($this->_s!=='')  +			$writer->write($this->evaluateStatements($this->_s));  +	}  +} +?><?php +class TFileUpload extends TWebControl implements IPostBackDataHandler, IValidatable  +{ +const MAX_FILE_SIZE=1048576; +private $_fileSize=0; +private $_fileName=''; +private $_localName=''; +private $_fileType=''; +private $_errorCode=UPLOAD_ERR_NO_FILE; +protected function getTagName()  +	{  +		return 'input';  +	} +protected function addAttributesToRender($writer)  +	{  +		$this->getPage()->ensureRenderInForm($this);  +		parent::addAttributesToRender($writer);  +		$writer->addAttribute('type','file');  +		$writer->addAttribute('name',$this->getUniqueID());  +	} +protected function onPreRender($param)  +	{  +		parent::onPreRender($param);  +		if(($form=$this->getPage()->getForm())!==null)  +			$form->setEnctype('multipart/form-data');  +		$this->getPage()->getClientScript()->registerHiddenField('MAX_FILE_SIZE',$this->getMaxFileSize());  +		if($this->getEnabled(true))  +			$this->getPage()->registerRequiresPostData($this);  +	} +public function getMaxFileSize()  +	{  +		return $this->getViewState('MaxFileSize',self::MAX_FILE_SIZE);  +	} +public function setMaxFileSize($size)  +	{  +		$this->setViewState('MaxFileSize',TPropertyValue::ensureInteger($size),self::MAX_FILE_SIZE);  +	} +public function getFileName()  +	{  +		return $this->_fileName;  +	} +public function getFileSize()  +	{  +		return $this->_fileSize;  +	} +public function getFileType()  +	{  +		return $this->_fileType;  +	} +public function getLocalName()  +	{  +		return $this->_localName;  +	} +public function getErrorCode()  +	{  +		return $this->_errorCode;  +	} +public function getHasFile()  +	{  +		return $this->_errorCode===UPLOAD_ERR_OK;  +	} +public function saveAs($fileName,$deleteTempFile=true)  +	{  +		if($this->_errorCode===UPLOAD_ERR_OK)  +		{  +			if($deleteTempFile)  +				move_uploaded_file($this->_localName,$fileName);  +			else if(is_uploaded_file($this->_localName))  +				file_put_contents($fileName,file_get_contents($this->_localName));  +			else  +				throw new TInvalidOperationException('fileupload_saveas_failed');  +		}  +		else  +			throw new TInvalidOperation('fileupload_saveas_forbidden');  +	} +public function loadPostData($key,$values)  +	{  +		if(isset($_FILES[$key]))  +		{  +			$this->_fileName=$_FILES[$key]['name'];  +			$this->_fileSize=$_FILES[$key]['size'];  +			$this->_fileType=$_FILES[$key]['type'];  +			$this->_errorCode=$_FILES[$key]['error'];  +			$this->_localName=$_FILES[$key]['tmp_name'];  +			return true;  +		}  +		else  +			return false;  +	} +public function raisePostDataChangedEvent()  +	{  +		$this->onFileUpload(null);  +	} +protected function onFileUpload($param)  +	{  +		$this->raiseEvent('FileUpload',$this,$param);  +	} +public function getValidationPropertyValue()  +	{  +		return $this->getFileName();  +	}  +} +?><?php +class THead extends TControl  +{ +private $_metaTags=array(); +protected function onInit($param)  +	{  +		parent::onInit($param);  +		$this->getPage()->setHead($this);  +	} +public function getTitle()  +	{  +		return $this->getViewState('Title','');  +	} +public function setTitle($value)  +	{  +		$this->setViewState('Title',$value,'');  +	} +public function registerMetaTag($key,$metaTag)  +	{  +		$this->_metaTags[$key]=$metaTag;  +	} +public function isMetaTagRegistered($key)  +	{  +		return isset($this->_metaTags[$key]);  +	} +public function render($writer)  +	{  +		$page=$this->getPage();  +		if(($title=$page->getTitle())==='')  +			$title=$this->getTitle();  +		$writer->write("<head>\n<title>".THttpUtility::htmlEncode($title)."</title>\n");  +		foreach($this->_metaTags as $metaTag)  +		{  +			$metaTag->render($writer);  +			$writer->writeLine();  +		}  +		$cs=$page->getClientScript();  +		$cs->renderStyleSheetFiles($writer);  +		$cs->renderStyleSheets($writer);  +		$cs->renderHeadScriptFiles($writer);  +		$cs->renderHeadScripts($writer);  +		parent::render($writer);  +		$writer->write("</head>\n");  +	}  +} +class TMetaTag extends TComponent  +{ +private $_id=''; +private $_httpEquiv=''; +private $_name=''; +private $_content=''; +private $_scheme=''; +public function getID()  +	{  +		return $this->_id;  +	} +public function setID($value)  +	{  +		$this->_id=$value;  +	} +public function getHttpEquiv()  +	{  +		return $this->_httpEquiv;  +	} +public function setHttpEquiv($value)  +	{  +		$this->_httpEquiv=$value;  +	} +public function getName()  +	{  +		return $this->_name;  +	} +public function setName($value)  +	{  +		$this->_name=$value;  +	} +public function getContent()  +	{  +		return $this->_content;  +	} +public function setContent($value)  +	{  +		$this->_content=$value;  +	} +public function getScheme()  +	{  +		return $this->_scheme;  +	} +public function setScheme($value)  +	{  +		$this->_scheme=$value;  +	} +public function render($writer)  +	{  +		if($this->_id!=='')  +			$writer->addAttribute('id',$this->_id);  +		if($this->_name!=='')  +			$writer->addAttribute('name',$this->_name);  +		if($this->_httpEquiv!=='')  +			$writer->addAttribute('http-equiv',$this->_name);  +		if($this->_scheme!=='')  +			$writer->addAttribute('scheme',$this->_name);  +		$writer->addAttribute('content',$this->_name);  +		$writer->renderBeginTag('meta');  +		$writer->renderEndTag();  +	}  +} +?><?php +class THiddenField extends TControl implements IPostBackDataHandler  +{ +protected function getTagName()  +	{  +		return 'input';  +	} +public function focus()  +	{  +		throw new TNotSupportedException('hiddenfield_focus_unsupported');  +	} +protected function render($writer)  +	{  +		$uniqueID=$this->getUniqueID();  +		$this->getPage()->ensureRenderInForm($this);  +		$writer->addAttribute('type','hidden');  +		if($uniqueID!=='')  +			$writer->addAttribute('name',$uniqueID);  +		if($this->getID()!=='')  +			$writer->addAttribute('id',$this->getClientID());  +		if(($value=$this->getValue())!=='')  +			$writer->addAttribute('value',$value);  +		$writer->renderBeginTag('input');  +		$writer->renderEndTag();  +	} +public function loadPostData($key,$values)  +	{  +		$value=$values[$key];  +		if($value===$this->getValue())  +			return false;  +		else  +		{  +			$this->setValue($value);  +			return true;  +		}  +	} +public function raisePostDataChangedEvent()  +	{  +		$this->onValueChanged(null);  +	} +public function onValueChanged($param)  +	{  +		$this->raiseEvent('ValueChanged',$this,$param);  +	} +public function getValue()  +	{  +		return $this->getViewState('Value','');  +	} +public function setValue($value)  +	{  +		$this->setViewState('Value',$value,'');  +	} +public function getEnableTheming()  +	{  +		return false;  +	} +public function setEnableTheming($value)  +	{  +		throw new TNotSupportedException('hiddenfield_theming_unsupported');  +	} +public function setSkinID($value)  +	{  +		throw new TNotSupportedException('hiddenfield_skinid_unsupported');  +	}  +} +?><?php +class THyperLink extends TWebControl  +{ +protected function getTagName()  +	{  +		return 'a';  +	} +protected function addAttributesToRender($writer)  +	{  +		$isEnabled=$this->getEnabled(true);  +		if($this->getEnabled() && !$isEnabled)  +			$writer->addAttribute('disabled','disabled');  +		parent::addAttributesToRender($writer);  +		if(($url=$this->getNavigateUrl())!=='' && $isEnabled)  +			$writer->addAttribute('href',$url);  +		if(($target=$this->getTarget())!=='')  +			$writer->addAttribute('target',$target);  +	} +protected function renderContents($writer)  +	{  +		if(($imageUrl=$this->getImageUrl())==='')  +		{  +			if(($text=$this->getText())!=='')  +				$writer->write($text);  +			else  +				parent::renderContents($writer);  +		}  +		else  +		{  +			$image=new TImage;  +			$image->setImageUrl($imageUrl);  +			if(($toolTip=$this->getToolTip())!=='')  +				$image->setToolTip($toolTip);  +			if(($text=$this->getText())!=='')  +				$image->setAlternateText($text);  +			$image->renderControl($writer);  +		}  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +public function getImageUrl()  +	{  +		return $this->getViewState('ImageUrl','');  +	} +public function setImageUrl($value)  +	{  +		$this->setViewState('ImageUrl',$value,'');  +	} +public function getNavigateUrl()  +	{  +		return $this->getViewState('NavigateUrl','');  +	} +public function setNavigateUrl($value)  +	{  +		$this->setViewState('NavigateUrl',$value,'');  +	} +public function getTarget()  +	{  +		return $this->getViewState('Target','');  +	} +public function setTarget($value)  +	{  +		$this->setViewState('Target',$value,'');  +	}  +} +?><?php +class TTable extends TWebControl  +{ +private $_rows=null; +protected function getTagName()  +	{  +		return 'table';  +	} +public function addParsedObject($object)  +	{  +		if($object instanceof TTableRow)  +			$this->getRows()->add($object);  +	} +protected function createStyle()  +	{  +		return new TTableStyle;  +	} +protected function addAttributesToRender($writer)  +	{  +		parent::addAttributesToRender($writer);  +		$border=0;  +		if($this->getHasStyle())  +		{  +			if($this->getGridLines()!=='None')  +			{  +				if(($border=$this->getBorderWidth())==='')  +					$border=1;  +				else  +					$border=(int)$border;  +			}  +		}  +		$writer->addAttribute('border',"$border");  +	} +public function getRows()  +	{  +		if(!$this->_rows)  +			$this->_rows=new TTableRowCollection($this);  +		return $this->_rows;  +	} +public function getCaption()  +	{  +		return $this->getViewState('Caption','');  +	} +public function setCaption($value)  +	{  +		$this->setViewState('Caption',$value,'');  +	} +public function getCaptionAlign()  +	{  +		return $this->getViewState('CaptionAlign','NotSet');  +	} +public function setCaptionAlign($value)  +	{  +		$this->setViewState('CaptionAlign',TPropertyValue::ensureEnum($value,'NotSet','Top','Bottom','Left','Right'),'NotSet');  +	} +public function getCellSpacing()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getCellSpacing();  +		else  +			return -1;  +	} +public function setCellSpacing($value)  +	{  +		$this->getStyle()->setCellSpacing($value);  +	} +public function getCellPadding()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getCellPadding();  +		else  +			return -1;  +	} +public function setCellPadding($value)  +	{  +		$this->getStyle()->setCellPadding($value);  +	} +public function getHorizontalAlign()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getHorizontalAlign();  +		else  +			return 'NotSet';  +	} +public function setHorizontalAlign($value)  +	{  +		$this->getStyle()->setHorizontalAlign($value);  +	} +public function getGridLines()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getGridLines();  +		else  +			return 'None';  +	} +public function setGridLines($value)  +	{  +		$this->getStyle()->setGridLines($value);  +	} +public function getBackImageUrl()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getBackImageUrl();  +		else  +			return '';  +	} +public function setBackImageUrl($value)  +	{  +		$this->getStyle()->setBackImageUrl($value);  +	} +public function renderBeginTag($writer)  +	{  +		parent::renderBeginTag($writer);  +		if(($caption=$this->getCaption())!=='')  +		{  +			if(($align=$this->getCaptionAlign())!=='NotSet')  +				$writer->addAttribute('align',$align);  +			$writer->renderBeginTag('caption');  +			$writer->write($caption);  +			$writer->renderEndTag();  +		}  +	} +protected function renderContents($writer)  +	{  +		if($this->_rows)  +		{  +			$writer->writeLine();  +			foreach($this->_rows as $row)  +			{  +				$row->renderControl($writer);  +				$writer->writeLine();  +			}  +		}  +	}  +} +class TTableRow extends TWebControl  +{ +private $_cells=null; +protected function getTagName()  +	{  +		return 'tr';  +	} +public function addParsedObject($object)  +	{  +		if($object instanceof TTableCell)  +			$this->getCells()->add($object);  +	} +protected function createStyle()  +	{  +		return new TTableItemStyle;  +	} +public function getCells()  +	{  +		if(!$this->_cells)  +			$this->_cells=new TTableCellCollection($this);  +		return $this->_cells;  +	} +public function getHorizontalAlign()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getHorizontalAlign();  +		else  +			return 'NotSet';  +	} +public function setHorizontalAlign($value)  +	{  +		$this->getStyle()->setHorizontalAlign($value);  +	} +public function getVerticalAlign()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getVerticalAlign();  +		else  +			return 'NotSet';  +	} +public function setVerticalAlign($value)  +	{  +		$this->getStyle()->setVerticalAlign($value);  +	} +protected function renderContents($writer)  +	{  +		if($this->_cells)  +		{  +			$writer->writeLine();  +			foreach($this->_cells as $cell)  +			{  +				$cell->renderControl($writer);  +				$writer->writeLine();  +			}  +		}  +	}  +} +class TTableCell extends TWebControl  +{ +protected function getTagName()  +	{  +		return 'td';  +	} +protected function createStyle()  +	{  +		return new TTableItemStyle;  +	} +public function getHorizontalAlign()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getHorizontalAlign();  +		else  +			return 'NotSet';  +	} +public function setHorizontalAlign($value)  +	{  +		$this->getStyle()->setHorizontalAlign($value);  +	} +public function getVerticalAlign()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getVerticalAlign();  +		else  +			return 'NotSet';  +	} +public function setVerticalAlign($value)  +	{  +		$this->getStyle()->setVerticalAlign($value);  +	} +public function getColumnSpan()  +	{  +		return $this->getViewState('ColumnSpan', 0);  +	} +public function setColumnSpan($value)  +	{  +		$this->setViewState('ColumnSpan', TPropertyValue::ensureInteger($value), 0);  +	} +public function getRowSpan()  +	{  +		return $this->getViewState('RowSpan', 0);  +	} +public function setRowSpan($value)  +	{  +		$this->setViewState('RowSpan', TPropertyValue::ensureInteger($value), 0);  +	} +public function getWrap()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getWrap();  +		else  +			return true;  +	} +public function setWrap($value)  +	{  +		$this->getStyle()->setWrap($value);  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +protected function addAttributesToRender($writer)  +	{  +		parent::addAttributesToRender($writer);  +		if(($colspan=$this->getColumnSpan())>0)  +			$writer->addAttribute('colspan',"$colspan");  +		if(($rowspan=$this->getRowSpan())>0)  +			$writer->addAttribute('rowspan',"$rowspan");  +	} +protected function renderContents($writer)  +	{  +		if(($text=$this->getText())==='')  +			parent::renderContents($writer);  +		else  +			$writer->write($text);  +	}  +} +class TTableHeaderCell extends TTableCell  +{ +protected function getTagName()  +	{  +		return 'th';  +	} +protected function addAttributesToRender($writer)  +	{  +		parent::addAttributesToRender($writer);  +		if(($scope=$this->getScope())!=='NotSet')  +			$writer->addAttribute('scope',$scope==='Row'?'row':'col');  +		if(($text=$this->getAbbreviatedText())!=='')  +			$writer->addAttribute('abbr',$text);  +		if(($text=$this->getCategoryText())!=='')  +			$writer->addAttribute('axis',$text);  +	} +public function getScope()  +	{  +		return $this->getViewState('Scope','NotSet');  +	} +public function setScope($value)  +	{  +		$this->setViewState('Scope',TPropertyValue::ensureEnum($value,'NotSet','Row','Column'),'NotSet');  +	} +public function getAbbreviatedText()  +	{  +		return $this->getViewState('AbbreviatedText','');  +	} +public function setAbbreviatedText($value)  +	{  +		$this->setViewState('AbbreviatedText',$value,'');  +	} +public function getCategoryText()  +	{  +		return $this->getViewState('CategoryText','');  +	} +public function setCategoryText($value)  +	{  +		$this->setViewState('CategoryText',$value,'');  +	}  +} +class TTableRowCollection extends TList  +{ +private $_owner=null; +public function __construct($owner=null)  +	{  +		$this->_owner=$owner;  +	} +protected function canAddItem($item)  +	{  +		return ($item instanceof TTableRow);  +	} +protected function addedItem($item)  +	{  +		if($this->_owner)  +			$this->_owner->getControls()->add($item);  +	} +protected function removedItem($item)  +	{  +		if($this->_owner)  +			$this->_owner->getControls()->remove($item);  +	}  +} +class TTableCellCollection extends TList  +{ +private $_owner=null; +public function __construct($owner=null)  +	{  +		$this->_owner=$owner;  +	} +protected function canAddItem($item)  +	{  +		return ($item instanceof TTableCell);  +	} +protected function addedItem($item)  +	{  +		if($this->_owner)  +			$this->_owner->getControls()->add($item);  +	} +protected function removedItem($item)  +	{  +		if($this->_owner)  +			$this->_owner->getControls()->remove($item);  +	}  +}  +?><?php +interface IDataSource  +{  +	public function getView($viewName);  +	public function getViewNames();  +	public function onDataSourceChanged($param);  +} +abstract class TDataSourceControl extends TControl implements IDataSource  +{  +	public function getView($viewName)  +	{  +		return null;  +	} +public function getViewNames()  +	{  +		return array();  +	} +public function onDataSourceChanged($param)  +	{  +		$this->raiseEvent('DataSourceChanged',$this,$param);  +	} +public function focus()  +	{  +		throw new TNotSupportedException('datasourcecontrol_focus_unsupported');  +	} +public function getEnableTheming()  +	{  +		return false;  +	} +public function setEnableTheming($value)  +	{  +		throw new TNotSupportedException('datasourcecontrol_enabletheming_unsupported');  +	} +public function getSkinID()  +	{  +		return '';  +	} +public function setSkinID($value)  +	{  +		throw new TNotSupportedException('datasourcecontrol_skinid_unsupported');  +	} +public function getVisible($checkParents=true)  +	{  +		return false;  +	} +public function setVisible($value)  +	{  +		throw new TNotSupportedException('datasourcecontrol_visible_unsupported');  +	}  +} +class TReadOnlyDataSource extends TDataSourceControl  +{  +	private $_dataSource;  +	private $_dataMember; +public function __construct($dataSource,$dataMember)  +	{  +		if(!is_array($dataSource) && !($dataSource instanceof IDataSource) && !($dataSource instanceof Traversable))  +			throw new TInvalidDataTypeException('readonlydatasource_datasource_invalid');  +		$this->_dataSource=$dataSource;  +		$this->_dataMember=$dataMember;  +	} +public function getView($viewName)  +	{  +		if($this->_dataSource instanceof IDataSource)  +			return $this->_dataSource->getView($viewName);  +		else  +			return new TReadOnlyDataSourceView($this,$this->_dataMember,$this->_dataSource);  +	}  +} +?><?php +class TDataSourceSelectParameters extends TComponent  +{  +	private $_retrieveTotalRowCount=false;  +	private $_startRowIndex=0;  +	private $_totalRowCount=0;  +	private $_maximumRows=0; +public function getStartRowIndex()  +	{  +		return $this->_startRowIndex;  +	} +public function setStartRowIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=0;  +		$this->_startRowIndex=$value;  +	} +public function getMaximumRows()  +	{  +		return $this->_maximumRows;  +	} +public function setMaximumRows($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=0;  +		$this->_maximumRows=$value;  +	} +public function getRetrieveTotalRowCount()  +	{  +		return $this->_retrieveTotalRowCount;  +	} +public function setRetrieveTotalRowCount($value)  +	{  +		$this->_retrieveTotalRowCount=TPropertyValue::ensureBoolean($value);  +	} +public function getTotalRowCount()  +	{  +		return $this->_totalRowCount;  +	} +public function setTotalRowCount($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=0;  +		$this->_totalRowCount=$value;  +	}  +} +abstract class TDataSourceView extends TComponent  +{  +	private $_owner;  +	private $_name; +public function __construct(IDataSource $owner,$viewName)  +	{  +		$this->_owner=$owner;  +		$this->_name=$viewName;  +	} +abstract public function select($parameters); +public function insert($values)  +	{  +		throw new TNotSupportedException('datasourceview_insert_unsupported');  +	} +public function update($keys,$values)  +	{  +		throw new TNotSupportedException('datasourceview_update_unsupported');  +	} +public function delete($keys)  +	{  +		throw new TNotSupportedException('datasourceview_delete_unsupported');  +	} +public function getCanDelete()  +	{  +		return false;  +	} +public function getCanInsert()  +	{  +		return false;  +	} +public function getCanPage()  +	{  +		return false;  +	} +public function getCanGetRowCount()  +	{  +		return false;  +	} +public function getCanSort()  +	{  +		return false;  +	} +public function getCanUpdate()  +	{  +		return false;  +	} +public function getName()  +	{  +		return $this->_name;  +	} +public function getDataSource()  +	{  +		return $this->_owner;  +	} +protected function onDataSourceViewChanged($param)  +	{  +		$this->raiseEvent('DataSourceViewChanged',$this,$param);  +	}  +} +class TReadOnlyDataSourceView extends TDataSourceView  +{  +	private $_dataSource=null; +public function __construct(IDataSource $owner,$viewName,$dataSource)  +	{  +		parent::__construct($owner,$viewName);  +		if($dataSource===null || is_array($dataSource))  +			$this->_dataSource=new TMap($dataSource);  +		else if($dataSource instanceof Traversable)  +			$this->_dataSource=$dataSource;  +		else  +			throw new TInvalidDataTypeException('readonlydatasourceview_datasource_invalid');  +	} +public function select($parameters)  +	{  +		return $this->_dataSource;  +	}  +} +?><?php +  + +abstract class TDataBoundControl extends TWebControl  +{  +	private $_initialized=false;  +	private $_dataSource=null;  +	private $_requiresBindToNull=false;  +	private $_requiresDataBinding=false;  +	private $_prerendered=false;  +	private $_currentView=null;  +	private $_currentDataSource=null;  +	private $_currentViewValid=false;  +	private $_currentDataSourceValid=false;  +	private $_currentViewIsFromDataSourceID=false;  +	private $_parameters=null;  +	private $_isDataBound=false; +public function getDataSource()  +	{  +		return $this->_dataSource;  +	} +public function setDataSource($value)  +	{  +		$this->_dataSource=$this->validateDataSource($value);;  +		$this->onDataSourceChanged();  +	} +public function getDataSourceID()  +	{  +		return $this->getViewState('DataSourceID','');  +	} +public function setDataSourceID($value)  +	{  +		$dsid=$this->getViewState('DataSourceID','');  +		if($dsid!=='' && $value==='')  +			$this->_requiresBindToNull=true;  +		$this->setViewState('DataSourceID',$value,'');  +		$this->onDataSourceChanged();  +	} +protected function getUsingDataSourceID()  +	{  +		return $this->getDataSourceID()!=='';  +	} +protected function onDataSourceChanged()  +	{  +		$this->_currentViewValid=false;  +		$this->_currentDataSourceValid=false;  +		if($this->getInitialized())  +			$this->setRequiresDataBinding(true);  +	} +protected function getInitialized()  +	{  +		return $this->_initialized;  +	} +protected function setInitialized($value)  +	{  +		$this->_initialized=TPropertyValue::ensureBoolean($value);  +	} +protected function getIsDataBound()  +	{  +		return $this->_isDataBound;  +	} +protected function setIsDataBound($value)  +	{  +		$this->_isDataBound=$value;  +	} +protected function getRequiresDataBinding()  +	{  +		return $this->_requiresDataBinding;  +	} +protected function setRequiresDataBinding($value)  +	{  +		$value=TPropertyValue::ensureBoolean($value);  +		if($value && $this->_prerendered)  +		{  +			$this->_requiresDataBinding=true;  +			$this->ensureDataBound();  +		}  +		else  +			$this->_requiresDataBinding=$value;  +	} +protected function ensureDataBound()  +	{  +		if($this->_requiresDataBinding && ($this->getUsingDataSourceID() || $this->_requiresBindToNull))  +		{  +			$this->dataBind();  +			$this->_requiresBindToNull=false;  +		}  +	} +public function dataBind()  +	{  +		$this->setRequiresDataBinding(false);  +		$this->dataBindProperties();  +		$this->onDataBinding(null);  +		$data=$this->getData();  +		if($data instanceof Traversable)  +			$this->performDataBinding($data);  +		else if($data!==null)  +			throw new TInvalidDataTypeException('databoundcontrol_data_nontraversable');  +		$this->setIsDataBound(true);  +		$this->onDataBound(null);  +	} +public function dataSourceViewChanged($sender,$param)  +	{  +		if(!$this->_ignoreDataSourceViewChanged)  +			$this->setRequiresDataBinding(true);  +	} +protected function getData()  +	{  +		if(($view=$this->getDataSourceView())!==null)  +			return $view->select($this->getSelectParameters());  +		else  +			return null;  +	} +protected function getDataSourceView()  +	{  +		if(!$this->_currentViewValid)  +		{  +			if($this->_currentView && $this->_currentViewIsFromDataSourceID)  +				$this->_currentView->detachEventHandler('DataSourceViewChanged',array($this,'dataSourceViewChanged'));  +			if(($dataSource=$this->determineDataSource())!==null)  +			{  +				if(($view=$dataSource->getView($this->getDataMember()))===null)  +					throw new TInvalidDataValueException('databoundcontrol_datamember_invalid',$this->getDataMember());  +				if($this->_currentViewIsFromDataSourceID=$this->getUsingDataSourceID())  +					$view->attachEventHandler('DataSourceViewChanged',array($this,'dataSourceViewChanged'));  +				$this->_currentView=$view;  +			}  +			else  +				$this->_currentView=null;  +			$this->_currentViewValid=true;  +		}  +		return $this->_currentView;  +	} +protected function determineDataSource()  +	{  +		if(!$this->_currentDataSourceValid)  +		{  +			if(($dsid=$this->getDataSourceID())!=='')  +			{  +				if(($dataSource=$this->getNamingContainer()->findControl($dsid))===null)  +					throw new TInvalidDataValueException('databoundcontrol_datasourceid_inexistent',$dsid);  +				else if(!($dataSource instanceof IDataSource))  +					throw new TInvalidDataValueException('databoundcontrol_datasourceid_invalid',$dsid);  +				else  +					$this->_currentDataSource=$dataSource;  +			}  +			else if(($dataSource=$this->getDataSource())!==null)  +				$this->_currentDataSource=new TReadOnlyDataSource($dataSource,$this->getDataMember());  +			else  +				$this->_currentDataSource=null;  +			$this->_currentDataSourceValid=true;  +		}  +		return $this->_currentDataSource;  +	} +abstract protected function performDataBinding($data); +public function onDataBound($param)  +	{  +		$this->raiseEvent('DataBound',$this,$param);  +	} +protected function onInit($param)  +	{  +		parent::onInit($param);  +		$page=$this->getPage();  +		$page->attachEventHandler('PreLoad',array($this,'onPagePreLoad'));  +	} +protected function onPagePreLoad($sender,$param)  +	{  +		$this->_initialized=true;  +		$isPostBack=$this->getPage()->getIsPostBack();  +		if(!$isPostBack || ($isPostBack && (!$this->getEnableViewState(true) || !$this->getIsDataBound())))  +			$this->setRequiresDataBinding(true);  +	} +protected function onPreRender($param)  +	{  +		$this->_prerendered=true;  +		$this->ensureDataBound();  +		parent::onPreRender($param);  +	} +protected function validateDataSource($value)  +	{  +		if(is_string($value))  +		{  +			$list=new TList;  +			foreach(TPropertyValue::ensureArray($value) as $key=>$value)  +			{  +				if(is_array($value))  +					$list->add($value);  +				else  +					$list->add(array($value,is_string($key)?$key:$value));  +			}  +			return $list;  +		}  +		else if(is_array($value))  +			return new TList($value);  +		else if(($value instanceof Traversable) || $value===null)  +			return $value;  +		else  +			throw new TInvalidDataTypeException('databoundcontrol_datasource_invalid');  +	} +public function getDataMember()  +	{  +		return $this->getViewState('DataMember','');  +	} +public function setDataMember($value)  +	{  +		$this->setViewState('DataMember',$value,'');  +	} +public function getSelectParameters()  +	{  +		if(!$this->_parameters)  +			$this->_parameters=new TDataSourceSelectParameters;  +		return $this->_parameters;  +	}  +} +?><?php + + + +class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingContainer, IPostBackDataHandler  +{  +	private $_repeatedControl;  +	private $_isEnabled;  +	private $_changedEventRaised=false; +public function __construct()  +	{  +		parent::__construct();  +		$this->_repeatedControl=$this->createRepeatedControl();  +		$this->_repeatedControl->setEnableViewState(false);  +		$this->_repeatedControl->setID('0');  +		$this->getControls()->add($this->_repeatedControl);  +	} +protected function createRepeatedControl()  +	{  +		return new TCheckBox;  +	} +public function findControl($id)  +	{  +		return $this;  +	} +protected function getIsMultiSelect()  +	{  +		return true;  +	} +protected function createStyle()  +	{  +		return new TTableStyle;  +	} +public function getTextAlign()  +	{  +		return $this->getViewState('TextAlign','Right');  +	} +public function setTextAlign($value)  +	{  +		$this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,array('Left','Right')),'Right');  +	} +protected function getRepeatInfo()  +	{  +		if(($repeatInfo=$this->getViewState('RepeatInfo',null))===null)  +		{  +			$repeatInfo=new TRepeatInfo;  +			$this->setViewState('RepeatInfo',$repeatInfo,null);  +		}  +		return $repeatInfo;  +	} +public function getRepeatColumns()  +	{  +		return $this->getRepeatInfo()->getRepeatColumns();  +	} +public function setRepeatColumns($value)  +	{  +		$this->getRepeatInfo()->setRepeatColumns($value);  +	} +public function getRepeatDirection()  +	{  +		return $this->getRepeatInfo()->getRepeatDirection();  +	} +public function setRepeatDirection($value)  +	{  +		$this->getRepeatInfo()->setRepeatDirection($value);  +	} +public function getRepeatLayout()  +	{  +		return $this->getRepeatInfo()->getRepeatLayout();  +	} +public function setRepeatLayout($value)  +	{  +		$this->getRepeatInfo()->setRepeatLayout($value);  +	} +public function getCellSpacing()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getCellSpacing();  +		else  +			return -1;  +	} +public function setCellSpacing($value)  +	{  +		$this->getStyle()->setCellSpacing($value);  +	} +public function getCellPadding()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getCellPadding();  +		else  +			return -1;  +	} +public function setCellPadding($value)  +	{  +		$this->getStyle()->setCellPadding($value);  +	} +public function getHasHeader()  +	{  +		return false;  +	} +public function getHasFooter()  +	{  +		return false;  +	} +public function getHasSeparators()  +	{  +		return false;  +	} +public function generateItemStyle($itemType,$index)  +	{  +		return null;  +	} +public function renderItem($writer,$repeatInfo,$itemType,$index)  +	{  +		$item=$this->getItems()->itemAt($index);  +		if($item->getHasAttributes())  +			$this->_repeatedControl->getAttributes()->copyFrom($item->getAttributes());  +		else if($this->_repeatedControl->getHasAttributes())  +			$this->_repeatedControl->getAttributes()->clear();  +		$this->_repeatedControl->setID("$index");  +		$this->_repeatedControl->setText($item->getText());  +		$this->_repeatedControl->setChecked($item->getSelected());  +		$this->_repeatedControl->setAttribute('value',$item->getValue());  +		$this->_repeatedControl->setEnabled($this->_isEnabled && $item->getEnabled());  +		$this->_repeatedControl->renderControl($writer);  +	} +public function loadPostData($key,$values)  +	{  +		if($this->getEnabled(true))  +		{  +			$index=(int)substr($key,strlen($this->getUniqueID())+1);  +			$this->ensureDataBound();  +			if($index>=0 && $index<$this->getItemCount())  +			{  +				$item=$this->getItems()->itemAt($index);  +				if($item->getEnabled())  +				{  +					$checked=isset($values[$key]);  +					if($item->getSelected()!=$checked)  +					{  +						$item->setSelected($checked);  +						if(!$this->_changedEventRaised)  +						{  +							$this->_changedEventRaised=true;  +							return true;  +						}  +					}  +				}  +			}  +		}  +		return false;  +	} +public function raisePostDataChangedEvent()  +	{  +		$page=$this->getPage();  +		if($this->getAutoPostBack() && !$page->getPostBackEventTarget())  +		{  +			$page->setPostBackEventTarget($this);  +			if($this->getCausesValidation())  +				$page->validate($this->getValidationGroup());  +		}  +		$this->onSelectedIndexChanged(null);  +	} +protected function onPreRender($param)  +	{  +		parent::onPreRender($param);  +		$this->_repeatedControl->setAutoPostBack($this->getAutoPostBack());  +		$this->_repeatedControl->setCausesValidation($this->getCausesValidation());  +		$this->_repeatedControl->setValidationGroup($this->getValidationGroup());  +		$page=$this->getPage();  +		$n=$this->getItemCount();  +		for($i=0;$i<$n;++$i)  +		{  +			$this->_repeatedControl->setID("$i");  +			$page->registerRequiresPostData($this->_repeatedControl);  +		}  +	} +protected function render($writer)  +	{  +		if($this->getItemCount()>0)  +		{  +			$this->_isEnabled=$this->getEnabled(true);  +			$repeatInfo=$this->getRepeatInfo();  +			$accessKey=$this->getAccessKey();  +			$tabIndex=$this->getTabIndex();  +			$this->_repeatedControl->setTextAlign($this->getTextAlign());  +			$this->_repeatedControl->setAccessKey($accessKey);  +			$this->_repeatedControl->setTabIndex($tabIndex);  +			$this->setAccessKey('');  +			$this->setTabIndex(0);  +			$repeatInfo->renderRepeater($writer,$this);  +			$this->setAccessKey($accessKey);  +			$this->setTabIndex($tabIndex);  +		}  +	}  +} +?><?php + + +class TRadioButtonList extends TCheckBoxList  +{ +protected function getIsMultiSelect()  +	{  +		return false;  +	} +protected function createRepeatedControl()  +	{  +		return new TRadioButton;  +	} +public function loadPostData($key,$values)  +	{  +		$value=isset($values[$key])?$values[$key]:'';  +		$oldSelection=$this->getSelectedIndex();  +		$this->ensureDataBound();  +		foreach($this->getItems() as $index=>$item)  +		{  +			if($item->getEnabled() && $item->getValue()===$value)  +			{  +				if($index===$oldSelection)  +					return false;  +				else  +				{  +					$this->setSelectedIndex($index);  +					return true;  +				}  +			}  +		}  +		return false;  +	} +public function setSelectedIndices($indices)  +	{  +		throw new TNotSupportedException('radiobuttonlist_selectedindices_unsupported');  +	}  +} +?><?php + +class TBulletedList extends TListControl implements IPostBackEventHandler  +{ +private $_isEnabled; +private $_postBackOptions; +public function raisePostBackEvent($param)  +	{  +		if($this->getCausesValidation())  +			$this->getPage()->validate($this->getValidationGroup());  +		$this->onClick(new TBulletedListEventParameter((int)$param));  +	} +protected function getTagName()  +	{  +		switch($this->getBulletStyle())  +		{  +			case 'Numbered':  +			case 'LowerAlpha':  +			case 'UpperAlpha':  +			case 'LowerRoman':  +			case 'UpperRoman':  +				return 'ol';  +		}  +		return 'ul';  +	} +protected function addAttributesToRender($writer)  +	{  +		$needStart=false;  +		switch($this->getBulletStyle())  +		{  +			case 'Numbered':  +				$writer->addStyleAttribute('list-style-type','decimal');  +				$needStart=true;  +				break;  +			case 'LowerAlpha':  +				$writer->addStyleAttribute('list-style-type','lower-alpha');  +				$needStart=true;  +				break;  +			case 'UpperAlpha':  +				$writer->addStyleAttribute('list-style-type','upper-alpha');  +				$needStart=true;  +				break;  +			case 'LowerRoman':  +				$writer->addStyleAttribute('list-style-type','lower-roman');  +				$needStart=true;  +				break;  +			case 'UpperRoman':  +				$writer->addStyleAttribute('list-style-type','upper-roman');  +				$needStart=true;  +				break;  +			case 'Disc':  +				$writer->addStyleAttribute('list-style-type','disc');  +				break;  +			case 'Circle':  +				$writer->addStyleAttribute('list-style-type','circle');  +				break;  +			case 'Square':  +				$writer->addStyleAttribute('list-style-type','square');  +				break;  +			case 'CustomImage':  +				$url=$this->getBulletImageUrl();  +				$writer->addStyleAttribute('list-style-image',"url($url)");  +				break;  +		}  +		if($needStart && ($start=$this->getFirstBulletNumber())!=1)  +			$writer->addAttribute('start',"$start");  +		parent::addAttributesToRender($writer);  +	} +public function getBulletImageUrl()  +	{  +		return $this->getViewState('BulletImageUrl','');  +	} +public function setBulletImageUrl($value)  +	{  +		$this->setViewState('BulletImageUrl',$value,'');  +	} +public function getBulletStyle()  +	{  +		return $this->getViewState('BulletStyle','NotSet');  +	} +public function setBulletStyle($value)  +	{  +		$this->setViewState('BulletStyle',TPropertyValue::ensureEnum($value,'NotSet','Numbered','LowerAlpha','UpperAlpha','LowerRoman','UpperRoman','Disc','Circle','Square','CustomImage'),'NotSet');  +	} +public function getDisplayMode()  +	{  +		return $this->getViewState('DisplayMode','Text');  +	} +public function setDisplayMode($value)  +	{  +		$this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'Text','HyperLink','LinkButton'),'Text');  +	} +public function getFirstBulletNumber()  +	{  +		return $this->getViewState('FirstBulletNumber',1);  +	} +public function setFirstBulletNumber($value)  +	{  +		$this->setViewState('FirstBulletNumber',TPropertyValue::ensureInteger($value),1);  +	} +public function onClick($param)  +	{  +		$this->raiseEvent('Click',$this,$param);  +	} +public function getTarget()  +	{  +		return $this->getViewState('Target','');  +	} +public function setTarget($value)  +	{  +		$this->setViewState('Target',$value,'');  +	} +protected function render($writer)  +	{  +		if($this->getHasItems())  +			parent::render($writer);  +	} +protected function renderContents($writer)  +	{  +		$this->_isEnabled=$this->getEnabled(true);  +		$this->_postBackOptions=$this->getPostBackOptions();  +		$writer->writeLine();  +		foreach($this->getItems() as $index=>$item)  +		{  +			if($item->getHasAttributes())  +			{  +				foreach($item->getAttributes() as $name=>$value)  +					$writer->addAttribute($name,$value);  +			}  +			$writer->renderBeginTag('li');  +			$this->renderBulletText($writer,$item,$index);  +			$writer->renderEndTag();  +			$writer->writeLine();  +		}  +	} +protected function renderBulletText($writer,$item,$index)  +	{  +		switch($this->getDisplayMode())  +		{  +			case 'Text':  +				if($item->getEnabled())  +					$writer->write(THttpUtility::htmlEncode($item->getText()));  +				else  +				{  +					$writer->addAttribute('disabled','disabled');  +					$writer->renderBeginTag('span');  +					$writer->write(THttpUtility::htmlEncode($item->getText()));  +					$writer->renderEndTag();  +				}  +				return;  +			case 'HyperLink':  +				if(!$this->_isEnabled || !$item->getEnabled())  +					$writer->addAttribute('disabled','disabled');  +				else  +				{  +					$writer->addAttribute('href',$item->getValue());  +					if(($target=$this->getTarget())!=='')  +						$writer->addAttribute('target',$target);  +				}  +				break;  +			case 'LinkButton':  +				if(!$this->_isEnabled || !$item->getEnabled())  +					$writer->addAttribute('disabled','disabled');  +				else  +				{  +					$postback=$this->getPage()->getClientScript()->getPostBackEventReference($this,"$index",$this->_postBackOptions);  +					$writer->addAttribute('href',$postback);  +				}  +		}  +		if(($accesskey=$this->getAccessKey())!=='')  +			$writer->addAttribute('accesskey',$accesskey);  +		$writer->renderBeginTag('a');  +		$writer->write(THttpUtility::htmlEncode($item->getText()));  +		$writer->renderEndTag();  +	} +protected function getPostBackOptions()  +	{  +		$option=new TPostBackOptions();  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		if($this->getCausesValidation() && $hasValidators)  +		{  +			$options->setPerformValidation(true);  +			$options->setValidationGroup($this->getValidationGroup());  +			return $options;  +		}  +		else  +			return null;  +	} +public function setAutoPostBack($value)  +	{  +		throw new TNotSupportedException('bulletedlist_autopostback_unsupported');  +	} +public function setSelectedIndex($index)  +	{  +		throw new TNotSupportedException('bulletedlist_selectedindex_unsupported');  +	} +public function setSelectedIndices($indices)  +	{  +		throw new TNotSupportedException('bulletedlist_selectedindices_unsupported');  +	} +public function setSelectedValue($value)  +	{  +		throw new TNotSupportedException('bulletedlist_selectedvalue_unsupported');  +	}  +} +class TBulletedListEventParameter extends TEventParameter  +{ +private $_index; +public function __construct($index)  +	{  +		$this->_index=$index;  +	} +public function getIndex()  +	{  +		return $this->_index;  +	}  +}  +?><?php + +abstract class TListControl extends TDataBoundControl  +{ +private $_items=null; +private $_loadedFromState=false; +protected function getTagName()  +	{  +		return 'select';  +	} +protected function addAttributesToRender($writer)  +	{  +		$page=$this->getPage();  +		$page->ensureRenderInForm($this);  +		if($this->getIsMultiSelect())  +			$writer->addAttribute('multiple','multiple');  +		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())  +		{  +			$writer->addAttribute('id',$this->getClientID());  +			$options = $this->getAutoPostBackOptions();  +			$scripts = $this->getPage()->getClientScript();  +			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  +			$scripts->registerClientEvent($this, "change", $postback);  +		}  +		if($this->getEnabled(true) && !$this->getEnabled())  +			$writer->addAttribute('disabled','disabled');  +		parent::addAttributesToRender($writer);  +	} +protected function getAutoPostBackOptions()  +	{  +		$option=new TPostBackOptions();  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		if($this->getCausesValidation() && $hasValidators)  +		{  +			$option->setPerformValidation(true);  +			$option->setValidationGroup($group);  +		}  +		$option->setAutoPostBack(true);  +		return $option;  +	} +public function addParsedObject($object)  +	{  +				if(!$this->_loadedFromState && ($object instanceof TListItem))  +			$this->getItems()->add($object);  +	} +protected function performDataBinding($data)  +	{  +		$items=$this->getItems();  +		if(!$this->getAppendDataBoundItems())  +			$items->clear();  +		$textField=$this->getDataTextField();  +		if($textField==='')  +			$textField=0;  +		$valueField=$this->getDataValueField();  +		if($valueField==='')  +			$valueField=1;  +		$textFormat=$this->getDataTextFormatString();  +		foreach($data as $object)  +		{  +			$item=new TListItem;  +			if(isset($object[$textField]))  +				$text=$object[$textField];  +			else  +				$text=TPropertyValue::ensureString($object);  +			$item->setText($textFormat===''?$text:sprintf($textFormat,$text));  +			if(isset($object[$valueField]))  +				$item->setValue($object[$valueField]);  +			$items->add($item);  +		}  +	} +protected function onSaveState($param)  +	{  +		if($this->_items)  +			$this->setViewState('Items',$this->_items->saveState(),null);  +		else  +			$this->clearViewState('Items');  +	} +protected function onLoadState($param)  +	{  +		$this->_loadedFromState=true;  +		if(!$this->getIsDataBound())  +		{  +			$this->_items=new TListItemCollection;  +			$this->_items->loadState($this->getViewState('Items',null));  +		}  +		$this->clearViewState('Items');  +	} +protected function getIsMultiSelect()  +	{  +		return false;  +	} +public function getAppendDataBoundItems()  +	{  +		return $this->getViewState('AppendDataBoundItems',false);  +	} +public function setAppendDataBoundItems($value)  +	{  +		$this->setViewState('AppendDataBoundItems',TPropertyValue::ensureBoolean($value),false);  +	} +public function getAutoPostBack()  +	{  +		return $this->getViewState('AutoPostBack',false);  +	} +public function setAutoPostBack($value)  +	{  +		$this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false);  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +	} +public function getDataTextField()  +	{  +		return $this->getViewState('DataTextField','');  +	} +public function setDataTextField($value)  +	{  +		$this->setViewState('DataTextField',$value,'');  +	} +public function getDataTextFormatString()  +	{  +		return $this->getViewState('DataTextFormatString','');  +	} +public function setDataTextFormatString($value)  +	{  +		$this->setViewState('DataTextFormatString',$value,'');  +	} +public function getDataValueField()  +	{  +		return $this->getViewState('DataValueField','');  +	} +public function setDataValueField($value)  +	{  +		$this->setViewState('DataValueField',$value,'');  +	} +public function getItemCount()  +	{  +		return $this->_items?$this->_items->getCount():0;  +	} +public function getHasItems()  +	{  +		return ($this->_items && $this->_items->getCount()>0);  +	} +public function getItems()  +	{  +		if(!$this->_items)  +			$this->_items=new TListItemCollection;  +		return $this->_items;  +	} +public function getSelectedIndex()  +	{  +		if($this->_items)  +		{  +			$n=$this->_items->getCount();  +			for($i=0;$i<$n;++$i)  +				if($this->_items->itemAt($i)->getSelected())  +					return $i;  +		}  +		return -1;  +	} +public function setSelectedIndex($index)  +	{  +		$index=TPropertyValue::ensureInteger($index);  +		if($this->_items)  +		{  +			$this->clearSelection();  +			if($index>=0 && $index<$this->_items->getCount())  +				$this->_items->itemAt($index)->setSelected(true);  +		}  +	} +public function getSelectedIndices()  +	{  +		$selections=array();  +		if($this->_items)  +		{  +			$n=$this->_items->getCount();  +			for($i=0;$i<$n;++$i)  +				if($this->_items->itemAt($i)->getSelected())  +					$selections[]=$i;  +		}  +		return $selections;  +	} +public function setSelectedIndices($indices)  +	{  +		if($this->_items)  +		{  +			$this->clearSelection();  +			$n=$this->_items->getCount();  +			foreach($indices as $index)  +			{  +				if($index>=0 && $index<$n)  +					$this->_items->itemAt($index)->setSelected(true);  +			}  +		}  +	} +public function getSelectedItem()  +	{  +		if(($index=$this->getSelectedIndex())>=0)  +			return $this->_items->itemAt($index);  +		else  +			return null;  +	} +public function getSelectedValue()  +	{  +		$index=$this->getSelectedIndex();  +		return $index>=0?$this->getItems()->itemAt($index)->getValue():'';  +	} +public function setSelectedValue($value)  +    {  +	    if($this->_items)  +	    {  +		    if($value===null)  +		    	$this->clearSelection();  +		    else if(($item=$this->_items->findItemByValue($value))!==null)  +	    	{  +		    	$this->clearSelection();  +		    	$item->setSelected(true);  +	    	}  +    	}  +    } +public function getText()  +    {  +	    return $this->getSelectedValue();  +    } +public function setText($value)  +    {  +	    $this->setSelectedValue($value);  +    } +public function clearSelection()  +    {  +	    if($this->_items)  +	    {  +		    foreach($this->_items as $item)  +		    	$item->setSelected(false);  +	    }  +    } +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +public function onSelectedIndexChanged($param)  +	{  +		$this->raiseEvent('SelectedIndexChanged',$this,$param);  +	} +public function onTextChanged($param)  +	{  +		$this->raiseEvent('TextChanged',$this,$param);  +	} +protected function renderContents($writer)  +	{  +		if($this->_items)  +		{  +			$writer->writeLine();  +			foreach($this->_items as $item)  +			{  +				if($item->getEnabled())  +				{  +					if($item->getSelected())  +						$writer->addAttribute('selected','selected');  +					$writer->addAttribute('value',$item->getValue());  +					if($item->getHasAttributes())  +					{  +						foreach($item->getAttributes() as $name=>$value)  +							$writer->addAttribute($name,$value);  +					}  +					$writer->renderBeginTag('option');  +					$writer->write(THttpUtility::htmlEncode($item->getText()));  +					$writer->renderEndTag();  +					$writer->writeLine();  +				}  +			}  +		}  +	}  +} +class TListItemCollection extends TList  +{ +public function add($item)  +	{  +		if(is_string($item))  +			parent::add(new TListItem($item));  +		else if($item instanceof TListItem)  +			parent::add($item);  +		else  +			throw new TInvalidDataTypeException('listitemcollection_item_invalid');  +	} +public function insert($index,$item)  +	{  +		if(is_string($item))  +			parent::insert($index,new TListItem($item));  +		else if($item instanceof TListItem)  +			parent::insert($index,$item);  +		else  +			throw new TInvalidDataTypeException('listitemcollection_item_invalid');  +	} +public function findIndexByValue($value,$includeDisabled=true)  +	{  +		$value=TPropertyValue::ensureString($value);  +		$index=0;  +		foreach($this as $item)  +		{  +			if($item->getValue()===$value && ($includeDisabled || $item->getEnabled()))  +				return $index;  +			$index++;  +		}  +		return -1;  +	} +public function findIndexByText($text,$includeDisabled=true)  +	{  +		$text=TPropertyValue::ensureString($text);  +		$index=0;  +		foreach($this as $item)  +		{  +			if($item->getText()===$text && ($includeDisabled || $item->getEnabled()))  +				return $index;  +			$index++;  +		}  +		return -1;  +	} +public function findItemByValue($value,$includeDisabled=true)  +	{  +		if(($index=$this->findIndexByValue($value,$includeDisabled))>=0)  +			return $this->itemAt($index);  +		else  +			return null;  +	} +public function findItemByText($text,$includeDisabled=true)  +	{  +		if(($index=$this->findIndexByText($text,$includeDisabled))>=0)  +			return $this->itemAt($index);  +		else  +			return null;  +	} +public function loadState($state)  +	{  +		$this->clear();  +		if($state!==null)  +		{  +			foreach($state as $item)  +				$this->add(new TListItem($item[0],$item[1],$item[2],$item[3]));  +		}  +	} +public function saveState()  +	{  +		if($this->getCount()>0)  +		{  +			$state=array();  +			foreach($this as $item)  +				$state[]=array($item->getText(),$item->getValue(),$item->getEnabled(),$item->getSelected());  +			return $state;  +		}  +		else  +			return null;  +	}  +} +class TListItem extends TComponent  +{ +private $_attributes=null; +private $_text; +private $_value; +private $_enabled; +private $_selected; +public function __construct($text='',$value='',$enabled=true,$selected=false)  +	{  +		$this->setText($text);  +		$this->setValue($value);  +		$this->setEnabled($enabled);  +		$this->setSelected($selected);  +	} +public function getEnabled()  +	{  +		return $this->_enabled;  +	} +public function setEnabled($value)  +	{  +		$this->_enabled=TPropertyValue::ensureBoolean($value);  +	} +public function getSelected()  +	{  +		return $this->_selected;  +	} +public function setSelected($value)  +	{  +		$this->_selected=TPropertyValue::ensureBoolean($value);  +	} +public function getText()  +	{  +		return $this->_text===''?$this->_value:$this->_text;  +	} +public function setText($value)  +	{  +		$this->_text=TPropertyValue::ensureString($value);  +	} +public function getValue()  +	{  +		return $this->_value===''?$this->_text:$this->_value;  +	} +public function setValue($value)  +	{  +		$this->_value=TPropertyValue::ensureString($value);  +	} +public function getAttributes()  +	{  +		if(!$this->_attributes)  +			$this->_attributes=new TMap;  +		return $this->_attributes;  +	} +public function getHasAttributes()  +	{  +		return $this->_attributes && $this->_attributes->getCount()>0;  +	} +public function hasAttribute($name)  +	{  +		return $this->_attributes?$this->_attributes->contains($name):false;  +	} +public function getAttribute($name)  +	{  +		return $this->_attributes?$this->_attributes->itemAt($name):null;  +	} +public function setAttribute($name,$value)  +	{  +		$this->getAttributes()->add($name,$value);  +	} +public function removeAttribute($name)  +	{  +		return $this->_attributes?$this->_attributes->remove($name):null;  +	}  +} +?><?php + +class TListBox extends TListControl implements IPostBackDataHandler  +{ +protected function addAttributesToRender($writer)  +	{  +		$rows=$this->getRows();  +		$writer->addAttribute('size',"$rows");  +		if($this->getSelectionMode()==='Multiple')  +			$writer->addAttribute('name',$this->getUniqueID().'[]');  +		else  +			$writer->addAttribute('name',$this->getUniqueID());  +		parent::addAttributesToRender($writer);  +	} +protected function onPreRender($param)  +	{  +		parent::onPreRender($param);  +		if($this->getEnabled(true))  +			$this->getPage()->registerRequiresPostData($this);  +	} +public function loadPostData($key,$values)  +	{  +		if(!$this->getEnabled(true))  +			return false;  +		$this->ensureDataBound();  +		$selections=isset($values[$key])?$values[$key]:null;  +		if($selections!==null)  +		{  +			$items=$this->getItems();  +			if($this->getSelectionMode()==='Single')  +			{  +				$selection=is_array($selections)?$selections[0]:$selections;  +				$index=$items->findIndexByValue($selection,false);  +				if($this->getSelectedIndex()!==$index)  +				{  +					$this->setSelectedIndex($index);  +					return true;  +				}  +				else  +					return false;  +			}  +			if(!is_array($selections))  +				$selections=array($selections);  +			$list=array();  +			foreach($selections as $selection)  +				$list[]=$items->findIndexByValue($selection,false);  +			$list2=$this->getSelectedIndices();  +			$n=count($list);  +			$flag=false;  +			if($n===count($list2))  +			{  +				sort($list,SORT_NUMERIC);  +				for($i=0;$i<$n;++$i)  +				{  +					if($list[$i]!==$list2[$i])  +					{  +						$flag=true;  +						break;  +					}  +				}  +			}  +			else  +				$flag=true;  +			if($flag)  +				$this->setSelectedIndices($list);  +			return $flag;  +		}  +		else if($this->getSelectedIndex()!==-1)  +		{  +			$this->clearSelection();  +			return true;  +		}  +		else  +			return false;  +	} +public function raisePostDataChangedEvent()  +	{  +		$page=$this->getPage();  +		if($this->getAutoPostBack() && !$page->getPostBackEventTarget())  +		{  +			$page->setPostBackEventTarget($this);  +			if($this->getCausesValidation())  +				$page->validate($this->getValidationGroup());  +		}  +		$this->onSelectedIndexChanged(null);  +	} +protected function getIsMultiSelect()  +	{  +		return $this->getSelectionMode()==='Multiple';  +	} +public function getRows()  +	{  +		return $this->getViewState('Rows', 4);  +	} +public function setRows($value)  +	{  +		$value=TPropertyValue::ensureInteger($value);  +		if($value<=0)  +			$value=4;  +		$this->setViewState('Rows', $value, 4);  +	} +public function getSelectionMode()  +	{  +		return $this->getViewState('SelectionMode', 'Single');  +	} +public function setSelectionMode($value)  +	{  +		$this->setViewState('SelectionMode',TPropertyValue::ensureEnum($value,array('Single','Multiple')),'Single');  +	}  +}  +?><?php + +class TDropDownList extends TListControl implements IPostBackDataHandler  +{ +protected function addAttributesToRender($writer)  +	{  +		$writer->addAttribute('name',$this->getUniqueID());  +		parent::addAttributesToRender($writer);  +	} +public function loadPostData($key,$values)  +	{  +		if(!$this->getEnabled(true))  +			return false;  +		$this->ensureDataBound();  +		$selection=isset($values[$key])?$values[$key]:null;  +		if($selection!==null)  +		{  +			$index=$this->getItems()->findIndexByValue($selection,false);  +			if($this->getSelectedIndex()!==$index)  +			{  +				$this->setSelectedIndex($index);  +				return true;  +			}  +		}  +		return false;  +	} +public function raisePostDataChangedEvent()  +	{  +		$page=$this->getPage();  +		if($this->getAutoPostBack() && !$page->getPostBackEventTarget())  +		{  +			$page->setPostBackEventTarget($this);  +			if($this->getCausesValidation())  +				$page->validate($this->getValidationGroup());  +		}  +		$this->onSelectedIndexChanged(null);  +	} +public function getSelectedIndex()  +	{  +		$index=parent::getSelectedIndex();  +		if($index<0 && $this->getHasItems())  +		{  +			$this->setSelectedIndex(0);  +			return 0;  +		}  +		else  +			return $index;  +	} +public function setSelectedIndices($indices)  +	{  +		throw new TNotSupportedException('dropdownlist_selectedindices_unsupported');  +	}  +}  +?><?php +class TJavascriptLogger extends TWebControl  +{ +protected function getTagName()  +	{  +		return 'div';  +	} +protected function renderContents($writer)  +	{  +		$this->Page->ClientScript->registerPradoScript('logger');  +		$info = '(<a href="http://gleepglop.com/javascripts/logger/" target="_blank">more info</a>).';  +		$usage = 'Press ALT-D (Or CTRL-D on OS X) to toggle the javascript log console';  +		$writer->write("{$usage} {$info}");  +		parent::renderContents($writer);  +	}  +} +?><?php +class TLinkButton extends TWebControl implements IPostBackEventHandler  +{ +protected function getTagName()  +	{  +		return 'a';  +	} +protected function addAttributesToRender($writer)  +	{  +		$page=$this->getPage();  +		$page->ensureRenderInForm($this); +$writer->addAttribute('id',$this->getClientID()); +parent::addAttributesToRender($writer); +if($this->getEnabled(true))  +		{  +			$url = $this->getPostBackUrl();  +						$nop = "javascript:;//".$this->getClientID();  +			$writer->addAttribute('href', $url ? $url : $nop); +$scripts = $this->getPage()->getClientScript();  +			$options = $this->getPostBackOptions();  +			$postback = $scripts->getPostBackEventReference($this, '', $options, false);  +			$code = "{$postback}; Event.stop(e);";  +			$scripts->registerClientEvent($this, "click", $code);  +		}  +		else if($this->getEnabled()) 			$writer->addAttribute('disabled','disabled');  +	} +protected function getPostBackOptions()  +	{  +		$flag=false; +$option=new TPostBackOptions();  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		if($this->getCausesValidation() && $hasValidators)  +		{  +			$flag=true;  +			$options->setPerformValidation(true);  +			$options->setValidationGroup($this->getValidationGroup());  +		}  +		if($this->getPostBackUrl()!=='')  +		{  +			$flag=true;  +			$options->setActionUrl($this->getPostBackUrl());  +		}  +		return $flag?$options:null;  +	} +protected function renderContents($writer)  +	{  +		if(($text=$this->getText())==='')  +			parent::renderContents($writer);  +		else  +			$writer->write($text);  +	} +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +	} +public function getCommandName()  +	{  +		return $this->getViewState('CommandName','');  +	} +public function setCommandName($value)  +	{  +		$this->setViewState('CommandName',$value,'');  +	} +public function getCommandParameter()  +	{  +		return $this->getViewState('CommandParameter','');  +	} +public function setCommandParameter($value)  +	{  +		$this->setViewState('CommandParameter',$value,'');  +	} +public function getPostBackUrl()  +	{  +		return $this->getViewState('PostBackUrl','');  +	} +public function setPostBackUrl($value)  +	{  +		$this->setViewState('PostBackUrl',$value,'');  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',$value,true);  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +public function raisePostBackEvent($param)  +	{  +		if($this->getCausesValidation())  +			$this->getPage()->validate($this->getValidationGroup());  +		$this->onClick(null);  +		$this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter()));  +	} +public function onClick($param)  +	{  +		$this->raiseEvent('Click',$this,$param);  +	} +public function onCommand($param)  +	{  +		$this->raiseEvent('Command',$this,$param);  +		$this->raiseBubbleEvent($this,$param);  +	}  +} +?><?php +abstract class TBaseValidator extends TLabel implements IValidator +{ +private $_isValid=true; +	private $_registered=false; +public function __construct() +	{ +		parent::__construct(); +		$this->setForeColor('red'); +	} +protected function onInit($param) +	{ +		parent::onInit($param); +		$this->getPage()->getValidators()->add($this); +		$this->_registered=true; +	} +protected function onUnload($param) +	{ +		if($this->_registered && ($page=$this->getPage())!==null) +			$page->getValidators()->remove($this); +		$this->_registered=false; +		parent::onUnload($param); +	} +protected function addAttributesToRender($writer) +	{ +		$display=$this->getDisplay(); +		$visible=$this->getEnabled(true) && !$this->getIsValid(); +		if($display==='None' || (!$visible && $display==='Dynamic')) +			$writer->addStyleAttribute('display','none'); +		else if(!$visible) +			$writer->addStyleAttribute('visibility','hidden'); +		$writer->addAttribute('id',$this->getClientID()); +		parent::addAttributesToRender($writer); +	} +protected function getClientScriptOptions() +	{ +		$options['id'] = $this->getClientID(); +		$options['display'] = $this->getDisplay(); +		$options['errormessage'] = $this->getErrorMessage(); +		$options['focusonerror'] = $this->getFocusOnError(); +		$options['focuselementid'] = $this->getFocusElementID(); +		$options['validationgroup'] = $this->getValidationGroup(); +		$options['controltovalidate'] = $this->getValidationTarget()->getClientID(); +		return $options; +	} +protected function onPreRender($param) +	{ +		$scripts = $this->getPage()->getClientScript(); +		$scriptKey = "TBaseValidator"; +		if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey)) +		{ +			$scripts->registerPradoScript('validator'); +			$formID=$this->getPage()->getForm()->getClientID(); +			$js = "Prado.Validation.AddForm('$formID');"; +			$scripts->registerEndScript($scriptKey, $js); +		} +		if($this->getEnableClientScript()) +			$this->renderClientScriptValidator(); +		parent::onPreRender($param); +	} +protected function renderClientScriptValidator() +	{ +		if($this->getEnabled(true) && $this->getEnableClientScript()) +		{ +			$class = get_class($this); +			$scriptKey = "prado:".$this->getClientID(); +			$scripts = $this->getPage()->getClientScript(); +			$options = TJavascript::toList($this->getClientScriptOptions()); +			$js = "new Prado.Validation(Prado.Validation.{$class}, {$options});"; +			$scripts->registerEndScript($scriptKey, $js); +		} +	} +public function setAssociatedControlID($value) +	{ +		throw new TNotSupportedException('basevalidator_associatedcontrolid_unsupported',get_class($this)); +	} +public function setEnabled($value) +	{ +		$value=TPropertyValue::ensureBoolean($value); +		parent::setEnabled($value); +		if(!$value) +			$this->_isValid=true; +	} +public function getDisplay() +	{ +		return $this->getViewState('Display','Static'); +	} +public function setDisplay($value) +	{ +		$this->setViewState('Display',TPropertyValue::ensureEnum($value,array('None','Static','Dynamic')),'Static'); +	} +public function getEnableClientScript() +	{ +		return $this->getViewState('EnableClientScript',true); +	} +public function setEnableClientScript($value) +	{ +		$this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true); +	} +public function getErrorMessage() +	{ +		return $this->getText(); +			} +public function setErrorMessage($value) +	{ +		$this->setText($value); +			} +public function getControlToValidate() +	{ +		return $this->getViewState('ControlToValidate',''); +	} +public function setControlToValidate($value) +	{ +		$this->setViewState('ControlToValidate',$value,''); +	} +public function getFocusOnError() +	{ +		return $this->getViewState('FocusOnError',false); +	} +public function setFocusOnError($value) +	{ +		$this->setViewState('FocusOnError',TPropertyValue::ensureBoolean($value),false); +	} +public function getFocusElementID() +	{ +		if(($id=$this->getViewState('FocusElementID',''))==='') +			$id=$this->getValidationTarget()->getClientID(); +		return $id; +	} +public function setFocusElementID($value) +	{ +		$this->setViewState('FocusElementID', $value, ''); +	} +public function getValidationGroup() +	{ +		return $this->getViewState('ValidationGroup',''); +	} +public function setValidationGroup($value) +	{ +		$this->setViewState('ValidationGroup',$value,''); +	} +public function getIsValid() +	{ +		return $this->_isValid; +	} +public function setIsValid($value) +	{ +		$this->_isValid=TPropertyValue::ensureBoolean($value); +	} +protected function getValidationTarget() +	{ +		if(($id=$this->getControlToValidate())!=='') +			return $this->findControl($id); +		else +			return null; +	} +protected function getValidationValue($control) +	{ +		if($control instanceof IValidatable) +		{ +			$value=$control->getValidationPropertyValue(); +													return TPropertyValue::ensureString($value); +		} +		else +			throw new TInvalidDataTypeException('basevalidator_validatable_required'); +	} +public function validate() +	{ +		$this->setIsValid(true); +		$control=$this->getValidationTarget(); +		if($control && $this->getVisible(true) && $this->getEnabled()) +			$this->setIsValid($this->evaluateIsValid()); +		return $this->getIsValid(); +	} +abstract protected function evaluateIsValid(); +} +?><?php + +class TRequiredFieldValidator extends TBaseValidator  +{  +	public function getInitialValue()  +	{  +		$this->getViewState('InitialValue','');  +	} +public function setInitialValue($value)  +	{  +		$this->setViewState('InitialValue',TPropertyValue::ensureString($value),'');  +	} +protected function evaluateIsValid()  +	{  +		if(($control=$this->getValidationTarget())!==null)  +		{  +			$value=$this->getValidationValue($control);  +			return trim($value)!==trim($this->getInitialValue());  +		}  +		else  +			throw new TInvalidDataValueException('requiredfieldvalidator_controltovalidate_invalid');  +	} +protected function getClientScriptOptions()  +	{  +		$options = parent::getClientScriptOptions();  +		$options['initialvalue']=$this->getInitialValue();  +		return $options;  +	}  +} +?><?php + +class TCompareValidator extends TBaseValidator  +{ +public function getValueType()  +	{  +		return $this->getViewState('ValueType','String');  +	} +public function setValueType($value)  +	{  +		$this->setViewState('ValueType',TPropertyValue::ensureEnum($value,'Integer','Double','Date','Currency','String'),'String');  +	} +public function getControlToCompare()  +	{  +		return $this->getViewState('ControlToCompare','');  +	} +public function setControlToCompare($value)  +	{  +		$this->setViewState('ControlToCompare',$value,'');  +	} +public function getValueToCompare()  +	{  +		return $this->getViewState('ValueToCompare','');  +	} +public function setValueToCompare($value)  +	{  +		$this->setViewState('ValueToCompare',$value,'');  +	} +public function getOperator()  +	{  +		return $this->getViewState('Operator','Equal');  +	} +public function setOperator($value)  +	{  +		$this->setViewState('Operator',TPropertyValue::ensureEnum($value,'Equal','NotEqual','GreaterThan','GreaterThanEqual','LessThan','LessThanEqual','DataTypeCheck'),'Equal');  +	} +public function setDateFormat($value)  +	{  +		$this->setViewState('DateFormat', $value, '');  +	} +public function getDateFormat()  +	{  +		return $this->getViewState('DateFormat', '');  +	} +public function evaluateIsValid()  +	{  +		if(($control=$this->getValidationTarget())===null)  +			throw new TInvalidDataValueException('comparevalidator_controltovalidate_invalid');  +		if(($value=$this->getValidationValue($control))==='')  +			return true; +if($this->getOperator()==='DataTypeCheck')  +			return $this->evaluateDataTypeCheck($value); +if(($controlToCompare=$this->getControlToCompare())!=='')  +		{  +			if(($control2=$this->findControl($controlToCompare))===null)  +				throw new TInvalidDataValueException('comparevalidator_controltocompare_invalid');  +			if(($value2=$this->getValidationValue($control2))==='')  +				return false;  +		}  +		else  +			$value2=$this->getValueToCompare(); +$values = $this->getComparisonValues($value, $value2);  +		switch($this->getOperator())  +		{  +			case 'Equal':  +				return $values[0] == $values[1];  +			case 'NotEqual':  +				return $values[0] != $values[1];  +			case 'GreaterThan':  +				return $values[0] > $values[1];  +			case 'GreaterThanEqual':  +				return $values[0] >= $values[1];  +			case 'LessThan':  +				return $values[0] < $values[1];  +			case 'LessThanEqual':  +				return $values[0] <= $values[1];  +		} +return false;  +	} +protected function evaluateDataTypeCheck($value)  +	{  +		switch($this->getValueType())  +		{  +			case 'Integer':  +				return preg_match('/^[-+]?[0-9]+$/',trim($value));  +			case 'Float':  +			case 'Double':  +				return preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value));  +			case 'Currency':  +				return preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value));  +			case 'Date':  +				$dateFormat = $this->getDateFormat();  +				if(strlen($dateFormat))  +					return pradoParseDate($value, $dateFormat) !== null;  +				else  +					return strtotime($value) > 0;  +		}  +		return true;  +	} +protected function getComparisonValues($value1, $value2)  +	{  +		switch($this->getValueType())  +		{  +			case 'Integer':  +				return array(intval($value1), intval($value2));  +			case 'Float':  +			case 'Double':  +				return array(floatval($value1), floatval($value2));  +			case 'Currency':  +				if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value1,$matches))  +					$value1=floatval($matches[0]);  +				else  +					$value1=0;  +				if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value2,$matches))  +					$value2=floatval($matches[0]);  +				else  +					$value2=0;  +				return array($value1, $value2);  +			case 'Date':  +				throw new TNotSupportedException('Date comparison for TCompareValidator is currently not supported. It will be supported in future.');  +				$dateFormat = $this->getDateFormat();  +				if (strlen($dateFormat))  +					return array(pradoParseDate($value1, $dateFormat), pradoParseDate($value2, $dateFormat));  +				else  +					return array(strtotime($value1), strtotime($value2));  +		}  +		return array($value1, $value2);  +	} +protected function getClientScriptOptions()  +	{  +		$options = parent::getClientScriptOptions();  +		if(($name=$this->getControlToCompare())!=='')  +		{  +			if(($control=$this->findControl($name))!==null)  +				$options['controltocompare']=$options['controlhookup']=$control->getClientID();  +		}  +		if(($value=$this->getValueToCompare())!=='')  +			$options['valuetocompare']=$value;  +		if(($operator=$this->getOperator())!=='Equal')  +			$options['operator']=$operator;  +		$options['type']=$this->getValueType();  +		if(($dateFormat=$this->getDateFormat())!=='')  +			$options['dateformat']=$dateFormat;  +		return $options;  +	}  +} +?><?php + +class TRegularExpressionValidator extends TBaseValidator  +{ +public function getRegularExpression()  +	{  +		return $this->getViewState('RegularExpression','');  +	} +public function setRegularExpression($value)  +	{  +		$this->setViewState('RegularExpression',$value,'');  +	} +public function evaluateIsValid()  +	{  +		if(($control=$this->getValidationTarget())!==null)  +		{  +			if(($value=$this->getValidationValue($control))==='')  +				return true;  +			if(($expression=$this->getRegularExpression())!=='')  +				return preg_match("/^$expression\$/",$value);  +			else  +				return true;  +		}  +		else  +			throw new TInvalidDataValueException('regularexpressionvalidator_controltovalidate_invalid');  +	} +protected function getClientScriptOptions()  +	{  +		$options = parent::getClientScriptOptions();  +		$options['validationexpression']=$this->getRegularExpression();  +		return $options;  +	}  +} +?><?php + +class TEmailAddressValidator extends TRegularExpressionValidator  +{  +	const EMAIL_REGEXP="\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; +public function getRegularExpression()  +	{  +		$regex=parent::getRegularExpression();  +		return $regex===''?self::EMAIL_REGEXP:$regex;  +	} +public function evaluateIsValid()  +	{  +		$valid=parent::evaluateIsValid();  +		if($valid && function_exists('checkdnsrr'))  +		{  +			if(($value=$this->getValidationValue($this->getValidationTarget()))!=='')  +			{  +				if(($pos=strpos($value,'@'))!==false)  +				{  +					$domain=substr($value,$pos+1);  +					return $domain===''?false:checkdnsrr($domain,'MX');  +				}  +				else  +					return false;  +			}  +		}  +		return $valid;  +	}  +} +?><?php + +class TCustomValidator extends TBaseValidator  +{ +public function getClientValidationFunction()  +	{  +		return $this->getViewState('ClientValidationFunction','');  +	} +public function setClientValidationFunction($value)  +	{  +		$this->setViewState('ClientValidationFunction',$value,'');  +	} +public function evaluateIsValid()  +	{  +		if(($id=$this->getControlToValidate())!=='')  +		{  +			if(($control=$this->findControl($id))!==null)  +				$value=$this->getValidationValue($control);  +			else  +				throw new TInvalidDataValueException('customvalidator_controltovalidate_invalid');  +			return $this->onServerValidate($value);  +		}  +		else  +			throw new TInvalidDataValueException('customvalidator_controltovalidate_required');  +	} +public function onServerValidate($value)  +	{  +		$param=new TServerValidateEventParameter($value,true);  +		$this->raiseEvent('ServerValidate',$this,$param);  +		return $param->getIsValid();  +	} +protected function getClientScriptOptions()  +	{  +		$options=parent::getClientScriptOptions();  +		if(($clientJs=$this->getClientValidationFunction())!=='')  +			$options['clientvalidationfunction']=$clientJs;  +		return $options;  +	}  +} +class TServerValidateEventParameter extends TEventParameter  +{ +private $_value=''; +private $_isValid=true; +public function __construct($value,$isValid)  +	{  +		$this->_value=$value;  +		$this->setIsValid($isValid);  +	} +public function getValue()  +	{  +		return $this->_value;  +	} +public function getIsValid()  +	{  +		return $this->_isValid;  +	} +public function setIsValid($value)  +	{  +		$this->_isValid=TPropertyValue::ensureBoolean($value);  +	}  +}  +?><?php +class TValidationSummary extends TWebControl  +{ +protected static $currentGroup; +public static function setCurrentGroup($group)  +	{  +		self::$currentGroup = $group;  +	} +public static function getCurrentGroup()  +	{  +		return self::$currentGroup;  +	} +public function getHeaderText()  +	{  +		return $this->getViewState('HeaderText','');  +	} +public function setHeaderText($value)  +	{  +		$this->setViewState('HeaderText',$value,'');  +	} +public function getDisplayMode()  +	{  +		return $this->getViewState('DisplayMode','BulletList');  +	} +public function setDisplayMode($value)  +	{  +		$this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'List','SingleParagraph','BulletList'),'BulletList');  +	} +public function getEnableClientScript()  +	{  +		return $this->getViewState('EnableClientScript',true);  +	} +public function setEnableClientScript($value)  +	{  +		$this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true);  +	} +public function getShowMessageBox()  +	{  +		return $this->getViewState('ShowMessageBox',false);  +	} +public function setShowMessageBox($value)  +	{  +		$this->setViewState('ShowMessageBox',TPropertyValue::ensureBoolean($value),false);  +	} +public function getShowSummary()  +	{  +		return $this->getViewState('ShowSummary',true);  +	} +public function setShowSummary($value)  +	{  +		$this->setViewState('ShowSummary',TPropertyValue::ensureBoolean($value),true);  +	} +public function getShowAnchor()  +	{  +		return $this->getViewState('ShowAnchor',false);  +	} +public function setShowAnchor($value)  +	{  +		$this->setViewState('ShowAnchor',TPropertyValue::ensureBoolean($value),false);  +	} +public function getAutoUpdate()  +	{  +		return $this->getViewState('AutoUpdate', true);  +	} +public function setAutoUpdate($value)  +	{  +		$this->setViewState('AutoUpdate', TPropertyValue::ensureBoolean($value), true);  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +	} +protected function getValidators()  +	{  +		$groupID = $this->getGroup();  +		if(empty($groupID)) return $this->getPage()->getValidators(); +$parent = $this->getParent();  +		$group = $parent->findObject($groupID); +$validators = array(); +foreach($group->getMembers() as $member)  +		{  +			$control = $parent->findObject($member);  +			if(!is_null($control))  +				$validators[] = $control;  +		}  +		return $validators;  +	} +protected function renderJsSummary()  +	{  +		if(!$this->getEnabled(true) || !$this->getEnableClientScript())  +			return;  +		$options = TJavascript::toList($this->getClientScriptOptions());  +		$script = "new Prado.Validation.Summary({$options});";  +		$this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script);  +	} +protected function getClientScriptOptions()  +	{  +		$options['id'] = $this->ClientID;  +		$options['form'] = $this->Page->Form->ClientID;  +		if($this->getShowMessageBox())  +			$options['showmessagebox']='True';  +		if(!$this->getShowSummary())  +			$options['showsummary']='False'; +$options['headertext']=$this->getHeaderText();  +		$options['displaymode']=$this->getDisplayMode(); +$options['refresh'] = $this->getAutoUpdate();  +		$options['validationgroup'] =  $this->getValidationGroup();  +		return $options;  +	} +protected function getErrorMessages()  +	{  +		$validators=$this->getPage()->getValidators($this->getValidationGroup());  +		$messages = array();  +		foreach($validators as $validator)  +		{  +			if(!$validator->getIsValid() && ($msg=$validator->getErrorMessage())!=='')  +								$messages[] = $msg;  +		}  +		return $messages;  +	} +protected function renderContents($writer)  +	{  +		$this->renderJsSummary();  +		if($this->getShowSummary())  +		{  +			switch($this->getDisplayMode())  +			{  +				case 'List':  +					$content = $this->renderList($writer);  +					break;  +				case 'SingleParagraph':  +					$content = $this->renderSingleParagraph($writer);  +					break;  +				case 'BulletList':  +				default:  +					$content = $this->renderBulletList($writer);  +			}  +		}  +	} +protected function renderList($writer)  +	{  +		$header=$this->getHeaderText();  +		$messages=$this->getErrorMessages();  +		$content = '';  +		if(strlen($header))  +			$content.= $header."<br/>\n";  +		foreach($messages as $message)  +			$content.="$message<br/>\n";  +		$writer->write($content);  +	} +protected function renderSingleParagraph($writer)  +	{  +		$header=$this->getHeaderText();  +		$messages=$this->getErrorMessages();  +		$content = $header;  +		foreach($messages as $message)  +			$content.= ' '.$message;  +		$writer->write($content);  +	} +protected function renderBulletList($writer)  +	{  +		$header=$this->getHeaderText();  +		$messages=$this->getErrorMessages();  +		$content = $header;  +		$show = count($messages) > 0;  +		if($show) $content .= "<ul>\n";  +		foreach($messages as $message)  +			$content.= '<li>'.$message."</li>\n";  +		if($show) $content .= "</ul>\n";  +		$writer->write($content);  +	}  +} +?><?php +interface IRepeatInfoUser  +{ +public function getHasFooter(); +public function getHasHeader(); +public function getHasSeparators(); +public function getItemCount(); +public function generateItemStyle($itemType,$index); +public function renderItem($writer,$repeatInfo,$itemType,$index);  +} +class TRepeatInfo extends TComponent  +{ +private $_caption=''; +private $_captionAlign='NotSet'; +private $_repeatColumns=0; +private $_repeatDirection='Vertical'; +private $_repeatLayout='Table'; +public function getCaption()  +	{  +		return $this->_caption;  +	} +public function setCaption($value)  +	{  +		$this->_caption=$value;  +	} +public function getCaptionAlign()  +	{  +		return $this->_captionAlign;  +	} +public function setCaptionAlign($value)  +	{  +		$this->_captionAlign=TPropertyValue::ensureEnum($value,array('NotSet','Top','Bottom','Left','Right'));  +	} +public function getRepeatColumns()  +	{  +		return $this->_repeatColumns;  +	} +public function setRepeatColumns($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			throw new TInvalidDataValueException('repeatinfo_repeatcolumns_invalid');  +		$this->_repeatColumns=$value;  +	} +public function getRepeatDirection()  +	{  +		return $this->_repeatDirection;  +	} +public function setRepeatDirection($value)  +	{  +		$this->_repeatDirection=TPropertyValue::ensureEnum($value,array('Horizontal','Vertical'));  +	} +public function getRepeatLayout()  +	{  +		return $this->_repeatLayout;  +	} +public function setRepeatLayout($value)  +	{  +		$this->_repeatLayout=TPropertyValue::ensureEnum($value,array('Table','Flow'));  +	} +public function renderRepeater($writer, IRepeatInfoUser $user)  +	{  +		if($this->_repeatLayout==='Table')  +		{  +			$control=new TTable;  +			if($this->_caption!=='')  +			{  +				$control->setCaption($this->_caption);  +				$control->setCaptionAlign($this->_captionAlign);  +			}  +		}  +		else  +			$control=new TWebControl;  +		$control->setID($user->getClientID());  +		$control->copyBaseAttributes($user);  +		if($user->getHasStyle())  +			$control->getStyle()->copyFrom($user->getStyle());  +		$control->renderBeginTag($writer);  +		$writer->writeLine(); +if($this->_repeatDirection==='Vertical')  +			$this->renderVerticalContents($writer,$user);  +		else  +			$this->renderHorizontalContents($writer,$user); +$control->renderEndTag($writer);  +	} +protected function renderHorizontalContents($writer,$user)  +	{  +		$tableLayout=($this->_repeatLayout==='Table');  +		$hasSeparators=$user->getHasSeparators();  +		$itemCount=$user->getItemCount();  +		$columns=$this->_repeatColumns===0?$itemCount:$this->_repeatColumns;  +		$totalColumns=$hasSeparators?$columns+$columns:$columns;  +		$needBreak=$columns<$itemCount; +if($user->getHasHeader())  +			$this->renderHeader($writer,$user,$tableLayout,$totalColumns,$needBreak); +if($tableLayout)  +		{  +			$column=0;  +			for($i=0;$i<$itemCount;++$i)  +			{  +				if($column==0)  +					$writer->renderBeginTag('tr');  +				if(($style=$user->generateItemStyle('Item',$i))!==null)  +					$style->addAttributesToRender($writer);  +				$writer->renderBeginTag('td');  +				$user->renderItem($writer,$this,'Item',$i);  +				$writer->renderEndTag();  +				$writer->writeLine();  +				if($hasSeparators && $i!=$itemCount-1)  +				{  +					if(($style=$user->generateItemStyle('Separator',$i))!==null)  +						$style->addAttributesToRender($writer);  +					$writer->renderBeginTag('td');  +					$user->renderItem($writer,$this,'Separator',$i);  +					$writer->renderEndTag();  +					$writer->writeLine();  +				}  +				$column++;  +				if($i==$itemCount-1)  +				{  +					$restColumns=$columns-$column;  +					if($hasSeparators)  +						$restColumns=$restColumns?$restColumns+$restColumns+1:1;  +					for($j=0;$j<$restColumns;++$j)  +						$writer->write("<td></td>\n");  +				}  +				if($column==$columns || $i==$itemCount-1)  +				{  +					$writer->renderEndTag();  +					$writer->writeLine();  +					$column=0;  +				}  +			}  +		}  +		else  +		{  +			$column=0;  +			for($i=0;$i<$itemCount;++$i)  +			{  +				$user->renderItem($writer,$this,'Item',$i);  +				if($hasSeparators && $i!=$itemCount-1)  +					$user->renderItem($writer,$this,'Separator',$i);  +				$column++;  +				if($column==$columns || $i==$itemCount-1)  +				{  +					if($needBreak)  +						$writer->writeBreak();  +					$column=0;  +				}  +				$writer->writeLine();  +			}  +		} +if($user->getHasFooter())  +			$this->renderFooter($writer,$user,$tableLayout,$totalColumns,$needBreak);  +	} +protected function renderVerticalContents($writer,$user)  +	{  +		$tableLayout=($this->_repeatLayout==='Table');  +		$hasSeparators=$user->getHasSeparators();  +		$itemCount=$user->getItemCount();  +		if($this->_repeatColumns<=1)  +		{  +			$rows=$itemCount;  +			$columns=1;  +			$lastColumns=1;  +		}  +		else  +		{  +			$columns=$this->_repeatColumns;  +			$rows=(int)(($itemCount+$columns-1)/$columns);  +			if($rows==0 && $itemCount>0)  +				$rows=1;  +			if(($lastColumns=$itemCount%$columns)==0)  +				$lastColumns=$columns;  +		}  +		$totalColumns=$hasSeparators?$columns+$columns:$columns; +if($user->getHasHeader())  +			$this->renderHeader($writer,$user,$tableLayout,$totalColumns,false); +if($tableLayout)  +		{  +			$renderedItems=0;  +			for($row=0;$row<$rows;++$row)  +			{  +				$index=$row;  +				$writer->renderBeginTag('tr');  +				for($col=0;$col<$columns;++$col)  +				{  +					if($renderedItems>=$itemCount)  +						break;  +					if($col>0)  +					{  +						$index+=$rows;  +						if($col-1>=$lastColumns)  +							$index--;  +					}  +					if($index>=$itemCount)  +						continue;  +					$renderedItems++;  +					if(($style=$user->generateItemStyle('Item',$index))!==null)  +						$style->addAttributesToRender($writer);  +					$writer->renderBeginTag('td');  +					$user->renderItem($writer,$this,'Item',$index);  +					$writer->renderEndTag();  +					$writer->writeLine();  +					if(!$hasSeparators)  +						continue;  +					if($renderedItems<$itemCount-1)  +					{  +						if($columns==1)  +						{  +							$writer->renderEndTag();  +							$writer->renderBeginTag('tr');  +						}  +						if(($style=$user->generateItemStyle('Separator',$index))!==null)  +							$style->addAttributesToRender($writer);  +						$writer->renderBeginTag('td');  +						$user->renderItem($writer,$this,'Separator',$index);  +						$writer->renderEndTag();  +						$writer->writeLine();  +					}  +					else if($columns>1)  +						$writer->write("<td></td>\n");  +				}  +				if($row==$rows-1)  +				{  +					$restColumns=$columns-$lastColumns;  +					if($hasSeparators)  +						$restColumns+=$restColumns;  +					for($col=0;$col<$restColumns;++$col)  +						$writer->write("<td></td>\n");  +				}  +				$writer->renderEndTag();  +				$writer->writeLine();  +			}  +		}  +		else  +		{  +			$renderedItems=0;  +			for($row=0;$row<$rows;++$row)  +			{  +				$index=$row;  +				for($col=0;$col<$columns;++$col)  +				{  +					if($renderedItems>=$itemCount)  +						break;  +					if($col>0)  +					{  +						$index+=$rows;  +						if($col-1>=$lastColumns)  +							$index--;  +					}  +					if($index>=$itemCount)  +						continue;  +					$renderedItems++;  +					$user->renderItem($writer,$this,'Item',$index);  +					$writer->writeLine();  +					if(!$hasSeparators)  +						continue;  +					if($renderedItems<$itemCount-1)  +					{  +						if($columns==1)  +							$writer->writeBreak();  +						$user->renderItem($writer,$this,'Separator',$index);  +					}  +					$writer->writeLine();  +				}  +				if($row<$rows-1 || $user->getHasFooter())  +					$writer->writeBreak();  +			}  +		} +if($user->getHasFooter())  +			$this->renderFooter($writer,$user,$tableLayout,$totalColumns,false); +} +protected function renderHeader($writer,$user,$tableLayout,$columns,$needBreak)  +	{  +		if($tableLayout)  +		{  +			$writer->renderBeginTag('tr');  +			if($columns>1)  +				$writer->addAttribute('colspan',"$columns");  +			$writer->addAttribute('scope','col');  +			if(($style=$user->generateItemStyle('Header',-1))!==null)  +				$style->addAttributesToRender($writer);  +			$writer->renderBeginTag('th');  +			$user->renderItem($writer,$this,'Header',-1);  +			$writer->renderEndTag();  +			$writer->renderEndTag();  +		}  +		else  +		{  +			$user->renderItem($writer,$this,'Header',-1);  +			if($needBreak)  +				$writer->writeBreak();  +		}  +		$writer->writeLine();  +	} +protected function renderFooter($writer,$user,$tableLayout,$columns)  +	{  +		if($tableLayout)  +		{  +			$writer->renderBeginTag('tr');  +			if($columns>1)  +				$writer->addAttribute('colspan',"$columns");  +			if(($style=$user->generateItemStyle('Footer',-1))!==null)  +				$style->addAttributesToRender($writer);  +			$writer->renderBeginTag('td');  +			$user->renderItem($writer,$this,'Footer',-1);  +			$writer->renderEndTag();  +			$writer->renderEndTag();  +		}  +		else  +			$user->renderItem($writer,$this,'Footer',-1);  +		$writer->writeLine();  +	}  +} +?><?php + +class TRepeater extends TDataBoundControl implements INamingContainer  +{ +const CACHE_EXPIRY=18000; +private static $_templates=array(); +private $_itemTemplate=''; +private $_alternatingItemTemplate=''; +private $_headerTemplate=''; +private $_footerTemplate=''; +private $_separatorTemplate=''; +private $_items=null; +private $_header=null; +private $_footer=null; +public function addParsedObject($object)  +	{  +	} +public function getItemTemplate()  +	{  +		return $this->_itemTemplate;  +	} +public function setItemTemplate($value)  +	{  +		$this->_itemTemplate=$value;  +	} +public function getAlternatingItemTemplate()  +	{  +		return $this->_alternatingItemTemplate;  +	} +public function setAlternatingItemTemplate($value)  +	{  +		$this->_alternatingItemTemplate=$value;  +	} +public function getHeaderTemplate()  +	{  +		return $this->_headerTemplate;  +	} +public function setHeaderTemplate($value)  +	{  +		$this->_headerTemplate=$value;  +	} +public function getFooterTemplate()  +	{  +		return $this->_footerTemplate;  +	} +public function setFooterTemplate($value)  +	{  +		$this->_footerTemplate=$value;  +	} +public function getSeparatorTemplate()  +	{  +		return $this->_separatorTemplate;  +	} +public function setSeparatorTemplate($value)  +	{  +		$this->_separatorTemplate=$value;  +	} +public function getHeader()  +	{  +		return $this->_header;  +	} +public function getFooter()  +	{  +		return $this->_footer;  +	} +public function getItems()  +	{  +		if(!$this->_items)  +			$this->_items=new TRepeaterItemCollection;  +		return $this->_items;  +	} +protected function createItem($itemIndex,$itemType)  +	{  +		return new TRepeaterItem($itemIndex,$itemType);  +	} +private function createItemInternal($itemIndex,$itemType,$dataBind,$dataItem)  +	{  +		$item=$this->createItem($itemIndex,$itemType);  +		$this->initializeItem($item);  +		$param=new TRepeaterItemEventParameter($item);  +		if($dataBind)  +		{  +			$item->setDataItem($dataItem);  +			$this->onItemCreated($param);  +			$this->getControls()->add($item);  +			$item->dataBind();  +			$this->onItemDataBound($param);  +			$item->setDataItem(null);  +		}  +		else  +		{  +			$this->onItemCreated($param);  +			$this->getControls()->add($item);  +		}  +		return $item;  +	} +protected function initializeItem($item)  +	{  +		$tplContent='';  +		switch($item->getItemType())  +		{  +			case 'Header': $tplContent=$this->_headerTemplate; break;  +			case 'Footer': $tplContent=$this->_footerTemplate; break;  +			case 'Item': $tplContent=$this->_itemTemplate; break;  +			case 'Separator': $tplContent=$this->_separatorTemplate; break;  +			case 'AlternatingItem': $tplContent=$this->_alternatingItemTemplate==='' ? $this->_itemTemplate : $this->_alternatingItemTemplate; break;  +			case 'SelectedItem':  +			case 'EditItem':  +			default:  +				break;  +		}  +		if($tplContent!=='')  +			$this->createTemplate($tplContent)->instantiateIn($item);  +	} +protected function createTemplate($str)  +	{  +		$key=md5($str);  +		if(isset(self::$_templates[$key]))  +			return self::$_templates[$key];  +		else  +		{  +			$contextPath=$this->getTemplateControl()->getTemplate()->getContextPath();  +			if(($cache=$this->getApplication()->getCache())!==null)  +			{  +				if(($template=$cache->get($key))===null)  +				{  +					$template=new TTemplate($str,$contextPath);  +					$cache->set($key,$template,self::CACHE_EXPIRY);  +				}  +			}  +			else  +				$template=new TTemplate($str,$contextPath);  +			self::$_templates[$key]=$template;  +			return $template;  +		}  +	} +protected function render($writer)  +	{  +		$this->renderContents($writer);  +	} +protected function onSaveState($param)  +	{  +		if($this->_items)  +			$this->setViewState('ItemCount',$this->_items->getCount(),0);  +		else  +			$this->clearViewState('ItemCount');  +	} +protected function onLoadState($param)  +	{  +		if(!$this->getIsDataBound())  +			$this->restoreItemsFromViewState();  +		$this->clearViewState('ItemCount');  +	} +public function reset()  +	{  +		$this->getControls()->clear();  +		$this->getItems()->clear();  +		$this->_header=null;  +		$this->_footer=null;  +	} +protected function restoreItemsFromViewState()  +	{  +		$this->reset();  +		if(($itemCount=$this->getViewState('ItemCount',0))>0)  +		{  +			$items=$this->getItems();  +			$hasSeparator=$this->_separatorTemplate!=='';  +			if($this->_headerTemplate!=='')  +				$this->_header=$this->createItemInternal(-1,'Header',false,null);  +			for($i=0;$i<$itemCount;++$i)  +			{  +				if($hasSeparator && $i>0)  +					$this->createItemInternal($i-1,'Separator',false,null);  +				$itemType=$i%2==0?'Item':'AlternatingItem';  +				$items->add($this->createItemInternal($i,$itemType,false,null));  +			}  +			if($this->_footerTemplate!=='')  +				$this->_footer=$this->createItemInternal(-1,'Footer',false,null);  +		}  +		$this->clearChildState();  +	} +protected function performDataBinding($data)  +	{  +		$this->reset();  +		$itemIndex=0;  +		$items=$this->getItems();  +		$hasSeparator=$this->_separatorTemplate!=='';  +		foreach($data as $dataItem)  +		{  +			if($itemIndex===0 && $this->_headerTemplate!=='')  +				$this->_header=$this->createItemInternal(-1,'Header',true,null);  +			if($hasSeparator && $itemIndex>0)  +				$this->createItemInternal($itemIndex-1,'Separator',true,null);  +			$itemType=$itemIndex%2==0?'Item':'AlternatingItem';  +			$items->add($this->createItemInternal($itemIndex,$itemType,true,$dataItem));  +			$itemIndex++;  +		}  +		if($itemIndex>0 && $this->_footerTemplate!=='')  +			$this->_footer=$this->createItemInternal(-1,'Footer',true,null);  +		$this->setViewState('ItemCount',$itemIndex,0);  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		if($param instanceof TRepeaterCommandEventParameter)  +		{  +			$this->onItemCommand($param);  +			return true;  +		}  +		else  +			return false;  +	} +protected function onItemCreated($param)  +	{  +		$this->raiseEvent('ItemCreated',$this,$param);  +	} +protected function onItemDataBound($param)  +	{  +		$this->raiseEvent('ItemDataBound',$this,$param);  +	} +protected function onItemCommand($param)  +	{  +		$this->raiseEvent('ItemCommand',$this,$param);  +	}  +} +class TRepeaterItemEventParameter extends TEventParameter  +{ +private $_item=null; +public function __construct(TRepeaterItem $item)  +	{  +		$this->_item=$item;  +	} +public function getItem()  +	{  +		return $this->_item;  +	}  +} +class TRepeaterCommandEventParameter extends TCommandEventParameter  +{ +private $_item=null; +private $_source=null; +public function __construct($item,$source,TCommandEventParameter $param)  +	{  +		$this->_item=$item;  +		$this->_source=$source;  +		parent::__construct($param->getCommandName(),$param->getCommandParameter());  +	} +public function getItem()  +	{  +		return $this->_item;  +	} +public function getCommandSource()  +	{  +		return $this->_source;  +	}  +} +class TRepeaterItem extends TControl implements INamingContainer  +{ +private $_itemIndex=''; +private $_itemType=''; +private $_dataItem=null; +public function __construct($itemIndex,$itemType)  +	{  +		$this->_itemIndex=$itemIndex;  +		$this->_itemType=TPropertyValue::ensureEnum($itemType,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager');  +	} +public function getItemType()  +	{  +		return $this->_itemType;  +	} +public function getItemIndex()  +	{  +		return $this->_itemIndex;  +	} +public function getDataItem()  +	{  +		return $this->_dataItem;  +	} +public function setDataItem($value)  +	{  +		$this->_dataItem=$value;  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		if($param instanceof TCommandEventParameter)  +		{  +			$this->raiseBubbleEvent($this,new TRepeaterCommandEventParameter($this,$sender,$param));  +			return true;  +		}  +		else  +			return false;  +	}  +} +class TRepeaterItemCollection extends TList  +{ +protected function canAddItem($item)  +	{  +		return ($item instanceof TRepeaterItem);  +	}  +} +?><?php + +abstract class TBaseDataList extends TDataBoundControl  +{ +public function addParsedObject($object)  +	{  +	} +protected function createStyle()  +	{  +		return new TTableStyle;  +	} +public function getCaption()  +	{  +		return $this->getViewState('Caption','');  +	} +public function setCaption($value)  +	{  +		$this->setViewState('Caption','');  +	} +public function getCaptionAlign()  +	{  +		return $this->getViewState('CaptionAlign','NotSet');  +	} +public function setCaptionAlign($value)  +	{  +		$this->setViewState('CaptionAlign',TPropertyValue::ensureEnum($value,'NotSet','Top','Bottom','Left','Right'),'NotSet');  +	} +public function getCellSpacing()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getCellSpacing();  +		else  +			return -1;  +	} +public function setCellSpacing($value)  +	{  +		$this->getStyle()->setCellSpacing($value);  +	} +public function getCellPadding()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getCellPadding();  +		else  +			return -1;  +	} +public function setCellPadding($value)  +	{  +		$this->getStyle()->setCellPadding($value);  +	} +public function getHorizontalAlign()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getHorizontalAlign();  +		else  +			return 'NotSet';  +	} +public function setHorizontalAlign($value)  +	{  +		$this->getStyle()->setHorizontalAlign($value);  +	} +public function getGridLines()  +	{  +		if($this->getHasStyle())  +			return $this->getStyle()->getGridLines();  +		else  +			return 'None';  +	} +public function setGridLines($value)  +	{  +		$this->getStyle()->setGridLines($value);  +	} +public function getDataKeyField()  +	{  +		return $this->getViewState('DataKeyField','');  +	} +public function setDataKeyField($value)  +	{  +		$this->setViewState('DataKeyField',$value,'');  +	} +public function getDataKeys()  +	{  +		if(($dataKeys=$this->getViewState('DataKeys',null))===null)  +		{  +			$dataKeys=new TList;  +			$this->setViewState('DataKeys',$dataKeys,null);  +		}  +		return $dataKeys;  +	} +protected function getDataFieldValue($data,$field)  +	{  +		if(is_array($data))  +			return $data[$field];  +		else if(($data instanceof TMap) || ($data instanceof TList))  +			return $data->itemAt($field);  +		else if(($data instanceof TComponent) && $data->canGetProperty($field))  +		{  +			$getter='get'.$field;  +			return $data->$getter();  +		}  +		else  +			throw new TInvalidDataValueException('basedatalist_datafield_invalid');  +	} +public function onSelectedIndexChanged($param)  +	{  +		$this->raiseEvent('SelectedIndexChanged',$this,$param);  +	}  +} +?><?php + + +class TDataList extends TBaseDataList implements INamingContainer, IRepeatInfoUser  +{ +const CACHE_EXPIRY=18000; +private static $_templates=array(); +private $_items=null; +private $_itemTemplate='';  +	private $_alternatingItemTemplate='';  +	private $_selectedItemTemplate='';  +	private $_editItemTemplate='';  +	private $_headerTemplate='';  +	private $_footerTemplate='';  +	private $_separatorTemplate=''; +private $_header=null; +private $_footer=null; +public function getItems()  +	{  +		if(!$this->_items)  +			$this->_items=new TDataListItemCollection;  +		return $this->_items;  +	} +public function getItemCount()  +	{  +		return $this->_items?$this->_items->getCount():0;  +	} +public function getItemTemplate()  +	{  +		return $this->_itemTemplate;  +	} +public function setItemTemplate($value)  +	{  +		$this->_itemTemplate=$value;  +	} +public function getItemStyle()  +	{  +		if(($style=$this->getViewState('ItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('ItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getAlternatingItemTemplate()  +	{  +		return $this->_alternatingItemTemplate;  +	} +public function setAlternatingItemTemplate($value)  +	{  +		$this->_alternatingItemTemplate=$value;  +	} +public function getAlternatingItemStyle()  +	{  +		if(($style=$this->getViewState('AlternatingItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('AlternatingItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getSelectedItemTemplate()  +	{  +		return $this->_selectedItemTemplate;  +	} +public function setSelectedItemTemplate($value)  +	{  +		$this->_selectedItemTemplate=$value;  +	} +public function getSelectedItemStyle()  +	{  +		if(($style=$this->getViewState('SelectedItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('SelectedItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getEditItemTemplate()  +	{  +		return $this->_editItemTemplate;  +	} +public function setEditItemTemplate($value)  +	{  +		$this->_editItemTemplate=$value;  +	} +public function getEditItemStyle()  +	{  +		if(($style=$this->getViewState('EditItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('EditItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getHeaderTemplate()  +	{  +		return $this->_headerTemplate;  +	} +public function setHeaderTemplate($value)  +	{  +		$this->_headerTemplate=$value;  +	} +public function getHeaderStyle()  +	{  +		if(($style=$this->getViewState('HeaderStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('HeaderStyle',$style,null);  +		}  +		return $style;  +	} +public function getHeader()  +	{  +		return $this->_header;  +	} +public function getFooterTemplate()  +	{  +		return $this->_footerTemplate;  +	} +public function setFooterTemplate($value)  +	{  +		$this->_footerTemplate=$value;  +	} +public function getFooterStyle()  +	{  +		if(($style=$this->getViewState('FooterStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('FooterStyle',$style,null);  +		}  +		return $style;  +	} +public function getFooter()  +	{  +		return $this->_footer;  +	} +public function getSeparatorTemplate()  +	{  +		return $this->_separatorTemplate;  +	} +public function setSeparatorTemplate($value)  +	{  +		$this->_separatorTemplate=$value;  +	} +public function getSeparatorStyle()  +	{  +		if(($style=$this->getViewState('SeparatorStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('SeparatorStyle',$style,null);  +		}  +		return $style;  +	} +public function getSelectedItemIndex()  +	{  +		return $this->getViewState('SelectedItemIndex',-1);  +	} +public function setSelectedItemIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=-1;  +		if(($current=$this->getSelectedItemIndex())!==$value)  +		{  +			$this->setViewState('SelectedItemIndex',$value,-1);  +			$items=$this->getItems();  +			$itemCount=$items->getCount();  +			if($current>=0 && $current<$itemCount)  +			{  +				$item=$items->itemAt($current);  +				if($item->getItemType()!=='EditItem')  +					$item->setItemType($current%2?'AlternatingItem':'Item');  +			}  +			if($value>=0 && $value<$itemCount)  +			{  +				$item=$items->itemAt($value);  +				if($item->getItemType()!=='EditItem')  +					$item->setItemType('SelectedItem');  +			}  +		}  +	} +public function getSelectedItem()  +	{  +		$index=$this->getSelectedItemIndex();  +		$items=$this->getItems();  +		if($index>=0 && $index<$items->getCount())  +			return $items->itemAt($index);  +		else  +			return null;  +	} +public function getSelectedDataKey()  +	{  +		if($this->getDataKeyField()==='')  +			throw new TInvalidOperationException('datalist_datakeyfield_required');  +		$index=$this->getSelectedIndex();  +		$dataKeys=$this->getDataKeys();  +		if($index>=0 && $index<$dataKeys->getCount())  +			return $dataKeys->itemAt($index);  +		else  +			return null;  +	} +public function getEditItemIndex()  +	{  +		return $this->getViewState('EditItemIndex',-1);  +	} +public function setEditItemIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=-1;  +		if(($current=$this->getEditItemIndex())!==$value)  +		{  +			$this->setViewState('EditItemIndex',$value,-1);  +			$items=$this->getItems();  +			$itemCount=$items->getCount();  +			if($current>=0 && $current<$itemCount)  +				$items->itemAt($current)->setItemType($current%2?'AlternatingItem':'Item');  +			if($value>=0 && $value<$itemCount)  +				$items->itemAt($value)->setItemType('EditItem');  +		}  +	} +public function getEditItem()  +	{  +		$index=$this->getEditItemIndex();  +		$items=$this->getItems();  +		if($index>=0 && $index<$items->getCount())  +			return $items->itemAt($index);  +		else  +			return null;  +	} +public function getShowHeader()  +	{  +		return $this->getViewState('ShowHeader',true);  +	} +public function setShowHeader($value)  +	{  +		$this->setViewState('ShowHeader',TPropertyValue::ensureBoolean($value),true);  +	} +public function getShowFooter()  +	{  +		return $this->getViewState('ShowFooter',true);  +	} +public function setShowFooter($value)  +	{  +		$this->setViewState('ShowFooter',TPropertyValue::ensureBoolean($value),true);  +	} +protected function getRepeatInfo()  +	{  +		if(($repeatInfo=$this->getViewState('RepeatInfo',null))===null)  +		{  +			$repeatInfo=new TRepeatInfo;  +			$this->setViewState('RepeatInfo',$repeatInfo,null);  +		}  +		return $repeatInfo;  +	} +public function getCaption()  +	{  +		return $this->getRepeatInfo()->getCaption();  +	} +public function setCaption($value)  +	{  +		$this->getRepeatInfo()->setCaption($value);  +	} +public function getCaptionAlign()  +	{  +		return $this->getRepeatInfo()->getCaptionAlign();  +	} +public function setCaptionAlign($value)  +	{  +		$this->getRepeatInfo()->setCaptionAlign($value);  +	} +public function getRepeatColumns()  +	{  +		return $this->getRepeatInfo()->getRepeatColumns();  +	} +public function setRepeatColumns($value)  +	{  +		$this->getRepeatInfo()->setRepeatColumns($value);  +	} +public function getRepeatDirection()  +	{  +		return $this->getRepeatInfo()->getRepeatDirection();  +	} +public function setRepeatDirection($value)  +	{  +		$this->getRepeatInfo()->setRepeatDirection($value);  +	} +public function getRepeatLayout()  +	{  +		return $this->getRepeatInfo()->getRepeatLayout();  +	} +public function setRepeatLayout($value)  +	{  +		$this->getRepeatInfo()->setRepeatLayout($value);  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		if($param instanceof TDataListCommandEventParameter)  +		{  +			$this->onItemCommand($param);  +			$command=$param->getCommandName();  +			if(strcasecmp($command,'select')===0)  +			{  +				$this->setSelectedIndex($param->getItem()->getItemIndex());  +				$this->onSelectedIndexChanged(null);  +				return true;  +			}  +			else if(strcasecmp($command,'edit')===0)  +			{  +				$this->onEditCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'delete')===0)  +			{  +				$this->onDeleteCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'update')===0)  +			{  +				$this->onUpdateCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'cancel')===0)  +			{  +				$this->onCancelCommand($param);  +				return true;  +			}  +		}  +		return false;  +	} +public function onItemCreated($param)  +	{  +		$this->raiseEvent('ItemCreated',$this,$param);  +	} +public function onItemDataBound($param)  +	{  +		$this->raiseEvent('ItemDataBound',$this,$param);  +	} +protected function onItemCommand($param)  +	{  +		$this->raiseEvent('ItemCommand',$this,$param);  +	} +protected function onEditCommand($param)  +	{  +		$this->raiseEvent('EditCommand',$this,$param);  +	} +protected function onDeleteCommand($param)  +	{  +		$this->raiseEvent('DeleteCommand',$this,$param);  +	} +protected function onUpdateCommand($param)  +	{  +		$this->raiseEvent('UpdateCommand',$this,$param);  +	} +protected function onCancelCommand($param)  +	{  +		$this->raiseEvent('CancelCommand',$this,$param);  +	} +public function getHasHeader()  +	{  +		return ($this->getShowHeader() && $this->_headerTemplate!=='');  +	} +public function getHasFooter()  +	{  +		return ($this->getShowFooter() && $this->_footerTemplate!=='');  +	} +public function getHasSeparators()  +	{  +		return $this->_separatorTemplate!=='';  +	} +public function generateItemStyle($itemType,$index)  +	{  +		if(($item=$this->getItem($itemType,$index))!==null && $item->getHasStyle())  +			return $item->getStyle();  +		else  +			return null;  +	} +public function renderItem($writer,$repeatInfo,$itemType,$index)  +	{  +		$item=$this->getItem($itemType,$index);  +		if($repeatInfo->getRepeatLayout()==='Table')  +			$item->renderContents($writer);  +		else  +			$item->renderControl($writer);  +	} +private function getItem($itemType,$index)  +	{  +		switch($itemType)  +		{  +			case 'Header': return $this->getControls()->itemAt(0);  +			case 'Footer': return $this->getControls()->itemAt($this->getControls()->getCount()-1);  +			case 'Item':  +			case 'AlternatingItem':  +			case 'SelectedItem':  +			case 'EditItem':  +				return $this->getItems()->itemAt($index);  +			case 'Separator':  +				$i=$index+$index+1;  +				if($this->_headerTemplate!=='')  +					$i++;  +				return $this->getControls->itemAt($i);  +		}  +		return null;  +	} +private function createItemInternal($itemIndex,$itemType,$dataBind,$dataItem)  +	{  +		$item=$this->createItem($itemIndex,$itemType);  +		$this->initializeItem($item);  +		$param=new TDataListItemEventParameter($item);  +		if($dataBind)  +		{  +			$item->setDataItem($dataItem);  +			$this->onItemCreated($param);  +			$this->getControls()->add($item);  +			$item->dataBind();  +			$this->onItemDataBound($param);  +			$item->setDataItem(null);  +		}  +		else  +		{  +			$this->onItemCreated($param);  +			$this->getControls()->add($item);  +		}  +		return $item;  +	} +protected function createItem($itemIndex,$itemType)  +	{  +		return new TDataListItem($itemIndex,$itemType);  +	} +protected function applyItemStyles()  +	{  +		$headerStyle=$this->getViewState('HeaderStyle',null);  +		$footerStyle=$this->getViewState('FooterStyle',null);  +		$separatorStyle=$this->getViewState('SeparatorStyle',null);  +		$itemStyle=$this->getViewState('ItemStyle',null);  +		$alternatingItemStyle=$this->getViewState('AlternatingItemStyle',null);  +		if($itemStyle!==null)  +		{  +			if($alternatingItemStyle===null)  +				$alternatingItemStyle=new TTableItemStyle;  +			$alternatingItemStyle->mergeWith($itemStyle);  +		}  +		$selectedItemStyle=$this->getViewState('SelectedItemStyle',null);  +		if($alternatingItemStyle!==null)  +		{  +			if($selectedItemStyle===null)  +				$selectedItemStyle=new TTableItemStyle;  +			$selectedItemStyle->mergeWith($alternatingItemStyle);  +		}  +		$editItemStyle=$this->getViewState('EditItemStyle',null);  +		if($selectedItemStyle!==null)  +		{  +			if($editItemStyle===null)  +				$editItemStyle=new TTableItemStyle;  +			$editItemStyle->mergeWith($selectedItemStyle);  +		} +foreach($this->getControls() as $control)  +		{  +			switch($control->getItemType())  +			{  +				case 'Header':  +					if($headerStyle)  +						$control->getStyle()->mergeWith($headerStyle);  +					break;  +				case 'Footer':  +					if($footerStyle)  +						$control->getStyle()->mergeWith($footerStyle);  +					break;  +				case 'Separator':  +					if($separatorStyle)  +						$control->getStyle()->mergeWith($separatorStyle);  +					break;  +				case 'Item':  +					if($itemStyle)  +						$control->getStyle()->mergeWith($itemStyle);  +					break;  +				case 'AlternatingItem':  +					if($alternatingItemStyle)  +						$control->getStyle()->mergeWith($alternatingItemStyle);  +					break;  +				case 'SelectedItem':  +					if($selectedItemStyle)  +						$control->getStyle()->mergeWith($selectedItemStyle);  +					break;  +				case 'EditItem':  +					if($editItemStyle)  +						$control->getStyle()->mergeWith($editItemStyle);  +					break;  +				default:  +					break;  +			}  +		}  +	} +protected function initializeItem($item)  +	{  +		$tplContent='';  +		switch($item->getItemType())  +		{  +			case 'Header':  +				$tplContent=$this->_headerTemplate;  +				break;  +			case 'Footer':  +				$tplContent=$this->_footerTemplate;  +				break;  +			case 'Item':  +				$tplContent=$this->_itemTemplate;  +				break;  +			case 'AlternatingItem':  +				if(($tplContent=$this->_alternatingItemTemplate)==='')  +					$tplContent=$this->_itemTemplate;  +				break;  +			case 'Separator':  +				$tplContent=$this->_separatorTemplate;  +				break;  +			case 'SelectedItem':  +				if(($tplContent=$this->_selectedItemTemplate)==='')  +				{  +					if(!($item->getItemIndex()%2) || ($tplContent=$this->_alternatingItemTemplate)==='')  +						$tplContent=$this->_itemTemplate;  +				}  +				break;  +			case 'EditItem':  +				if(($tplContent=$this->_editItemTemplate)==='')  +				{  +					if($item->getItemIndex()!==$this->getSelectedItemIndex() || ($tplContent=$this->_selectedItemTemplate)==='')  +						if(!($item->getItemIndex()%2) || ($tplContent=$this->_alternatingItemTemplate)==='')  +							$tplContent=$this->_itemTemplate;  +				}  +				break;  +			default:  +				break;  +		}  +		if($tplContent!=='')  +			$this->createTemplate($tplContent)->instantiateIn($item);  +	} +protected function createTemplate($str)  +	{  +		$key=md5($str);  +		if(isset(self::$_templates[$key]))  +			return self::$_templates[$key];  +		else  +		{  +			$contextPath=$this->getTemplateControl()->getTemplate()->getContextPath();  +			if(($cache=$this->getApplication()->getCache())!==null)  +			{  +				if(($template=$cache->get($key))===null)  +				{  +					$template=new TTemplate($str,$contextPath);  +					$cache->set($key,$template,self::CACHE_EXPIRY);  +				}  +			}  +			else  +				$template=new TTemplate($str,$contextPath);  +			self::$_templates[$key]=$template;  +			return $template;  +		}  +	} +protected function onSaveState($param)  +	{  +		if($this->_items)  +			$this->setViewState('ItemCount',$this->_items->getCount(),0);  +		else  +			$this->clearViewState('ItemCount');  +	} +protected function onLoadState($param)  +	{  +		if(!$this->getIsDataBound())  +			$this->restoreItemsFromViewState();  +		$this->clearViewState('ItemCount');  +	} +public function reset()  +	{  +		$this->getControls()->clear();  +		$this->getItems()->clear();  +		$this->_header=null;  +		$this->_footer=null;  +	} +protected function restoreItemsFromViewState()  +	{  +		$this->reset();  +		if(($itemCount=$this->getViewState('ItemCount',0))>0)  +		{  +			$items=$this->getItems();  +			$selectedIndex=$this->getSelectedItemIndex();  +			$editIndex=$this->getEditItemIndex();  +			if($this->_headerTemplate!=='')  +				$this->_header=$this->createItemInternal(-1,'Header',false,null);  +			$hasSeparator=$this->_separatorTemplate!=='';  +			for($i=0;$i<$itemCount;++$i)  +			{  +				if($hasSeparator && $i>0)  +					$this->createItemInternal($i-1,'Separator',false,null);  +				if($i===$editIndex)  +					$itemType='EditItem';  +				else if($i===$selectedIndex)  +					$itemType='SelectedItem';  +				else  +					$itemType=$i%2?'AlternatingItem':'Item';  +				$items->add($this->createItemInternal($i,$itemType,false,null));  +			}  +			if($this->_footerTemplate!=='')  +				$this->_footer=$this->createItemInternal(-1,'Footer',false,null);  +		}  +		$this->clearChildState();  +	} +protected function performDataBinding($data)  +	{  +		$this->reset();  +		$keys=$this->getDataKeys();  +		$keys->clear();  +		$keyField=$this->getDataKeyField();  +		$itemIndex=0;  +		$items=$this->getItems();  +		$hasSeparator=$this->_separatorTemplate!=='';  +		$selectedIndex=$this->getSelectedItemIndex();  +		$editIndex=$this->getEditItemIndex();  +		foreach($data as $dataItem)  +		{  +			if($keyField!=='')  +				$keys->add($this->getDataFieldValue($dataItem,$keyField));  +			if($itemIndex===0 && $this->_headerTemplate!=='')  +				$this->_header=$this->createItemInternal(-1,'Header',true,null);  +			if($hasSeparator && $itemIndex>0)  +				$this->createItemInternal($itemIndex-1,'Separator',true,null);  +			if($itemIndex===$editIndex)  +				$itemType='EditItem';  +			else if($itemIndex===$selectedIndex)  +				$itemType='SelectedItem';  +			else  +				$itemType=$itemIndex%2?'AlternatingItem':'Item';  +			$items->add($this->createItemInternal($itemIndex,$itemType,true,$dataItem));  +			$itemIndex++;  +		}  +		if($itemIndex>0 && $this->_footerTemplate!=='')  +			$this->_footer=$this->createItemInternal(-1,'Footer',true,null);  +		$this->setViewState('ItemCount',$itemIndex,0);  +	} +protected function render($writer)  +	{  +		if($this->getHasControls())  +		{  +			$this->applyItemStyles();  +			$repeatInfo=$this->getRepeatInfo();  +			$repeatInfo->renderRepeater($writer,$this);  +		}  +	}  +} +class TDataListItemEventParameter extends TEventParameter  +{ +private $_item=null; +public function __construct(TDataListItem $item)  +	{  +		$this->_item=$item;  +	} +public function getItem()  +	{  +		return $this->_item;  +	}  +} +class TDataListCommandEventParameter extends TCommandEventParameter  +{ +private $_item=null; +private $_source=null; +public function __construct($item,$source,TCommandEventParameter $param)  +	{  +		$this->_item=$item;  +		$this->_source=$source;  +		parent::__construct($param->getCommandName(),$param->getCommandParameter());  +	} +public function getItem()  +	{  +		return $this->_item;  +	} +public function getCommandSource()  +	{  +		return $this->_source;  +	}  +} +class TDataListItem extends TWebControl implements INamingContainer  +{ +private $_itemIndex=''; +private $_itemType=''; +private $_dataItem=null; +public function __construct($itemIndex,$itemType)  +	{  +		$this->_itemIndex=$itemIndex;  +		$this->setItemType($itemType);  +	} +protected function createStyle()  +	{  +		return new TTableItemStyle;  +	} +public function getItemType()  +	{  +		return $this->_itemType;  +	} +public function setItemType($value)  +	{  +		$this->_itemType=TPropertyValue::ensureEnum($value,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager');  +	} +public function getItemIndex()  +	{  +		return $this->_itemIndex;  +	} +public function getDataItem()  +	{  +		return $this->_dataItem;  +	} +public function setDataItem($value)  +	{  +		$this->_dataItem=$value;  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		if($param instanceof TCommandEventParameter)  +		{  +			$this->raiseBubbleEvent($this,new TDataListCommandEventParameter($this,$sender,$param));  +			return true;  +		}  +		else  +			return false;  +	}  +} +class TDataListItemCollection extends TList  +{ +protected function canAddItem($item)  +	{  +		return ($item instanceof TDataListItem);  +	}  +} +?><?php +class TPagedDataSource extends TComponent implements IteratorAggregate  +{ +private $_dataSource=null; +private $_pageSize=10; +private $_currentPageIndex=0; +private $_allowPaging=false; +private $_allowCustomPaging=false; +private $_virtualCount=0; +public function getDataSource()  +	{  +		return $this->_dataSource;  +	} +public function setDataSource($value)  +	{  +		if(!($value instanceof TMap) && !($value instanceof TList))  +		{  +			if(is_array($value))  +				$value=new TMap($value);  +			else if($value instanceof Traversable)  +				$value=new TList($value);  +			else if($value!==null)  +				throw new TInvalidDataTypeException('pageddatasource_datasource_invalid');  +		}  +		$this->_dataSource=$value;  +	} +public function getPageSize()  +	{  +		return $this->_pageSize;  +	} +public function setPageSize($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))>0)  +			$this->_pageSize=$value;  +		else  +			throw new TInvalidDataValueException('pageddatasource_pagesize_invalid');  +	} +public function getCurrentPageIndex()  +	{  +		return $this->_currentPageIndex;  +	} +public function setCurrentPageIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=0;  +		$this->_currentPageIndex=$value;  +	} +public function getAllowPaging()  +	{  +		return $this->_allowPaging;  +	} +public function setAllowPaging($value)  +	{  +		$this->_allowPaging=TPropertyValue::ensureBoolean($value);  +	} +public function getAllowCustomPaging()  +	{  +		return $this->_allowCustomPaging;  +	} +public function setAllowCustomPaging($value)  +	{  +		$this->_allowCustomPaging=TPropertyValue::ensureBoolean($value);  +	} +public function getVirtualCount()  +	{  +		return $this->_virtualCount;  +	} +public function setVirtualCount($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))>=0)  +			$this->_virtualCount=$value;  +		else  +			throw new TInvalidDataValueException('pageddatasource_virtualcount_invalid');  +	} +public function getCount()  +	{  +		if($this->_dataSource===null)  +			return 0;  +		if(!$this->_allowPaging)  +			return $this->getDataSourceCount();  +		if(!$this->_allowCustomPaging && $this->getIsLastPage())  +			return $this->getDataSourceCount()-$this->getFirstIndexInPage();  +		return $this->_pageSize;  +	} +public function getPageCount()  +	{  +		if($this->_dataSource===null)  +			return 0;  +		$count=$this->getDataSourceCount();  +		if(!$this->_allowPaging || $count<=0)  +			return 1;  +		return (int)(($count+$this->_pageSize-1)/$this->_pageSize);  +	} +public function getIsFirstPage()  +	{  +		if($this->_allowPaging)  +			return $this->_currentPageIndex===0;  +		else  +			return true;  +	} +public function getIsLastPage()  +	{  +		if($this->_allowPaging)  +			return $this->_currentPageIndex===$this->getPageCount()-1;  +		else  +			return true;  +	} +public function getFirstIndexInPage()  +	{  +		if($this->_dataSource!==null && $this->_allowPaging && !$this->_allowCustomPaging)  +			return $this->_currentPageIndex*$this->_pageSize;  +		else  +			return 0;  +	} +public function getDataSourceCount()  +	{  +		if($this->_dataSource===null)  +			return 0;  +		else if($this->_allowCustomPaging)  +			return $this->_virtualCount;  +		else  +			return $this->_dataSource->getCount();  +	} +public function getIterator()  +	{  +		if($this->_dataSource instanceof TList)  +			return new TPagedListIterator($this->_dataSource,$this->getFirstIndexInPage(),$this->getCount());  +		else if($this->_dataSource instanceof TMap)  +			return new TPagedMapIterator($this->_dataSource,$this->getFirstIndexInPage(),$this->getCount());  +		else  +			return null;  +	}  +} +class TPagedListIterator implements Iterator  +{  +	private $_list;  +	private $_startIndex;  +	private $_count;  +	private $_index; +public function __construct(TList $list,$startIndex,$count)  +	{  +		$this->_list=$list;  +		$this->_index=0;  +		$this->_startIndex=$startIndex;  +		if($startIndex+$count>$list->getCount())  +			$this->_count=$list->getCount()-$startIndex;  +		else  +			$this->_count=$count;  +	} +public function rewind()  +	{  +		$this->_index=0;  +	} +public function key()  +	{  +		return $this->_index;  +	} +public function current()  +	{  +		return $this->_list->itemAt($this->_startIndex+$this->_index);  +	} +public function next()  +	{  +		$this->_index++;  +	} +public function valid()  +	{  +		return $this->_index<$this->_count;  +	}  +} +class TPagedMapIterator implements Iterator  +{  +	private $_map;  +	private $_startIndex;  +	private $_count;  +	private $_index;  +	private $_iterator; +public function __construct(TMap $map,$startIndex,$count)  +	{  +		$this->_map=$map;  +		$this->_index=0;  +		$this->_startIndex=$startIndex;  +		if($startIndex+$count>$map->getCount())  +			$this->_count=$map->getCount()-$startIndex;  +		else  +			$this->_count=$count;  +		$this->_iterator=$map->getIterator();  +	} +public function rewind()  +	{  +		$this->_iterator->rewind();  +		for($i=0;$i<$this->_startIndex;++$i)  +			$this->_iterator->next();  +		$this->_index=0;  +	} +public function key()  +	{  +		return $this->_iterator->key();  +	} +public function current()  +	{  +		return $this->_iterator->current();  +	} +public function next()  +	{  +		$this->_index++;  +		$this->_iterator->next();  +	} +public function valid()  +	{  +		return $this->_index<$this->_count;  +	}  +} +?><?php +  +  + +class TDataGrid extends TBaseDataList  +{  +	private $_columns=null;  +	private $_autoColumns=null;  +	private $_items=null;  +	private $_header=null;  +	private $_footer=null;  +	private $_pager=null;  +	private $_pagedDataSource=null; +protected function getTagName()  +	{  +		return 'table';  +	} +public function addParsedObject($object)  +	{  +		if($object instanceof TDataGridColumn)  +			$this->getColumns()->add($object);  +	} +public function getColumns()  +	{  +		if(!$this->_columns)  +			$this->_columns=new TDataGridColumnCollection;  +		return $this->_columns;  +	} +public function getAutoColumns()  +	{  +		if(!$this->_autoColumns)  +			$this->_autoColumns=new TDataGridColumnCollection;  +		return $this->_autoColumns;  +	} +public function getItems()  +	{  +		if(!$this->_items)  +			$this->_items=new TDataGridItemCollection;  +		return $this->_items;  +	} +protected function createStyle()  +	{  +		$style=new TTableStyle;  +		$style->setGridLines('Both');  +		$style->setCellSpacing(0);  +		return $style;  +	} +public function getBackImageUrl()  +	{  +		return $this->getStyle()->getBackImageUrl();  +	} +public function setBackImageUrl($value)  +	{  +		$this->getStyle()->setBackImageUrl($value);  +	} +public function getAlternatingItemStyle()  +	{  +		if(($style=$this->getViewState('AlternatingItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('AlternatingItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getItemStyle()  +	{  +		if(($style=$this->getViewState('ItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('ItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getSelectedItemStyle()  +	{  +		if(($style=$this->getViewState('SelectedItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('SelectedItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getEditItemStyle()  +	{  +		if(($style=$this->getViewState('EditItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('EditItemStyle',$style,null);  +		}  +		return $style;  +	} +public function getHeaderStyle()  +	{  +		if(($style=$this->getViewState('HeaderStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('HeaderStyle',$style,null);  +		}  +		return $style;  +	} +public function getHeader()  +	{  +		return $this->_header;  +	} +public function getFooterStyle()  +	{  +		if(($style=$this->getViewState('FooterStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('FooterStyle',$style,null);  +		}  +		return $style;  +	} +public function getFooter()  +	{  +		return $this->_footer;  +	} +public function getPagerStyle()  +	{  +		if(($style=$this->getViewState('PagerStyle',null))===null)  +		{  +			$style=new TDataGridPagerStyle;  +			$this->setViewState('PagerStyle',$style,null);  +		}  +		return $style;  +	} +public function getPager()  +	{  +		return $this->_pager;  +	} +public function getSelectedItem()  +	{  +		$index=$this->getSelectedItemIndex();  +		$items=$this->getItems();  +		if($index>=0 && $index<$items->getCount())  +			return $items->itemAt($index);  +		else  +			return null;  +	} +public function getSelectedItemIndex()  +	{  +		return $this->getViewState('SelectedItemIndex',-1);  +	} +public function setSelectedItemIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=-1;  +		if(($current=$this->getSelectedItemIndex())!==$value)  +		{  +			$this->setViewState('SelectedItemIndex',$value,-1);  +			$items=$this->getItems();  +			$itemCount=$items->getCount();  +			if($current>=0 && $current<$itemCount)  +			{  +				$item=$items->itemAt($current);  +				if($item->getItemType()!=='EditItem')  +					$item->setItemType($current%2?'AlternatingItem':'Item');  +			}  +			if($value>=0 && $value<$itemCount)  +			{  +				$item=$items->itemAt($value);  +				if($item->getItemType()!=='EditItem')  +					$item->setItemType('SelectedItem');  +			}  +		}  +	} +public function getEditItem()  +	{  +		$index=$this->getEditItemIndex();  +		$items=$this->getItems();  +		if($index>=0 && $index<$items->getCount())  +			return $items->itemAt($index);  +		else  +			return null;  +	} +public function getEditItemIndex()  +	{  +		return $this->getViewState('EditItemIndex',-1);  +	} +public function setEditItemIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			$value=-1;  +		if(($current=$this->getEditItemIndex())!==$value)  +		{  +			$this->setViewState('EditItemIndex',$value,-1);  +			$items=$this->getItems();  +			$itemCount=$items->getCount();  +			if($current>=0 && $current<$itemCount)  +				$items->itemAt($current)->setItemType($current%2?'AlternatingItem':'Item');  +			if($value>=0 && $value<$itemCount)  +				$items->itemAt($value)->setItemType('EditItem');  +		}  +	} +public function getAllowCustomPaging()  +	{  +		return $this->getViewState('AllowCustomPaging',false);  +	} +public function setAllowCustomPaging($value)  +	{  +		$this->setViewState('AllowCustomPaging',TPropertyValue::ensureBoolean($value),false);  +	} +public function getAllowPaging()  +	{  +		return $this->getViewState('AllowPaging',false);  +	} +public function setAllowPaging($value)  +	{  +		$this->setViewState('AllowPaging',TPropertyValue::ensureBoolean($value),false);  +	} +public function getAllowSorting()  +	{  +		return $this->getViewState('AllowSorting',false);  +	} +public function setAllowSorting($value)  +	{  +		$this->setViewState('AllowSorting',TPropertyValue::ensureBoolean($value),false);  +	} +public function getAutoGenerateColumns()  +	{  +		return $this->getViewState('AutoGenerateColumns',false);  +	} +public function setAutoGenerateColumns($value)  +	{  +		$this->setViewState('AutoGenerateColumns',TPropertyValue::ensureBoolean($value),false);  +	} +public function getCurrentPageIndex()  +	{  +		return $this->getViewState('CurrentPageIndex',0);  +	} +public function setCurrentPageIndex($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			throw new TInvalidDataValueException('datagrid_currentpageindex_invalid');  +		$this->setViewState('CurrentPageIndex',$value,0);  +	} +public function getPageSize()  +	{  +		return $this->getViewState('PageSize',10);  +	} +public function setPageSize($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<1)  +			throw new TInvalidDataValueException('datagrid_pagesize_invalid');  +		$this->setViewState('PageSize',TPropertyValue::ensureInteger($value),10);  +	} +public function getPageCount()  +	{  +		if($this->_pagedDataSource)  +			return $this->_pagedDataSource->getPageCount();  +		return $this->getViewState('PageCount',0);  +	} +public function getVirtualCount()  +	{  +		return $this->getViewState('VirtualCount',0);  +	} +public function setVirtualCount($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<0)  +			throw new TInvalidDataValueException('datagrid_virtualcount_invalid');  +		$this->setViewState('VirtualCount',$value,0);  +	} +public function getShowHeader()  +	{  +		return $this->getViewState('ShowHeader',true);  +	} +public function setShowHeader($value)  +	{  +		$this->setViewState('ShowHeader',TPropertyValue::ensureBoolean($value),true);  +	} +public function getShowFooter()  +	{  +		return $this->getViewState('ShowFooter',false);  +	} +public function setShowFooter($value)  +	{  +		$this->setViewState('ShowFooter',TPropertyValue::ensureBoolean($value),false);  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		if($param instanceof TDataGridCommandEventParameter)  +		{  +			$this->onItemCommand($param);  +			$command=$param->getCommandName();  +			if(strcasecmp($command,'select')===0)  +			{  +				$this->setSelectedIndex($param->getItem()->getItemIndex());  +				$this->onSelectedIndexChanged(null);  +				return true;  +			}  +			else if(strcasecmp($command,'edit')===0)  +			{  +				$this->onEditCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'delete')===0)  +			{  +				$this->onDeleteCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'update')===0)  +			{  +				$this->onUpdateCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'cancel')===0)  +			{  +				$this->onCancelCommand($param);  +				return true;  +			}  +			else if(strcasecmp($command,'sort')===0)  +			{  +				$this->onSortCommand(new TDataGridSortCommandEventParameter($sender,$param->getCommandParameter()));  +				return true;  +			}  +			else if(strcasecmp($command,'page')===0)  +			{  +				$p=$param->getCommandParameter();  +				if(strcasecmp($p,'next'))  +					$pageIndex=$this->getCurrentPageIndex()+1;  +				else if(strcasecmp($p,'prev'))  +					$pageIndex=$this->getCurrentPageIndex()-1;  +				else  +					$pageIndex=TPropertyValue::ensureInteger($p)-1;  +				$this->onPageIndexChanged(new TDataGridPageChangedEventParameter($sender,$pageIndex));  +				return true;  +			}  +		}  +		return false;  +	} +public function onCancelCommand($param)  +	{  +		$this->raiseEvent('CancelCommand',$this,$param);  +	} +public function onDeleteCommand($param)  +	{  +		$this->raiseEvent('DeleteCommand',$this,$param);  +	} +public function onEditCommand($param)  +	{  +		$this->raiseEvent('EditCommand',$this,$param);  +	} +public function onItemCommand($param)  +	{  +		$this->raiseEvent('ItemCommand',$this,$param);  +	} +public function onSortCommand($param)  +	{  +		$this->raiseEvent('SortCommand',$this,$param);  +	} +public function onUpdateCommand($param)  +	{  +		$this->raiseEvent('UpdateCommand',$this,$param);  +	} +public function onItemCreated($param)  +	{  +		$this->raiseEvent('ItemCreated',$this,$param);  +	} +public function onItemDataBound($param)  +	{  +		$this->raiseEvent('ItemDataBound',$this,$param);  +	} +public function onPageIndexChanged($param)  +	{  +		$this->raiseEvent('PageIndexChanged',$this,$param);  +	} +protected function onSaveState($param)  +	{  +		if($this->_items)  +			$this->setViewState('ItemCount',$this->_items->getCount(),0);  +		else  +			$this->clearViewState('ItemCount');  +	} +protected function onLoadState($param)  +	{  +		if(!$this->getIsDataBound())  +			$this->restoreItemsFromViewState();  +		$this->clearViewState('ItemCount');  +	} +private function createPagedDataSource()  +	{  +		$ds=new TPagedDataSource;  +		$ds->setCurrentPageIndex($this->getCurrentPageIndex());  +		$ds->setPageSize($this->getPageSize());  +		$ds->setAllowPaging($this->getAllowPaging());  +		$ds->setAllowCustomPaging($this->getAllowCustomPaging());  +		$ds->setVirtualCount($this->getVirtualCount());  +		return $ds;  +	} +public function reset()  +	{  +		$this->getControls()->clear();  +		$this->getItems()->clear();  +		$this->_header=null;  +		$this->_footer=null;  +	} +protected function restoreGridFromViewState()  +	{  +		$this->reset();  +		$this->_pagedDataSource=$ds=$this->createPagedDataSource();  +						if($columns->getCount()>0)  +		{  +			foreach($columns as $column)  +				$column->initialize();  +			$allowPaging=$ds->getAllowPaging();  +			if($allowPaging)  +													$selectedIndex=$this->getSelectedItemIndex();  +			$editIndex=$this->getEditItemIndex();  +			$index=0;  +			foreach($ds as $data)  +			{  +				if($index===$editIndex)  +					$itemType='EditItem';  +				else if($index===$selectedIndex)  +					$itemType='SelectedItem';  +				else if($index % 2)  +					$itemType='AlternatingItem';  +				else  +					$itemType='Item';  +								$index++;  +			}  +								}  +		$this->_pagedDataSource=null;  +	} +protected function performDataBinding($data)  +	{  +		$this->reset();  +		$keys=$this->getDataKeys();  +		$keys->clear();  +		$keyField=$this->getDataKeyField();  +		$this->_pagedDataSource=$ds=$this->createPagedDataSource();  +		$ds->setDataSource($data);  +		$allowPaging=$ds->getAllowPaging();  +		if($allowPaging && $ds->getCurrentPageIndex()>=$ds->getPageCount())  +			throw new TInvalidDataValueException('datagrid_currentpageindex_invalid');  +		$columns=$this->getAllColumns($ds);  +		$items=$this->getItems(); +if(($columnCount=$columns->getCount())>0)  +		{  +			foreach($columns as $column)  +				$column->initialize();  +			$allowPaging=$ds->getAllowPaging();  +			if($allowPaging)  +				$this->createPager(-1,-1,$columnCount,$ds);  +			$this->createItemInternal(-1,-1,'Header',true,null,$columns);  +			$selectedIndex=$this->getSelectedItemIndex();  +			$editIndex=$this->getEditItemIndex();  +			$index=0;  +			$dsIndex=$ds->getAllowPaging()?$ds->getFirstIndexInPage():0;  +			foreach($ds as $data)  +			{  +				if($keyField!=='')  +					$keys->add($this->getDataFieldValue($data,$keyField));  +				if($index===$editIndex)  +					$itemType='EditItem';  +				else if($index===$selectedIndex)  +					$itemType='SelectedItem';  +				else if($index % 2)  +					$itemType='AlternatingItem';  +				else  +					$itemType='Item';  +				$items->add($this->createItemInternal($index,$dsIndex,$itemType,true,$data,$columns));  +				$index++;  +				$dsIndex++;  +			}  +			$this->createItemInternal(-1,-1,'Footer',true,null,$columns);  +			if($allowPaging)  +				$this->createPager(-1,-1,$columnCount,$ds);  +			$this->setViewState('ItemCount',$index,0);  +			$this->setViewState('PageCount',$ds->getPageCount(),0);  +			$this->setViewState('DataSourceCount',$ds->getDataSourceCount(),0);  +		}  +		else  +		{  +			$this->setViewState('ItemCount',$index,0);  +			$this->setViewState('PageCount',0,0);  +			$this->setViewState('DataSourceCount',0,0);  +		}  +		$this->_pagedDataSource=null;  +	} +protected function createItem($itemIndex,$dataSourceIndex,$itemType)  +	{  +		return new TDataGridItem($itemIndex,$dataSourceIndex,$itemType);  +	} +private function createItemInternal($itemIndex,$dataSourceIndex,$itemType,$dataBind,$dataItem,$columns)  +	{  +		$item=$this->createItem($itemIndex,$dataSourceIndex,$itemType);  +		$this->initializeItem($item,$columns);  +		$param=new TDataGridItemEventParameter($item);  +		if($dataBind)  +		{  +			$item->setDataItem($dataItem);  +			$this->onItemCreated($param);  +			$this->getControls()->add($item);  +			$item->dataBind();  +			$this->onItemDataBound($param);  +			$item->setDataItem(null);  +		}  +		else  +		{  +			$this->onItemCreated($param);  +			$this->getControls()->add($item);  +		}  +		return $item;  +	} +protected function initializeItem($item,$columns)  +	{  +		$cells=$item->getCells();  +		$itemType=$item->getItemType();  +		$index=0;  +		foreach($columns as $column)  +		{  +			if($itemType==='Header')  +				$cell=new TTableHeaderCell;  +			else  +				$cell=new TTableCell;  +			$column->initializeCell($cell,$index,$itemType);  +			$cells->add($cell);  +			$index++;  +		}  +	} +private function createPager($itemIndex,$dataSourceIndex,$columnSpan,$pagedDataSource)  +	{  +		$item=$this->createItem($itemIndex,$dataSourceIndex,'Pager');  +		$this->initializePager($item,$columnSpan,$pagedDataSource);  +		$this->onItemCreated(new TDataGridItemEventParameter($item));  +		$this->getControls()->add($item);  +		return $item;  +	} +protected function initializePager($pager,$columnSpan,$pagedDataSource)  +	{  +		$cell=new TTableCell;  +		if($columnSpan>1)  +			$cell->setColumnSpan($columnSpan);  +		$this->buildPager($cell,$pagedDataSource);  +		$pager->getCells()->add($cell);  +	} +protected function buildPager($cell,$dataSource)  +	{  +		switch($this->getPagerStyle()->getMode())  +		{  +			case 'NextPrev':  +				$this->buildNextPrevPager($cell,$dataSource);  +				break;  +			case 'Numeric':  +				$this->buildNumericPager($cell,$dataSource);  +				break;  +		}  +	} +protected function buildNextPrevPager($cell,$dataSource)  +	{  +		$style=$this->getPagerStyle();  +		$controls=$cell->getControls();  +		if($dataSource->getIsFirstPage())  +		{  +			$label=new TLabel;  +			$label->setText($style->getPrevPageText());  +			$controls->add($label);  +		}  +		else  +		{  +			$button=new TLinkButton;  +			$button->setText($style->getPrevPageText());  +			$button->setCommandName('page');  +			$button->setCommandParameter('prev');  +			$button->setCausesValidation(false);  +			$controls->add($button);  +		}  +		$controls->add(' ');  +		if($dataSource->getIsLastPage())  +		{  +			$label=new TLabel;  +			$label->setText($style->getNextPageText());  +			$controls->add($label);  +		}  +		else  +		{  +			$button=new TLinkButton;  +			$button->setText($style->getNextPageText());  +			$button->setCommandName('page');  +			$button->setCommandParameter('next');  +			$button->setCausesValidation(false);  +			$controls->add($button);  +		}  +	} +protected function buildNumericPager($cell,$dataSource)  +	{  +		$style=$this->getPagerStyle();  +		$controls=$cell->getControls();  +		$pageCount=$dataSource->getPageCount();  +		$pageIndex=$dataSource->getCurrentPageIndex()+1;  +		$maxButtonCount=$style->getPageButtonCount();  +		$buttonCount=$maxButtonCount>$pageCount?$pageCount:$maxButtonCount;  +		$startPageIndex=1;  +		$endPageIndex=$buttonCount;  +		if($pageIndex>$endPageIndex)  +		{  +			$startPageIndex=((int)($pageIndex/$maxButtonCount))*$maxButtonCount+1;  +			if(($endPageIndex=$startPageIndex+$maxButtonCount-1)>$pageCount)  +				$endPageIndex=$pageCount;  +			if($endPageIndex-$startPageIndex+1<$maxButtonCount)  +			{  +				if(($startPageIndex=$endPageIndex-$maxButtonCount+1)<1)  +					$startPageIndex=1;  +			}  +		} +if($startPageIndex>1)  +		{  +			$button=new TLinkButton;  +			$button->setText('...');  +			$button->setCommandName('page');  +			$button->setCommandParameter($startPageIndex-1);  +			$button->setCausesValidation(false);  +			$controls->add($button);  +			$controls->add(' ');  +		} +for($i=$startPageIndex;$i<=$endPageIndex;++$i)  +		{  +			if($i===$pageIndex)  +			{  +				$label=new TLabel;  +				$label->setText("$i");  +				$controls->add($label);  +			}  +			else  +			{  +				$button=new TLinkButton;  +				$button->setText("$i");  +				$button->setCommandName('page');  +				$button->setCommandParameter($i);  +				$button->setCausesValidation(false);  +				$controls->add($button);  +			}  +			if($i<$endPageIndex)  +				$controls->add(' ');  +		} +if($pageCount>$endPageIndex)  +		{  +			$controls->add(' ');  +			$button=new TLinkButton;  +			$button->setText('...');  +			$button->setCommandName('page');  +			$button->setCommandParameter($endPageIndex+1);  +			$button->setCausesValidation(false);  +			$controls->add($button);  +		}  +	} +protected function getAllColumns($dataSource)  +	{  +		$list=new TList($this->getColumns());  +		$list->mergeWith($this->createAutoColumns($dataSource));  +		return $list;  +	} +protected function createAutoColumns($dataSource)  +	{  +		if(!$dataSource || $dataSource->getCount()<=0)  +			return null;  +		$autoColumns=$this->getAutoColumns();  +		$autoColumns->clear();  +		foreach($dataSource as $row)  +		{  +			foreach($row as $key=>$value)  +			{  +				$column=new TBoundColumn;  +				if(is_string($key))  +				{  +					$column->setHeaderText($key);  +					$column->setDataField($key);  +					$column->setSortExpression($key);  +					$column->setOwner($this);  +					$autoColumns->add($column);  +				}  +				else  +				{  +					$column->setHeaderText('Item');  +					$column->setDataField($key);  +					$column->setSortExpression('Item');  +					$column->setOwner($this);  +					$autoColumns->add($column);  +				}  +			}  +			break;  +		}  +		return $autoColumns;  +	}  +} +class TDataGridItemEventParameter extends TEventParameter  +{ +private $_item=null; +public function __construct(TDataGridItem $item)  +	{  +		$this->_item=$item;  +	} +public function getItem()  +	{  +		return $this->_item;  +	}  +} +class TDataGridCommandEventParameter extends TCommandEventParameter  +{ +private $_item=null; +private $_source=null; +public function __construct($item,$source,TCommandEventParameter $param)  +	{  +		$this->_item=$item;  +		$this->_source=$source;  +		parent::__construct($param->getCommandName(),$param->getCommandParameter());  +	} +public function getItem()  +	{  +		return $this->_item;  +	} +public function getCommandSource()  +	{  +		return $this->_source;  +	}  +} +class TDataGridSortCommandEventParameter extends TEventParameter  +{ +private $_sortExpression=''; +private $_source=null; +public function __construct($source,TDataGridCommandEventParameter $param)  +	{  +		$this->_source=$source;  +		$this->_sortExpression=$param->getCommandParameter();  +	} +public function getCommandSource()  +	{  +		return $this->_source;  +	} +public function getSortExpression()  +	{  +		return $this->_sortExpression;  +	}  +} +class TDataGridPageChangedEventParameter extends TEventParameter  +{ +private $_newIndex; +private $_source=null; +public function __construct($source,$newPageIndex)  +	{  +		$this->_source=$source;  +		$this->_newIndex=$newPageIndex;  +	} +public function getCommandSource()  +	{  +		return $this->_source;  +	} +public function getNewPageIndex()  +	{  +		return $this->_newIndex;  +	}  +} +class TDataGridItem extends TTableRow implements INamingContainer  +{ +private $_itemIndex=''; +private $_dataSourceIndex=0; +private $_itemType=''; +private $_dataItem=null; +public function __construct($itemIndex,$dataSourceIndex,$itemType)  +	{  +		$this->_itemIndex=$itemIndex;  +		$this->_dataSourceIndex=$dataSourceIndex;  +		$this->setItemType($itemType);  +	} +public function getItemType()  +	{  +		return $this->_itemType;  +	} +public function setItemType($value)  +	{  +		$this->_itemType=TPropertyValue::ensureEnum($value,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager');  +	} +public function getItemIndex()  +	{  +		return $this->_itemIndex;  +	} +public function getDataSourceIndex()  +	{  +		return $this->_dataSourceIndex;  +	} +public function getDataItem()  +	{  +		return $this->_dataItem;  +	} +public function setDataItem($value)  +	{  +		$this->_dataItem=$value;  +	} +protected function onBubbleEvent($sender,$param)  +	{  +		if($param instanceof TCommandEventParameter)  +		{  +			$this->raiseBubbleEvent($this,new TDataGridCommandEventParameter($this,$sender,$param));  +			return true;  +		}  +		else  +			return false;  +	}  +} +class TDataGridItemCollection extends TList  +{ +protected function canAddItem($item)  +	{  +		return ($item instanceof TDataGridItem);  +	}  +} +class TDataGridColumnCollection extends TList  +{ +protected function canAddItem($item)  +	{  +		return ($item instanceof TDataGridColumn);  +	}  +} +class TDataGridPagerStyle extends TTableItemStyle  +{  +	private $_mode=null;  +	private $_nextText=null;  +	private $_prevText=null;  +	private $_buttonCount=null;  +	private $_position=null;  +	private $_visible=null; +public function getMode()  +	{  +		return $this->_mode===null?'NextPrev':$this->_mode;  +	} +public function setMode($value)  +	{  +		$this->_mode=TPropertyValue::ensureEnum($value,'NextPrev','Numeric');  +	} +public function getNextPageText()  +	{  +		return $this->_nextText===null?'>':$this->_nextText;  +	} +public function setNextPageText($value)  +	{  +		$this->_nextText=$value;  +	} +public function getPrevPageText()  +	{  +		return $this->_prevText===null?'<':$this->_prevText;  +	} +public function setPrevPageText($value)  +	{  +		$this->_prevText=$value;  +	} +public function getPageButtonCount()  +	{  +		return $this->_buttonCount===null?10:$this->_buttonCount;  +	} +public function setPageButtonCount($value)  +	{  +		if(($value=TPropertyValue::ensureInteger($value))<1)  +			throw new TInvalidDataValueException('datagridpagerstyle_pagebuttoncount_invalid');  +		$this->_buttonCount=$value;  +	} +public function getPosition()  +	{  +		return $this->_position===null?'Bottom':$this->_position;  +	} +public function setPosition($value)  +	{  +		$this->_position=TPropertyValue::ensureEnum($value,'Bottom','Top','TopAndBottom');  +	} +public function getVisible()  +	{  +		return $this->_visible===null?true:$this->_visible;  +	} +public function setVisible($value)  +	{  +		$this->_visible=TPropertyValue::ensureBoolean($value);  +	} +public function reset()  +	{  +		parent::reset();  +		$this->_visible=null;  +		$this->_position=null;  +		$this->_buttonCount=null;  +		$this->_prevText=null;  +		$this->_nextText=null;  +		$this->_mode=null;  +	} +public function copyFrom($style)  +	{  +		parent::copyFrom($style);  +		if($style instanceof TDataGridPagerStyle)  +		{  +			$this->_visible=$style->_visible;  +			$this->_position=$style->_position;  +			$this->_buttonCount=$style->_buttonCount;  +			$this->_prevText=$style->_prevText;  +			$this->_nextText=$style->_nextText;  +			$this->_mode=$style->_mode;  +		}  +	} +public function mergeWith($style)  +	{  +		parent::mergeWith($style);  +		if($style instanceof TDataGridPagerStyle)  +		{  +			if($style->_visible!==null && $this->_visible===null)  +				$this->_visible=$style->_visible;  +			if($style->_position!==null && $this->_position===null)  +				$this->_position=$style->_position;  +			if($style->_buttonCount!==null && $this->_buttonCount===null)  +				$this->_buttonCount=$style->_buttonCount;  +			if($style->_prevText!==null && $this->_prevText===null)  +				$this->_prevText=$style->_prevText;  +			if($style->_nextText!==null && $this->_nextText===null)  +				$this->_nextText=$style->_nextText;  +			if($style->_mode!==null && $this->_mode===null)  +				$this->_mode=$style->_mode;  +		}  +	}  +} +?><?php +abstract class TDataGridColumn extends TComponent  +{  +	private $_owner=null;  +	private $_viewState=array(); +public function getHeaderText()  +	{  +		return $this->getViewState('HeaderText','');  +	} +public function setHeaderText($value)  +	{  +		$this->setViewState('HeaderText',$value,'');  +		$this->onColumnChanged();  +	} +public function getHeaderImageUrl()  +	{  +		return $this->getViewState('HeaderImageUrl','');  +	} +public function setHeaderImageUrl($value)  +	{  +		$this->setViewState('HeaderImageUrl',$value,'');  +		$this->onColumnChanged();  +	} +public function getHeaderStyle()  +	{  +		if(($style=$this->getViewState('HeaderStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('HeaderStyle',$style,null);  +		}  +		return $style;  +	} +public function getFooterText()  +	{  +		return $this->getViewState('FooterText','');  +	} +public function setFooterText($value)  +	{  +		$this->setViewState('FooterText',$value,'');  +		$this->onColumnChanged();  +	} +public function getFooterStyle()  +	{  +		if(($style=$this->getViewState('FooterStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('FooterStyle',$style,null);  +		}  +		return $style;  +	} +public function getItemStyle()  +	{  +		if(($style=$this->getViewState('ItemStyle',null))===null)  +		{  +			$style=new TTableItemStyle;  +			$this->setViewState('ItemStyle',$style,null);  +		}  +		return $style;  +	} +public function setSortExpression($value)  +	{  +		$this->setViewState('SortExpression',$value,'');  +		$this->onColumnChanged();  +	} +public function getSortExpression()  +	{  +		return $this->getViewState('SortExpression','');  +	} +public function getVisible($checkParents=true)  +	{  +		return $this->getViewState('Visible',true);  +	} +public function setVisible($value)  +	{  +		$this->setViewState('Visible',TPropertyValue::ensureBoolean($value),true);  +		$this->onColumnChanged();  +	} +protected function getViewState($key,$defaultValue=null)  +	{  +		return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue;  +	} +protected function setViewState($key,$value,$defaultValue=null)  +	{  +		if($value===$defaultValue)  +			unset($this->_viewState[$key]);  +		else  +			$this->_viewState[$key]=$value;  +	} +protected function loadState($state)  +	{  +		$this->_viewState=$state;  +	} +protected function saveState()  +	{  +		return $this->_viewState;  +	} +public function getOwner()  +	{  +		return $this->_owner;  +	} +public function setOwner(TDataGrid $value)  +	{  +		$this->_owner=$value;  +	} +protected function onColumnChanged()  +	{  +		if($this->_owner)  +			$this->_owner->onColumnsChanged();  +	} +public function initialize()  +	{  +	} +protected function getDataFieldValue($data,$field)  +	{  +		if(is_array($data))  +			return $data[$field];  +		else if($data instanceof TMap)  +			return $data->itemAt($field);  +		else if(($data instanceof TComponent) && $data->canGetProperty($field))  +		{  +			$getter='get'.$field;  +			return $data->$getter();  +		}  +		else  +			throw new TInvalidDataValueException('datagridcolumn_data_invalid');  +	} +public function initializeCell($cell,$columnIndex,$itemType)  +	{  +		switch($itemType)  +		{  +			case 'Header':  +				$sortExpression=$this->getSortExpression();  +				$allowSorting=$sortExpression!=='' && (!$this->_owner || $this->_owner->getAllowSorting());  +				if($allowSorting)  +				{  +					if(($url=$this->getHeaderImageUrl())!=='')  +					{  +						$button=Prado::createComponent('System.Web.UI.WebControls.TImageButton');  +						$button->setImageUrl($url);  +						$button->setCommandName('Sort');  +						$button->setCommandParameter($sortExpression);  +						$button->setCausesValidation(false);  +						$cell->getControls()->add($button);  +					}  +					else if(($text=$this->getHeaderText())!=='')  +					{  +						$button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton');  +						$button->setText($text);  +						$button->setCommandName('Sort');  +						$button->setCommandParameter($sortExpression);  +						$button->setCausesValidation(false);  +						$cell->getControls()->add($button);  +					}  +					else  +						$cell->setText(' ');  +				}  +				else  +				{  +					if(($url=$this->getHeaderImageUrl())!=='')  +					{  +						$image=Prado::createComponent('System.Web.UI.WebControls.TImage');  +						$image->setImageUrl($url);  +						$cell->getControls()->add($image);  +					}  +					else  +					{  +						if(($text=$this->getHeaderText())==='')  +							$text=' ';  +						$cell->setText($text);  +					}  +				}  +				break;  +			case 'Footer':  +				if(($text=$this->getFooterText())==='')  +					$text=' ';  +				$cell->setText($text);  +				break;  +		}  +	}  +} +?><?php + +class TBoundColumn extends TDataGridColumn  +{ +public function getDataField()  +	{  +		return $this->getViewState('DataField','');  +	} +public function setDataField($value)  +	{  +		$this->setViewState('DataField',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataFormatString()  +	{  +		return $this->getViewState('DataFormatString','');  +	} +public function setDataFormatString($value)  +	{  +		$this->setViewState('DataFormatString',$value,'');  +		$this->onColumnChanged();  +	} +public function getReadOnly()  +	{  +		return $this->getViewState('ReadOnly',false);  +	} +public function setReadOnly($value)  +	{  +		$this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false);  +		$this->onColumnChanged();  +	} +public function initializeCell($cell,$columnIndex,$itemType)  +	{  +		parent::initializeCell($cell,$columnIndex,$itemType);  +		switch($itemType)  +		{  +			case 'EditItem':  +				$control=$cell;  +				if(!$this->getReadOnly())  +				{  +					$textBox=Prado::createComponent('System.Web.UI.WebControls.TTextBox');  +					$cell->getControls()->add($textBox);  +					$control=$textBox;  +				}  +				if(($dataField=$this->getDataField())!=='')  +					$control->attachEventHandler('DataBinding',array($this,'dataBindColumn'));  +				break;  +			case 'Item':  +			case 'AlternatingItem':  +			case 'SelectedItem':  +				if(($dataField=$this->getDataField())!=='')  +					$cell->attachEventHandler('DataBinding',array($this,'dataBindColumn'));  +				break;  +		}  +	} +public function dataBindColumn($sender,$param)  +	{  +		$item=$sender->getNamingContainer();  +		$data=$item->getDataItem();  +		$formatString=$this->getDataFormatString();  +		if(($field=$this->getDataField())!=='')  +			$value=$this->formatDataValue($formatString,$this->getDataFieldValue($data,$field));  +		else  +			$value=$this->formatDataValue($data);  +		if(($sender instanceof TTableCell) || ($sender instanceof TTextBox))  +			$sender->setText($value);  +	} +protected function formatDataValue($formatString,$value)  +	{  +		return $formatString===''?TPropertyValue::ensureString($value):sprintf($formatString,$value);  +	}  +} +?><?php + +class TButtonColumn extends TDataGridColumn  +{ +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataTextField()  +	{  +		return $this->getViewState('DataTextField','');  +	} +public function setDataTextField($value)  +	{  +		$this->setViewState('DataTextField',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataTextFormatString()  +	{  +		return $this->getViewState('DataTextFormatString','');  +	} +public function setDataTextFormatString($value)  +	{  +		$this->setViewState('DataTextFormatString',$value,'');  +		$this->onColumnChanged();  +	} +public function getButtonType()  +	{  +		return $this->getViewState('ButtonType','LinkButton');  +	} +public function setButtonType($value)  +	{  +		$this->setViewState('ButtonType',TPropertyValue::ensureEnum($value,'LinkButton','PushButton'),'LinkButton');  +		$this->onColumnChanged();  +	} +public function getCommandName()  +	{  +		return $this->getViewState('CommandName','');  +	} +public function setCommandName($value)  +	{  +		$this->setViewState('CommandName',$value,'');  +		$this->onColumnChanged();  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +		$this->onColumnChanged();  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +		$this->onColumnChanged();  +	} +public function initializeCell($cell,$columnIndex,$itemType)  +	{  +		parent::initializeCell($cell,$columnIndex,$itemType);  +		if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem' || $itemType==='EditItem')  +		{  +			if($this->getButtonType()==='LinkButton')  +				$button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton');  +			else  +				$button=Prado::createComponent('System.Web.UI.WebControls.TButton');  +			$button->setText($this->getText());  +			$button->setCommandName($this->getCommandName());  +			$button->setCausesValidation($this->getCausesValidation());  +			$button->setValidationGroup($this->getValidationGroup());  +			if($this->getDataTextField()!=='')  +				$button->attachEventHandler('DataBinding',array($this,'dataBindColumn'));  +			$cell->getControls()->add($button);  +		}  +	} +public function dataBindColumn($sender,$param)  +	{  +		if(($field=$this->getDataTextField())!=='')  +		{  +			$item=$sender->getNamingContainer();  +			$data=$item->getDataItem();  +			$value=$this->getDataFieldValue($data,$field);  +			$text=$this->formatDataValue($this->getDataTextFormatString(),$value);  +			if(($sender instanceof TLinkButton) || ($sender instanceof TButton))  +				$sender->setText($text);  +		}  +	}  +} +?><?php + +class TEditCommandColumn extends TDataGridColumn  +{ +public function getButtonType()  +	{  +		return $this->getViewState('ButtonType','LinkButton');  +	} +public function setButtonType($value)  +	{  +		$this->setViewState('ButtonType',TPropertyValue::ensureEnum($value,'LinkButton','PushButton'),'LinkButton');  +		$this->onColumnChanged();  +	} +public function getEditText()  +	{  +		return $this->getViewState('EditText','');  +	} +public function setEditText($value)  +	{  +		$this->setViewState('EditText',$value,'');  +		$this->onColumnChanged();  +	} +public function getUpdateText()  +	{  +		return $this->getViewState('UpdateText','');  +	} +public function setUpdateText($value)  +	{  +		$this->setViewState('UpdateText',$value,'');  +		$this->onColumnChanged();  +	} +public function getCancelText()  +	{  +		return $this->getViewState('CancelText','');  +	} +public function setCancelText($value)  +	{  +		$this->setViewState('CancelText',$value,'');  +		$this->onColumnChanged();  +	} +public function getCausesValidation()  +	{  +		return $this->getViewState('CausesValidation',true);  +	} +public function setCausesValidation($value)  +	{  +		$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);  +		$this->onColumnChanged();  +	} +public function getValidationGroup()  +	{  +		return $this->getViewState('ValidationGroup','');  +	} +public function setValidationGroup($value)  +	{  +		$this->setViewState('ValidationGroup',$value,'');  +		$this->onColumnChanged();  +	} +public function initializeCell($cell,$columnIndex,$itemType)  +	{  +		parent::initializeCell($cell,$columnIndex,$itemType);  +		$buttonType=$this->getButtonType()=='LinkButton'?'TLinkButton':'TButton';  +		if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem')  +			$this->addButtonToCell($cell,'Edit',$this->getUpdateText(),false,'');  +		else if($itemType==='EditItem')  +		{  +			$this->addButtonToCell($cell,'Update',$this->getUpdateText(),$this->getCausesValidation(),$this->getValidationGroup());  +			$cell->getControls()->add(' ');  +			$this->addButtonToCell($cell,'Cancel',$this->getUpdateText(),false,'');  +		}  +	} +private function addButtonToCell($cell,$commandName,$text,$causesValidation,$validationGroup)  +	{  +		if($this->getButtonType()==='LinkButton')  +			$button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton');  +		else  +			$button=Prado::createComponent('System.Web.UI.WebControls.TButton');  +		$button->setText($text);  +		$button->setCommandName($commandName);  +		$button->setCausesValidation($causesValidation);  +		$button->setValidationGroup($validationGroup);  +		$cell->getControls()->add($button);  +	}  +} +?><?php + +class THyperLinkColumn extends TDataGridColumn  +{ +public function getText()  +	{  +		return $this->getViewState('Text','');  +	} +public function setText($value)  +	{  +		$this->setViewState('Text',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataTextField()  +	{  +		return $this->getViewState('DataTextField','');  +	} +public function setDataTextField($value)  +	{  +		$this->setViewState('DataTextField',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataTextFormatString()  +	{  +		return $this->getViewState('DataTextFormatString','');  +	} +public function setDataTextFormatString($value)  +	{  +		$this->setViewState('DataTextFormatString',$value,'');  +		$this->onColumnChanged();  +	} +public function getNavigateUrl()  +	{  +		return $this->getViewState('NavigateUrl','');  +	} +public function setNavigateUrl($value)  +	{  +		$this->setViewState('NavigateUrl',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataNavigateUrlField()  +	{  +		return $this->getViewState('DataNavigateUrlField','');  +	} +public function setDataNavigateUrlField($value)  +	{  +		$this->setViewState('DataNavigateUrlField',$value,'');  +		$this->onColumnChanged();  +	} +public function getDataNavigateUrlFormatString()  +	{  +		return $this->getViewState('DataNavigateUrlFormatString','');  +	} +public function setDataNavigateUrlFormatString($value)  +	{  +		$this->setViewState('DataNavigateUrlFormatString',$value,'');  +		$this->onColumnChanged();  +	} +public function getTarget()  +	{  +		return $this->getViewState('Target','');  +	} +public function setTarget($value)  +	{  +		$this->setViewState('Target',$value,'');  +		$this->onColumnChanged();  +	} +public function initializeCell($cell,$columnIndex,$itemType)  +	{  +		parent::initializeCell($cell,$columnIndex,$itemType);  +		if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem' || $itemType==='EditItem')  +		{  +			$link=Prado::createComponent('System.Web.UI.WebControls.THyperLink');  +			$link->setText($this->getText());  +			$link->setNavigateUrl($this->getNavigateUrl());  +			$link->setTarget($this->getTarget());  +			if($this->getDataTextField()!=='' || $this->getDataNavigateUrlField()!=='')  +				$link->attachEventHandler('DataBinding',array($this,'dataBindColumn'));  +			$cell->getControls()->add($link);  +		}  +	} +public function dataBindColumn($sender,$param)  +	{  +		$item=$sender->getNamingContainer();  +		$data=$item->getDataItem();  +		if(($field=$this->getDataTextField())!=='')  +		{  +			$value=$this->getDataFieldValue($data,$field);  +			$text=$this->formatDataValue($this->getDataTextFormatString(),$value);  +			$sender->setText($text);  +		}  +		if(($field=$this->getDataNavigateUrlField())!=='')  +		{  +			$value=$this->getDataFieldValue($data,$field);  +			$url=$this->formatDataValue($this->getDataNavigateUrlFormatString(),$value);  +			$sender->setNavigateUrl($url);  +		}  +	}  +} +?><?php + +class TTemplateColumn extends TDataGridColumn  +{ +const CACHE_EXPIRY=18000; +private $_itemTemplate='';  +	private $_editItemTemplate='';  +	private $_headerTemplate='';  +	private $_footerTemplate='';  +	private static $_templates=array(); +public function getEditItemTemplate()  +	{  +		return $this->_editItemTemplate;  +	} +public function setEditItemTemplate($value)  +	{  +		$this->_editItemTemplate=$value;  +	} +public function getItemTemplate()  +	{  +		return $this->_itemTemplate;  +	} +public function setItemTemplate($value)  +	{  +		$this->_itemTemplate=$value;  +	} +public function getHeaderTemplate()  +	{  +		return $this->_headerTemplate;  +	} +public function setHeaderTemplate($value)  +	{  +		$this->_headerTemplate=$value;  +	} +public function getFooterTemplate()  +	{  +		return $this->_footerTemplate;  +	} +public function setFooterTemplate($value)  +	{  +		$this->_footerTemplate=$value;  +	} +public function initializeCell($cell,$columnIndex,$itemType)  +	{  +		parent::initializeCell($cell,$columnIndex,$itemType);  +		$tplContent='';  +		switch($itemType)  +		{  +			case 'Header':  +				$tplContent=$this->_headerTemplate;  +				break;  +			case 'Footer':  +				$tplContent=$this->_footerTemplate;  +				break;  +			case 'Item':  +			case 'AlternatingItem':  +			case 'SelectedItem':  +				$tplContent=$this->_itemTemplate;  +				break;  +			case 'EditItem':  +				$tplContent=$this->_editItemTemplate===''?$this->_itemTemplate:$this->_editItemTemplate;  +				break;  +		}  +		if($tplContent!=='')  +		{  +			$cell->setText('');  +			$cell->getControls()->clear();  +			$this->createTemplate($tplContent)->instantiateIn($cell);  +		}  +	} +protected function createTemplate($str)  +	{  +		$key=md5($str);  +		if(isset(self::$_templates[$key]))  +			return self::$_templates[$key];  +		else  +		{  +			$contextPath=$this->getOwner()->getTemplateControl()->getTemplate()->getContextPath();  +			if(($cache=$this->getApplication()->getCache())!==null)  +			{  +				if(($template=$cache->get($key))===null)  +				{  +					$template=new TTemplate($str,$contextPath);  +					$cache->set($key,$template,self::CACHE_EXPIRY);  +				}  +			}  +			else  +				$template=new TTemplate($str,$contextPath);  +			self::$_templates[$key]=$template;  +			return $template;  +		}  +	}  +} +?>
\ No newline at end of file diff --git a/tools/phpbuilder/build.php b/tools/phpbuilder/build.php index 24626b85..6df74923 100644 --- a/tools/phpbuilder/build.php +++ b/tools/phpbuilder/build.php @@ -38,7 +38,7 @@ $lines=file(SCRIPT_FILES);  foreach($lines as $line)
  {
  	$line=trim($line);
 -	if($line==='')
 +	if($line==='' || $line[0]==='#')
  		continue;
  	echo 'adding '.FRAMEWORK_DIR.'/'.$line."\n";
  	$input=file_get_contents(FRAMEWORK_DIR.'/'.$line);
 @@ -50,7 +50,7 @@ foreach($lines as $line)  	$input=preg_replace('/^(include|include_once)\s*\(.*?;/mu','',$input);
  	//remove internal logging
 -	$input=preg_replace('/^\s*Prado::coreLog.*\s*;\s*$/mu','',$input);
 +	$input=preg_replace('/^\s*Prado::trace.*\s*;\s*$/mu','',$input);
  	$output.=$input;
  }
 @@ -80,8 +80,8 @@ function strip_comments($source)      } else {
        // token array
        list($id, $text) = $token;
 -      switch ($id) { 
 -        case T_COMMENT: 
 +      switch ($id) {
 +        case T_COMMENT:
          case T_ML_COMMENT: // we've defined this
          case T_DOC_COMMENT: // and this
            // no action on comments
 diff --git a/tools/phpbuilder/files.txt b/tools/phpbuilder/files.txt index 011259de..3a82116b 100644 --- a/tools/phpbuilder/files.txt +++ b/tools/phpbuilder/files.txt @@ -4,6 +4,8 @@ Collections/TList.php  Collections/TMap.php
  Data/TXmlDocument.php
  Web/THttpUtility.php
 +Data/TCache.php
 +Log/TLogger.php
  core.php
  prado.php
  TApplication.php
 @@ -13,6 +15,7 @@ Web/THttpResponse.php  Web/THttpSession.php
  Security/TAuthorizationRule.php
  Web/Services/TPageService.php
 +Web/UI/THtmlWriter.php
  Web/UI/TTemplateManager.php
  Web/UI/TThemeManager.php
  Web/UI/TAssetManager.php
 @@ -21,5 +24,64 @@ Web/UI/TControl.php  Web/UI/TTemplateControl.php
  Web/UI/TForm.php
  Web/UI/TClientScriptManager.php
 -Web/UI/THtmlWriter.php
 -Web/UI/TPage.php
\ No newline at end of file +Web/UI/TPage.php
 +Web/UI/WebControls/TFont.php
 +Web/UI/WebControls/TStyle.php
 +Web/UI/WebControls/TWebControl.php
 +Web/UI/WebControls/TPlaceHolder.php
 +Web/UI/WebControls/TLiteral.php
 +Web/UI/WebControls/TLabel.php
 +Web/UI/WebControls/TImage.php
 +Web/UI/WebControls/TImageButton.php
 +Web/UI/WebControls/TButton.php
 +Web/UI/WebControls/TCheckBox.php
 +Web/UI/WebControls/TRadioButton.php
 +Web/UI/WebControls/TTextBox.php
 +# Web/UI/WebControls/TTextHighlighter.php
 +Web/UI/WebControls/TPanel.php
 +Web/UI/WebControls/TContent.php
 +Web/UI/WebControls/TContentPlaceHolder.php
 +Web/UI/WebControls/TExpression.php
 +Web/UI/WebControls/TStatements.php
 +Web/UI/WebControls/TFileUpload.php
 +Web/UI/WebControls/THead.php
 +Web/UI/WebControls/THiddenField.php
 +Web/UI/WebControls/THyperLink.php
 +Web/UI/WebControls/TTable.php
 +
 +Web/UI/WebControls/TDataSourceControl.php
 +Web/UI/WebControls/TDataSourceView.php
 +
 +Web/UI/WebControls/TDataBoundControl.php
 +Web/UI/WebControls/TCheckBoxList.php
 +Web/UI/WebControls/TRadioButtonList.php
 +Web/UI/WebControls/TBulletedList.php
 +
 +Web/UI/WebControls/TListControl.php
 +Web/UI/WebControls/TListBox.php
 +Web/UI/WebControls/TDropDownList.php
 +
 +Web/UI/WebControls/TJavascriptLogger.php
 +Web/UI/WebControls/TLinkButton.php
 +
 +Web/UI/WebControls/TBaseValidator.php
 +Web/UI/WebControls/TRequiredFieldValidator.php
 +Web/UI/WebControls/TCompareValidator.php
 +Web/UI/WebControls/TRegularExpressionValidator.php
 +Web/UI/WebControls/TEmailAddressValidator.php
 +Web/UI/WebControls/TCustomValidator.php
 +Web/UI/WebControls/TValidationSummary.php
 +
 +Web/UI/WebControls/TRepeatInfo.php
 +Web/UI/WebControls/TRepeater.php
 +
 +Web/UI/WebControls/TBaseDataList.php
 +Web/UI/WebControls/TDataList.php
 +Collections/TPagedDataSource.php
 +Web/UI/WebControls/TDataGrid.php
 +Web/UI/WebControls/TDataGridColumn.php
 +Web/UI/WebControls/TBoundColumn.php
 +Web/UI/WebControls/TButtonColumn.php
 +Web/UI/WebControls/TEditCommandColumn.php
 +Web/UI/WebControls/THyperLinkColumn.php
 +Web/UI/WebControls/TTemplateColumn.php
  | 
