summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxue <>2006-03-06 16:12:59 +0000
committerxue <>2006-03-06 16:12:59 +0000
commit72bf039357e9137122733c50924130747fd14855 (patch)
tree6bc7eb44eabbd338fe5ef2abf653d088b64c1490
parent5b22e50d36d11c50ef3b9cd0b4e2d5563c4b9c93 (diff)
final fixes before 3.0b release.3.0b
-rw-r--r--.gitattributes4
-rw-r--r--CREDITS7
-rw-r--r--HISTORY10
-rw-r--r--UPGRADE11
-rw-r--r--framework/Web/UI/WebControls/TWizardStep.php78
-rw-r--r--framework/Web/UI/WebControls/TWizardTemplate.php116
-rw-r--r--framework/pradolite.php7277
-rw-r--r--index.html67
8 files changed, 55 insertions, 7515 deletions
diff --git a/.gitattributes b/.gitattributes
index 2c9b1242..9c33e2ab 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,5 @@
* text=auto !eol
/COPYRIGHT -text
-/CREDITS -text
/HISTORY -text
/UPGRADE -text
/build.xml -text
@@ -772,11 +771,8 @@ framework/Web/UI/WebControls/TValidationSummary.php -text
framework/Web/UI/WebControls/TWebControl.php -text
framework/Web/UI/WebControls/TWebControlAdapter.php -text
framework/Web/UI/WebControls/TWizard.php -text
-framework/Web/UI/WebControls/TWizardStep.php -text
-framework/Web/UI/WebControls/TWizardTemplate.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/CREDITS b/CREDITS
deleted file mode 100644
index 49aa455e..00000000
--- a/CREDITS
+++ /dev/null
@@ -1,7 +0,0 @@
-Robert Kummer - XSD and DTD for application and page configurations.
-Alban - the TAPCCache module
-Knut Urdalen - build and test framework
-Carl Mathisen - art design of demos
-Jason Ragsdale - TInlineFrame
-Wei Zhuo - I18N, TRatingList, TDatePicker, THtmlArea, TColorPicker
-Qiang Xue - core framework and most web controls
diff --git a/HISTORY b/HISTORY
index fdac01a1..3bbd6e5a 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,18 +1,18 @@
Version 3.0b March 6, 2006
=============================
-- CHG: event names must prefix with 'On' (Qiang)
-- ENH: template parser reports exact error location (Qiang)
+- BUG: fixed many
+- CHG: event names must be prefixed with 'On' (Qiang)
- CHG: values of properties whose name ends with 'Template' are
parsed directly by template parser (Qiang)
+- ENH: template parser reports exact error location (Qiang)
+- ENH: cookie HMAC check (Qiang)
- NEW: TInlineFrame (Jason)
- NEW: TAPCCache (Alban)
- NEW: TColorPicker, TDatePicker, TRatingList, TAdodbProvider,
TCreoleProvider (Wei)
- NEW: TMultiView, TView, TControlAdapter, TWebControlAdapter,
TPagedList, TAttributeCollection (Qiang)
-- ENH: cookie HMAC check (Qiang)
-- BUG: fixed many
Version 3.0a January 18, 2006
=============================
-Starting, main work functioning, may contain many bugs (Qiang)
+Starting, main feaures are ready (Qiang)
diff --git a/UPGRADE b/UPGRADE
index 52518ff8..4b6688a7 100644
--- a/UPGRADE
+++ b/UPGRADE
@@ -1,4 +1,11 @@
- PRADO v3.0a January 18, 2006
+ PRADO v3.0b March 6, 2006
+ =========================
-Backward compatibility is not maintained for v2.x and v1.x. \ No newline at end of file
+Upgrading from v3.0a
+--------------------
+A major change is the event names, which must be prefixed with 'On'.
+
+Upgrading from v2.x and v1.x
+----------------------------
+PRADO v3.x is not backward compatible with v2.x and v1.x. \ No newline at end of file
diff --git a/framework/Web/UI/WebControls/TWizardStep.php b/framework/Web/UI/WebControls/TWizardStep.php
deleted file mode 100644
index 9e58b59e..00000000
--- a/framework/Web/UI/WebControls/TWizardStep.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/**
- * TWizardStep 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.
- *
- * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
- * The latest version of PRADO can be obtained from:
- * {@link http://prado.sourceforge.net/}
- *
- * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version $Revision: 1.1 $ $Date: 2005/01/22 03:11:28 $
- * @package System.Web.UI.WebControls
- */
-
-/**
- * Each step of the TWizard is specified by one TWizardStep component.
- * A wizard step can be of type "Auto" or "Final" be specifying the
- * Type property. The "Final" step type should be the very last step
- * of the form to show a final confirmation/"Thank you" note. All other
- * steps should be of Type="Auto". The Title property is by default
- * used by the Navigation side bar as the name of the links to each form.
- *
- * TWizardStep should be used within a TWizard component.
- *
- * Namespace: System.Web.UI.WebControls
- *
- * Properties
- * - <b>Type</b>, string,
- * <br>Gets or sets the step type. Valid types are
- * "Auto" and "Final".
- * - <b>Title</b>, string,
- * <br>Gets or sets the title for this wizard step.
- *
- * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version v1.0, last update on Sat Dec 11 15:25:11 EST 2004
- * @package System.Web.UI.WebControls
- */
-class TWizardStep extends TPanel
-{
- /**
- * Wizard step type "Auto"
- * @var string
- */
- const TYPE_AUTO = 'Auto';
-
- /**
- * Wizard step type "Final"
- * @var string
- */
- const TYPE_FINAL = 'Final';
-
- /**
- * Get the wizard step type.
- * @return string step type.
- */
- function getType()
- {
- return $this->getViewState('Type',self::TYPE_AUTO);
- }
-
- /**
- * Set the wizard step type, default is "Auto". Valid step
- * types are "Auto" and "Final".
- * @param string step type
- */
- function setType($value)
- {
- $this->setViewState('Type', TPropertyValue::ensureEnum(
- $value, self::TYPE_AUTO, self::TYPE_FINAL), self::TYPE_AUTO);
- }
-}
-
-?> \ No newline at end of file
diff --git a/framework/Web/UI/WebControls/TWizardTemplate.php b/framework/Web/UI/WebControls/TWizardTemplate.php
deleted file mode 100644
index 2c209859..00000000
--- a/framework/Web/UI/WebControls/TWizardTemplate.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-
-/**
- * TWizardTemplate 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.
- *
- * To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
- * The latest version of PRADO can be obtained from:
- * {@link http://prado.sourceforge.net/}
- *
- * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version $Revision: 1.3 $ $Date: 2005/01/23 23:23:54 $
- * @package System.Web.UI.WebControls
- */
-
-/**
- * The TWizardTemplate component if present within a TWizard will override
- * the specific default templates. The allowable templated to be overidden are
- *
- * # NavigationStart -- used for the 1st page of the form
- * # NavigationStep -- used for each intermediate step of the form
- * # NavigationFinish -- used for the last step of the form
- * # NavigationSideBar -- displays the list of links to each form
- *
- * The type of template is specified by the Type property, e.g.
- * Type="NavigationStart".
- *
- * Multiple instances of the same template are allowed. If a template
- * is not specified, the default templates will be used.
- *
- * Namespace: System.Web.UI.WebControls
- *
- * Properties
- * - <b>Type</b>, string,
- * <br>Gets or sets the template type. Valid types are
- * "NavigationStart", "NavigationStep", "NavigationFinish" and
- * "NavigationSideBar".
- *
- * @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>
- * @version v1.0, last update on Sat Dec 11 15:25:11 EST 2004
- * @package System.Web.UI.WebControls
- */
-class TWizardTemplate extends TPanel
-{
- /**
- * Navigation template ID for the 1st page of the form.
- * @var string
- */
- const ID_START='NavigationStart';
-
- /**
- * Navigation template ID for each intermediate step of the form.
- * @var string
- */
- const ID_STEP='NavigationStep';
-
- /**
- * Navigation template ID for the last step of the form.
- * @var string
- */
- const ID_FINISH='NavigationFinish';
-
- /**
- * Navigation template ID for the list of links to each form.
- * @var string
- */
- const ID_SIDEBAR='NavigationSideBar';
-
- /**
- * Template type.
- * @var type
- */
- private $type;
-
- /**
- * Set the template type, must be of "NavigationStart",
- * "NavigationStep", "NavigationFinish" or "NavigationSideBar".
- * @param string template type.
- */
- function setType($value)
- {
- $this->type = TPropertyValue::ensureEnum($value,
- self::ID_START, self::ID_STEP, self::ID_FINISH, self::ID_SIDEBAR);
- }
-
- /**
- * Gets the template type.
- * @return string template type.
- */
- function getType()
- {
- return $this->type;
- }
-
- /**
- * Override the parent implementation.
- * Adds all components within the TWizardTemplate body as it's child.
- * @param object an object within the TWizardTemplate
- * has been handled.
- * @param object a component object.
- * @param object the template owner object
- */
- //TODO, how does this work? naming container?
- /*public function addParsedObject($object,$context)
- {
- if($object instanceof TComponent)
- $this->addChild($object);
- $this->addBody($object);
- }*/
-}
-
-?> \ No newline at end of file
diff --git a/framework/pradolite.php b/framework/pradolite.php
deleted file mode 100644
index ac380d8c..00000000
--- a/framework/pradolite.php
+++ /dev/null
@@ -1,7277 +0,0 @@
-<?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(strncasecmp($name,'on',2)===0 && method_exists($this,$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(strncasecmp($name,'on',2)===0 && method_exists($this,$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);
-}
-}
-public function hasProperty($name)
-{
-return method_exists($this,'get'.$name) || method_exists($this,'set'.$name);
-}
-public function canGetProperty($name)
-{
-return method_exists($this,'get'.$name);
-}
-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 strncasecmp($name,'on',2)===0 && method_exists($this,$name);
-}
-public function hasEventHandler($name)
-{
-$name=strtolower($name);
-return isset($this->_e[$name]) && $this->_e[$name]->getCount()>0;
-}
-public function getEventHandlers($name)
-{
-if(strncasecmp($name,'on',2)===0 && method_exists($this,$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
-{
-}
-
-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 TPhpErrorException extends TSystemException
-{
-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 TSystemException
-{
-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;
-}
-}
-
-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($index>=0 && $index<$this->_c)
-return $this->_d[$index];
-else
-throw new TInvalidDataValueException('list_index_invalid',$index);
-}
-public function add($item)
-{
-$this->insertAt($this->_c,$item);
-}
-public function insertAt($index,$item)
-{
-if($index===$this->_c)
-$this->_d[$this->_c++]=$item;
-else if($index>=0 && $index<$this->_c)
-{
-array_splice($this->_d,$index,0,array($item));
-$this->_c++;
-}
-else
-throw new TInvalidDataValueException('list_index_invalid',$index);
-}
-public function remove($item)
-{
-if(($index=$this->indexOf($item))>=0)
-$this->removeAt($index);
-else
-throw new TInvalidDataValueException('list_item_inexistent');
-}
-public function removeAt($index)
-{
-if($index>=0 && $index<$this->_c)
-{
-$this->_c--;
-if($index===$this->_c)
-return array_pop($this->_d);
-else
-{
-$item=$this->_d[$index];
-array_splice($this->_d,$index,1);
-return $item;
-}
-}
-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 ($offset>=0 && $offset<$this->_c);
-}
-public function offsetGet($offset)
-{
-if($offset>=0 && $offset<$this->_c)
-return $this->_d[$offset];
-else
-throw new TInvalidDataValueException('list_index_invalid',$offset);
-}
-public function offsetSet($offset,$item)
-{
-if($offset===null || $offset===$this->_c)
-$this->insertAt($this->_c,$item);
-else
-{
-$this->removeAt($offset);
-$this->insertAt($offset,$item);
-}
-}
-public function offsetUnset($offset)
-{
-$this->removeAt($offset);
-}
-}
-class TListIterator implements Iterator
-{
-private $_d;
-private $_i;
-private $_c;
-public function __construct(&$data)
-{
-$this->_d=&$data;
-$this->_i=0;
-$this->_c=count($this->_d);
-}
-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 $this->_i<$this->_c;
-}
-}
-
-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)
-{
-$this->_d[$key]=$value;
-}
-public function remove($key)
-{
-if(isset($this->_d[$key]) || array_key_exists($key,$this->_d))
-{
-$value=$this->_d[$key];
-unset($this->_d[$key]);
-return $value;
-}
-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]) || array_key_exists($key,$this->_d);
-}
-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 $this->itemAt($offset);
-}
-public function offsetSet($offset,$item)
-{
-$this->add($offset,$item);
-}
-public function offsetUnset($offset)
-{
-$this->remove($offset);
-}
-}
-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()
-{
-$this->_key=next($this->_keys);
-}
-public function valid()
-{
-return $this->_key!==false;
-}
-}
-
-class TAttributeCollection extends TMap
-{
-public function __get($name)
-{
-return $this->contains($name)?$this->itemAt($name):parent::__get($name);
-}
-public function __set($name,$value)
-{
-$this->add($name,$value);
-}
-public function itemAt($key)
-{
-return parent::itemAt(strtolower($key));
-}
-public function add($key,$value)
-{
-parent::add(strtolower($key),$value);
-}
-public function remove($key)
-{
-return parent::remove(strtolower($key));
-}
-public function contains($key)
-{
-return parent::contains(strtolower($key));
-}
-public function hasProperty($name)
-{
-return $this->contains($name) || parent::hasProperty($name);
-}
-public function canGetProperty($name)
-{
-return $this->contains($name) || parent::canGetProperty($name);
-}
-public function canSetProperty($name)
-{
-return true;
-}
-}
-
-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;
-}
-public function insertAt($index,$item)
-{
-if($item instanceof TXmlElement)
-{
-parent::insertAt($index,$item);
-if($item->getParent()!==null)
-$item->getParent()->getElements()->remove($item);
-$item->setParent($this->_o);
-}
-else
-throw new TInvalidDataTypeException('xmlelementlist_xmlelement_required');
-}
-public function removeAt($index)
-{
-$item=parent::removeAt($index);
-if($item instanceof TXmlElement)
-$item->setParent(null);
-return $item;
-}
-}
-
-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;
-}
-}
-
-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
-{
-}
-
-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($value[2]===$category || strpos($value[2],$category.'.')===0)
-return $value;
-}
-return false;
-}
-private function filterByLevels($value)
-{
-if($value[1] & $this->_levels)
-return $value;
-else
-return false;
-}
-}
-
-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 applySkin($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.0b';
-}
-public static function poweredByPrado()
-{
-return '<a title="Powered by PRADO" href="http://www.pradosoft.com/"><img src="http://www.pradosoft.com/images/powered.gif" style="border-width:0px;" alt="Powered by PRADO" /></a>';
-}
-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)
-{
-self::using($type);
-if(($pos=strrpos($type,'.'))!==false)
-$type=substr($type,$pos+1);
-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]) || class_exists($namespace,false))
-return;
-if(($pos=strrpos($namespace,'.'))===false) {
-try
-{
-include_once($namespace.self::CLASS_FILE_EXT);
-}
-catch(Exception $e)
-{
-if(!class_exists($namespace,false))
-throw new TInvalidOperationException('prado_component_unknown',$namespace);
-else
-throw $e;
-}
-}
-else if(($path=self::getPathOfNamespace($namespace,self::CLASS_FILE_EXT))!==null)
-{
-$className=substr($namespace,$pos+1);
-if($className==='*') {
-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($className,false))
-{
-try
-{
-include_once($path);
-}
-catch(Exception $e)
-{
-if(!class_exists($className,false))
-throw new TInvalidOperationException('prado_component_unknown',$className);
-else
-throw $e;
-}
-}
-}
-else
-throw new TInvalidDataValueException('prado_using_invalid',$namespace);
-}
-}
-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)
-{
-return isset(self::$_aliases[$alias])?self::$_aliases[$alias]: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))
-{
-if(strpos($alias,'.')===false)
-self::$_aliases[$alias]=$rp;
-else
-throw new TInvalidDataValueException('prado_aliasname_invalid',$alias);
-}
-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)
-{
-if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
-$languages[0]='en';
-else
-{
-$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()===TApplication::STATE_PERFORMANCE)
-return;
-if(!self::$_application || self::$_application->getMode()===TApplication::STATE_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
-{
-}
-
-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) && !interface_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'));
-
-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(
-'onBeginRequest',
-'onAuthentication',
-'onPostAuthentication',
-'onAuthorization',
-'onPostAuthorization',
-'onLoadState',
-'onPostLoadState',
-'onPreRunService',
-'onRunService',
-'onPostRunService',
-'onSaveState',
-'onPostSaveState',
-'onEndRequest'
-);
-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)
-throw new TConfigurationException('application_basepath_invalid',$basePath);
-if(is_file($this->_basePath))
-{
-$this->_configFile=$this->_basePath;
-$this->_basePath=dirname($this->_basepath);
-}
-else if(is_file($this->_basePath.'/'.self::CONFIG_FILE))
-$this->_configFile=$this->_basePath.'/'.self::CONFIG_FILE;
-else
-$this->_configFile=null;
-$this->_runtimePath=$this->_basePath.'/'.self::RUNTIME_PATH;
-if(is_writable($this->_runtimePath))
-{
-if($this->_configFile!==null)
-{
-$subdir=basename($this->_configFile);
-$this->_runtimePath.='/'.$subdir;
-if(!is_dir($this->_runtimePath))
-mkdir($this->_runtimePath);
-}
-}
-else
-throw new TConfigurationException('application_runtimepath_invalid',$this->_runtimePath);
-$this->_cacheFile=$cacheConfig ? $this->_runtimePath.'/'.self::CONFIGCACHE_FILE : null;
-$this->_uniqueID=md5($this->_runtimePath);
-}
-public function __destruct()
-{
-$this->onExitApplication();
-}
-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=self::$_steps[$this->_step];
-
-$this->$method();
-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_array($parameter))
-{
-$component=Prado::createComponent($parameter[0]);
-foreach($parameter[1] as $name=>$value)
-$component->setSubProperty($name,$value);
-$this->_parameters->add($id,$component);
-}
-else
-$this->_parameters->add($id,$parameter);
-}
-$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)
-{
-Prado::log($param->getMessage(),TLogger::ERROR,'System.TApplication');
-$this->getErrorHandler()->handleError($this,$param);
-$this->raiseEvent('OnError',$this,$param);
-}
-public function onBeginRequest()
-{
-$this->raiseEvent('OnBeginRequest',$this,null);
-}
-public function onAuthentication()
-{
-$this->raiseEvent('OnAuthentication',$this,null);
-}
-public function onPostAuthentication()
-{
-$this->raiseEvent('OnPostAuthentication',$this,null);
-}
-public function onAuthorization()
-{
-$this->raiseEvent('OnAuthorization',$this,null);
-}
-public function onPostAuthorization()
-{
-$this->raiseEvent('OnPostAuthorization',$this,null);
-}
-public function onLoadState()
-{
-$this->loadGlobals();
-$this->raiseEvent('OnLoadState',$this,null);
-}
-public function onPostLoadState()
-{
-$this->raiseEvent('OnPostLoadState',$this,null);
-}
-public function onPreRunService()
-{
-$this->raiseEvent('OnPreRunService',$this,null);
-}
-public function onRunService()
-{
-$this->raiseEvent('OnRunService',$this,null);
-if($this->_service)
-$this->_service->run();
-}
-public function onPostRunService()
-{
-$this->raiseEvent('OnPostRunService',$this,null);
-}
-public function onSaveState()
-{
-$this->raiseEvent('OnSaveState',$this,null);
-$this->saveGlobals();
-}
-public function onPostSaveState()
-{
-$this->raiseEvent('OnPostSaveState',$this,null);
-}
-public function onEndRequest()
-{
-$this->raiseEvent('OnEndRequest',$this,null);
-}
-public function onExitApplication()
-{
-$this->raiseEvent('OnExitApplication',$this,null);
-}
-}
-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)
-{
-if(($value=$properties->remove('value'))===null)
-$this->_parameters[$id]=$node;
-else
-$this->_parameters[$id]=$value;
-}
-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);
-}
-}
-}
-
-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($value))!==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);
-}
-}
-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);
-}
-}
-
-class THttpRequest extends TMap implements IModule
-{
-const SERVICE_VAR='sp';
-private $_initialized=false;
-private $_serviceID=null;
-private $_serviceParam=null;
-private $_cookies=null;
-private $_requestUri;
-private $_pathInfo;
-private $_urlFormat='Get';
-private $_services;
-private $_requestResolved=false;
-private $_id;
-public function getID()
-{
-return $this->_id;
-}
-public function setID($value)
-{
-$this->_id=$value;
-}
-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);
-}
-if($this->getUrlFormat()==='Path' && ($pathInfo=trim($this->_pathInfo,'/'))!=='')
-{
-$paths=explode('/',$pathInfo);
-$n=count($paths);
-$getVariables=array();
-for($i=0;$i<$n;++$i)
-{
-if($i+1<$n)
-$getVariables[$paths[$i]]=$paths[++$i];
-}
-$this->copyFrom(array_merge($getVariables,array_merge($_GET,$_POST)));
-}
-else
-$this->copyFrom(array_merge($_GET,$_POST));
-$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 getUrlFormat()
-{
-return $this->_urlFormat;
-}
-public function setUrlFormat($value)
-{
-$this->_urlFormat=TPropertyValue::ensureEnum($value,'Path','Get');
-}
-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 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=$serviceID.'='.$serviceParam;
-$amp=$encodeAmpersand?'&amp;':'&';
-if(is_array($getItems) || $getItems instanceof Traversable)
-{
-foreach($getItems as $name=>$value)
-$url.=$amp.urlencode($name).'='.urlencode($value);
-}
-if($this->getUrlFormat()==='Path')
-{
-$url=strtr($url,array($amp=>'/','?'=>'/','='=>'/'));
-if(defined('SID') && SID != '')
-$url.='?'.SID;
-return $this->getApplicationPath().'/'.$url;
-}
-else
-{
-if(defined('SID') && SID != '')
-$url.=$amp.SID;
-return $this->getApplicationPath().'?'.$url;
-}
-}
-protected function resolveRequest()
-{
-
-$this->_requestResolved=true;
-foreach($this->_services as $id)
-{
-if($this->contains($id))
-{
-$this->setServiceID($id);
-$this->setServiceParameter($this->itemAt($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;
-}
-public function insertAt($index,$item)
-{
-if($item instanceof THttpCookie)
-{
-parent::insertAt($index,$item);
-if($this->_o instanceof THttpResponse)
-$this->_o->addCookie($item);
-}
-else
-throw new TInvalidDataTypeException('authorizationrulecollection_authorizationrule_required');
-}
-public function removeAt($index)
-{
-$item=parent::removeAt($index);
-if($this->_o instanceof THttpResponse)
-$this->_o->removeCookie($item);
-return $item;
-}
-}
-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;
-}
-}
-
-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()
-{
-
-$this->sendContentTypeHeader();
-if($this->_bufferOutput)
-ob_flush();
-}
-protected function sendContentTypeHeader()
-{
-$charset = $this->getCharset();
-if(empty($charset) && ($globalization=$this->getApplication()->getGlobalization())!==null)
-$charset = $globalization->getCharset();
-if(!empty($charset))
-{
-$header='Content-Type: '.$this->getContentType().';charset='.$charset;
-$this->appendHeader($header);
-}
-}
-public function clear()
-{
-if($this->_bufferOutput)
-ob_clean();
-
-}
-public function appendHeader($value)
-{
-
-header($value);
-}
-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);
-}
-}
-
-class THttpSession extends TComponent implements IteratorAggregate,ArrayAccess,IModule
-{
-private $_initialized=false;
-private $_started=false;
-private $_autoStart=false;
-private $_cookie=null;
-private $_id;
-public function getID()
-{
-return $this->_id;
-}
-public function setID($value)
-{
-$this->_id=$value;
-}
-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 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;
-}
-public function getIterator()
-{
-return new TSessionIterator;
-}
-public function getCount()
-{
-return count($_SESSION);
-}
-public function getKeys()
-{
-return array_keys($_SESSION);
-}
-public function itemAt($key)
-{
-return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
-}
-public function add($key,$value)
-{
-$_SESSION[$key]=$value;
-}
-public function remove($key)
-{
-if(isset($_SESSION[$key]))
-{
-$value=$_SESSION[$key];
-unset($_SESSION[$key]);
-return $value;
-}
-else
-return null;
-}
-public function clear()
-{
-foreach(array_keys($_SESSION) as $key)
-unset($_SESSION[$key]);
-}
-public function contains($key)
-{
-return isset($_SESSION[$key]);
-}
-public function toArray()
-{
-return $_SESSION;
-}
-public function offsetExists($offset)
-{
-return isset($_SESSION[$offset]);
-}
-public function offsetGet($offset)
-{
-return isset($_SESSION[$offset]) ? $_SESSION[$offset] : null;
-}
-public function offsetSet($offset,$item)
-{
-$_SESSION[$offset]=$item;
-}
-public function offsetUnset($offset)
-{
-unset($_SESSION[$offset]);
-}
-}
-class TSessionIterator implements Iterator
-{
-private $_keys;
-private $_key;
-public function __construct()
-{
-$this->_keys=array_keys($_SESSION);
-}
-public function rewind()
-{
-$this->_key=reset($this->_keys);
-}
-public function key()
-{
-return $this->_key;
-}
-public function current()
-{
-return isset($_SESSION[$this->_key])?$_SESSION[$this->_key]:null;
-}
-public function next()
-{
-do
-{
-$this->_key=next($this->_keys);
-}
-while(!isset($_SESSION[$this->_key]) && $this->_key!==false);
-}
-public function valid()
-{
-return $this->_key!==false;
-}
-}
-
-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;
-}
-public function insertAt($index,$item)
-{
-if($item instanceof TAuthorizationRule)
-parent::insertAt($index,$item);
-else
-throw new TInvalidDataTypeException('authorizationrulecollection_authorizationrule_required');
-}
-}
-
-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->_page=new $className();
-foreach($this->_properties as $name=>$value)
-$this->_page->setSubProperty($name,$value);
-$this->_page->setTemplate($this->getTemplateManager()->getTemplateByFileName($path.self::PAGE_FILE_EXT));
-}
-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());
-}
-}
-}
-}
-}
-
-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.'>');
-}
-}
-
-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(($fileName=$this->getLocalizedTemplate($fileName))!==null)
-{
-
-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;
-}
-return null;
-}
-}
-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;
-const CONFIG_TEMPLATE=5;
-private $_tpl=array();
-private $_directive=array();
-private $_contextPath;
-private $_tplFile=null;
-private $_assetManager;
-private $_startingLine=0;
-private $_content;
-public function __construct($template,$contextPath,$tplFile=null,$startingLine=0)
-{
-$this->_contextPath=$contextPath;
-$this->_tplFile=$tplFile;
-$this->_startingLine=$startingLine;
-$this->_content=$template;
-$this->parse($template);
-$this->_content=null; }
-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 {
-if(isset($controls[$object[0]]))
-$controls[$object[0]]->addParsedObject($object[1]);
-else
-$tplControl->addParsedObject($object[1]);
-}
-}
-}
-protected function configureControl($control,$name,$value)
-{
-if(strncasecmp($name,'on',2)===0) $this->configureEvent($control,$name,$value);
-else if(strpos($name,'.')===false) $this->configureProperty($control,$name,$value);
-else $this->configureSubProperty($control,$name,$value);
-}
-protected function configureComponent($component,$name,$value)
-{
-if(strpos($name,'.')===false) $this->configureProperty($component,$name,$value);
-else $this->configureSubProperty($component,$name,$value);
-}
-protected function configureEvent($component,$name,$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)
-{
-$setter='set'.$name;
-if(is_array($value))
-{
-switch($value[0])
-{
-case self::CONFIG_DATABIND:
-$component->bindProperty($name,$value[1]);
-break;
-case self::CONFIG_EXPRESSION:
-$component->$setter($component->evaluateExpression($value[1]));
-break;
-case self::CONFIG_TEMPLATE:
-$component->$setter($value[1]);
-break;
-case self::CONFIG_ASSET: $url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$value[1]);
-$component->$setter($url);
-break;
-case self::CONFIG_PARAMETER: $component->$setter($this->getApplication()->getParameters()->itemAt($value[1]));
-break;
-case self::CONFIG_LOCALIZATION:
-Prado::using('System.I18N.Translation');
-$component->$setter(localize(trim($value[1])));
-break;
-default: break;
-}
-}
-else
-$component->$setter($value);
-}
-protected function configureSubProperty($component,$name,$value)
-{
-if(is_array($value))
-{
-switch($value[0])
-{
-case self::CONFIG_DATABIND: $component->bindProperty($name,$value[1]);
-break;
-case self::CONFIG_EXPRESSION: $component->setSubProperty($name,$component->evaluateExpression($value[1]));
-break;
-case self::CONFIG_TEMPLATE:
-$component->setSubProperty($name,$value[1]);
-break;
-case self::CONFIG_ASSET: $url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$value[1]);
-$component->setSubProperty($name,$url);
-break;
-case self::CONFIG_PARAMETER: $component->setSubProperty($name,$this->getApplication()->getParameters()->itemAt($value[1]));
-break;
-case self::CONFIG_LOCALIZATION:
-$component->setSubProperty($name,localize($value[1]));
-break;
-default: break;
-}
-}
-else
-$component->setSubProperty($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;
-$matchEnd=0;
-$c=0;
-try
-{
-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],$match[2][1]);
-$this->validateAttributes($type,$attributes);
-$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))
-throw new TConfigurationException('template_closingtag_unexpected',"</com:$type>");
-$name=array_pop($stack);
-if($name!==$type)
-{
-$tag=$name[0]==='@' ? '</prop:'.substr($name,1).'>' : "</com:$name>";
-throw new TConfigurationException('template_closingtag_expected',$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]))
-throw new TConfigurationException('template_directive_nonunique');
-$this->_directive=$this->parseAttributes($match[4][0],$match[4][1]);
-}
-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'=>THttpUtility::htmlDecode($match[5][0])));
-else if($str[2]==='%') $tpl[$c++]=array($container,'TStatements',array('Statements'=>THttpUtility::htmlDecode($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))
-throw new TConfigurationException('template_closingtag_unexpected',"</prop:$prop>");
-$name=array_pop($stack);
-if($name!=='@'.$prop)
-{
-$tag=$name[0]==='@' ? '</prop:'.substr($name,1).'>' : "</com:$name>";
-throw new TConfigurationException('template_closingtag_expected',$tag);
-}
-if(($last=count($stack))<1 || $stack[$last-1][0]!=='@')
-{
-if($matchStart>$textStart && $container>=0)
-{
-$value=substr($input,$textStart,$matchStart-$textStart);
-if(strrpos($prop,'template')===strlen($prop)-8)
-$value=$this->parseTemplateProperty($value,$textStart);
-else
-$value=$this->parseAttribute($value);
-$type=$tpl[$container][1];
-$this->validateAttributes($type,array($prop=>$value));
-$tpl[$container][2][$prop]=$value;
-$textStart=$matchEnd+1;
-}
-$expectPropEnd=false;
-}
-}
-else if(strpos($str,'<!--')===0) {
-$state=0;
-}
-else if(strpos($str,'<!')===0) {
-if($expectPropEnd)
-throw new TConfigurationException('template_comments_forbidden');
-if($matchStart>$textStart)
-$tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart));
-$textStart=$matchEnd+1;
-}
-else
-throw new TConfigurationException('template_matching_unexpected',$match);
-}
-if(!empty($stack))
-{
-$name=array_pop($stack);
-$tag=$name[0]==='@' ? '</prop:'.substr($name,1).'>' : "</com:$name>";
-throw new TConfigurationException('template_closingtag_expected',$tag);
-}
-if($textStart<strlen($input))
-$tpl[$c++]=array($container,substr($input,$textStart));
-}
-catch(Exception $e)
-{
-if($e->getErrorCode()==='template_format_invalid' || $e->getErrorCode()==='template_format_invalid2')
-throw $e;
-if($matchEnd===0)
-$line=$this->_startingLine+1;
-else
-$line=$this->_startingLine+count(explode("\n",substr($input,0,$matchEnd+1)));
-if(empty($this->_tplFile))
-throw new TConfigurationException('template_format_invalid2',$line,$e->getMessage(),$input);
-else
-throw new TConfigurationException('template_format_invalid',$this->_tplFile,$line,$e->getMessage());
-}
-return $tpl;
-}
-protected function parseAttributes($str,$offset)
-{
-if($str==='')
-return array();
-$pattern='/([\w\.]+)=(\'.*?\'|".*?"|<%.*?%>)/msS';
-$attributes=array();
-$n=preg_match_all($pattern,$str,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE);
-for($i=0;$i<$n;++$i)
-{
-$match=&$matches[$i];
-$name=strtolower($match[1][0]);
-$value=$match[2][0];
-if(strrpos($name,'template')===strlen($name)-8)
-{
-if($value[0]==='\'' || $value[0]==='"')
-$attributes[$name]=$this->parseTemplateProperty(substr($value,1,strlen($value)-2),$match[2][1]+1);
-else
-$attributes[$name]=$this->parseTemplateProperty($value,$match[2][1]);
-}
-else
-{
-if($value[0]==='\'' || $value[0]==='"')
-$attributes[$name]=$this->parseAttribute(substr($value,1,strlen($value)-2));
-else
-$attributes[$name]=$this->parseAttribute($value);
-}
-}
-return $attributes;
-}
-protected function parseTemplateProperty($content,$offset)
-{
-$line=$this->_startingLine+count(explode("\n",substr($this->_content,0,$offset)))-1;
-return array(self::CONFIG_TEMPLATE,new TTemplate($content,$this->_contextPath,$this->_tplFile,$line));
-}
-protected function parseAttribute($value)
-{
-$matches=array();
-if(!preg_match('/\\s*(<%#.*?%>|<%=.*?%>|<%~.*?%>|<%\\$.*?%>|<%\\[.*?\\]%>)\\s*/msS',$value,$matches) || $matches[0]!==$value)
-return THttpUtility::htmlDecode($value);
-$value=THttpUtility::htmlDecode($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)));
-}
-protected function validateAttributes($type,$attributes)
-{
-Prado::using($type);
-if(($pos=strrpos($type,'.'))!==false)
-$className=substr($type,$pos+1);
-else
-$className=$type;
-if(is_subclass_of($className,'TControl') || $className==='TControl')
-{
-foreach($attributes as $name=>$att)
-{
-if(($pos=strpos($name,'.'))!==false)
-{
-$subname=substr($name,0,$pos);
-if(!is_callable(array($className,'get'.$subname)))
-throw new TConfigurationException('template_property_unknown',$type,$subname);
-}
-else if(strncasecmp($name,'on',2)===0)
-{
-if(!is_callable(array($className,$name)))
-throw new TConfigurationException('template_event_unknown',$type,$name);
-else if(!is_string($att))
-throw new TConfigurationException('template_eventhandler_invalid',$type,$name);
-}
-else
-{
-if(!is_callable(array($className,'set'.$name)))
-{
-if(is_callable(array($className,'get'.$name)))
-throw new TConfigurationException('template_property_readonly',$type,$name);
-else
-throw new TConfigurationException('template_property_unknown',$type,$name);
-}
-}
-}
-}
-else if(is_subclass_of($className,'TComponent') || $className==='TComponent')
-{
-foreach($attributes as $name=>$att)
-{
-if($att[0]===self::CONFIG_DATABIND)
-throw new TConfigurationException('template_databind_forbidden',$type,$name);
-if(($pos=strpos($name,'.'))!==false)
-{
-$subname=substr($name,0,$pos);
-if(!is_callable(array($className,'get'.$subname)))
-throw new TConfigurationException('template_property_unknown',$type,$subname);
-}
-else if(strncasecmp($name,'on',2)===0)
-throw new TConfigurationException('template_event_forbidden',$type,$name);
-else
-{
-if(strcasecmp($name,'id')!==0 && !is_callable(array($className,'set'.$name)))
-{
-if(is_callable(array($className,'get'.$name)))
-throw new TConfigurationException('template_property_readonly',$type,$name);
-else
-throw new TConfigurationException('template_property_unknown',$type,$name);
-}
-}
-}
-}
-else
-throw new TConfigurationException('template_component_required',$type);
-}
-}
-
-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=rtrim($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=rtrim(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 implements ITheme
-{
-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
-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;
-}
-}
-
-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=rtrim(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=rtrim($value,'/');
-}
-public function getPublishedUrl($path)
-{
-if(($fullpath=realpath($path))!==false)
-{
-$dir=$this->hash(dirname($fullpath));
-$file=$this->_basePath.'/'.$dir.'/'.basename($fullpath);
-if(is_file($file) || is_dir($file))
-return $this->_baseUrl.'/'.$dir.'/'.basename($fullpath);
-}
-return null;
-}
-public function isPublished($path)
-{
-return $this->getPublishedUrl($path) !== null;
-}
-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];
-}
-}
-protected 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);
-}
-}
-
-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->getRequest()->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)));
-}
-}
-
-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 TAttributeCollection;
-$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 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 getRegisteredObject($name)
-{
-return isset($this->_rf[self::RF_NAMED_OBJECTS][$name])?$this->_rf[self::RF_NAMED_OBJECTS][$name]:null;
-}
-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);
-}
-public function onInit($param)
-{
-$this->raiseEvent('OnInit',$this,$param);
-}
-public function onLoad($param)
-{
-$this->raiseEvent('OnLoad',$this,$param);
-}
-public function onDataBinding($param)
-{
-$this->raiseEvent('OnDataBinding',$this,$param);
-}
-public function onUnload($param)
-{
-$this->raiseEvent('OnUnload',$this,$param);
-}
-public function onPreRender($param)
-{
-$this->raiseEvent('OnPreRender',$this,$param);
-}
-protected function raiseBubbleEvent($sender,$param)
-{
-$control=$this;
-while($control=$control->_parent)
-{
-if($control->onBubbleEvent($sender,$param))
-break;
-}
-}
-public 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);
-}
-}
-}
-public function saveState()
-{
-}
-public function loadState()
-{
-}
-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]))
-{
-$control->loadStateRecursive($state[$control->_id],$needViewState);
-unset($state[$control->_id]);
-}
-else
-{
-$s=array();
-$control->loadStateRecursive($s,$needViewState);
-}
-}
-}
-}
-if(!empty($state))
-$this->_rf[self::RF_CHILD_STATE]=&$state;
-$this->_stage=self::CS_STATE_LOADED;
-}
-else
-$this->_stage=self::CS_STATE_LOADED;
-$this->loadState();
-}
-final protected function &saveStateRecursive($needViewState=true)
-{
-$this->saveState();
-$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);
-if(!empty($cs))
-$state[$control->_id]=&$cs;
-}
-}
-}
-if($needViewState && !empty($this->_viewState))
-$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;
-}
-public function insertAt($index,$item)
-{
-if(is_string($item))
-parent::insertAt($index,$item);
-else if($item instanceof TControl)
-{
-parent::insertAt($index,$item);
-$this->_o->addedControl($item);
-}
-else
-throw new TInvalidDataTypeException('controllist_control_required');
-}
-public function removeAt($index)
-{
-$item=parent::removeAt($index);
-if($item instanceof TControl)
-$this->_o->removedControl($item);
-return $item;
-}
-public function clear()
-{
-parent::clear();
-if($this->_o instanceof INamingContainer)
-$this->_o->clearNamingContainer();
-}
-}
-interface INamingContainer
-{
-}
-interface IPostBackEventHandler
-{
-public function raisePostBackEvent($param);
-public function getPostBackOptions();
-}
-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;
-}
-}
-
-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 getTemplate()
-{
-if($this->_localTemplate===null)
-{
-$class=get_class($this);
-if(!isset(self::$_template[$class]))
-self::$_template[$class]=$this->loadTemplate();
-return self::$_template[$class];
-}
-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(true))
-{
-foreach($tpl->getDirective() as $name=>$value)
-$this->setSubProperty($name,$value);
-$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()->insertAt($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);
-}
-}
-
-class TForm extends TControl
-{
-public 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('action');
-$page=$this->getPage();
-if($this->getDefaultButton()!=='')
-{
-}
-$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 getName()
-{
-return $this->getUniqueID();
-}
-public function getTarget()
-{
-return $this->getViewState('Target','');
-}
-public function setTarget($value)
-{
-$this->setViewState('Target',$value,'');
-}
-}
-
-Prado::using('System.Web.Javascripts.*');
-class TClientScriptManager extends TComponent
-{
-const SCRIPT_DIR='Web/Javascripts/js';
-private $_page;
-private $_hiddenFields=array();
-private $_beginScripts=array();
-private $_endScripts=array();
-private $_scriptFiles=array();
-private $_styleSheetFiles=array();
-private $_styleSheets=array();
-private $_client;
-private $_publishedScriptFiles=array();
-public function __construct(TPage $owner)
-{
-$this->_page=$owner;
-$this->_client = new TClientScript($this);
-}
-public function registerPostBackControl($control,$namespace='Prado.WebUI')
-{
-$options = $this->getPostBackOptions($control);
-$type = get_class($control);
-$namespace = empty($namespace) ? "window" : $namespace;
-$code = "new {$namespace}.{$type}($options);";
-$this->registerEndScript(sprintf('%08X', crc32($code)), $code);
-$this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,'');
-$this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,'');
-$this->registerClientScript('prado');
-}
-protected function getPostBackOptions($control)
-{
-$postback = $control->getPostBackOptions();
-if(!isset($postback['ID']))
-$postback['ID'] = $control->getClientID();
-if(!isset($postback['FormID']))
-$postback['FormID'] = $this->_page->getForm()->getClientID();
-$options = new TJavascriptSerializer($postback);
-return $options->toJavascript();
-}
-public function registerDefaultButton($panel, $button)
-{
-$serializer = new TJavascriptSerializer(
-$this->getDefaultButtonOptions($panel, $button));
-$options = $serializer->toJavascript();
-$code = "new Prado.WebUI.DefaultButton($options);";
-$scripts = $this->_page->getClientScript();
-$scripts->registerEndScript("prado:".$panel->getClientID(), $code);
-}
-protected function getDefaultButtonOptions($panel, $button)
-{
-$options['Panel'] = $panel->getClientID();
-$options['Target'] = $button->getClientID();
-$options['Event'] = 'click';
-return $options;
-}
-public function registerClientScript($script)
-{
-static $scripts = array();
-$scripts = array_unique(array_merge($scripts,
-TClientScript::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);
-}
-protected 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;
-}
-}
-}
-protected 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;
-}
-}
-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 isStyleSheetFileRegistered($key)
-{
-return isset($this->_styleSheetFiles[$key]);
-}
-public function isStyleSheetRegistered($key)
-{
-return isset($this->_styleSheets[$key]);
-}
-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 registerBeginScript($key,$script)
-{
-$this->_beginScripts[$key]=$script;
-}
-public function registerEndScript($key,$script)
-{
-$this->_endScripts[$key]=$script;
-}
-public function registerStyleSheetFile($key,$url)
-{
-$this->_styleSheetFiles[$key]=$url;
-}
-public function registerStyleSheet($key,$css)
-{
-$this->_styleSheets[$key]=$css;
-}
-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 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 renderJavascriptBlock($code)
-{
-return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n{$code}\n/*]]>*/\n</script>";
-}
-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;
-}
-}
-
-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()
-{
-parent::__construct();
-$this->setPage($this);
-}
-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=null)
-{
-if(!$this->_validators)
-$this->_validators=new TList;
-if($validationGroup===null)
-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())
-{
-
-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;
-}
-public function onPreInit($param)
-{
-$this->raiseEvent('OnPreInit',$this,$param);
-}
-public function onInitComplete($param)
-{
-$this->raiseEvent('OnInitComplete',$this,$param);
-}
-public function onPreLoad($param)
-{
-$this->raiseEvent('OnPreLoad',$this,$param);
-}
-public function onLoadComplete($param)
-{
-$this->raiseEvent('OnLoadComplete',$this,$param);
-}
-public function onPreRenderComplete($param)
-{
-$this->raiseEvent('OnPreRenderComplete',$this,$param);
-$cs=$this->getClientScript();
-if($this->_theme instanceof ITheme)
-{
-foreach($this->_theme->getStyleSheetFiles() as $url)
-$cs->registerStyleSheetFile($url,$url);
-foreach($this->_theme->getJavaScriptFiles() as $url)
-$cs->registerHeadScriptFile($url,$url);
-}
-if($this->_styleSheet instanceof ITheme)
-{
-foreach($this->_styleSheet->getStyleSheetFiles() as $url)
-$cs->registerStyleSheetFile($url,$url);
-foreach($this->_styleSheet->getJavaScriptFiles() as $url)
-$cs->registerHeadScriptFile($url,$url);
-}
-}
-public function onSaveStateComplete($param)
-{
-$this->raiseEvent('OnSaveStateComplete',$this,$param);
-}
-private function determinePostBackMode()
-{
-$postData=$this->getRequest();
-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();
-}
-public function saveState()
-{
-parent::saveState();
-$this->setViewState('ControlsRequiringPostBack',$this->_controlsRegisteredForPostData,array());
-}
-public function loadState()
-{
-parent::loadState();
-$this->_controlsRequiringPostData=$this->getViewState('ControlsRequiringPostBack',array());
-}
-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->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,'');
-}
-}
-
-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(TPropertyValue::ensureBoolean($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(TPropertyValue::ensureBoolean($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(TPropertyValue::ensureBoolean($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(TPropertyValue::ensureBoolean($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(TPropertyValue::ensureBoolean($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->setBold($font->getBold());
-if($font->_flags & self::IS_SET_ITALIC)
-$this->setItalic($font->getItalic());
-if($font->_flags & self::IS_SET_OVERLINE)
-$this->setOverline($font->getOverline());
-if($font->_flags & self::IS_SET_STRIKEOUT)
-$this->setStrikeout($font->getStrikeout());
-if($font->_flags & self::IS_SET_UNDERLINE)
-$this->setUnderline($font->getUnderline());
-if($font->_flags & self::IS_SET_SIZE)
-$this->setSize($font->getSize());
-if($font->_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);
-}
-}
-
-class TStyle extends TComponent
-{
-private $_fields=array();
-private $_font=null;
-private $_class=null;
-private $_customStyle=null;
-public function __construct($style=null)
-{
-if($style!==null)
-$this->copyFrom($style);
-}
-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()
-{
-$this->_fields=array();
-$this->_font=null;
-$this->_class=null;
-$this->_customStyle=null;
-}
-public function copyFrom($style)
-{
-$this->reset();
-if($style instanceof TStyle)
-{
-$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($this->_fields,$style->_fields);
-if($style->_class!==null)
-$this->_class=$style->_class;
-if($style->_customStyle!==null)
-$this->_customStyle=$style->_customStyle;
-if($style->_font!==null)
-$this->getFont()->mergeWith($style->_font);
-}
-}
-public function addAttributesToRender($writer)
-{
-if($this->_customStyle!==null)
-{
-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=$style->_backImageUrl;
-if($style->_horizontalAlign!==null)
-$this->_horizontalAlign=$style->_horizontalAlign;
-if($style->_cellPadding!==null)
-$this->_cellPadding=$style->_cellPadding;
-if($style->_cellSpacing!==null)
-$this->_cellSpacing=$style->_cellSpacing;
-if($style->_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);
-if($style instanceof TTableItemStyle)
-{
-$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=$style->_verticalAlign;
-if($style->_horizontalAlign!==null)
-$this->_horizontalAlign=$style->_horizontalAlign;
-if($style->_wrap!==null)
-$this->_wrap=$style->_wrap;
-}
-}
-public function addAttributesToRender($writer)
-{
-if(!$this->getWrap())
-$writer->addStyleAttribute('white-space','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);
-}
-}
-
-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();
-}
-}
-
-class TContent extends TControl implements INamingContainer
-{
-public function createdOnTemplate($parent)
-{
-if(($id=$this->getID())==='')
-throw new TConfigurationException('content_id_required');
-$this->getTemplateControl()->registerContent($this);
-}
-}
-
-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);
-}
-}
-
-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));
-}
-}
-
-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));
-}
-}
-
-class THead extends TControl
-{
-private $_metaTags=array();
-public 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->renderScriptFiles($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();
-}
-}
-?> \ No newline at end of file
diff --git a/index.html b/index.html
index ade079d8..939a4ce6 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
<body>
<h1>PRADO Framework for PHP 5 </h1>
-<p>Version 3.0a, January 18, 2006<br>
+<p>Version 3.0b, March 6, 2006<br>
Copyright&copy; 2004-2006 by <a href="http://www.pradosoft.com/">PradoSoft</a><br>
All Rights Reserved.
@@ -24,18 +24,26 @@ All Rights Reserved.
GUI development, such as Borland Delphi. In particular, it supports event-driven
programming, viewstate maintenance, javascript, template, form validations, theme/skin,
etc.</p>
+
<h2>Requirements</h2>
-<p>The sole requirement for PRADO is PHP 5.0.4 or higher. It has been tested
-with Apache 2.0 on both Windows XP and RedHat Linux.</p>
+<p>
+The sole requirement for PRADO is PHP 5.0.4 or higher.
+Please run <a href="requirements/index.php">requirement checker</a> to obtain
+more detailed requirement information.
+</p>
+<p>
+PRADO has been tested with Apache 2.0 on both Windows XP and RedHat Linux.
+</p>
+
<h2>Installation</h2>
<ul>
- <li> Unpack the distribution file using &quot;unzip&quot; command on Linux or
+ <li>Unpack the distribution file using &quot;unzip&quot; command on Linux or
&quot;winzip&quot; program on Windows.</li>
- <li> Copy all the files and directories under the unpacked &quot;prado&quot;
+ <li>Copy all the files and directories under the unpacked &quot;prado&quot;
directory to the DocumentRoot of the Web server (or a subdirectory of that).</li>
- <li> Browse the URL, http://&lt;Web-server-address&gt;/requirements/index.php, to see
+ <li>Browse the URL, http://&lt;Web-server-address&gt;/requirements/index.php, to see
if your Web server configuration satisfies the requirement for using PRADO.</li>
- <li> The directory &quot;framework&quot; contains the core code of PRADO.</li>
+ <li>The directory &quot;framework&quot; contains the core code of PRADO.</li>
<li>The directory &quot;docs/manual&quot; contains the PRADO API documentation
in HTML format.</li>
</ul>
@@ -44,26 +52,32 @@ with Apache 2.0 on both Windows XP and RedHat Linux.</p>
<li><a href="demos/quickstart/index.php">Prado QuickStart Tutorial</a></li>
<li><a href="demos/composer/index.php">Prado Component Writer</a></li>
</ul>
+
<h2>Documentation</h2>
-<p>
-Complete documentation will be added in beta version. Please refer to
-Prado QuickStart Tutorial and the included API documentation for now.
-</p>
+<ul>
+<li><a href="docs/manual/index.html">API documentation</a></li>
+<li><a href="demos/quickstart/prado3_quick_start.pdf">Quickstart tutorial (PDF)</a></li>
+</ul>
<h2>Credits</h2>
-<h3>Prado Developer Team</h3>
+
+<h3>Prado v3 Developer Team</h3>
<ul>
-<li><a href="mailto:qiang.xue@gmail.com">Qiang Xue</a> - PRADO founder, author of application controller, core components and controls.</a></li>
-<li><a href="mailto:weizhuo@gmail.com">Xiang Wei Zhuo</a> - author of I18N/L10N support, active controls (AJAX) and PRADO javascript framework, unit and functionality testing.</a></li>
-<li><a href="mailto:jrags@jasrags.net">Jason Ragsdale</a> - the PetShop demo, project site maintenance</li>
-<li><a href="mailto:nyeholt@optushome.com.au">Marcus Nyeholt</a> - component development and unit testing.</a></li>
-<li><a href="mailto:alex@linium.net">Alex Flint</a> - component development and unit testing.</a></li>
-<li><a href="mailto:luftyluft@gmail.com">Brian Luft</a> - documentation and marketing</li>
-<li><a href="mailto:carl@decart.no">Carl Mathisen</a> - art design, PRADO v2 maintenance</li>
-<li><a href="mailto:compte_messagerie@hotmail.com">Alban Hanry</a> - component development</li>
-<li><a href="mailto:rodolfo@equinoxe.g-networks.net">Rodolfo Gonzales</a> - PRADO v2 maintenance</li>
-<li><a href="mailto:wkonkel@gmail.com">Warren Konkel</a> - PRADO v2 maintenance</li>
-<li><a href="mailto:jnavratil@houston.rr.com">John Navratil</a> - PRADO v2 maintenance</li>
+<li><a href="mailto:qiang.xue@gmail.com">Qiang Xue</a></li>
+<li><a href="mailto:weizhuo@gmail.com">Xiang Wei Zhuo</a></li>
+<li><a href="mailto:jrags@jasrags.net">Jason Ragsdale</a></li>
+<li><a href="mailto:nyeholt@optushome.com.au">Marcus Nyeholt</a></li>
+<li><a href="mailto:alex@linium.net">Alex Flint</a></li>
+<li><a href="mailto:luftyluft@gmail.com">Brian Luft</a></li>
+<li><a href="mailto:carl@decart.no">Carl Mathisen</a></li>
+<li><a href="mailto:compte_messagerie@hotmail.com">Alban Hanry</a></li>
+</ul>
+
+<h3>Prado v2 Maintenance Team</h3>
+<ul>
+<li><a href="mailto:rodolfo@equinoxe.g-networks.net">Rodolfo Gonzales</a></li>
+<li><a href="mailto:wkonkel@gmail.com">Warren Konkel</a></li>
+<li><a href="mailto:jnavratil@houston.rr.com">John Navratil</a></li>
</ul>
<h3>Past Team Members</h3>
@@ -78,12 +92,13 @@ Prado QuickStart Tutorial and the included API documentation for now.
<ul>
<li>All PRADO users - great suggestions, feedback and support</li>
<li>ASP.NET 2.0 for its great inspiration and reference</li>
-<li>All third-party work used in PRADO (<a href="framework/3rdParty/readme.html">more details</a>)</li>
+<li>All <a href="framework/3rdParty/readme.html">third-party work</a> used in PRADO</li>
</ul>
-<h2>Terms and Condition</h2>
-<p>PRADO is released under the BSD License.</p>
+<h2>License</h2>
+<p>PRADO is free software released under the terms of the following BSD license.
+</p>
<p>Copyright &copy; 2004-2006, PradoSoft (http://www.pradosoft.com)<br/>
All rights reserved.
</p>