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 = ''; $html .= ''; $html .= ''; $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 .= ''; // 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 .= '
' . tra('Time zone') . ': ' . $display_tz . '
'; // 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 '
' . $html . '
'; } function smarty_function_jscalendar_tra($str) { return str_replace("'", "\\'", tra($str)); }