You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

214 lines
11 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/**
* @param $params
* - id: id attribute for the input element
* - fieldname: name attribute for the input element
* - date: date to display in the input field; default is now
* - showtime: show timepicker in addition to date
* - goto:
* - notAfter:
* - notBefore:
* - isutc:
*
* @param $smarty
*
* @return string
* @throws Exception
*/
function smarty_function_jscalendar($params, $smarty)
{
global $prefs;
$headerlib = TikiLib::lib('header');
$tikilib = TikiLib::lib('tiki');
$uiCalendarInstance = uniqid();
if (! isset($params['id'])) {
$params['id'] = 'uiCal_' . $uiCalendarInstance;
}
$id = '';
$selector = "#$id";
if (isset($params['fieldname'])) {
$name = ' name="' . $params['fieldname'] . '"';
} else {
$name = '';
}
if (! isset($params['date'])) {
// if date is provided empty then show a blank date (for filters)
$params['date'] = $tikilib->now;
}
$datepicker_options = '{ altField: "#' . $params['id'] . '", onClose: function(dateText, inst) {' .
'$(inst.settings.altField).removeClass("isDatepicker");' .
'$.datepickerAdjustAltField("' . ((! isset($params['showtime']) || $params['showtime'] === 'n') ? 'datepicker' : 'datetimepicker') . '", inst);' .
'}';
if (! empty($params['goto'])) {
$datepicker_options .= ', onSelect: function(dateText, inst) { window.location="' .
$params['goto'] . '".replace("%s",$("#' . $params['id'] . '").val()/1000); }';
}
if (! empty($params['notAfter'])) {
$datepicker_options .= ', onSelect: function (selectedDateTime) {
$("' . $params['notAfter'] . '").find(".isDatepicker").datetimepicker("option", "minDate", selectedDateTime); }';
}
if (! empty($params['notBefore'])) {
$datepicker_options .= ', onSelect: function (selectedDateTime) {
$("' . $params['notBefore'] . '").find(".isDatepicker").datetimepicker("option", "maxDate", selectedDateTime); }';
}
static $datepicker_options_common;
if (! $datepicker_options_common) {
$calendarlib = TikiLib::lib('calendar');
$first = $calendarlib->firstDayofWeek();
if (! is_numeric($first) || ! in_array($first, [0, 1, 2, 3, 4, 5, 6])) {
$first = 0;
}
$datepicker_options_common .= ', firstDay: ' . $first;
$datepicker_options_common .= ", closeText: '" . smarty_function_jscalendar_tra('Done') . "'";
$datepicker_options_common .= ", prevText: '" . smarty_function_jscalendar_tra('Prev') . "'";
$datepicker_options_common .= ", nextText: '" . smarty_function_jscalendar_tra('Next') . "'";
$datepicker_options_common .= ", currentText: '" . smarty_function_jscalendar_tra('Today') . "'";
$datepicker_options_common .= ", weekHeader: '" . smarty_function_jscalendar_tra('Wk') . "'";
$datepicker_options_common .= ", dayNames: ['" .
smarty_function_jscalendar_tra('Sunday') . "','" .
smarty_function_jscalendar_tra('Monday') . "','" .
smarty_function_jscalendar_tra('Tuesday') . "','" .
smarty_function_jscalendar_tra('Wednesday') . "','" .
smarty_function_jscalendar_tra('Thursday') . "','" .
smarty_function_jscalendar_tra('Friday') . "','" .
smarty_function_jscalendar_tra('Saturday') . "']";
$datepicker_options_common .= ", dayNamesMin: ['" .
smarty_function_jscalendar_tra('Su') . "','" .
smarty_function_jscalendar_tra('Mo') . "','" .
smarty_function_jscalendar_tra('Tu') . "','" .
smarty_function_jscalendar_tra('We') . "','" .
smarty_function_jscalendar_tra('Th') . "','" .
smarty_function_jscalendar_tra('Fr') . "','" .
smarty_function_jscalendar_tra('Sa') . "']";
$datepicker_options_common .= ", dayNamesShort: ['" .
smarty_function_jscalendar_tra('Sun') . "','" .
smarty_function_jscalendar_tra('Mon') . "','" .
smarty_function_jscalendar_tra('Tue') . "','" .
smarty_function_jscalendar_tra('Wed') . "','" .
smarty_function_jscalendar_tra('Thu') . "','" .
smarty_function_jscalendar_tra('Fri') . "','" .
smarty_function_jscalendar_tra('Sat') . "']";
$datepicker_options_common .= ", monthNames: ['" .
smarty_function_jscalendar_tra('January') . "','" .
smarty_function_jscalendar_tra('February') . "','" .
smarty_function_jscalendar_tra('March') . "','" .
smarty_function_jscalendar_tra('April') . "','" .
smarty_function_jscalendar_tra('May') . "','" .
smarty_function_jscalendar_tra('June') . "','" .
smarty_function_jscalendar_tra('July') . "','" .
smarty_function_jscalendar_tra('August') . "','" .
smarty_function_jscalendar_tra('September') . "','" .
smarty_function_jscalendar_tra('October') . "','" .
smarty_function_jscalendar_tra('November') . "','" .
smarty_function_jscalendar_tra('December') . "']";
$datepicker_options_common .= ", monthNamesShort: ['" .
smarty_function_jscalendar_tra('Jan') . "','" .
smarty_function_jscalendar_tra('Feb') . "','" .
smarty_function_jscalendar_tra('Mar') . "','" .
smarty_function_jscalendar_tra('Apr') . "','" .
smarty_function_jscalendar_tra('May') . "','" .
smarty_function_jscalendar_tra('Jun') . "','" . //get_strings tra('Jun')
smarty_function_jscalendar_tra('Jul') . "','" . //get_strings tra('Jul')
smarty_function_jscalendar_tra('Aug') . "','" .
smarty_function_jscalendar_tra('Sep') . "','" .
smarty_function_jscalendar_tra('Oct') . "','" .
smarty_function_jscalendar_tra('Nov') . "','" .
smarty_function_jscalendar_tra('Dec') . "']";
$datepicker_options_common .= '}';
}
$datepicker_options .= $datepicker_options_common;
$html = '<input type="hidden" id="' . $params['id'] . '"' . $name . ' value="' . $params['date'] . '" class="isDatepicker">';
$html .= '<input type="hidden" id="' . $params['id'] . '_tzoffset" name="tzoffset" value="">';
$html .= '<input type="hidden" id="' . $params['id'] . '_tzname" name="tzname" value="">';
$headerlib->add_jq_onready('$("input#' . $params['id'] . '_tzoffset").val((new Date('.(int)$params['date'].'*1000)).getTimezoneOffset());');
$headerlib->add_jq_onready('try { $("input#' . $params['id'] . '_tzname").val(Intl.DateTimeFormat().resolvedOptions().timeZone); } catch(e) {}');
if (isset($params['isutc']) && $params['isutc'] && intval($params['date']) > 0) {
$headerlib->add_jq_onready('$("#' . $params['id'] . '").val(' . (int)$params['date'] . ' + parseInt($("input#' . $params['id'] . '_tzoffset").val())*60);');
}
$html .= '<input type="text" class="form-control isDatepicker" id="' . $params['id'] . '_dptxt" value="">'; // text version of datepicker date
$headerlib->add_jq_onready('$("#' . $params['id'] . '_dptxt").change(function(e){' .
'var inst = $.datepicker._getInst(this);' .
'$.datepickerAdjustAltField("' . ( ! isset($params['showtime']) || $params['showtime'] === 'n' ? 'datepicker' : 'datetimepicker' ) . '", inst);' .
'})');
$headerlib->add_jq_onready('$("#' . $params['id'] . '").change(function(e){' .
'$("input#' . $params['id'] . '_tzoffset").val((new Date(parseInt($(this).val())*1000)).getTimezoneOffset());' .
'})');
$display_tz = $tikilib->get_display_timezone();
if ($display_tz == '') {
$display_tz = 'UTC';
}
if (strpos($display_tz, 'Etc/GMT+') !== false) {
$display_tz = str_replace('Etc/GMT+', 'GMT-', $display_tz);
} elseif (strpos($display_tz, 'Etc/GMT-') !== false) {
$display_tz = str_replace('Etc/GMT-', 'GMT+', $display_tz);
}
// TODO use a parsed version of $prefs['short_date_format']
// Note: JS timestamp is in milliseconds - php is seconds
// Note: adding local browser offset if php date is in UTC, see JsCalendar tracker field
if (! isset($params['showtime']) || $params['showtime'] === 'n') {
$command = 'datepicker';
$js_val = empty($params['date']) ? '""' : '$.datepicker.formatDate( "' .
$prefs['short_date_format_js'] . '", new Date(' . $params['date'] . '* 1000 + ' . (isset($params['isutc']) && $params['isutc'] && intval($params['date']) > 0 ? 'parseInt($("input#' . $params['id'] . '_tzoffset").val())*60*1000' : '0') . '))';
$headerlib->add_jq_onready(
'$("#' . $params['id'] . '_dptxt").val(' . $js_val . ').tiki("' .
$command . '", "jscalendar", ' . $datepicker_options . ');'
);
$timeclass = '';
} else {
// add timezone info if showing the time
$html .= '<div class="description">' . tra('Time zone') . ': ' . $display_tz . '</div>';
// datetime picker
$command = 'datetimepicker';
$js_val1 = empty($params['date']) ? '' : '
var dt = new Date(' . $params['date'] . '* 1000 + ' . (isset($params['isutc']) && $params['isutc'] ? 'parseInt($("input#' . $params['id'] . '_tzoffset").val())*60*1000' : '0') . ');
var tm = { hour: dt.getHours(), minute: dt.getMinutes(), second: dt.getSeconds() };
';
$js_val2 = empty($params['date']) ? '""' : '$.datepicker.formatDate( "' .
$prefs['short_date_format_js'] . '", dt) + " " + $.datepicker.formatTime("' .
$prefs['short_time_format_js'] . '", tm)';
$headerlib->add_jq_onready(
$js_val1 . '$("#' . $params['id'] . '_dptxt").val(' . $js_val2 . ').tiki("' .
$command . '", "jscalendar", ' . $datepicker_options . ');'
);
$timeclass = ' datetime';
}
$smarty->loadPlugin('smarty_function_icon');
$icon = smarty_function_icon(['name' => 'calendar'], $smarty);
$headerlib->add_jq_onready("$('#" . $params['id'] . "').closest('div.jscal').find(' button.ui-datepicker-trigger').empty().append('$icon').addClass('btn btn-sm btn-link').css({'padding' : '0px', 'font-size': '16px'});");
return '<div class="jscal' . $timeclass . '" style="margin-bottom:10px">' . $html . '</div>';
}
function smarty_function_jscalendar_tra($str)
{
return str_replace("'", "\\'", tra($str));
}