* @link http://www.pradosoft.com/
* @copyright Copyright © 2005-2008 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Id$
* @package System.Web.UI.ActiveControls
*/
/**
* TCallbackClientScript class.
*
* The TCallbackClientScript class provides corresponding methods that can be
* executed on the client-side (i.e. the browser client that is viewing
* the page) during a callback response.
*
* The avaiable methods includes setting/clicking input elements, changing Css
* styles, hiding/showing elements, and adding visual effects to elements on the
* page. The client-side methods can be access through the CallbackClient
* property available in TPage.
*
* For example, to hide "$myTextBox" element during callback response, do
*
* $this->getPage()->getCallbackClient()->hide($myTextBox);
*
*
* @author Wei Zhuo
* @version $Id$
* @package System.Web.UI.ActiveControls
* @since 3.1
*/
class TCallbackClientScript extends TApplicationComponent
{
/**
* @var TList list of client functions to execute.
*/
private $_actions;
/**
* Constructor.
*/
public function __construct()
{
$this->_actions = new TList;
}
/**
* @return array list of client function to be executed during callback
* response.
*/
public function getClientFunctionsToExecute()
{
return $this->_actions->toArray();
}
/**
* Executes a client-side statement.
* @param string javascript function name
* @param array list of arguments for the function
*/
public function callClientFunction($function, $params=null)
{
if(!is_array($params))
$params = array($params);
if(count($params) > 0)
{
if($params[0] instanceof TControl)
$params[0] = $params[0]->getClientID();
}
$this->_actions->add(array($function => $params));
}
/**
* Client script to set the value of a particular input element.
* @param TControl control element to set the new value
* @param string new value
*/
public function setValue($input, $text)
{
$this->callClientFunction('Prado.Element.setValue', array($input, $text));
}
/**
* Client script to select/clear/check a drop down list, check box list,
* or radio button list.
* The second parameter determines the selection method. Valid methods are
* - Value, select or check by value
* - Values, select or check by a list of values
* - Index, select or check by index (zero based index)
* - Indices, select or check by a list of index (zero based index)
* - Clear, clears or selections or checks in the list
* - All, select all
* - Invert, invert the selection.
* @param TControl list control
* @param string selection method
* @param string|int the value or index to select/check.
* @param string selection control type, either 'check' or 'select'
*/
public function select($control, $method='Value', $value=null, $type=null)
{
$method = TPropertyValue::ensureEnum($method,
'Value', 'Index', 'Clear', 'Indices', 'Values', 'All', 'Invert');
$type = is_null($type) ? $this->getSelectionControlType($control) : $type;
$total = $this->getSelectionControlIsListType($control) ? $control->getItemCount() : 1;
$this->callClientFunction('Prado.Element.select',
array($control, $type.$method, $value, $total));
}
private function getSelectionControlType($control)
{
if(is_string($control)) return 'check';
if($control instanceof TCheckBoxList)
return 'check';
if($control instanceof TCheckBox)
return 'check';
return 'select';
}
private function getSelectionControlIsListType($control)
{
return $control instanceof TListControl;
}
/**
* Client script to click on an element. This client-side function
* is unpredictable.
* @param TControl control element or element id
*/
public function click($control)
{
$this->callClientFunction('Prado.Element.click', $control);
}
/**
* Client script to check or uncheck a checkbox or radio button.
* @param TControl control element or element id
* @param boolean check or uncheck the checkbox or radio button.
*/
public function check($checkbox, $checked=true)
{
$this->select($checkbox, "Value", $checked);
}
/**
* Raise the client side event (given by $eventName) on a particular element.
* @param TControl control element or element id
* @param string Event name, e.g. "click"
*/
public function raiseClientEvent($control, $eventName)
{
$this->callClientFunction('Event.fireEvent',
array($control, strtolower($eventName)));
}
/**
* Sets the attribute of a particular control.
* @param TControl control element or element id
* @param string attribute name
* @param string attribute value
*/
public function setAttribute($control, $name, $value)
{
if ($control instanceof ISurroundable)
$control=$control->getSurroundingTagID();
$this->callClientFunction('Prado.Element.setAttribute',array($control, $name, $value));
}
/**
* Sets the options of a select input element.
* @param TControl control element or element id
* @param TCollection a list of new options
*/
public function setListItems($control, $items)
{
$options = array();
foreach($items as $item)
{
if($item->getHasAttributes())
$options[] = array($item->getText(),$item->getValue(), $item->getAttributes()->itemAt('Group'));
else
$options[] = array($item->getText(),$item->getValue());
}
$this->callClientFunction('Prado.Element.setOptions', array($control, $options));
}
/**
* Shows an element by changing its CSS display style as empty.
* @param TControl control element or element id
*/
public function show($element)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.show', $element);
}
/**
* Hides an element by changing its CSS display style to "none".
* @param TControl control element or element id
*/
public function hide($element)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.hide', $element);
}
/**
* Toggles the visibility of the element.
* @param TControl control element or element id
* @param string visual effect, such as, 'appear' or 'slide' or 'blind'.
* @param array additional options.
*/
public function toggle($element, $effect=null, $options=array())
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.toggle', array($element,$effect,$options));
}
/**
* Removes an element from the HTML page.
* @param TControl control element or element id
*/
public function remove($element)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.remove', $element);
}
public function addPostDataLoader($name)
{
$this->callClientFunction('Prado.CallbackRequest.addPostLoaders', $name);
}
/**
* Update the element's innerHTML with new content.
* @param TControl control element or element id
* @param TControl new HTML content, if content is of a TControl, the
* controls render method is called.
*/
public function update($element, $content)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->replace($element, $content, 'Element.update');
}
/**
* Add a Css class name to the element.
* @param TControl control element or element id
* @param string CssClass name to add.
*/
public function addCssClass($element, $cssClass)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.addClassName', array($element, $cssClass));
}
/**
* Remove a Css class name from the element.
* @param TControl control element or element id
* @param string CssClass name to remove.
*/
public function removeCssClass($element, $cssClass)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.removeClassName', array($element, $cssClass));
}
/**
* Sets the CssClass of an element.
* @param TControl control element or element id
* @param string new CssClass name for the element.
*/
/*public function setCssClass($element, $cssClass)
{
$this->callClientFunction('Prado.Element.CssClass.set', array($element, $cssClass));
}*/
/**
* Scroll the top of the browser viewing area to the location of the
* element.
* @param TControl control element or element id
*/
public function scrollTo($element)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Element.scrollTo', $element);
}
/**
* Focus on a particular element.
* @param TControl control element or element id.
*/
public function focus($element)
{
$this->callClientFunction('Prado.Element.focus', $element);
}
/**
* Sets the style of element. The style must be a key-value array where the
* key is the style property and the value is the style value.
* @param TControl control element or element id
* @param array list of key-value pairs as style property and style value.
*/
public function setStyle($element, $styles)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction('Prado.Element.setStyle', array($element, $styles));
}
/**
* Append a HTML fragement to the element.
* @param TControl control element or element id
* @param string HTML fragement or the control to be rendered
*/
public function appendContent($element, $content)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->replace($element, $content, 'Prado.Element.Insert.append');
}
/**
* Prepend a HTML fragement to the element.
* @param TControl control element or element id
* @param string HTML fragement or the control to be rendered
*/
public function prependContent($element, $content)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->replace($element, $content, 'Prado.Element.Insert.prepend');
}
/**
* Insert a HTML fragement after the element.
* @param TControl control element or element id
* @param string HTML fragement or the control to be rendered
*/
public function insertContentAfter($element, $content)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->replace($element, $content, 'Prado.Element.Insert.after');
}
/**
* Insert a HTML fragement in before the element.
* @param TControl control element or element id
* @param string HTML fragement or the control to be rendered
*/
public function insertContentBefore($element, $content)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->replace($element, $content, 'Prado.Element.Insert.before');
}
/**
* Replace the content of an element with new content. The new content can
* be a string or a TControl component. If the content parameter is
* a TControl component, its rendered method will be called and its contents
* will be used for replacement.
* @param TControl control element or HTML element id.
* @param string HTML fragement or the control to be rendered
* @param string replacement method, default is to replace the outter
* html content.
* @param string provide a custom boundary.
* @see insertAbout
* @see insertBelow
* @see insertBefore
* @see insertAfter
*/
protected function replace($element, $content, $method="Element.replace", $boundary=null)
{
if($content instanceof TControl)
{
$boundary = $this->getRenderedContentBoundary($content);
$content = null;
}
else if($content instanceof THtmlWriter)
{
$boundary = $this->getResponseContentBoundary($content);
$content = null;
}
$this->callClientFunction('Prado.Element.replace',
array($element, $method, $content, $boundary));
}
/**
* Replace the content of an element with new content contained in writer.
* @param TControl control element or HTML element id.
* @param string HTML fragement or the control to be rendered
*/
public function replaceContent($element,$content)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->replace($element, $content);
}
/**
* Evaluate a block of javascript enclosed in a boundary.
* @param THtmlWriter writer for the content.
*/
public function evaluateScript($writer)
{
$this->replace(null, $writer, 'Prado.Element.evaluateScript');
}
/**
* Renders the control and return the content boundary from
* TCallbackResponseWriter. This method should only be used by framework
* component developers. The render() method is defered to be called in the
* TActivePageAdapter class.
* @param TControl control to be rendered on callback response.
* @return string the boundary for which the rendered content is wrapped.
*/
private function getRenderedContentBoundary($control)
{
$writer = $this->getResponse()->createHtmlWriter();
$adapter = $control->getPage()->getAdapter();
$adapter->registerControlToRender($control, $writer);
return $writer->getWriter()->getBoundary();
}
/**
* @param THtmlWriter the writer responsible for rendering html content.
* @return string content boundary.
*/
private function getResponseContentBoundary($html)
{
if($html instanceof THtmlWriter)
{
if($html->getWriter() instanceof TCallbackResponseWriter)
return $html->getWriter()->getBoundary();
}
return null;
}
/**
* Add a visual effect the element.
* @param string visual effect function name.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function visualEffect($type, $element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->callClientFunction($type, array($element, $options));
}
/**
* Visual Effect: Gradually make the element appear.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function appear($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Appear', $element, $options);
}
/**
* Visual Effect: Blind down.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function blindDown($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.BlindDown', $element, $options);
}
/**
* Visual Effect: Blind up.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function blindUp($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.BlindUp', $element, $options);
}
/**
* Visual Effect: Drop out.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function dropOut($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.DropOut', $element, $options);
}
/**
* Visual Effect: Gradually fade the element.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function fade($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Fade', $element, $options);
}
/**
* Visual Effect: Fold.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function fold($element, $options = null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Fold', $element, $options);
}
/**
* Visual Effect: Gradually make an element grow to a predetermined size.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function grow($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Grow', $element, $options);
}
/**
* Visual Effect: Gradually grow and fade the element.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function puff($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Puff', $element, $options);
}
/**
* Visual Effect: Pulsate.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function pulsate($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Pulsate', $element, $options);
}
/**
* Visual Effect: Shake the element.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function shake($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Shake', $element, $options);
}
/**
* Visual Effect: Shrink the element.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function shrink($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Shrink', $element, $options);
}
/**
* Visual Effect: Slide down.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function slideDown($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.SlideDown', $element, $options);
}
/**
* Visual Effect: Side up.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function slideUp($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.SlideUp', $element, $options);
}
/**
* Visual Effect: Squish the element.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function squish($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.Squish', $element, $options);
}
/**
* Visual Effect: Switch Off effect.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function switchOff($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Effect.SwitchOff', $element, $options);
}
/**
* Visual Effect: High light the element for about 2 seconds.
* @param TControl control element or element id
* @param array visual effect key-value pair options.
*/
public function highlight($element, $options=null)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$this->visualEffect('Prado.Effect.Highlight', $element, $options);
}
/**
* Set the opacity on a html element or control.
* @param TControl control element or element id
* @param float opacity value between 1 and 0
*/
public function setOpacity($element, $value)
{
if ($element instanceof ISurroundable)
$element=$element->getSurroundingTagID();
$value = TPropertyValue::ensureFloat($value);
$this->callClientFunction('Element.setOpacity', array($element,$value));
}
}
?>