<?php
/**
* @version $Id$
* @package Elxis
* @subpackage Helpers / Calendar
* @copyright Copyright (c) 2006-2019 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author Elxis Team ( http://www.elxis.org )
* @description Elxis CMS is free software. Read the license for copyright notices and details
*/
defined('_ELXIS_') or die ('Direct access to this location is not allowed');
class elxisCalendarHelper {
private $options = array();
private $idx = 1;
/*********************/
/* MAGIC CONSTRUCTOR */
/*********************/
public function __construct() {
}
/***********************/
/* SET CALENDAR OPTION */
/***********************/
public function setOption($option, $value) {
switch ($option) {
case 'reverseWheel': $this->options[$option] = (bool)$value; break; //default: false
case 'animation': $this->options[$option] = (bool)$value; break; //default: true
case 'cont': $this->options[$option] = trim($value); break; //value: container element id (for inline display)
case 'bottomBar': $this->options[$option] = (bool)$value; break; //default: true
case 'fdow': $this->options[$option] = (int)$value; break; //first day of the week, values: 0, 1, ..., 6
case 'min': $this->options[$option] = trim($value); break; //value: YYMMDD
case 'max': $this->options[$option] = trim($value); break; //value: YYMMDD
case 'weekNumbers': $this->options[$option] = (bool)$value; break; //default: false
case 'checkRange': $this->options[$option] = (bool)$value; break; //default: false
case 'align': $this->options[$option] = trim($value); break; //default: empty
case 'opacity': $this->options[$option] = (int)$value; break; //default: 1, values: 0, 1, 2, 3
case 'titleFormat': $this->options[$option] = trim($value); break; //default: %b %Y
case 'showTime': //default: false, values: false, 12, 24 (boolean or integer)
$this->options[$option] = is_bool($value) ? (bool)$value : (int)$value;
break;
case 'timePos': $this->options[$option] = trim($value); break; //default: right, values: left, right
case 'time': $this->options[$option] = (int)$value; break; //default: auto, values: HHMM (24h clock)
case 'minuteStep': $this->options[$option] = (int)$value; break; //default: 5
case 'fixed': $this->options[$option] = (bool)$value; break; //default: false
case 'noScroll': $this->options[$option] = (bool)$value; break; //default: false
case 'inputField': $this->options[$option] = trim($value); break; //value: input element id
case 'trigger': $this->options[$option] = trim($value); break; //value: trigger element id
case 'dateFormat': $this->options[$option] = trim($value); break; //value: input date format
case 'date': $this->options[$option] = (int)$value; break; //value: YYMMDD
case 'selectionType': $this->options[$option] = trim($value); break; //value: Calendar.SEL_SINGLE or Calendar.SEL_MULTIPLE
case 'selection': $this->options[$option] = trim($value); break; //value: js array of YYMMDD
case 'onSelect':
case 'onChange':
case 'onTimeChange':
case 'disabled':
case 'dateInfo':
case 'onFocus':
case 'onBlur':
$this->options[$option] = trim($value);
break; //value: js callback
default: break;
}
}
/************************/
/* SET CALENDAR OPTIONS */
/************************/
public function setOptions($options) {
if (is_array($options) && (count($options) > 0)) {
foreach ($options as $option => $value) {
$this->setOption($option, $value);
}
}
}
/***********************************************/
/* ADD REQUIRED JAVASCRIPT AND CSS TO DOCUMENT */
/***********************************************/
private function prepareCalendar() {
if (defined('ELXIS_CALENDAR')) { return; }
$eDoc = eFactory::getDocument();
$caldir = eFactory::getElxis()->secureBase().'/includes/js/calendar';
$eDoc->addLibrary('calendar', $caldir.'/calendar.js', '1.9');
$lang = eFactory::getLang()->currentLang();
if (!file_exists(ELXIS_PATH.'/includes/js/calendar/lang/'.$lang.'.js')) { $lang = 'en'; }
$eDoc->addScriptLink($caldir.'/lang/'.$lang.'.js');
$eDoc->addStyleLink($caldir.'/css/calendar.css', 'text/css', 'all');
$eDoc->addStyleLink($caldir.'/css/border-radius.css', 'text/css', 'all');
$eDoc->addStyleLink($caldir.'/css/steel/steel.css', 'text/css', 'all');
define('ELXIS_CALENDAR', 1);
}
/**************************************************************/
/* CONVERT A PHP FORMATTED DATE TO CALENDAR COMPATIBLE FORMAT */
/**************************************************************/
private function convertFormat($format) {
$format = str_replace('i', 'M', $format);
$format = str_replace('s', 'S', $format);
$format = str_replace('Y-m-d', '%Y-%m-%d', $format);
$format = str_replace('Y/m/d', '%Y/%m/%d', $format);
$format = str_replace('d-m-Y', '%d-%m-%Y', $format);
$format = str_replace('d/m/Y', '%d/%m/%Y', $format);
$format = str_replace('m-d-Y', '%m-%d-%Y', $format);
$format = str_replace('m/d/Y', '%m/%d/%Y', $format);
$format = str_replace('H:M:S', '%H:%M:%S', $format);
$format = str_replace('H:M', '%H:%M', $format);
return $format;
}
/**************************/
/* MAKE CALENDAR INSTANCE */
/**************************/
public function makeCalendar($elementid, $triggerid, $format='', $idx=0, $options=array(), $with_input=false, $element_name='', $initial_date='') {
if (trim($format) == '') {
$format = (strlen($initial_date) == 19) ? eFactory::getLang()->get('DATE_FORMAT_BOX_LONG') : eFactory::getLang()->get('DATE_FORMAT_BOX');
}
$boxtitle = $format.' ('.eFactory::getDate()->getTimezone().')';
$format = $this->convertFormat($format);
if (intval($idx) > 0) { $this->idx = (int)$idx; } else { $this->idx = rand(1, 100); }
if (is_array($options) && (count($options) > 0)) { $this->setOptions($options); }
$this->prepareCalendar();
$boxsize = 10;
if (!isset($this->options['onSelect'])) { $this->setOption('onSelect', 'function(cal'.$this->idx.') { this.hide() }'); }
if (strpos($format, 'H') !== false) { $this->setOption('showTime', 24); $boxsize = 19; }
$n = count($this->options);
$js = '';
if ($with_input === true) {
if ($element_name == '') { $element_name = $elementid; }
$img = eFactory::getElxis()->icon('calendar', 16);
$js .= '<input type="text" name="'.$element_name.'" id="'.$elementid.'" value="'.$initial_date.'" size="'.$boxsize.'" class="inputbox" title="'.$boxtitle.'" />'."\n";
$js .= '<img src="'.$img.'" id="'.$triggerid.'" alt="calendar" style="vertical-align:top; margin:2px 2px 0 2px;" />'."\n";
}
$js .= '<script>'."\n";
$js .= 'var cal'.$this->idx.' = Calendar.setup({'."\n";
if ($n > 0) {
$i = 1;
foreach ($this->options as $option => $value) {
$js .= "\t".$option.': ';
if (is_int($value)) {
$js .= $value;
} elseif (is_bool($value)) {
$js .= ($value === true) ? 'true' : 'false';
} else { //string
if (in_array($option, array('selectionType', 'selection'))) {
$js .= $value;
} elseif (in_array($option, array('selectionType', 'selection', 'onSelect', 'onChange', 'onTimeChange', 'disabled', 'dateInfo', 'onFocus', 'onBlur'))) {
$js .= $value;
} else {
$js .= '\''.$value.'\'';
}
}
$js .= ($i >= $n) ? "\n" : ",\n";
$i++;
}
}
$js .= "});\n";
$js .= 'cal'.$this->idx.'.manageFields(\''.$triggerid.'\', \''.$elementid.'\', \''.$format.'\');'."\n";
$js .= "</script>\n";
$this->resetOptions();
return $js;
}
/**************************/
/* RESET CALENDAR OPTIONS */
/**************************/
private function resetOptions() {
$this->options = array();
}
}
?>