Ejemplo n.º 1
0
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);
    }
}