diff options
| -rw-r--r-- | demos/quickstart/protected/controls/Layout.tpl | 4 | ||||
| -rw-r--r-- | framework/pradolite.php | 603 | ||||
| -rw-r--r-- | index.html | 2 | 
3 files changed, 143 insertions, 466 deletions
| diff --git a/demos/quickstart/protected/controls/Layout.tpl b/demos/quickstart/protected/controls/Layout.tpl index ac5f84d0..586b30af 100644 --- a/demos/quickstart/protected/controls/Layout.tpl +++ b/demos/quickstart/protected/controls/Layout.tpl @@ -8,7 +8,7 @@  <body>
  <com:TForm>
  <div id="header">
 -<div class="title">Prado QuickStart Tutorial</div> +<div class="title">Prado QuickStart Tutorial</div>
  <div class="image"></div>
  </div>
 @@ -21,7 +21,7 @@  <table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
  <td valign="top">
 -<div id="content" width="100%">
 +<div id="content">
  <com:TContentPlaceHolder ID="body" />
  </div>
  </td>
 diff --git a/framework/pradolite.php b/framework/pradolite.php index 6b8a5e2f..cccf61f2 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -5322,7 +5322,8 @@ interface INamingContainer  }  interface IPostBackEventHandler   { -public function raisePostBackEvent($param);  +public function raisePostBackEvent($param); +public function getPostBackOptions();   }  interface IPostBackDataHandler   { @@ -5633,101 +5634,49 @@ public function setTrackFocus($value)  		$this->_trackFocus=$value;  	}  } +Prado::using('System.Web.Javascripts.*');  class TClientScriptManager extends TComponent  {  	const SCRIPT_DIR='Web/Javascripts/js'; -	const POSTBACK_FUNC='Prado.doPostBack'; -	private $_page; +private $_page;  	private $_hiddenFields=array();  	private $_beginScripts=array();  	private $_endScripts=array();  	private $_scriptFiles=array(); -	private $_headScriptFiles=array(); -	private $_headScripts=array(); -	private $_styleSheetFiles=array(); +private $_styleSheetFiles=array();  	private $_styleSheets=array(); -	private $_onSubmitStatements=array(); -	private $_arrayDeclares=array(); -	private $_expandoAttributes=array(); -	private $_postBackScriptRegistered=false; -	private $_focusScriptRegistered=false; -	private $_scrollScriptRegistered=false; -	private $_publishedScriptFiles=array(); +private $_client; +private $_publishedScriptFiles=array();  public function __construct(TPage $owner)  	{  		$this->_page=$owner; +		$this->_client = new TClientScript($this);  	} -public function getPostBackEventReference($control,$parameter='',$options=null,$javascriptPrefix=true) +public function registerPostBackControl($control,$namespace='Prado.WebUI')  	{ -		if(!$options || (!$options->getPerformValidation() && !$options->getTrackFocus() && $options->getClientSubmit() && $options->getActionUrl()=='')) -		{ -			$this->registerPostBackScript(); -			if(($form=$this->_page->getForm())!==null) -				$formID=$form->getClientID(); -			else -				throw new TConfigurationException('clientscriptmanager_form_required'); -			$postback=self::POSTBACK_FUNC.'(\''.$formID.'\',\''.$control->getUniqueID().'\',\''.THttpUtility::quoteJavaScriptString($parameter).'\')'; -			if($options && $options->getAutoPostBack()) -				$postback='setTimeout(\''.THttpUtility::quoteJavaScriptString($postback).'\',0)'; -			return $javascriptPrefix?'javascript:'.$postback:$postback; -		} -		$opt=''; -		$flag=false; -		if($options->getPerformValidation()) -		{ -			$flag=true; -			$this->registerValidationScript(); -			$opt.=',true,'; -		} -		else -			$opt.=',false,'; -		if($options->getValidationGroup()!=='') -		{ -			$flag=true; -			$opt.='"'.$options->getValidationGroup().'",'; -		} -		else -			$opt.='\'\','; -		if($options->getActionUrl()!=='') -		{ -			$flag=true; -			$this->_page->setCrossPagePostBack(true); -			$opt.='"'.$options->getActionUrl().'",'; -		} -		else -			$opt.='null,'; -		if($options->getTrackFocus()) -		{ -			$flag=true; -			$this->registerFocusScript(); -			$opt.='true,'; -		} -		else -			$opt.='false,'; -		if($options->getClientSubmit()) -		{ -			$flag=true; -			$opt.='true'; -		} -		else -			$opt.='false'; -		if(!$flag) -			return ''; -		$this->registerPostBackScript(); -		if(($form=$this->_page->getForm())!==null) -			$formID=$form->getClientID(); -		else -			throw new TConfigurationException('clientscriptmanager_form_required'); -		$postback=self::POSTBACK_FUNC.'(\''.$formID.'\',\''.$control->getUniqueID().'\',\''.THttpUtility::quoteJavaScriptString($parameter).'\''.$opt.')'; -		if($options && $options->getAutoPostBack()) -			$postback='setTimeout(\''.THttpUtility::quoteJavaScriptString($postback).'\',0)'; -		return $javascriptPrefix?'javascript:'.$postback:$postback; +		$options = $this->getPostBackOptions($control); +		$type = get_class($control); +		$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 registerPradoScript($script) +public function registerClientScript($script)  	{  		static $scripts = array();  		$scripts = array_unique(array_merge($scripts,  -						TPradoClientScript::getScripts($script))); +						TClientScript::getScripts($script)));  $this->publishClientScriptAssets($scripts);  $url = $this->publishClientScriptCompressorAsset();  		$url .= '?js='.implode(',', $scripts); @@ -5735,7 +5684,7 @@ $url = $this->publishClientScriptCompressorAsset();  			$url .= '&__nocache';  		$this->registerScriptFile('prado:gzipscripts', $url);  	} -private function publishClientScriptAssets($scripts) +protected function publishClientScriptAssets($scripts)  	{  		foreach($scripts as $lib)  		{ @@ -5750,7 +5699,7 @@ private function publishClientScriptAssets($scripts)  			}  		}  	} -private function publishClientScriptCompressorAsset() +protected function publishClientScriptCompressorAsset()  	{  		$scriptFile = 'clientscripts.php';  		if(isset($this->_publishedScriptFiles[$scriptFile])) @@ -5766,44 +5715,6 @@ private function publishClientScriptCompressorAsset()  			return $url;  		}  	} -protected function registerPostBackScript() -	{ -		if(!$this->_postBackScriptRegistered) -		{ -			$this->_postBackScriptRegistered=true; -			$this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,''); -			$this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,''); -			$this->registerPradoScript('prado'); -		} -	} -public function registerFocusScript($target) -	{ -		if(!$this->_focusScriptRegistered) -		{ -			$this->_focusScriptRegistered=true; -			$this->registerPradoScript('prado'); -			$this->registerEndScript('prado:focus','Prado.Focus.setFocus("'.THttpUtility::quoteJavaScriptString($target).'");'); -		} -	} -public function registerScrollScript($x,$y) -	{ -		if(!$this->_scrollScriptRegistered) -		{ -			$this->_scrollScriptRegistered=true; -			$this->registerHiddenField(TPage::FIELD_SCROLL_X,$x); -			$this->registerHiddenField(TPage::FIELD_SCROLL_Y,$y); -					} -	} -public function registerDefaultButtonScript($source, $target) -	{ -		$this->registerPradoScript('prado'); -		$button = $target->getClientID(); -		$panel = $source->getClientID(); -		return "Event.observe('{$panel}', 'keypress', Prado.Button.fireButton.bindEvent($('{$panel}'), '$button'));"; -	} -public function registerValidationScript() -	{ -	}  public function isHiddenFieldRegistered($key)  	{  		return isset($this->_hiddenFields[$key]); @@ -5824,14 +5735,6 @@ public function isEndScriptRegistered($key)  	{  		return isset($this->_endScripts[$key]);  	} -public function isHeadScriptFileRegistered($key) -	{ -		return isset($this->_headScriptFiles[$key]); -	} -public function isHeadScriptRegistered($key) -	{ -		return isset($this->_headScripts[$key]); -	}  public function isStyleSheetFileRegistered($key)  	{  		return isset($this->_styleSheetFiles[$key]); @@ -5840,14 +5743,6 @@ public function isStyleSheetRegistered($key)  	{  		return isset($this->_styleSheets[$key]);  	} -public function isOnSubmitStatementRegistered($key) -	{ -		return isset($this->_onSubmitStatements[$key]); -	} -public function registerArrayDeclaration($name,$value) -	{ -		$this->_arrayDeclares[$name][]=$value; -	}  public function registerScriptFile($key,$url)  	{  		$this->_scriptFiles[$key]=$url; @@ -5857,10 +5752,6 @@ public function registerHiddenField($name,$value)  				if(!isset($this->_hiddenFields[$name]) || $this->_hiddenFields[$name]!==null)  			$this->_hiddenFields[$name]=$value;  	} -public function registerOnSubmitStatement($key,$script) -	{ -		$this->_onSubmitStatements[$key]=$script; -	}  public function registerBeginScript($key,$script)  	{  		$this->_beginScripts[$key]=$script; @@ -5869,14 +5760,6 @@ public function registerEndScript($key,$script)  	{  		$this->_endScripts[$key]=$script;  	} -public function registerHeadScriptFile($key,$url) -	{ -		$this->_headScriptFiles[$key]=$url; -	} -public function registerHeadScript($key,$script) -	{ -		$this->_headScripts[$key]=$script; -	}  public function registerStyleSheetFile($key,$url)  	{  		$this->_styleSheetFiles[$key]=$url; @@ -5885,21 +5768,6 @@ public function registerStyleSheet($key,$css)  	{  		$this->_styleSheets[$key]=$css;  	} -public function registerExpandoAttribute($controlID,$name,$value) -	{ -		$this->_expandoAttributes[$controlID][$name]=$value; -	} -public function renderArrayDeclarations($writer) -	{ -		if(count($this->_arrayDeclares)) -		{ -			$str="<script type=\"text/javascript\">\n//<![CDATA[\n"; -			foreach($this->_arrayDeclares as $name=>$array) -				$str.="var $name=new Array(".implode(',',$array).");\n"; -			$str.="\n//]]>\n</script>\n"; -			$writer->write($str); -		} -	}  public function renderScriptFiles($writer)  	{  		$str=''; @@ -5907,9 +5775,6 @@ public function renderScriptFiles($writer)  			$str.="<script type=\"text/javascript\" src=\"".THttpUtility::htmlEncode($include)."\"></script>\n";  		$writer->write($str);  	} -public function renderOnSubmitStatements($writer) -	{ -			}  public function renderBeginScripts($writer)  	{  		if(count($this->_beginScripts)) @@ -5935,38 +5800,6 @@ public function renderHiddenFields($writer)  		if($str!=='')  			$writer->write("<div>\n".$str."</div>\n");  	} -public function renderExpandoAttributes($writer) -	{ -		if(count($this->_expandoAttributes)) -		{ -			$str="<script type=\"text/javascript\">\n//<![CDATA[\n"; -			foreach($this->_expandoAttributes as $controlID=>$attrs) -			{ -				$str.="var $controlID = document.all ? document.all[\"$controlID\"] : document.getElementById(\"$controlID\");\n"; -				foreach($attrs as $name=>$value) -				{ -					if($value===null) -						$str.="{$key}[\"$name\"]=null;\n"; -					else -						$str.="{$key}[\"$name\"]=\"$value\";\n"; -				} -			} -			$str.="\n//]]>\n</script>\n"; -			$writer->write($str); -		} -	} -public function renderHeadScriptFiles($writer) -	{ -		$str=''; -		foreach($this->_headScriptFiles as $url) -			$str.="<script type=\"text/javascript\" src=\"".THttpUtility::htmlEncode($url)."\"></script>\n"; -		$writer->write($str); -	} -public function renderHeadScripts($writer) -	{ -		if(count($this->_headScripts)) -			$writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_headScripts)."\n//]]>\n</script>\n"); -	}  public function renderStyleSheetFiles($writer)  	{  		$str=''; @@ -5985,117 +5818,6 @@ public function getHasHiddenFields()  	{  		return count($this->_hiddenFields)>0;  	} -public function getHasSubmitStatements() -	{ -		return count($this->_onSubmitStatements)>0; -	} -public function registerClientEvent($control, $event, $code) -	{ -		if(empty($code)) return; -		$this->registerPradoScript("prado"); -		$script= "Event.observe('{$control->ClientID}', '{$event}', function(e){ {$code} });"; -		$key = "prado:{$control->ClientID}:{$event}"; -		$this->registerEndScript($key, $script); -	} -} -class TJavascript -{ -public static function toArray($array,$append=null,$strict=false) -	{ -		$results = array(); -		$converter = new TJavascript(); -		foreach($array as $v) -		{ -			if($strict || (!$strict && $v !== '' && $v !== array())) -			{ -				$type = 'to_'.gettype($v); -				if($type == 'to_array') -					$results[] = $converter->toArray($v, $append, $strict); -				else -					$results[] = $converter->{$type}($v); -			} -		} -		$extra = ''; -		if(strlen($append) > 0) -			$extra .= count($results) > 0 ? ','.$append : $append; -		return '['.implode(',', $results).$extra.']'; -	} -public static function toList($array,$append=null, $strict=false) -	{ -		$results = array(); -		$converter = new TJavascript(); -		foreach($array as $k => $v) -		{ -			if($strict || (!$strict && $v !== '' && $v !== array())) -			{ -				$type = 'to_'.gettype($v); -				if($type == 'to_array') -					$results[] = "'{$k}':".$converter->toList($v, $append, $strict); -				else -					$results[] = "'{$k}':".$converter->{$type}($v); -			} -		} -		$extra = ''; -		if(strlen($append) > 0) -			$extra .= count($results) > 0 ? ','.$append : $append; -return '{'.implode(',', $results).$extra.'}'; -	} -public function to_boolean($v) -	{ -		return $v ? 'true' : 'false'; -	} -public function to_integer($v) -	{ -		return "{$v}"; -	} -public function to_double($v) -	{ -		return "{$v}"; -	} -public function to_string($v) -	{ -		if(strlen($v)>1) -		{ -			$first = $v{0}; $last = $v{strlen($v)-1}; -			if($first == '[' && $last == ']' || -				($first == '{' && $last == '}')) -				return $v; -		} -		return "'".addslashes($v)."'"; -	} -public function to_array($v) -	{ -		return TJavascript::toArray($v); -	} -public function to_null($v) -	{ -		return 'null'; -	} -} -class TPradoClientScript -{ -protected static $dependencies = array( -		'prado' => array('prado'), -		'effects' => array('prado', 'effects'), -		'ajax' => array('prado', 'effects', 'ajax'), -		'validator' => array('prado', 'validator'), -		'logger' => array('prado', 'logger'), -		'datepicker' => array('prado', 'datepicker'), -		'rico' => array('prado', 'effects', 'ajax', 'rico') -		); -public static function getScripts($scripts) -	{ -		$files = array(); -		if(!is_array($scripts)) $scripts = array($scripts); -		foreach($scripts as $script) -		{ -			if(isset(self::$dependencies[$script])) -				$files = array_merge($files, self::$dependencies[$script]); -			$files[] = $script; -		} -		$files = array_unique($files); -		return $files; -	}  }  ?><?php  Prado::using('System.Web.UI.WebControls.*');  @@ -6519,9 +6241,7 @@ public function endFormRender($writer)  				$cs->registerScrollScript($x,$y);   			}   			$cs->renderHiddenFields($writer);  -			$cs->renderArrayDeclarations($writer);  -			$cs->renderExpandoAttributes($writer);  -			$cs->renderScriptFiles($writer);  +									$cs->renderScriptFiles($writer);   			$cs->renderEndScripts($writer);   		}   		else  @@ -7602,34 +7322,26 @@ protected function addAttributesToRender($writer)  		$writer->addAttribute('value',$this->getText());   		if($this->getEnabled(true))   		{  -			$scripts = $this->getPage()->getClientScript();  -			if($scripts->isEndScriptRegistered("TBaseValidator"))  -			{  -				$group = $this->getValidationGroup();  -				$group = strlen($group) ? ",'".$group."'" : '';  -				$clientID=$this->getClientID();  -								$script = "Prado.Validation.AddTarget('{$clientID}'{$group});";  -				$scripts->registerEndScript("{$uniqueID}:target", $script);  -			}  +			if($this->canCauseValidation())  +				$this->getPage()->getClientScript()->registerPostBackControl($this);   		}   		else if($this->getEnabled()) 			$writer->addAttribute('disabled','disabled');  $writer->addAttribute('id',$this->getClientID());   		parent::addAttributesToRender($writer);   	} -protected function getPostBackOptions()  +protected function canCauseValidation()   	{  -		$option=new TPostBackOptions();   		$group = $this->getValidationGroup();   		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  -		if($this->getCausesValidation() && $hasValidators)  -		{  -			$option->setPerformValidation(true);  -			$option->setValidationGroup($group);  -		}  -		if($this->getPostBackUrl()!=='')  -			$option->setActionUrl($this->getPostBackUrl());  -		$option->setClientSubmit(!$this->getUseSubmitBehavior()); -return $option;  +		return $this->getCausesValidation() && $hasValidators;  +	} +public function getPostBackOptions()  +	{  +		$options['CausesValidation'] = $this->getCausesValidation();  +		$options['ValidationGroup'] = $this->getValidationGroup();		  +		$options['PostBackUrl'] = $this->getPostBackUrl();  +		$options['ClientSubmit'] = !$this->getUseSubmitBehavior(); +return $options;   	}  protected function renderContents($writer)   	{  @@ -7897,12 +7609,7 @@ protected function renderInputTag($writer,$clientID,$onclick)  			$writer->addAttribute('disabled','disabled');  $page=$this->getPage();   		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())  -		{  -			$options = $this->getAutoPostBackOptions();  -			$scripts = $page->getClientScript();  -			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  -			$scripts->registerClientEvent($this, "click", $postback);  -		} +			$page->getClientScript()->registerPostBackControl($this);  if(($accesskey=$this->getAccessKey())!=='')   			$writer->addAttribute('accesskey',$accesskey);   		if(($tabindex=$this->getTabIndex())>0)  @@ -7912,17 +7619,12 @@ if(($accesskey=$this->getAccessKey())!=='')  		$writer->renderBeginTag('input');   		$writer->renderEndTag();   	} -protected function getAutoPostBackOptions()  +public function getPostBackOptions()   	{  -		$option=new TPostBackOptions();  -		$group = $this->getValidationGroup();  -		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  -		if($this->getCausesValidation() && $hasValidators)  -		{  -			$option->setPerformValidation(true);  -			$option->setValidationGroup($group);  -		}  -		$option->setAutoPostBack(true);  +		$options['ValidationGroup'] = $this->getValidationGroup();  +		$options['CausesValidation'] = $this->getCausesValidation();  +		$options['EventTarget'] = $this->getUniqueID();  +		return $options;   	}  }  ?><?php @@ -8002,12 +7704,7 @@ protected function renderInputTag($writer,$clientID,$onclick)  			$writer->addAttribute('disabled','disabled');  $page=$this->getPage();   		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())  -		{  -			$options = $this->getAutoPostBackOptions();  -			$scripts = $page->getClientScript();  -			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  -			$scripts->registerClientEvent($this, "click", $postback);  -		} +			$page->getClientScript()->registerPostBackControl($this);  if(($accesskey=$this->getAccessKey())!=='')   			$writer->addAttribute('accesskey',$accesskey);   		if(($tabindex=$this->getTabIndex())>0)  @@ -8088,31 +7785,19 @@ protected function addAttributesToRender($writer)  		if(!$this->getEnabled(true) && $this->getEnabled())  			$writer->addAttribute('disabled','disabled');   		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())   		{  -			$writer->addAttribute('id',$this->getClientID());  -			$options = $this->getAutoPostBackOptions();  -			$scripts = $this->getPage()->getClientScript();  -			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  -			$scripts->registerClientEvent($this, "change", $postback); -if($this->getTextMode() !== 'MultiLine')  -			{  -				$code = "if(Prado.TextBox.handleReturnKey(e)==false) Event.stop(e);";  -				$scripts->registerClientEvent($this, "keypress", $code);  -			}  -		}  +			$writer->addAttribute('id',$this->getClientID());			  +			$this->getPage()->getClientScript()->registerPostBackControl($this); +}   		parent::addAttributesToRender($writer);   	} -protected function getAutoPostBackOptions()  +public function getPostBackOptions()   	{  -		$option=new TPostBackOptions();  -		$group = $this->getValidationGroup();  -		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  -		if($this->getCausesValidation() && $hasValidators)  -		{  -			$option->setPerformValidation(true);  -			$option->setValidationGroup($group);  -		}  -		$option->setAutoPostBack(true);  -	} +		$options['EventTarget'] = $this->getUniqueID();  +		$options['CausesValidation'] = $this->getCausesValidation();  +		$options['ValidationGroup'] = $this->getValidationGroup();  +		$options['TextMode'] = $this->getTextMode();  +		return $options; +}  public function loadPostData($key,$values)   	{   		$value=$values[$key];  @@ -8270,13 +7955,8 @@ protected function addAttributesToRender($writer)  			if(($button=$this->findControl($butt))===null)   				throw new TInvalidDataValueException('panel_defaultbutton_invalid',$butt);   			else  -			{  -				$scripts = $this->getPage()->getClientScript();  -				$js = $scripts->registerDefaultButtonScript($this,$button);  -				$clientID=$this->getClientID();  -				$scripts->registerEndScript($clientID.'defaultButton', $js);  -				$writer->addAttribute('id',$clientID);  -			}  +			{ +}   		}   	}  public function getWrap()  @@ -8621,9 +8301,8 @@ public function render($writer)  		$cs=$page->getClientScript();   		$cs->renderStyleSheetFiles($writer);   		$cs->renderStyleSheets($writer);  -		$cs->renderHeadScriptFiles($writer);  -		$cs->renderHeadScripts($writer);  -		parent::render($writer);  +		$cs->renderScriptFiles($writer);  +				parent::render($writer);   		$writer->write("</head>\n");   	}   } @@ -9831,6 +9510,7 @@ class TBulletedList extends TListControl implements IPostBackEventHandler  {  private $_isEnabled;  private $_postBackOptions; +private $_currentRenderItemIndex;  public function raisePostBackEvent($param)   	{   		if($this->getCausesValidation())  @@ -9965,34 +9645,12 @@ protected function renderBulletText($writer,$item,$index)  		switch($this->getDisplayMode())   		{   			case 'Text':  -				if($item->getEnabled())  -					$writer->write(THttpUtility::htmlEncode($item->getText()));  -				else  -				{  -					$writer->addAttribute('disabled','disabled');  -					$writer->renderBeginTag('span');  -					$writer->write(THttpUtility::htmlEncode($item->getText()));  -					$writer->renderEndTag();  -				}  -				return;  +				return $this->renderTextItem($writer, $item, $index);   			case 'HyperLink':  -				if(!$this->_isEnabled || !$item->getEnabled())  -					$writer->addAttribute('disabled','disabled');  -				else  -				{  -					$writer->addAttribute('href',$item->getValue());  -					if(($target=$this->getTarget())!=='')  -						$writer->addAttribute('target',$target);  -				}  +				$this->renderHyperLinkItem($writer, $item, $index);   				break;   			case 'LinkButton':  -				if(!$this->_isEnabled || !$item->getEnabled())  -					$writer->addAttribute('disabled','disabled');  -				else  -				{  -					$postback=$this->getPage()->getClientScript()->getPostBackEventReference($this,"$index",$this->_postBackOptions);  -					$writer->addAttribute('href',$postback);  -				}  +				$this->renderLinkButtonItem($writer, $item, $index);   		}   		if(($accesskey=$this->getAccessKey())!=='')   			$writer->addAttribute('accesskey',$accesskey);  @@ -10000,19 +9658,55 @@ protected function renderBulletText($writer,$item,$index)  		$writer->write(THttpUtility::htmlEncode($item->getText()));   		$writer->renderEndTag();   	} -protected function getPostBackOptions()  +protected function renderTextItem($writer, $item, $index)   	{  -		$option=new TPostBackOptions();  -		$group = $this->getValidationGroup();  -		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  -		if($this->getCausesValidation() && $hasValidators)  +		if($item->getEnabled())  +			$writer->write(THttpUtility::htmlEncode($item->getText()));  +		else   		{  -			$options->setPerformValidation(true);  -			$options->setValidationGroup($this->getValidationGroup());  -			return $options;  +			$writer->addAttribute('disabled','disabled');  +			$writer->renderBeginTag('span');  +			$writer->write(THttpUtility::htmlEncode($item->getText()));  +			$writer->renderEndTag();   		}  +	} +protected function renderHyperLinkItem($writer, $item, $index)  +	{  +		if(!$this->_isEnabled || !$item->getEnabled())  +			$writer->addAttribute('disabled','disabled');   		else  -			return null;  +		{  +			$writer->addAttribute('href',$item->getValue());  +			if(($target=$this->getTarget())!=='')  +				$writer->addAttribute('target',$target);  +		}  +	} +protected function renderLinkButtonItem($writer, $item, $index)  +	{  +		if(!$this->_isEnabled || !$item->getEnabled())  +			$writer->addAttribute('disabled','disabled');  +		else  +		{  +			$this->_currentRenderItemIndex = $index;  +			$this->getPage()->getClientScript()->registerPostbackControl($this);  +			$writer->addAttribute('id', $this->getClientID().$index);  +			$writer->addAttribute('href', "javascript:;//".$this->getClientID().$index);  +		}  +	} +public function getPostBackOptions()  +	{  +		$options['ValidationGroup'] = $this->getValidationGroup();  +		$options['CausesValidation'] = $this->getCausesValidation();  +		$options['EventTarget'] = $this->getUniqueID();  +		$options['EventParameter'] = $this->_currentRenderItemIndex;  +		$options['ID'] = $this->getClientID().$this->_currentRenderItemIndex;  +		return $options;  +	} +protected function canCauseValidation()  +	{  +		$group = $this->getValidationGroup();  +		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  +		return $this->getCausesValidation() && $hasValidators;   	}  public function setAutoPostBack($value)   	{  @@ -10062,27 +9756,18 @@ protected function addAttributesToRender($writer)  		if($this->getAutoPostBack() && $page->getClientSupportsJavaScript())   		{   			$writer->addAttribute('id',$this->getClientID());  -			$options = $this->getAutoPostBackOptions();  -			$scripts = $this->getPage()->getClientScript();  -			$postback = $scripts->getPostBackEventReference($this,'',$options,false);  -			$scripts->registerClientEvent($this, "change", $postback);  -		}  +			$this->getPage()->getClientScript()->registerPostBackControl($this); +}   		if($this->getEnabled(true) && !$this->getEnabled())   			$writer->addAttribute('disabled','disabled');   		parent::addAttributesToRender($writer);   	} -protected function getAutoPostBackOptions()  -	{  -		$option=new TPostBackOptions();  -		$group = $this->getValidationGroup();  -		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  -		if($this->getCausesValidation() && $hasValidators)  -		{  -			$option->setPerformValidation(true);  -			$option->setValidationGroup($group);  -		}  -		$option->setAutoPostBack(true);  -		return $option;  +public function getPostBackOptions()  +	{ +$options['CausesValidation'] = $this->getCausesValidation();  +		$options['ValidationGroup'] = $this->getValidationGroup();  +		$options['EventTarget'] = $this->getUniqueID();  +		return $options;   	}  public function addParsedObject($object)   	{  @@ -10651,7 +10336,7 @@ protected function getTagName()  	}  protected function renderContents($writer)   	{  -		$this->Page->ClientScript->registerPradoScript('logger');  +		$this->Page->ClientScript->registerClientScript('logger');   		$info = '(<a href="http://gleepglop.com/javascripts/logger/" target="_blank">more info</a>).';   		$usage = 'Press ALT-D (Or CTRL-D on OS X) to toggle the javascript log console';   		$writer->write("{$usage} {$info}");  @@ -10675,33 +10360,18 @@ if($this->getEnabled(true))  		{   			$url = $this->getPostBackUrl();   						$nop = "javascript:;//".$this->getClientID();  -			$writer->addAttribute('href', $url ? $url : $nop); -$scripts = $this->getPage()->getClientScript();  -			$options = $this->getPostBackOptions();  -			$postback = $scripts->getPostBackEventReference($this, '', $options, false);  -			$code = "{$postback}; Event.stop(e);";  -			$scripts->registerClientEvent($this, "click", $code);  +			$writer->addAttribute('href', $url ? $url : $nop);  +			$this->getPage()->getClientScript()->registerPostBackControl($this);   		}   		else if($this->getEnabled()) 			$writer->addAttribute('disabled','disabled');   	} -protected function getPostBackOptions()  +public function getPostBackOptions()   	{  -		$flag=false; -$option=new TPostBackOptions();  -		$group = $this->getValidationGroup();  -		$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;  -		if($this->getCausesValidation() && $hasValidators)  -		{  -			$flag=true;  -			$options->setPerformValidation(true);  -			$options->setValidationGroup($this->getValidationGroup());  -		}  -		if($this->getPostBackUrl()!=='')  -		{  -			$flag=true;  -			$options->setActionUrl($this->getPostBackUrl());  -		}  -		return $flag?$options:null;  +		$options['EventTarget'] = $this->getUniqueID();  +		$options['CausesValidation'] = $this->getCausesValidation();  +		$options['ValidationGroup'] = $this->getValidationGroup();		  +		$options['PostBackUrl'] = $this->getPostBackUrl(); +return $options;   	}  protected function renderContents($writer)   	{  @@ -10826,7 +10496,7 @@ protected function onPreRender($param)  		$scriptKey = "TBaseValidator";  		if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey))  		{ -			$scripts->registerPradoScript('validator'); +			$scripts->registerClientScript('validator');  			$formID=$this->getPage()->getForm()->getClientID();  			$js = "Prado.Validation.AddForm('$formID');";  			$scripts->registerEndScript($scriptKey, $js); @@ -10842,7 +10512,8 @@ protected function renderClientScriptValidator()  			$class = get_class($this);  			$scriptKey = "prado:".$this->getClientID();  			$scripts = $this->getPage()->getClientScript(); -			$options = TJavascript::toList($this->getClientScriptOptions()); +			$serializer = new TJavascriptSerializer($this->getClientScriptOptions()); +			$options = $serializer->toJavascript();  			$js = "new Prado.Validation(Prado.Validation.{$class}, {$options});";  			$scripts->registerEndScript($scriptKey, $js);  		} @@ -11340,11 +11011,17 @@ foreach($group->getMembers() as $member)  		}   		return $validators;   	} +protected function addAttributesToRender($writer)  +	{  +		$writer->addAttribute('id',$this->getClientID());  +		parent::addAttributesToRender($writer);  +	}  protected function renderJsSummary()   	{   		if(!$this->getEnabled(true) || !$this->getEnableClientScript())   			return;  -		$options = TJavascript::toList($this->getClientScriptOptions());  +		$serializer = new TJavascriptSerializer($this->getClientScriptOptions());  +		$options = $serializer->toJavascript();   		$script = "new Prado.Validation.Summary({$options});";   		$this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script);   	} @@ -60,7 +60,7 @@ Prado QuickStart Tutorial and the included API documentation for now.  <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</a> - component development</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>
 | 
