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'] . '"'; if (!empty($params['goto'])) { $datepicker_options .= ', onSelect: function(dateText, inst) { window.location="' . $params['goto'] . '".replace("%s",$("#' . $params['id'] . '").val()/1000); }'; } static $datepicker_options_common; if (!$datepicker_options_common) { $calendarlib = TikiLib::lib('calendar'); $first = $calendarlib->firstDayofWeek(); if (!is_numeric($first) || !in_array($first, array(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') . "','" . smarty_function_jscalendar_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'] . '" />'; $html .= '<input type="text" class="form-control" id="' . $params['id'] . '_dptxt" value="" />'; // text version of datepicker date $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); } else { if (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 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))'; $headerlib->add_jq_onready('$("#' . $params['id'] . '_dptxt").val(' . $js_val . ').tiki("' . $command . '", "jscalendar", ' . $datepicker_options . ');'); } else { // add timezone info if showing the time $html .= '<span class="description">' . tra('Time zone') . ': ' . $display_tz . '</span>'; // datetime picker $command = 'datetimepicker'; $js_val1 = empty($params['date']) ? '' : ' var dt = new Date(' . $params['date'] . '* 1000); 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 . ');'); } return '<span class="jscal">' . $html . '</span>'; }
function smarty_function_jscalendar($params, $smarty) { global $headerlib, $prefs, $tikilib; if ($prefs['feature_jquery_ui'] === 'y') { // override jscalendar with jQuery UI datepicker static $uiCalendarInstance = 0; $uiCalendarInstance++; 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'] . '"'; if (!empty($params['goto'])) { $datepicker_options .= ', onSelect: function(dateText, inst) { window.location="' . $params['goto'] . '".replace("%s",$("#' . $params['id'] . '").val()/1000); }'; } static $datepicker_options_common; if (!$datepicker_options_common) { $first = $prefs['calendar_firstDayofWeek'] == 'user' ? tra('First day of week: Sunday (its ID is 0) - translators you need to localize this string!') : $prefs['calendar_firstDayofWeek']; if (!is_numeric($first) || !in_array($first, array(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') . "','" . smarty_function_jscalendar_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'] . '" />'; $html .= '<input type="text" id="' . $params['id'] . '_dptxt" value="" />'; // text version of datepicker date // TODO use a parsed version of $prefs['short_date_format'] // Note: JS timestamp is in milliseconds - php is seconds if (!isset($params['showtime']) || $params['showtime'] === 'n') { $command = 'datepicker'; $js_val = empty($params['date']) ? '""' : '$.datepicker.formatDate( "yy-mm-dd", new Date(' . $params['date'] . '* 1000))'; $headerlib->add_jq_onready('$("#' . $params['id'] . '_dptxt").val(' . $js_val . ').tiki("' . $command . '", "jscalendar", {altField: "#' . $params['id'] . '"});'); } else { // datetime picker $command = 'datetimepicker'; /* css for timepicker */ $headerlib->add_css(' .ui-timepicker-div .ui-widget-header{ margin-bottom: 8px; } .ui-timepicker-div dl{ text-align: left; } .ui-timepicker-div dl dt{ height: 25px; } .ui-timepicker-div dl dd{ margin: -25px 0 10px 65px; } .ui-timepicker-div td { font-size: 90%; }'); $headerlib->add_jsfile('lib/jquery/jquery-ui-timepicker-addon.js'); $js_val1 = empty($params['date']) ? '' : ' var dt = new Date(' . $params['date'] . '* 1000); var tm = { hour: dt.getHours(), minute: dt.getMinutes(), second: dt.getSeconds() }; '; $js_val2 = empty($params['date']) ? '""' : '$.datepicker.formatDate( "yy-mm-dd", dt) + " " + $.timepicker._formatTime(tm)'; $headerlib->add_jq_onready($js_val1 . '$("#' . $params['id'] . '_dptxt").val(' . $js_val2 . ').tiki("' . $command . '", "jscalendar", {altField: "#' . $params['id'] . '",altFieldTimeOnly:false});'); } return $html; } else { echo smarty_function_jscalendar_body($params, $smarty); } }