986 lines
39 KiB
PHP
986 lines
39 KiB
PHP
<?php
|
|
/**
|
|
* @package JEM
|
|
* @copyright (C) 2013-2024 joomlaeventmanager.net
|
|
* @copyright (C) 2005-2009 Christoph Lukes
|
|
* @license https://www.gnu.org/licenses/gpl-3.0 GNU/GPL
|
|
*/
|
|
|
|
/**
|
|
* Based on
|
|
* @class: activeCalendar
|
|
* @project: Active Calendar
|
|
* @version: 1.2.0;
|
|
* @author: Giorgos Tsiledakis;
|
|
* @date: 23 Feb 2006;
|
|
* @copyright: Giorgos Tsiledakis;
|
|
* @license: GNU LESSER GENERAL PUBLIC LICENSE;
|
|
* Support, feature requests and bug reports please at : https://www.micronetwork.de/activecalendar/
|
|
* Special thanks to Corissia S.A (https://www.corissia.com) for the permission to publish the source code
|
|
* Thanks to Maik Lindner (https://nifox.com) for his help developing this class
|
|
*/
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\Language\Text;
|
|
use Joomla\CMS\Router\Route;
|
|
|
|
#[AllowDynamicProperties]
|
|
class JemCalendar
|
|
{
|
|
/*
|
|
----------------------
|
|
@START CONFIGURATION
|
|
----------------------
|
|
*/
|
|
/*
|
|
********************************************************************************
|
|
You can change below the month and day names, according to your language
|
|
This is just the default configuration. You may set the month and day names by calling setMonthNames() and setDayNames()
|
|
********************************************************************************
|
|
*/
|
|
var $jan="January";
|
|
var $feb="February";
|
|
var $mar="March";
|
|
var $apr="April";
|
|
var $may="May";
|
|
var $jun="June";
|
|
var $jul="July";
|
|
var $aug="August";
|
|
var $sep="September";
|
|
var $oct="October";
|
|
var $nov="November";
|
|
var $dec="December";
|
|
var $sun="Sun";
|
|
var $mon="Mon";
|
|
var $tue="Tue";
|
|
var $wed="Wed";
|
|
var $thu="Thu";
|
|
var $fri="Fri";
|
|
var $sat="Sat";
|
|
|
|
/*
|
|
********************************************************************************
|
|
$startOnSun = false: first day of week is Monday
|
|
$startOnSun = true: first day of week is Sunday
|
|
You may use the method setFirstWeekDay() instead
|
|
********************************************************************************
|
|
*/
|
|
var $startOnSun=false;
|
|
/*
|
|
********************************************************************************
|
|
$rowCount : defines the number of months in a row in yearview (can be also set by the method showYear())
|
|
********************************************************************************
|
|
*/
|
|
var $rowCount=4;
|
|
/*
|
|
********************************************************************************
|
|
Names of the generated html classes. You may change them to avoid any conflicts with your existing CSS
|
|
********************************************************************************
|
|
*/
|
|
var $cssYearTable="year"; // table tag: calendar year
|
|
var $cssYearTitle="yearname"; // td tag: calendar year title
|
|
var $cssYearNav="yearnavigation"; // td tag: calendar year navigation
|
|
var $cssMonthTable="month"; // table tag: calendar month
|
|
var $cssMonthTitle="monthname"; // td tag: calendar month title
|
|
var $cssMonthNav="monthnavigation"; // td tag: calendar month navigation
|
|
var $cssWeekDay="dayname"; // td tag: calendar weekdays
|
|
var $cssWeekNumTitle="weeknumtitle"; // td tag: title of the week numbers
|
|
var $cssWeekNum="weeknum"; // td tag: week numbers
|
|
var $cssPicker="datepicker"; // td tag: date picker
|
|
var $cssPickerForm="datepickerform"; // form tag: date picker form
|
|
var $cssPickerMonth="monthpicker"; // select tag: month picker
|
|
var $cssPickerYear="yearpicker"; // select tag: year picker
|
|
var $cssPickerButton="pickerbutton"; // input (submit) tag: date picker button
|
|
var $cssMonthDay="monthday"; // td tag: days, that belong to the current month
|
|
var $cssNoMonthDay="nomonthday"; // td tag: days, that do not belong to the current month
|
|
var $cssToday="today"; // td tag: the current day
|
|
var $cssSelecDay="selectedday"; // td tag: the selected day
|
|
var $cssSunday="sunday"; // td tag: all Sundays (can be disabled, see below)
|
|
var $cssSaturday="saturday"; // td tag: all Saturdays (can be disabled, see below)
|
|
var $cssEvent="event"; // td tag: event day set by setEvent(). Multiple class names can be generated
|
|
var $cssPrefixSelecEvent="selected"; // prefix for the event class name if the event is selected
|
|
var $cssPrefixTodayEvent="today"; // prefix for the event class name if the event is the current day
|
|
var $cssEventContent="eventcontent"; // table tag: calendar event content. Multiple class names can be generated
|
|
var $crSunClass=true; // true: creates a td class on every Sunday (set above)
|
|
var $crSatClass=true; // true: creates a td class on every Saturday (set above)
|
|
/*
|
|
********************************************************************************
|
|
You can change below the GET VARS NAMES [url parameter names] (navigation + day links)
|
|
You should modify the private method mkUrl() or mkWeekNum(), if you want to change the structure of the generated links
|
|
********************************************************************************
|
|
*/
|
|
var $yearID="yearID";
|
|
var $monthID="monthID";
|
|
var $dayID="dayID";
|
|
var $weekID="weekID";
|
|
/*
|
|
********************************************************************************
|
|
Default start and end year for the date picker (can be changed, if using the ADOdb Date Library)
|
|
********************************************************************************
|
|
*/
|
|
var $startYear=1971;
|
|
var $endYear=2037;
|
|
/*
|
|
----------------------
|
|
@START PUBLIC METHODS
|
|
----------------------
|
|
*/
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC activeCalendar() -> class constructor, does the initial date calculation
|
|
$GMTDiff: GMT Zone for current day calculation, do not set to use local server time
|
|
********************************************************************************
|
|
*/
|
|
public function __construct($year=false,$month=false,$day=false,$GMTDiff="none") {
|
|
$this->timetoday=time();
|
|
$this->selectedday=-2;
|
|
$this->selectedyear=$year;
|
|
$this->selectedmonth=$month;
|
|
if (!$month) $month=1;
|
|
if (!$day) $day=1;
|
|
else $this->selectedday=$day;
|
|
$h=$this->mkActiveGMDate("H");
|
|
$m=$this->mkActiveGMDate("i");
|
|
$s=$this->mkActiveGMDate("s");
|
|
$d=$this->mkActiveGMDate("j");
|
|
$mo=$this->mkActiveGMDate("n");
|
|
$y=$this->mkActiveGMDate("Y");
|
|
$is_dst=$this->mkActiveDate("I");
|
|
if ($GMTDiff!="none") $this->timetoday=$this->mkActiveTime($h,$m,$s,$mo,$d,$y)+(3600*($GMTDiff+$is_dst));
|
|
$this->unixtime=$this->mkActiveTime($h,$m,$s,$month,$day,$year);
|
|
if ($this->unixtime==-1 || !$year) $this->unixtime=$this->timetoday;
|
|
$this->daytoday=$this->mkActiveDate("j");
|
|
$this->monthtoday=$this->mkActiveDate("n");
|
|
$this->yeartoday=$this->mkActiveDate("Y");
|
|
if (!$day) $this->actday=$this->daytoday;
|
|
else $this->actday=$this->mkActiveDate("j",$this->unixtime);
|
|
if (!$month) $this->actmonth=$this->monthtoday;
|
|
else $this->actmonth=$this->mkActiveDate("n",$this->unixtime);
|
|
if (!$year) $this->actyear=$this->yeartoday;
|
|
else $this->actyear=$this->mkActiveDate("Y",$this->unixtime);
|
|
$this->has31days=checkdate($this->actmonth,31,$this->actyear);
|
|
$this->isSchalt=checkdate(2,29,$this->actyear);
|
|
if ($this->isSchalt==1 && $this->actmonth==2) $this->maxdays=29;
|
|
elseif ($this->isSchalt!=1 && $this->actmonth==2) $this->maxdays=28;
|
|
elseif ($this->has31days==1) $this->maxdays=31;
|
|
else $this->maxdays=30;
|
|
$this->firstday=$this->mkActiveDate("w", $this->mkActiveTime(0,0,1,$this->actmonth,1,$this->actyear));
|
|
$this->GMTDiff=$GMTDiff;
|
|
|
|
/*
|
|
********************************************************************************
|
|
You can change below the default year's and month's view navigation controls
|
|
********************************************************************************
|
|
*/
|
|
|
|
if (version_compare(JVERSION, '5.0.0', '>=')) {
|
|
// Joomla 5
|
|
$this->yearNavBack=" <i class='fa-solid fa-backward'></i> "; // Previous year
|
|
$this->yearNavForw=" <i class='fa-solid fa-forward'></i> "; // Next year
|
|
$this->monthNavBack=" <i class='fa-solid fa-backward-step'></i> "; // Previous month
|
|
$this->monthNavForw=" <i class='fa-solid fa-forward-step'></i> "; // Next month
|
|
} elseif (version_compare(JVERSION, '4.0.0', '>=')) {
|
|
// Joomla 4
|
|
$this->yearNavBack=" << "; // Previous year, this could be an image link
|
|
$this->yearNavForw=" >> "; // Next year, this could be an image link
|
|
$this->monthNavBack=" << "; // Previous month, this could be an image link
|
|
$this->monthNavForw=" >> "; // Next month, this could be an image link
|
|
}
|
|
$this->selBtn="Go"; // value of the date picker button (if enabled)
|
|
$this->monthYearDivider=" "; // the divider between month and year in the month`s title
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC enableYearNav() -> enables the year's navigation controls
|
|
********************************************************************************
|
|
*/
|
|
function enableYearNav($link=false,$arrowBack=false,$arrowForw=false) {
|
|
if ($link) $this->urlNav=$link;
|
|
if ($arrowBack) $this->yearNavBack=$arrowBack;
|
|
if ($arrowForw) $this->yearNavForw=$arrowForw;
|
|
$this->yearNav=true;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC enableMonthNav() -> enables the month's navigation controls
|
|
********************************************************************************
|
|
*/
|
|
function enableMonthNav($link=false,$arrowBack=false,$arrowForw=false) {
|
|
if ($link) $this->urlNav=$link;
|
|
if ($arrowBack) $this->monthNavBack=$arrowBack;
|
|
if ($arrowForw) $this->monthNavForw=$arrowForw;
|
|
$this->monthNav=true;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC enableDayLinks() -> enables the day links
|
|
param javaScript: sets a Javascript function on each day link
|
|
********************************************************************************
|
|
*/
|
|
function enableDayLinks($link=false,$javaScript=false) {
|
|
if ($link) $this->url=$link;
|
|
if ($javaScript) $this->javaScriptDay=$javaScript;
|
|
$this->dayLinks=true;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC enableNewEventLinks() -> enables links on each day to create new events
|
|
param link: full html template with token "{date}" to get day's date
|
|
********************************************************************************
|
|
*/
|
|
function enableNewEventLinks($link) {
|
|
if ($link && (stripos($link, '{date}') !== false)) {
|
|
$this->htmlNewEventLink = $link;
|
|
$this->dayNewEventLinks = true;
|
|
} else {
|
|
$this->dayNewEventLinks = false;
|
|
}
|
|
|
|
return $this->dayNewEventLinks;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC enableDatePicker() -> enables the day picker control
|
|
********************************************************************************
|
|
*/
|
|
function enableDatePicker($startYear=false,$endYear=false,$link=false,$button=false) {
|
|
if ($link) $this->urlPicker=$link;
|
|
if ($startYear && $endYear) {
|
|
if ($startYear>=$this->startYear && $startYear<$this->endYear) $this->startYear=$startYear;
|
|
if ($endYear>$this->startYear && $endYear<=$this->endYear) $this->endYear=$endYear;
|
|
}
|
|
if ($button) $this->selBtn=$button;
|
|
$this->datePicker=true;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC enableWeekNum() -> enables a week number column
|
|
********************************************************************************
|
|
*/
|
|
function enableWeekNum($title="",$link=false,$javaScript=false) {
|
|
// checking before enabling, as week number calulation works only if php version > 4.1.0 [php function: date ("W")]
|
|
if (is_integer($this->getWeekNum($this->actday))) {
|
|
$this->weekNum=true;
|
|
$this->weekNumTitle=$title;
|
|
$this->monthSpan++;
|
|
|
|
if (empty($link)) {
|
|
$this->weekUrl='';
|
|
} else {
|
|
$this->weekUrl=$link;
|
|
}
|
|
|
|
if (empty($javaScript)) {
|
|
$this->javaScriptWeek='';
|
|
} else {
|
|
$this->javaScriptWeek=$javaScript;
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC setEvent() -> sets a calendar event, $id: the HTML class (css layout)
|
|
********************************************************************************
|
|
*/
|
|
function setEvent($year,$month,$day,$id=false,$url=false) {
|
|
$eventTime=$this->mkActiveTime(0,0,1,$month,$day,$year);
|
|
if (!$id) $id=$this->cssEvent;
|
|
$this->calEvents[$eventTime]=$id;
|
|
$this->calEventsUrl[$eventTime]=$url;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC setEventContent() -> sets a calendar event content,
|
|
$content: can be a string or an array, $id: the HTML class (css layout)
|
|
********************************************************************************
|
|
*/
|
|
/**
|
|
* set event content
|
|
*
|
|
* @param int $year
|
|
* @param int $month
|
|
* @param int $day
|
|
* @param string or array $content
|
|
* @param string $url
|
|
* @param string $id the HTML class
|
|
*/
|
|
function setEventContent($year, $month, $day, $content, $url=false, $id=false)
|
|
{
|
|
// event time
|
|
$eventTime = $this->mkActiveTime(0, 0, 1, $month, $day, $year);
|
|
|
|
// add to eventcontent array
|
|
$eventContent[$eventTime] = $content;
|
|
$this->calEventContent[] = $eventContent;
|
|
|
|
// add specific id
|
|
if (!$id) $id = $this->cssEventContent;
|
|
$this->calEventContentId[] = $id;
|
|
|
|
// add url
|
|
if ($url) $this->calEventContentUrl[] = $url;
|
|
else $this->calEventContentUrl[] = $this->calInit++;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC setMonthNames() -> sets the month names, $namesArray must be an array of 12 months starting with January
|
|
********************************************************************************
|
|
*/
|
|
function setMonthNames($namesArray) {
|
|
if (!is_array($namesArray) || count($namesArray)!=12) return false;
|
|
else $this->monthNames=$namesArray;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC setDayNames() -> sets the week day names, $namesArray must be an array of 7 days starting with Sunday
|
|
********************************************************************************
|
|
*/
|
|
function setDayNames($namesArray) {
|
|
if (!is_array($namesArray) || count($namesArray)!=7) return false;
|
|
else $this->dayNames=$namesArray;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC setFirstWeekDay() -> sets the first day of the week, currently only Sunday and Monday supported, $daynum=0 -> Sunday
|
|
********************************************************************************
|
|
*/
|
|
function setFirstWeekDay($daynum) {
|
|
if ($daynum==0) $this->startOnSun=true;
|
|
else $this->startOnSun=false;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC showYear() -> returns the year's view as html table string
|
|
Each private method returns a tr tag of the table as a string.
|
|
You can change the calendar structure by simply calling these private methods in another order
|
|
********************************************************************************
|
|
*/
|
|
function showYear($rowCount=false,$startMonth=false) {
|
|
if ($rowCount) $this->rowCount=$rowCount;
|
|
$this->monthNav=false; // disables month navigation in yearview
|
|
$out=$this->mkYearHead(); // this should remain first: opens table tag
|
|
$out.=$this->mkYearTitle(); // tr tag: year title and navigation
|
|
$out.=$this->mkDatePicker("yearonly"); // tr tag: year date picker (only year selection)
|
|
$this->datePicker=false; // disables month date picker in yearview
|
|
$out.=$this->mkYearBody($startMonth); // tr tag(s): year month (html tables)
|
|
$out.=$this->mkYearFoot(); // this should remain last: closes table tag
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PUBLIC showMonth() -> returns the month's view as html table string
|
|
Each private method returns a tr tag of the table as a string.
|
|
You can change the calendar structure by simply calling these private methods in another order
|
|
$showNoMonthDays = false: days, that do not belong to the current month, will not be displayed
|
|
$showNoMonthDays = true: days, that do not belong to the current month, will be displayed
|
|
(note: these 'noMonthDays' will not contain any events or eventcontents!)
|
|
********************************************************************************
|
|
*/
|
|
function showMonth($showNoMonthDays=false) {
|
|
$this->showNoMonthDays=$showNoMonthDays;
|
|
$out=$this->mkMonthHead(); // this should remain first: opens table tag
|
|
$out.=$this->mkMonthTitle(); // tr tag: month title and navigation
|
|
$out.=$this->mkDatePicker(); // tr tag: month date picker (month and year selection)
|
|
$out.=$this->mkWeekDays(); // tr tag: the weekday names
|
|
if ($this->showNoMonthDays==false) $out.=$this->mkMonthBody(); // tr tags: the days of the month
|
|
else $out.=$this->mkMonthBody(1); // tr tags: the days of the month
|
|
$out.=$this->mkMonthFoot(); // this should remain last: closes table tag
|
|
return $out;
|
|
}
|
|
/*
|
|
----------------------
|
|
@START PRIVATE METHODS
|
|
----------------------
|
|
*/
|
|
/*
|
|
********************************************************************************
|
|
THE FOLLOWING METHODS AND VARIABLES ARE PRIVATE. PLEASE DO NOT CALL OR MODIFY THEM
|
|
********************************************************************************
|
|
*/
|
|
var $version="1.2.0";
|
|
var $releaseDate="23 Feb 2006";
|
|
var $monthSpan=7;
|
|
var $timezone=false;
|
|
var $yearNav=false;
|
|
var $monthNav=false;
|
|
var $dayLinks=false;
|
|
var $dayNewEventLinks=false;
|
|
var $datePicker=false;
|
|
var $url=false;
|
|
var $urlNav=false;
|
|
var $urlPicker=false;
|
|
var $htmlNewEventLink=false;
|
|
var $calEvents=false;
|
|
var $calEventsUrl=false;
|
|
var $eventUrl=false;
|
|
var $javaScriptDay=false;
|
|
var $monthNames=false;
|
|
var $dayNames=false;
|
|
var $calEventContent=[];
|
|
var $calEventContentUrl=[];
|
|
var $calEventContentId=[];
|
|
var $calInit=0;
|
|
var $weekNum=false;
|
|
var $WeekUrl=false;
|
|
var $javaScriptWeek=false;
|
|
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkYearHead() -> creates the year table tag
|
|
********************************************************************************
|
|
*/
|
|
function mkYearHead() {
|
|
return "<table class=\"".$this->cssYearTable."\">\n";
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkYearTitle() -> creates the tile and navigation tr tag of the year table
|
|
********************************************************************************
|
|
*/
|
|
function mkYearTitle() {
|
|
if ($this->rowCount<1 || $this->rowCount>12) $this->rowCount=4;
|
|
if (!$this->yearNav) {
|
|
$out="<tr><td colspan=\"".$this->rowCount."\" class=\"".$this->cssYearTitle."\">";
|
|
$out.=$this->actyear;
|
|
$out.="</td></tr>\n";
|
|
} else {
|
|
$out="<tr><td colspan=\"".$this->rowCount."\" align=\"center\">";
|
|
$out.="<table><tr><td class=\"".$this->cssYearNav."\">";
|
|
$out.=$this->mkUrl($this->actyear-1);
|
|
$out.=$this->yearNavBack."</a></td>";
|
|
$out.="<td class=\"".$this->cssYearTitle."\">".$this->actyear."</td>";
|
|
$out.="<td class=\"".$this->cssYearNav."\">";
|
|
$out.=$this->mkUrl($this->actyear+1);
|
|
$out.=$this->yearNavForw."</a></td></tr></table></td></tr>\n";
|
|
}
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkYearBody() -> creates the tr tags of the year table
|
|
********************************************************************************
|
|
*/
|
|
function mkYearBody($stmonth=false) {
|
|
if (!$stmonth || $stmonth>12) $stmonth=1;
|
|
$TrMaker = $this->rowCount;
|
|
$curyear = $this->actyear;
|
|
$out="<tr>\n";
|
|
for ($x=1; $x<=12; $x++) {
|
|
$this->activeCalendar($curyear,$stmonth,false,$this->GMTDiff);
|
|
$out.="<td valign=\"top\">\n".$this->showMonth()."</td>\n";
|
|
if ($x == $TrMaker && $x < 12) {
|
|
$out.="</tr><tr>";
|
|
$TrMaker = ($TrMaker+$this->rowCount);
|
|
}
|
|
if ($stmonth == 12) {
|
|
$stmonth = 1;
|
|
$curyear++;
|
|
}
|
|
else $stmonth++;
|
|
}
|
|
$out.="</tr>\n";
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkYearFoot() -> closes the year table tag
|
|
********************************************************************************
|
|
*/
|
|
function mkYearFoot() {
|
|
return "</table>\n";
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkMonthHead() -> creates the month table tag
|
|
********************************************************************************
|
|
*/
|
|
function mkMonthHead() {
|
|
return "<table class=\"".$this->cssMonthTable."\">\n";
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkMonthTitle() -> creates the tile and navigation tr tag of the month table
|
|
********************************************************************************
|
|
*/
|
|
function mkMonthTitle() {
|
|
if (!$this->monthNav) {
|
|
$out="<tr><td class=\"".$this->cssMonthTitle."\" colspan=\"".$this->monthSpan."\">";
|
|
$out.=$this->getMonthName().$this->monthYearDivider.$this->actyear;
|
|
$out.="</td></tr>\n";
|
|
} else {
|
|
$out = "<tr><td class=\"".$this->cssMonthNav."\" colspan=\"2\" style=\"text-align:right;\">";
|
|
if ($this->actmonth==1) { // january
|
|
$out.=$this->mkUrl($this->actyear-1,"12");
|
|
} else {
|
|
$out.=$this->mkUrl($this->actyear,$this->actmonth-1);
|
|
}
|
|
$out .= $this->monthNavBack."</a></td>";
|
|
$out .= "<td class=\"".$this->cssMonthTitle."\" colspan=\"".($this->monthSpan-4)."\">";
|
|
$out .= $this->getMonthName().$this->monthYearDivider.$this->actyear."</td>";
|
|
$out .= "<td class=\"".$this->cssMonthNav."\" colspan=\"2\" style=\"text-align:left;\">";
|
|
if ($this->actmonth==12) { //december
|
|
$out.=$this->mkUrl($this->actyear+1,"1");
|
|
}
|
|
else {
|
|
$out.=$this->mkUrl($this->actyear,$this->actmonth+1);
|
|
}
|
|
$out.=$this->monthNavForw."</a></td></tr>\n";
|
|
}
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkDatePicker() -> creates the tr tag for the date picker
|
|
********************************************************************************
|
|
*/
|
|
function mkDatePicker($yearpicker=false) {
|
|
if ($this->datePicker && !empty($this->urlPicker)) {
|
|
if ($yearpicker) $pickerSpan=$this->rowCount;
|
|
else $pickerSpan=$this->monthSpan;
|
|
$out="<tr><td class=\"".$this->cssPicker."\" colspan=\"".$pickerSpan."\">\n";
|
|
$out.="<form name=\"".$this->cssPickerForm."\" class=\"".$this->cssPickerForm."\" action=\"".$this->urlPicker."\" method=\"get\">\n";
|
|
if (!$yearpicker) {
|
|
$out.="<select name=\"".$this->monthID."\" class=\"".$this->cssPickerMonth."\">\n";
|
|
for ($z=1;$z<=12;$z++) {
|
|
if ($z==$this->actmonth) $out.="<option value=\"".$z."\" selected=\"selected\">".$this->getMonthName($z)."</option>\n";
|
|
else $out.="<option value=\"".$z."\">".$this->getMonthName($z)."</option>\n";
|
|
}
|
|
$out.="</select>\n";
|
|
}
|
|
$out.="<select name=\"".$this->yearID."\" class=\"".$this->cssPickerYear."\">\n";
|
|
for ($z=$this->startYear;$z<=$this->endYear;$z++) {
|
|
if ($z==$this->actyear) $out.="<option value=\"".$z."\" selected=\"selected\">".$z."</option>\n";
|
|
else $out.="<option value=\"".$z."\">".$z."</option>\n";
|
|
}
|
|
$out.="</select>\n";
|
|
$out.="<input type=\"submit\" value=\"".$this->selBtn."\" class=\"".$this->cssPickerButton."\"></input>\n";
|
|
$out.="</form>\n";
|
|
$out.="</td></tr>\n";
|
|
}
|
|
else $out="";
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkWeekDays() -> creates the tr tag of the month table for the weekdays
|
|
********************************************************************************
|
|
*/
|
|
function mkWeekDays() {
|
|
if ($this->startOnSun) {
|
|
$out='<tr class="daynamesRow">';
|
|
if ($this->weekNum) $out.="<td class=\"".$this->cssWeekNumTitle."\">".$this->weekNumTitle."</td>";
|
|
for ($x=0;$x<=6;$x++) $out.="<td class=\"".$this->cssWeekDay."\">".$this->getDayName($x)."</td>";
|
|
$out.="</tr>\n";
|
|
} else {
|
|
$out='<tr class="daynamesRow">';
|
|
if ($this->weekNum) $out.="<td class=\"".$this->cssWeekNumTitle."\">".$this->weekNumTitle."</td>";
|
|
for ($x=1;$x<=6;$x++) $out.="<td class=\"".$this->cssWeekDay."\">".$this->getDayName($x)."</td>";
|
|
$out.="<td class=\"".$this->cssWeekDay."\">".$this->getDayName(0)."</td>";
|
|
$out.="</tr>\n";
|
|
$this->firstday=$this->firstday-1;
|
|
if ($this->firstday<0) $this->firstday=6;
|
|
}
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkMonthBody() -> creates the tr tags of the month table
|
|
********************************************************************************
|
|
*/
|
|
function mkMonthBody($showNoMonthDays=0) {
|
|
if ($this->actmonth==1) {
|
|
$pMonth=12;
|
|
$pYear=$this->actyear-1;
|
|
} else{
|
|
$pMonth=$this->actmonth-1;
|
|
$pYear=$this->actyear;
|
|
}
|
|
$out='<tr class="daysRow">';
|
|
$cor=0;
|
|
if ($this->startOnSun) {
|
|
$cor=1;
|
|
}
|
|
if ($this->weekNum) {
|
|
$out.="<td class=\"".$this->cssWeekNum."\">".$this->mkWeekNum(1+$cor)."</td>";
|
|
}
|
|
$monthday=0;
|
|
$nmonthday=1;
|
|
for ($x=0; $x<=6; $x++) {
|
|
if ($x>=$this->firstday) {
|
|
$monthday++;
|
|
$out.=$this->mkDay($monthday);
|
|
} else {
|
|
if ($showNoMonthDays==0) {
|
|
$out.="<td class=\"".$this->cssNoMonthDay."\"></td>";
|
|
} else {
|
|
$out.="<td class=\"".$this->cssNoMonthDay."\">".($this->getMonthDays($pMonth,$pYear)-($this->firstday-1)+$x)."</td>";
|
|
}
|
|
}
|
|
}
|
|
$out.="</tr>\n";
|
|
$goon=$monthday+1;
|
|
$stop=0;
|
|
for ($x=0; $x<=6; $x++) {
|
|
if ($goon>$this->maxdays) {
|
|
break;
|
|
}
|
|
if ($stop==1) {
|
|
break;
|
|
}
|
|
$out.='<tr class="daysRow">';
|
|
if ($this->weekNum) $out.="<td class=\"".$this->cssWeekNum."\">".$this->mkWeekNum($goon+$cor)."</td>";
|
|
for ($i=$goon; $i<=$goon+6; $i++) {
|
|
if ($i>$this->maxdays) {
|
|
if ($showNoMonthDays==0) {
|
|
$out.="<td class=\"".$this->cssNoMonthDay."\"></td>";
|
|
}
|
|
else {
|
|
$out.='<td class="'.$this->cssNoMonthDay.'"><div class="daynum">'.$nmonthday++.'</div></td>';
|
|
}
|
|
$stop=1;
|
|
} else {
|
|
$out.=$this->mkDay($i);
|
|
}
|
|
}
|
|
$goon=$goon+7;
|
|
$out.="</tr>\n";
|
|
}
|
|
$this->selectedday="-2";
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkDay() -> creates each td tag of the month body
|
|
********************************************************************************
|
|
*/
|
|
function mkDay($var) {
|
|
$eventContent = $this->mkEventContent($var);
|
|
$linktext = $var;
|
|
if ($this->dayLinks) {
|
|
if ($eventContent) {
|
|
if ($this->javaScriptDay) {
|
|
$linktext="<a href=\"javascript:".$this->javaScriptDay."(".$this->actyear.",".$this->actmonth.",".$var.")\">".$var."</a>";
|
|
} elseif (!empty($this->url)) {
|
|
$dayurl= Route::_($this->url.(strpos($this->url,"?") === false ? '?' : '&').'id='.sprintf('%04d%02d%02d',$this->actyear,$this->actmonth,$var));
|
|
$linktext="<a href=\"".$dayurl."\">".$var."</a>";
|
|
}
|
|
}
|
|
}
|
|
|
|
$htmlNewEventLink = '';
|
|
if ($this->dayNewEventLinks) {
|
|
$htmlNewEventLink = preg_replace('/{date}/', sprintf('%04d-%02d-%02d', $this->actyear, $this->actmonth, $var), $this->htmlNewEventLink);
|
|
}
|
|
|
|
if ($this->isEvent($var)) {
|
|
if ($this->eventUrl) {
|
|
$out="<td class=\"".$this->eventID."\"><div class=\"daynum\">".$htmlNewEventLink."<a href=\"".$this->eventUrl."\">".$var."</a></div>".$eventContent."</td>";
|
|
$this->eventUrl=false;
|
|
} else {
|
|
$out="<td class=\"".$this->eventID."\"><div class=\"daynum\">".$htmlNewEventLink.$linktext.'</div>'.$eventContent."</td>";
|
|
}
|
|
} else {
|
|
/* allow styling of multiple things like "today is Sunday" */
|
|
$cssClass = array($this->cssMonthDay);
|
|
if (($var == $this->selectedday) && ($this->actmonth == $this->selectedmonth) && ($this->actyear == $this->selectedyear)) {
|
|
$cssClass[] = $this->cssSelecDay;
|
|
}
|
|
if (($var == $this->daytoday) && ($this->actmonth == $this->monthtoday) && ($this->actyear == $this->yeartoday)) {
|
|
$cssClass[] = $this->cssToday;
|
|
}
|
|
if (($this->getWeekday($var) == 0) && $this->crSunClass) {
|
|
$cssClass[] = $this->cssSunday;
|
|
}
|
|
if (($this->getWeekday($var) == 6) && $this->crSatClass) {
|
|
$cssClass[] = $this->cssSaturday;
|
|
}
|
|
$out = "<td class=\"".implode(' ', $cssClass)."\"><div class=\"daynum\" jem-monthname=\"".$this->getMonthName()."\" jem-dayname=\"".$this->getDayName($this->getWeekday($var))."\">".$htmlNewEventLink.$linktext.'</div>'.$eventContent."</td>";
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkMonthFoot() -> closes the month table
|
|
********************************************************************************
|
|
*/
|
|
function mkMonthFoot() {
|
|
return "</table>\n";
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkUrl() -> creates the day and navigation link structure
|
|
********************************************************************************
|
|
*/
|
|
function mkUrl($year, $month=false, $day=false) {
|
|
if (strpos($this->url,"?") === false) {
|
|
$glue="?";
|
|
} else {
|
|
$glue="&";
|
|
}
|
|
if (strpos($this->urlNav,"?") === false) {
|
|
$glueNav="?";
|
|
} else {
|
|
$glueNav="&";
|
|
}
|
|
$yearNavLink = empty($this->urlNav) ? '' : "<a href=\"".Route::_($this->urlNav.$glueNav.$this->yearID."=".$year)."\" rel=\"noindex, nofollow\">";
|
|
$monthNavLink = empty($this->urlNav) ? '' : "<a href=\"".Route::_($this->urlNav.$glueNav.$this->yearID."=".$year."&".$this->monthID."=".$month)."\" rel=\"noindex, nofollow\">";
|
|
$dayLink = empty($this->url) ? $day : "<a href=\"".Route::_($this->url.$glue.$this->yearID."=".$year."&".$this->monthID."=".$month."&".$this->dayID."=".$day)."\">".$day."</a>";
|
|
if ($year && $month && $day) return $dayLink;
|
|
if ($year && !$month && !$day) return $yearNavLink;
|
|
if ($year && $month && !$day) return $monthNavLink;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkEventContent() -> creates the table for the event content
|
|
********************************************************************************
|
|
*/
|
|
/* see below
|
|
function mkEventContent_old($var)
|
|
{
|
|
$hasContent=$this->hasEventContent($var);
|
|
$out="";
|
|
if ($hasContent) {
|
|
for ($x=0;$x<count($hasContent);$x++) {
|
|
foreach($hasContent[$x] as $eventContentid => $eventContentData) {
|
|
foreach($eventContentData as $eventContentUrl => $eventContent) {
|
|
$out.="<table class=\"".$eventContentid."\">";
|
|
if (is_string($eventContent)) {
|
|
if (is_int($eventContentUrl)) {
|
|
$out.="<tr><td>".$eventContent."</td></tr></table>";
|
|
} else {
|
|
$out.="<tr><td><a href=\"".$eventContentUrl."\">".$eventContent."</a></td></tr></table>";
|
|
}
|
|
} else if (is_array($eventContent)) {
|
|
foreach($eventContent as $arrayContent) {
|
|
if (is_int($eventContentUrl)) {
|
|
$out.="<tr><td>".$arrayContent."</td></tr>";
|
|
} else {
|
|
$out.="<tr><td><a href=\"".$eventContentUrl."\">".$arrayContent."</a></td></tr>";
|
|
}
|
|
}
|
|
$out.="</table>";
|
|
}
|
|
else $out="";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $out;
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* creates the div for the event content
|
|
*
|
|
* @param int $var the day
|
|
* @return string
|
|
*/
|
|
function mkEventContent($var) {
|
|
$hasContent=$this->hasEventContent($var);
|
|
$out="";
|
|
if ($hasContent) {
|
|
$n = is_array($hasContent) ? count($hasContent) : 0;
|
|
for ($x = 0; $x < $n; $x++) {
|
|
foreach ($hasContent[$x] as $eventContentid => $eventContentData) {
|
|
foreach ($eventContentData as $eventContentUrl => $eventContent) {
|
|
if (is_string($eventContent)) {
|
|
$eventContent = array($eventContent);
|
|
}
|
|
|
|
foreach($eventContent as $arrayContent) {
|
|
$out .= '<div class="'.$eventContentid.'">';
|
|
if (is_int($eventContentUrl)) {
|
|
$out.= $arrayContent;
|
|
} else {
|
|
$out.='<a href="'.$eventContentUrl.'">'.$arrayContent.'</a>';
|
|
}
|
|
$out.='</div>';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkWeekNum() -> returns the week number and optionally creates a link
|
|
********************************************************************************
|
|
*/
|
|
function mkWeekNum($var) {
|
|
$year=$this->actyear;
|
|
$week=$this->getWeekNum($var);
|
|
if ($week>50 && $this->actmonth==1) $year=$this->actyear-1;
|
|
$out="";
|
|
if ($this->weekUrl) {
|
|
if (strpos($this->weekUrl,"?") === false) $glue="?";
|
|
else $glue="&";
|
|
$out.="<a href=\"".$this->weekUrl.$glue.$this->yearID."=".$year."&".$this->weekID."=".$week."\">".$week."</a>";
|
|
}
|
|
elseif ($this->javaScriptWeek) $out.="<a href=\"javascript:".$this->javaScriptWeek."(".$year.",".$week.")\">".$week."</a>";
|
|
else $out.=$week;
|
|
return $out;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE getMonthName() -> returns the month's name, according to the configuration
|
|
********************************************************************************
|
|
*/
|
|
function getMonthName($var=false) {
|
|
if (!$var) $var=@$this->actmonth;
|
|
if ($this->monthNames) return $this->monthNames[$var-1];
|
|
switch($var) {
|
|
case 1: return Text::_($this->jan);
|
|
case 2: return Text::_($this->feb);
|
|
case 3: return Text::_($this->mar);
|
|
case 4: return Text::_($this->apr);
|
|
case 5: return Text::_($this->may);
|
|
case 6: return Text::_($this->jun);
|
|
case 7: return Text::_($this->jul);
|
|
case 8: return Text::_($this->aug);
|
|
case 9: return Text::_($this->sep);
|
|
case 10: return Text::_($this->oct);
|
|
case 11: return Text::_($this->nov);
|
|
case 12: return Text::_($this->dec);
|
|
}
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE getDayName() -> returns the day's name, according to the configuration
|
|
********************************************************************************
|
|
*/
|
|
function getDayName($var=false) {
|
|
if ($this->dayNames) return $this->dayNames[$var];
|
|
switch($var) {
|
|
case 0: return Text::_($this->sun);
|
|
case 1: return Text::_($this->mon);
|
|
case 2: return Text::_($this->tue);
|
|
case 3: return Text::_($this->wed);
|
|
case 4: return Text::_($this->thu);
|
|
case 5: return Text::_($this->fri);
|
|
case 6: return Text::_($this->sat);
|
|
}
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE getMonthDays() -> returns the number of days of the month specified
|
|
********************************************************************************
|
|
*/
|
|
function getMonthDays($month,$year) {
|
|
$has31days=checkdate($month,31,$year);
|
|
$isSchalt=checkdate(2,29,$year);
|
|
if ($isSchalt==1 && $month==2) $maxdays=29;
|
|
elseif ($isSchalt!=1 && $month==2) $maxdays=28;
|
|
elseif ($has31days==1) $maxdays=31;
|
|
else $maxdays=30;
|
|
return $maxdays;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE getWeekday() -> returns the weekday's number, 0 = Sunday ... 6 = Saturday
|
|
********************************************************************************
|
|
*/
|
|
function getWeekday($var) {
|
|
return $this->mkActiveDate("w", $this->mkActiveTime(0,0,1,$this->actmonth,$var,$this->actyear));
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE getWeekNum() -> returns the week number, php version > 4.1.0, unsupported by the ADOdb Date Library
|
|
********************************************************************************
|
|
*/
|
|
function getWeekNum($var) {
|
|
return date("W", $this->mkActiveTime(0,0,1,$this->actmonth,$var,$this->actyear))+0;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE isEvent() -> checks if a date was set as an event and creates the eventID (css layout) and eventUrl
|
|
********************************************************************************
|
|
*/
|
|
function isEvent($var) {
|
|
if ($this->calEvents) {
|
|
$checkTime=$this->mkActiveTime(0,0,1,$this->actmonth,$var,$this->actyear);
|
|
$selectedTime=$this->mkActiveTime(0,0,1,$this->selectedmonth,$this->selectedday,$this->selectedyear);
|
|
$todayTime=$this->mkActiveTime(0,0,1,$this->monthtoday,$this->daytoday,$this->yeartoday);
|
|
foreach($this->calEvents as $eventTime => $eventID) {
|
|
if ($eventTime==$checkTime) {
|
|
if ($eventTime==$selectedTime) $this->eventID=$this->cssPrefixSelecEvent.$eventID;
|
|
elseif ($eventTime==$todayTime) $this->eventID=$this->cssPrefixTodayEvent.$eventID;
|
|
else $this->eventID=$eventID;
|
|
if ($this->calEventsUrl[$eventTime]) $this->eventUrl=$this->calEventsUrl[$eventTime];
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE hasEventContent() -> checks if an event content was set
|
|
********************************************************************************
|
|
*/
|
|
/**
|
|
* checks if an event content was set for the day
|
|
*
|
|
* @param int $var day of the month
|
|
* @return array
|
|
*/
|
|
function hasEventContent($var) {
|
|
$hasContent = [];
|
|
if ($this->calEventContent) {
|
|
$checkTime = $this->mkActiveTime(0, 0, 1, $this->actmonth, $var, $this->actyear);
|
|
$n = is_array($this->calEventContent) ? count($this->calEventContent) : 0;
|
|
for ($x = 0; $x < $n; $x++) {
|
|
$eventContent = $this->calEventContent[$x];
|
|
$eventContentUrl = $this->calEventContentUrl[$x];
|
|
$eventContentId = $this->calEventContentId[$x];
|
|
foreach ($eventContent as $eventTime => $eventContent) {
|
|
if ($eventTime == $checkTime) $hasContent[][$eventContentId][$eventContentUrl] = $eventContent;
|
|
}
|
|
}
|
|
}
|
|
return $hasContent;
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkActiveDate() -> checks if ADOdb Date Library is loaded and calls the date function
|
|
********************************************************************************
|
|
*/
|
|
function mkActiveDate($param,$acttime=false) {
|
|
if (!$acttime) $acttime=$this->timetoday;
|
|
if (function_exists("adodb_date")) return adodb_date($param,$acttime);
|
|
else return date($param,$acttime);
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkActiveGMDate() -> checks if ADOdb Date Library is loaded and calls the gmdate function
|
|
********************************************************************************
|
|
*/
|
|
function mkActiveGMDate($param,$acttime=false) {
|
|
if (!$acttime) $acttime=time();
|
|
if (function_exists("adodb_gmdate")) return adodb_gmdate($param,$acttime);
|
|
else return gmdate($param,$acttime);
|
|
}
|
|
/*
|
|
********************************************************************************
|
|
PRIVATE mkActiveTime() -> checks if ADOdb Date Library is loaded and calls the mktime function
|
|
********************************************************************************
|
|
*/
|
|
/**
|
|
* checks if ADOdb Date Library is loaded and calls the mktime function
|
|
*
|
|
* @param int $hr
|
|
* @param int $min
|
|
* @param int $sec
|
|
* @param int $month [optional]
|
|
* @param int $day [optional]
|
|
* @param int $year [optional]
|
|
* @return int
|
|
*/
|
|
function mkActiveTime($hr,$min,$sec,$month=false,$day=false,$year=false) {
|
|
if (function_exists("adodb_mktime")) return adodb_mktime($hr,$min,$sec,$month,$day,$year);
|
|
else return mktime($hr,$min,$sec,$month,$day,$year);
|
|
}
|
|
}
|
|
?>
|