<?php
/**
* @package RSForm! Pro
* @copyright (C) 2007-2019 www.rsjoomla.com
* @license GPL, http://www.gnu.org/copyleft/gpl.html
*/
defined('_JEXEC') or die;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
class RSFormProJQueryCalendar
{
protected $calendarOptions = array(); // store the javascript settings for each calendar
protected $translationTable = array
(
'd' => 'DD',
'j' => 'D',
'D' => 'ddd',
'l' => 'dddd',
'N' => 'e',
'S' => 'o',
'z' => 'DDDD',
'F' => 'MMMM',
'm' => 'MM',
'M' => 'MMM',
'n' => 'M',
'Y' => 'YYYY',
'y' => 'YY',
'a' => 'a',
'A' => 'A',
'g' => 'h',
'G' => 'H',
'h' => 'hh',
'H' => 'HH',
'i' => 'mm',
's' => 'ss',
);
public function loadFiles()
{
static $done;
if ($done)
{
return;
}
// load the jQuery framework
RSFormProAssets::addJquery();
RSFormProAssets::addScript(HTMLHelper::_('script', 'com_rsform/jquerycalendar/jquery.datetimepicker.js', array('pathOnly' => true, 'relative' => true)));
RSFormProAssets::addScript(HTMLHelper::_('script', 'com_rsform/jquerycalendar/moment.js', array('pathOnly' => true, 'relative' => true)));
RSFormProAssets::addScript(HTMLHelper::_('script', 'com_rsform/jquerycalendar/script.js', array('pathOnly' => true, 'relative' => true)));
RSFormProAssets::addStyleSheet(HTMLHelper::_('stylesheet', 'com_rsform/jquerycalendar/jquery.datetimepicker.css', array('pathOnly' => true, 'relative' => true)));
$out = "\n";
$m_short = $m_long = array();
for ($i=1; $i<=12; $i++)
{
$m_short[] = '"'.Text::_('RSFP_CALENDAR_MONTHS_SHORT_'.$i, true).'"';
$m_long[] = '"'.Text::_('RSFP_CALENDAR_MONTHS_LONG_'.$i, true).'"';
}
$w_short = $w_med = $w_long = array();
for ($i=0; $i<=6; $i++)
{
$w_short[] = '"'.Text::_('RSFP_CALENDAR_WEEKDAYS_SHORT_'.$i, true).'"';
$w_med[] = '"'.Text::_('RSFP_CALENDAR_WEEKDAYS_MEDIUM_'.$i, true).'"';
$w_long[] = '"'.Text::_('RSFP_CALENDAR_WEEKDAYS_LONG_'.$i, true).'"';
}
$out .= 'RSFormPro.jQueryCalendar.settings.MONTHS_SHORT = ['.implode(',', $m_short).'];'."\n";
$out .= 'RSFormPro.jQueryCalendar.settings.MONTHS_LONG = ['.implode(',', $m_long).'];'."\n";
$out .= 'RSFormPro.jQueryCalendar.settings.WEEKDAYS_SHORT = ['.implode(',', $w_short).'];'."\n";
$out .= 'RSFormPro.jQueryCalendar.settings.WEEKDAYS_MEDIUM = ['.implode(',', $w_med).'];'."\n";
$out .= 'RSFormPro.jQueryCalendar.settings.WEEKDAYS_LONG = ['.implode(',', $w_long).'];'."\n";
$out .= 'RSFormPro.jQueryCalendar.settings.START_WEEKDAY = '.Text::_('RSFP_CALENDAR_START_WEEKDAY').';'."\n";
$out .= "jQuery(document).ready(function(){ RSFormPro.jQueryCalendar.renderCalendars(); });\n";
RSFormProAssets::addScriptDeclaration($out);
$done = true;
}
protected function processDateFormat($dateFormat) {
$newFormat = '';
for ($i = 0; $i < strlen($dateFormat); $i++)
{
$current = $dateFormat[$i];
// get previous char to see if is the dash
$previous = isset($dateFormat[($i-1)]) ? $dateFormat[($i-1)] : '';
if ($current == "\\" || $previous == "\\")
{
$newFormat .= $current;
continue;
}
if (isset($this->translationTable[$current]))
{
$newFormat .= $this->translationTable[$current];
}
else
{
$newFormat .= $current;
}
}
return $newFormat;
}
public function setCalendarOptions($config) {
extract($config);
$this->calendarOptions[$formId][$customId]['inline'] = $inline;
$this->calendarOptions[$formId][$customId]['format'] = $this->processDateFormat($dateFormat);
$this->calendarOptions[$formId][$customId]['value'] = $value;
$this->calendarOptions[$formId][$customId]['timepicker'] = $timepicker;
$this->calendarOptions[$formId][$customId]['theme'] = $theme;
if ($timepicker) {
// in case the user leaves the input empty and save the settings
$timepickerformat = trim($timepickerformat);
if (empty($timepickerformat)) {
$timepickerformat = 'H:i';
}
$this->calendarOptions[$formId][$customId]['timepickerformat'] = $this->processDateFormat($timepickerformat);
}
$extras = array();
// Set the min and max dates
if (!empty($minDate)) {
$extras['minDate'] = $minDate;
}
if (!empty($maxDate)) {
$extras['maxDate'] = $maxDate;
}
// Set the min and max time
if (!empty($minTime)) {
$extras['minTime'] = $minTime;
}
if (!empty($maxTime)) {
$extras['maxTime'] = $maxTime;
}
if (!empty($allowDates)) {
$allowDates = str_replace("\r\n", "\n", $allowDates);
$allowDates = explode("\n", $allowDates);
$extras['allowDates'] = $allowDates;
}
if (!empty($allowDateRe)) {
$extras['allowDateRe'] = $allowDateRe;
}
if (!empty($disabledDates)) {
$disabledDates = str_replace("\r\n", "\n", $disabledDates);
$disabledDates = explode("\n", $disabledDates);
$extras['disabledDates'] = $disabledDates;
}
if (isset($disabledWeekDays) && strlen($disabledWeekDays)) {
$disabledWeekDays = str_replace("\r\n", "\n", $disabledWeekDays);
$disabledWeekDays = explode("\n", $disabledWeekDays);
$disabledWeekDays = array_map('intval', $disabledWeekDays);
$extras['disabledWeekDays'] = $disabledWeekDays;
}
// Set the time step (Ex: 5, 10, 15, 30 minutes)
if (!empty($timeStep)) {
$extras['step'] = $timeStep;
}
if (!empty($validationCalendar)) {
list($rule, $otherCalendar) = explode(' ', $validationCalendar);
$otherCalendarData = RSFormProHelper::getComponentProperties($otherCalendar);
$extras['rule'] = $rule.'|'.$otherCalendarData['NAME'];
if (isset($offset) && $offset != 1)
{
$extras['rule'] .= '|' . (int) $offset;
}
}
$extras = $this->parseJSProperties($extras);
$this->calendarOptions[$formId][$customId]['extra'] = $extras;
}
protected function parseJSProperties($extras) {
$properties = array();
if (count($extras)) {
foreach ($extras as $key => $value) {
$properties[] = json_encode($key).': '.json_encode($value);
}
}
return $properties;
}
public function getCalendarOptions() {
return $this->calendarOptions;
}
public function getPosition($formId, $componentId)
{
static $calendars = array();
if (!isset($calendars[$formId]))
{
$calendars[$formId] = RSFormProHelper::componentExists($formId, RSFORM_FIELD_JQUERY_CALENDAR);
}
$position = (int) array_search($componentId, $calendars[$formId]);
return $position;
}
public function printInlineScript($formId)
{
return "RSFormPro.callbacks.addCallback({$formId}, 'changePage', [RSFormPro.jQueryCalendar.hideAllPopupCalendars, {$formId}]);";
}
}