* @link http://www.pradosoft.com/
* @copyright Copyright © 2005 PradoSoft
* @license http://www.pradosoft.com/license/
* @version $Revision: $ $Date: $
* @package System.Web.UI.WebControls
*/
/**
*
* TDatePicker class.
*
* TDatePicker displays a text box for date input purpose.
* When the text box receives focus, a calendar will pop up and users can
* pick up from it a date that will be automatically entered into the text box.
* The format of the date string displayed in the text box is determined by
* the DateFormat property. Valid formats are the combination of the
* following tokens,
*
*
* Character Format Pattern (en-US)
* -----------------------------------------
* d day digit
* dd padded day digit e.g. 01, 02
* M month digit
* MM padded month digit
* MMMM localized month name, e.g. March, April
* yy 2 digit year
* yyyy 4 digit year
* -----------------------------------------
*
*
* TDatePicker has three Mode to show the date picker popup.
*
* # Basic -- Only shows a text input, focusing on the input shows the
* date picker.
* # Button -- Shows a button next to the text input, clicking on the
* button shows the date, button text can be by the
* ButtonText property
* # ImageButton -- Shows an image next to the text input, clicking on
* the image shows the date picker, image source can be
* change through the ImageUrl property.
*
* The CssClass property can be used to override the css class name
* for the date picker panel. CalendarStyle property sets the packages
* styles available. E.g. default.
*
* @author Wei Zhuo
* @version $Revision: $ $Date: $
* @package System.Web.UI.WebControls
* @since 3.0
*/
class TDatePicker extends TTextBox
{
/**
* @return string the format of the date string
*/
public function getDateFormat()
{
return $this->getViewState('DateFormat','dd-MM-yyyy');
}
/**
* Sets the format of the date string.
* @param string the format of the date string
*/
public function setDateFormat($value)
{
$this->setViewState('DateFormat',$value,'dd-MM-yyyy');
}
/**
* @return boolean whether the calendar window should pop up when the control receives focus
*/
public function getShowCalendar()
{
return $this->getViewState('ShowCalendar',true);
}
/**
* Sets whether to pop up the calendar window when the control receives focus
* @param boolean whether to show the calendar window
*/
public function setShowCalendar($value)
{
$this->setViewState('ShowCalendar',TPropertyValue::ensureBoolean($value),true);
}
/**
* Gets the current culture.
* @return string current culture, e.g. en_AU.
*/
public function getCulture()
{
return $this->getViewState('Culture', '');
}
/**
* Sets the culture/language for the date picker.
* @param string a culture string, e.g. en_AU.
*/
public function setCulture($value)
{
$this->setViewState('Culture', $value, '');
}
/**
* @param string calendar UI mode, "Basic", "Button" or "ImageButton"
*/
public function setMode($value)
{
$this->setViewState('Mode', TPropertyValue::ensureEnum($value, 'Basic', 'Button', 'ImageButton'), 'Basic');
}
/**
* @return string current calendar UI mode.
*/
public function getMode()
{
return $this->getViewState('Mode', 'Basic');
}
/**
* @param string the image url for "Image" UI mode.
*/
public function setButtonImageUrl($value)
{
$this->setViewState('ImageUrl', $value, '');
}
/**
* @return string the image url for "Image" UI mode.
*/
public function getButtonImageUrl()
{
return $this->getViewState('ImageUrl', '');
}
/**
* @param string set the calendar style
*/
public function setCalendarStyle($value)
{
$this->setViewState('CalendarStyle', $value, 'default');
}
/**
* @return string current calendar style
*/
public function getCalendarStyle()
{
return $this->getViewState('CalendarStyle', 'default');
}
/**
* Set the first day of week, with 0 as Sunday, 1 as Monday, etc.
* @param integer 0 for Sunday, 1 for Monday, 2 for Tuesday, etc.
*/
public function setFirstDayOfWeek($value)
{
$this->setViewState('FirstDayOfWeek', TPropertyValue::ensureInteger($value), 1);
}
/**
* @return integer first day of the week
*/
public function getFirstDayOfWeek()
{
return $this->getViewState('FirstDayOfWeek', 1);
}
/**
* @return string text for the date picker button. Default is "...".
*/
public function getButtonText()
{
return $this->getViewState('ButtonText', '...');
}
/**
* @param string text for the date picker button
*/
public function setButtonText($value)
{
$this->setViewState('ButtonText', $value, '...');
}
/**
* @param integer date picker starting year, default is 2000.
*/
public function setFromYear($value)
{
$this->setViewState('FromYear', TPropertyValue::ensureInteger($value), intval(@date('Y'))-5);
}
/**
* @return integer date picker starting year, default is -5 years
*/
public function getFromYear()
{
return $this->getViewState('FromYear', intval(@date('Y'))-5);
}
/**
* @param integer date picker ending year, default +10 years
*/
public function setUpToYear($value)
{
$this-setViewState('UpToYear', TPropertyValue::ensureInteger($value), intval(@date('Y'))+10);
}
/**
* @return integer date picker ending year, default +10 years
*/
public function getUpToYear()
{
return $this->getViewState('UpToYear', intval(@date('Y'))+10);
}
/**
* Get javascript date picker options.
* @return array date picker client-side options
*/
protected function getDatePickerOptions()
{
$options['Format'] = $this->getDateFormat();
$options['FirstDayOfWeek'] = $this->getFirstDayOfWeek();
$options['ClassName'] = $this->getCssClass();
$options['FromYear'] = $this->getFromYear();
$options['UpToYear'] = $this->getUpToYear();
if($this->getMode()!=='Basic')
$options['Trigger'] = $this->getDatePickerButtonID();
$options = array_merge($options, $this->getCulturalOptions());
return $options;
}
/**
* Get javascript localization options, e.g. month and weekday names.
* @return array localization options.
*/
protected function getCulturalOptions()
{
$app = $this->getApplication()->getGlobalization();
$culture = $this->getCulture() == '' ? $app->getCulture() : $this->getCulture();
if($culture == 'en') return array();
//expensive operations
Prado::using('System.I18N.core.DateTimeFormatInfo');
$info = Prado::createComponent('System.I18N.core.CultureInfo', $culture);
$date = $info->getDateTimeFormat();
$serializer = new TJavascriptSerializer($date->getMonthNames());
$options['MonthNames'] = $serializer->toList();
$serializer = new TJavascriptSerializer($date->getAbbreviatedDayNames());
$options['ShortWeekDayNames'] = $serializer->toList();
return $options;
}
/**
* Publish the date picker Css asset files.
*/
public function onPreRender($param)
{
parent::onPreRender($param);
$this->publishCalendarStyle();
}
/**
* Renders body content.
* This method overrides parent implementation by adding
* additional date picker button if Mode is "Button" or "ImageButton".
* @param THtmlWriter writer
*/
public function render($writer)
{
parent::render($writer);
switch ($this->getMode())
{
case 'Button': $this->renderButtonDatePicker($writer); break;
case 'ImageButton' : $this->renderImageButtonDatePicker($writer); break;
}
}
/**
* Gets the ID for the date picker trigger button.
* @return string unique button ID
*/
protected function getDatePickerButtonID()
{
return $this->getClientID().'button';
}
/**
* Adds an additional button such that when clicked it shows the date picker.
* @return THtmlWriter writer
*/
protected function renderButtonDatePicker($writer)
{
$writer->addAttribute('id', $this->getDatePickerButtonID());
$writer->addAttribute('type', 'button');
$writer->addAttribute('class', $this->getCssClass().' TDatePickerButton');
$writer->addAttribute('value',$this->getButtonText());
$writer->renderBeginTag("input");
}
/**
* Adds an additional image button such that when clicked it shows the date picker.
* @return THtmlWriter writer
*/
protected function renderImageButtonDatePicker($writer)
{
$url = $this->getButtonImageUrl();
$url = empty($url) ? $this->publishDefaultButtonImage() : $url;
$writer->addAttribute('id', $this->getDatePickerButtonID());
$writer->addAttribute('src', $url);
$writer->addAttribute('class', $this->getCssClass().' TDatePickerImageButton');
$writer->renderBeginTag('img');
}
/**
* Publish the default button image asset file.
* @return string image file url.
*/
protected function publishDefaultButtonImage()
{
$cs = $this->getPage()->getClientScript();
$image = 'System.Web.Javascripts.datepicker.calendar';
if(($file = Prado::getPathOfNamespace($image, '.png'))!==null)
return $this->publishFilePath($file);
else
throw new TConfigurationException('datepicker_defaultbuttonimage_invalid',$image);
}
/**
* Publish the calendar style Css asset file.
* @return string Css file url.
*/
protected function publishCalendarStyle()
{
$cs = $this->getPage()->getClientScript();
$style = 'System.Web.Javascripts.datepicker.'.$this->getCalendarStyle();
if(($cssFile=Prado::getPathOfNamespace($style,'.css'))!==null)
{
$url = $this->publishFilePath($cssFile);
if(!$cs->isStyleSheetFileRegistered($style))
$cs->registerStyleSheetFile($style, $url);
return $url;
}
else
throw new TConfigurationException('datepicker_calendarstyle_invalid',$style);
}
/**
* Registers the javascript code to initialize the date picker.
* Must use "Event.OnLoad" to initialize the date picker when the
* full page is loaded, otherwise IE will throw an error.
* @param THtmlWriter writer
*/
protected function addAttributesToRender($writer)
{
parent::addAttributesToRender($writer);
$writer->addAttribute('id',$this->getClientID());
if($this->getShowCalendar())
{
$scripts = $this->getPage()->getClientScript();
$scripts->registerClientScript("datepicker");
$serializer = new TJavascriptSerializer($this->getDatePickerOptions());
$options = $serializer->toJavascript();
$id = $this->getClientID();
$code = "Event.OnLoad(function(){ new Prado.WebUI.TDatePicker('$id', $options); });";
$scripts->registerEndScript("prado:$id", $code);
}
}
}
?>