<?php
/**
 * copyright (C) 2008-2022 GWESystems Ltd - All rights reserved
 */

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();

use Joomla\CMS\Language\Text;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\Router\Route;

/**
 * HTML View class for the component frontend
 *
 * @static
 */
class DefaultModCalView
{
	var $_modid = null;

	/* parameters form module or component */
	var $displayLastMonth = null;
	var $disp_lastMonthDays = null;
	var $disp_lastMonth = null;

	var $displayNextMonth = null;
	var $disp_nextMonthDays = null;
	var $disp_nextMonth = null;

	var $linkCloaking = null;

	/* component only parameter */
	var $com_starday = null;

	/* module only parameters */
	var $inc_ec_css = null;
	var $minical_showlink = null;
	var $minical_prevyear = null;
	var $minical_prevmonth = null;
	var $minical_actmonth = null;
	var $minical_actyear = null;
	var $minical_nextmonth = null;
	var $minical_nextyear = null;

	/* class variables */
	var $catidsOut = null;
	var $modcatids = null;
	var $catidList = "";
	var $aid = null;
	var $lang = null;
	var $myItemid = 0;
	var $cat = "";

	/* modules parameter object */
	var $modparams = null;

	// data model for module
	var $datamodel = null;

	// flag to say if we want to load tooltips
	protected $hasTooltips = false;

	public function __construct($params, $modid)
	{

		if (File::exists(JPATH_SITE . "/components/com_jevents/assets/css/jevcustom.css"))
		{
			$document = Factory::getDocument();
			JEVHelper::stylesheet('jevcustom.css', 'components/' . JEV_COM_COMPONENT . '/assets/css/');
		}

		$this->_modid = $modid;

		$user = Factory::getUser();

		$cfg                = JEVConfig::getInstance();
		$jev_component_name = JEV_COM_COMPONENT;
		$db                 = Factory::getDbo();

		$this->datamodel = new JEventsDataModel();

		// component config object
		$jevents_config = JEVConfig::getInstance();

		$this->modparams = &$params;
		$this->aid       = isset($user->aid) ? $user->aid : 0;
		$tmplang         = Factory::getLanguage();

		// get params exclusive to module
		$this->inc_ec_css       = $this->modparams->get('inc_ec_css', 1);
		$this->minical_showlink = $this->modparams->get('minical_showlink', 1);
		$this->minical_prevyear = $this->modparams->get('minical_prevyear', 1);
		$this->minical_prevmonth = $this->modparams->get('minical_prevmonth', 1);
		$this->minical_actmonth = $this->modparams->get('minical_actmonth', 1);
		$this->minical_actmonth = $this->modparams->get('minical_actmonth', 1);
		$this->minical_actyear = $this->modparams->get('minical_actyear', 1);
		$this->minical_nextmonth = $this->modparams->get('minical_nextmonth', 1);
		$this->minical_nextyear = $this->modparams->get('minical_nextyear', 1);

		// get params exclusive to component
		$this->com_starday = intval($jevents_config->get('com_starday', 1));

		// make config object (module or component) current
		if (intval($this->modparams->get('modcal_useLocalParam', 0)) == 1)
		{
			$myparam = &$this->modparams;
		}
		else
		{
			$myparam = &$jevents_config;
		}

		// get com_event config parameters for this module
		$this->displayLastMonth   = $myparam->get('modcal_DispLastMonth', 'NO');
		$this->disp_lastMonthDays = $myparam->get('modcal_DispLastMonthDays', 0);
		$this->linkCloaking       = $myparam->get('modcal_LinkCloaking', 0);

		$t_datenow            = JEVHelper::getNow();
		$this->timeWithOffset = $t_datenow->toUnix(true);

		switch ($this->displayLastMonth)
		{
			case 'YES_stop':
				$this->disp_lastMonth = 1;
				break;
			case 'YES_stop_events':
				$this->disp_lastMonth = 2;
				break;
			case 'ALWAYS':
				$this->disp_lastMonthDays = 0;
				$this->disp_lastMonth     = 1;
				break;
			case 'ALWAYS_events':
				$this->disp_lastMonthDays = 0;
				$this->disp_lastMonth     = 2;
				break;
			case 'NO':
			default:
				$this->disp_lastMonthDays = 0;
				$this->disp_lastMonth     = 0;
				break;
		}

		$this->displayNextMonth   = $myparam->get('modcal_DispNextMonth', 'NO');
		$this->disp_nextMonthDays = $myparam->get('modcal_DispNextMonthDays', 0);

		switch ($this->displayNextMonth)
		{
			case 'YES_stop':
				$this->disp_nextMonth = 1;
				break;
			case 'YES_stop_events':
				$this->disp_nextMonth = 2;
				break;
			case 'ALWAYS':
				$this->disp_nextMonthDays = 0;
				$this->disp_nextMonth     = 1;
				break;
			case 'ALWAYS_events':
				$this->disp_nextMonthDays = 0;
				$this->disp_nextMonth     = 2;
				break;
			case 'NO':
			default:
				$this->disp_nextMonthDays = 0;
				$this->disp_nextMonth     = 0;
				break;
		}

		// find appropriate Itemid and setup catids for datamodel
		$this->myItemid = $this->datamodel->setupModuleCatids($this->modparams);

		$this->cat = $this->datamodel->getCatidsOutLink(true);

		$this->linkpref = 'index.php?option=' . $jev_component_name . '&Itemid=' . $this->myItemid . $this->cat . '&task=';

	}

public function getCal($modid = 0)
	{

		// capture module id so that we can use it for ajax type navigation
		if ($modid != 0)
		{
			$this->_modid = $modid;
		}
		$user = Factory::getUser();

		$db = Factory::getDbo();

		// this will get the viewname based on which classes have been implemented
		$viewname = $this->getTheme();

		$cfg      = JEVConfig::getInstance();
		$compname = JEV_COM_COMPONENT;

		$viewpath = "components/" . JEV_COM_COMPONENT . "/views/" . $viewname . "/assets/css/";

		// get array
		$day_name    = JEVHelper::getWeekdayLetter(null, 1);
		$day_name[0] = '<span class="sunday">' . $day_name[0] . '</span>';
		$day_name[6] = '<span class="saturday">' . $day_name[6] . '</span>';

		$content = '<div style="margin:0px;padding:0px;border-width:0px;">';

		if ($this->inc_ec_css)
		{
			JEVHelper::componentStylesheet($this, "modstyle.css");
		}

		$thisDayOfMonth  = date("j", $this->timeWithOffset);
		$daysLeftInMonth = date("t", $this->timeWithOffset) - date("j", $this->timeWithOffset) + 1;
		// calculate month offset from first of month
		$first_of_current_month = JevDate::strtotime(date('Y-m-01', $this->timeWithOffset));

		$mod = "";
		if (isset($this->_modid) && $this->_modid > 0)
		{
			$mod     = 'id="modid_' . $this->_modid . '" ';
			$content .= "<span id='testspan" . $this->_modid . "' style='display:none'></span>\n";
		}

		if ($this->disp_lastMonth && (!$this->disp_lastMonthDays || $thisDayOfMonth <= $this->disp_lastMonthDays))
			$content .= $this->_displayCalendarMod(JevDate::strtotime("-1 month", $first_of_current_month),
				$this->com_starday, Text::_('JEV_LAST_MONTH'), $day_name, $this->disp_lastMonth == 2, $this->timeWithOffset);

		$content .= $this->_displayCalendarMod($this->timeWithOffset,
			$this->com_starday, Text::_('JEV_THIS_MONTH'), $day_name, false, $this->timeWithOffset);

		if ($this->disp_nextMonth && (!$this->disp_nextMonthDays || $daysLeftInMonth <= $this->disp_nextMonthDays))
			$content .= $this->_displayCalendarMod(JevDate::strtotime("+1 month", $first_of_current_month),
				$this->com_starday, Text::_('JEV_NEXT_MONTH'), $day_name, $this->disp_nextMonth == 2, $this->timeWithOffset);

		$content .= '</div>';

		return $content;
	}

	public function getTheme()
	{

		$modtheme = $this->modparams->get("com_calViewName", "flat");
		if ($modtheme == "" || $modtheme == "global")
		{
			$modtheme = JEV_CommonFunctions::getJEventsViewName();
		}

		return $modtheme;
	}

	public function _displayCalendarMod($time, $startday, $linkString, &$day_name, $monthMustHaveEvent = false, $basedate = false)
	{

		$db     = Factory::getDbo();
		$cfg    = JEVConfig::getInstance();
		$option = JEV_COM_COMPONENT;
		$app      = Factory::getApplication();
		$input    = $app->input;

		if (!$basedate) $basedate = $time;
		$base_year          = date("Y", $basedate);
		$base_month         = date("m", $basedate);
		$basefirst_of_month = JevDate::mktime(0, 0, 0, $base_month, 1, $base_year);

		$base_prev_month      = $base_month - 1;
		$base_next_month      = $base_month + 1;
		$base_next_month_year = $base_year;
		$base_prev_month_year = $base_year;
		if ($base_prev_month == 0)
		{
			$base_prev_month      = 12;
			$base_prev_month_year -= 1;
		}
		if ($base_next_month == 13)
		{
			$base_next_month      = 1;
			$base_next_month_year += 1;
		}

		$requestYear  = $input->getInt("year", 0);
		$requestMonth = $input->getInt("month", 0);
		// special case when site link set the dates for the mini-calendar in the URL but not in the ajax request
		if ($requestMonth && $requestYear && $input->getString("task", "") != "modcal.ajax" && $this->modparams->get("minical_usedate", 0))
		{
			$requestDay = $input->getInt("day", 1);

			$requestTime = JevDate::mktime(0, 0, 0, $requestMonth, $requestDay, $requestYear);
			if ($time - $basedate > 100000) $requestTime = JevDate::strtotime("+1 month", $requestTime);
			else if ($time - $basedate < -100000) $requestTime = JevDate::strtotime("-1 month", $requestTime);

			$cal_day   = date("d", $requestTime);
			$cal_year  = date("Y", $requestTime);
			$cal_month = date("m", $requestTime);

			$base_year          = $requestYear;
			$base_month         = $requestMonth;
			$basefirst_of_month = JevDate::mktime(0, 0, 0, $requestMonth, $requestDay, $requestYear);
		}
		else
		{
			$cal_year  = date("Y", $time);
			$cal_month = date("m", $time);
			$cal_day   = date("d", $time);
		}

		$reg = Factory::getConfig();
		$reg->set("jev.modparams", $this->modparams);
		if ($this->modparams->get("showtooltips", 0))
		{
			$data              = $this->datamodel->getCalendarData($cal_year, $cal_month, 1, false, false);
			$this->hasTooltips = true;
		}
		else
		{
			$data = $this->datamodel->getCalendarData($cal_year, $cal_month, 1, true, $this->modparams->get("noeventcheck", 0));
		}
		$reg->set("jev.modparams", false);
		$width  = $this->modparams->get("mod_cal_width", "140px");
		$height = $this->modparams->get("mod_cal_height", "");


		$month_name     = JEVHelper::getMonthName($cal_month);
		$first_of_month = JevDate::mktime(0, 0, 0, $cal_month, 1, $cal_year);
		$today          = JevDate::mktime(0, 0, 0);

		$content = '';

		$scriptlinks = [];

		if ($this->minical_showlink)
		{

			$content .= "\n" . '<table style="width:' . $width . ';" cellpadding="0" cellspacing="0" align="center" class="mod_events_monthyear" >' . "\n"
				. '<tr >' . "\n";

			if ($this->minical_showlink == 1)
			{

				if ($this->minical_prevyear)
				{
					$content .= $this->monthYearNavigation($basefirst_of_month, "-1 year", '&laquo;', Text::_('JEV_CLICK_TOSWITCH_PY'));
				}

				if ($this->minical_prevmonth)
				{
					$linkprevious = htmlentities(Uri::base() . "index.php?option=$option&task=modcal.ajax&day=1&month=$base_prev_month&year=$base_prev_month_year&modid=$this->_modid&tmpl=component" . $this->cat);
					$scriptlinks['linkprevious']  = $linkprevious;
					$content      .= $this->monthYearNavigation($basefirst_of_month, "-1 month", '&lt;', Text::_('JEV_CLICK_TOSWITCH_PM'));
				}
				else {
					$scriptlinks['linkprevious']  = "";
				}

				if ($this->minical_actmonth == 1)
				{
					// combination of actual month and year: view month
					$seflinkActMonth = Route::_($this->linkpref . 'month.calendar&month=' . $cal_month . '&year=' . $cal_year);

					$content .= '<td align="center">';
					$content .= $this->htmlLinkCloaking($seflinkActMonth, $month_name, array('class' => "mod_events_link", 'title' => Text::_('JEV_CLICK_TOSWITCH_MON'))) . " ";
					if ($this->minical_actyear < 1) $content .= '</td>';
				}
				elseif ($this->minical_actmonth == 2)
				{
					$content .= '<td align="center">';
					$content .= $month_name . "\n";
					if ($this->minical_actyear < 1) $content .= '</td>';
				}

				if ($this->minical_actyear == 1)
				{
					// combination of actual month and year: view year
					$seflinkActYear = Route::_($this->linkpref . 'year.listevents' . '&month=' . $cal_month
						. '&year=' . $cal_year);

					if ($this->minical_actmonth < 1) $content .= '<td align="center">';
					$content .= $this->htmlLinkCloaking($seflinkActYear, $cal_year, array('class' => "mod_events_link", 'title' => Text::_('JEV_CLICK_TOSWITCH_YEAR'))) . " ";
					$content .= '</td>';
				}
				elseif ($this->minical_actyear == 2)
				{
					if ($this->minical_actmonth < 1) $content .= '<td align="center">';
					$content .= $cal_year . "\n";
					$content .= '</td>';
				}

				if ($this->minical_nextmonth)
				{
					$linknext    = htmlentities(Uri::base() . "index.php?option=$$option&task=modcal.ajax&day=1&month=$base_next_month&year=$base_next_month_year&modid=$this->_modid&tmpl=component" . $this->cat);
					$scriptlinks['linknext']  = $linknext;
					$content     .= $this->monthYearNavigation($basefirst_of_month, "+1 month", '&gt;', Text::_('JEV_CLICK_TOSWITCH_NM'));
				}
				else {
					$scriptlinks['linknext']  = "";
				}

				if ($this->minical_nextyear)
				{
					$content .= $this->monthYearNavigation($basefirst_of_month, "+1 year", '&raquo;', Text::_('JEV_CLICK_TOSWITCH_NY'));
				}

				// combination of actual month and year: view year & month [ mic: not used here ]
				// $seflinkActYM   = Route::_( $link . 'month.calendar' . '&month=' . $cal_month
				// . '&year=' . $cal_year );
			}
			else
			{
				// show only text
				$content .= '<td>';
				$content .= $month_name . ' ' . $cal_year;
				$content .= '</td>';
			}

			$content .= "</tr>\n"
				. "</table>\n";
		}
		$lf = "\n";


		$content .= '<table style="width:' . $width . ';height:' . $height . ';" align="center" class="mod_events_table" cellspacing="0" cellpadding="2" >' . $lf
			. '<tr class="mod_events_dayname">' . $lf;

		// Days name rows
		for ($i = 0; $i < 7; $i++)
		{
			$content .= "<td class=\"mod_events_td_dayname\">" . $day_name[($i + $startday) % 7] . "</td>" . $lf;
		}

		$content .= '</tr>' . $lf;

		$datacount = count($data["dates"]);
		$dn        = 0;
		for ($w = 0; $w < 6 && $dn < $datacount; $w++)
		{
			$content .= "<tr>\n";
			for ($d = 0; $d < 7 && $dn < $datacount; $d++)
			{
				$currentDay = $data["dates"][$dn];
				switch ($currentDay["monthType"])
				{
					case "prior":
					case "following":
						$content .= '<td class="mod_events_td_dayoutofmonth">' . $currentDay["d"] . "</td>\n";
						break;
					case "current":
						if ($currentDay["events"] || $this->modparams->get("noeventcheck", 0))
						{
							$class = ($currentDay["cellDate"] == $today) ? "mod_events_td_todaywithevents" : "mod_events_td_daywithevents";
						}
						else
						{
							$class = ($currentDay["cellDate"] == $today) ? "mod_events_td_todaynoevents" : "mod_events_td_daynoevents";
						}
						$content .= "<td class='" . $class . "'>\n";
						$tooltip = $this->getTooltip($currentDay, array('class' => "mod_events_daylink"));
						if ($tooltip)
						{
							$content .= $tooltip;
						}
						else
						{
							if ($this->modparams->get("emptydaylinks", 1) || $currentDay["events"] || $this->modparams->get("noeventcheck", 0))
							{
								$content .= $this->htmlLinkCloaking($currentDay["link"], $currentDay['d'], array('class' => "mod_events_daylink", 'title' => Text::_('JEV_CLICK_TOSWITCH_DAY')));
							}
							else
							{
								$content .= $currentDay['d'];
							}
						}
						$content .= "</td>\n";

						break;
				}
				$dn++;
			}
			$content .= "</tr>\n";
		}

		$content .= '</table>' . $lf;

		if ($input->getCmd('jevtask', '') === 'modcal.ajax')
		{
			if (count($scriptlinks)){
				$content .= "<script style='text/javascript'>xyz=1;" . json_encode($scriptlinks) . "zyx=1;</script>";
			}
		}
		else
		{
			$content .= "<script style='text/javascript'>xyz=1;";
			foreach ($scriptlinks as $k => $v)
			{
				$content .= "$k = '$v';\n";
			}
			$content .= "zyx=1;</script>";
		}

		return $content;
	}

	public function monthYearNavigation($cal_today, $adj, $symbol, $label, $action = "month.calendar")
	{

		$cfg                = JEVConfig::getInstance();
		$jev_component_name = JEV_COM_COMPONENT;
		$adjDate            = JevDate::strtotime($adj, $cal_today);
		list($year, $month) = explode(":", JevDate::strftime("%Y:%m", $adjDate));
		$link = Route::_($this->linkpref . $action . "&day=1&month=$month&year=$year" . $this->cat);

		$content = "";
		if (isset($this->_modid) && $this->_modid > 0)
		{
			$this->_navigationJS($this->_modid);
			$link    = htmlentities(Uri::base() . "index.php?option=$jev_component_name&task=modcal.ajax&day=1&month=$month&year=$year&modid=$this->_modid&tmpl=component" . $this->cat);
			$content = '<td>';
			$content .= '<div class="mod_events_link" onmousedown="callNavigation(\'' . $link . '\');" ontouchstart="callNavigation(\'' . $link . '\');">' . $symbol . "</div>\n";
			$content .= '</td>';
		}

		return $content;
	}

	public function _navigationJS($modid)
	{

		JEVHelper::script("modules/mod_jevents_cal/tmpl/default/assets/js/calnav.js");

		$specificScript = <<< SCRIPT
function setupSpecificNavigation()
{
setupMiniCalTouchInteractions(".mod_events_table", true);
}
SCRIPT;

		Factory::getDocument()->addScriptDeclaration($specificScript);

	}

		/**
	 * Cloaks html link whith javascript
	 *
	 * @param string The cloaking URL
	 * @param string The link text
	 *
	 * @return string HTML
	 */
	protected function htmlLinkCloaking($url = '', $text = '', $attribs = array())
	{

		$link = Route::_($url);

		if ($this->linkCloaking)
		{
			$attribs['onclick'] = 'window.location.href=\'' . $link . '\';return false;';
			$href               = '"#"';
		}
		else
		{
			$href = '"' . $link . '"';
		}

		$attrstr = '';
		foreach ($attribs as $key => $value)
		{
			$attrstr .= ' ' . $key . ' = "' . $value . '"';
		}

		return '<a href=' . $href . $attrstr . '>' . $text . '</a>';

	} // function getCal

	protected function getTooltip($currentDay, $linkattr)
	{

		return "";
	} // function getSpecificCal

public function getAjaxCal($modid, $month, $year)
	{

        //TODO check usage of this function and us
		// capture module id so that we can use it for ajax type navigation
        $this->_modid   = $modid != 0 ? $modid : 0;

		$user   = Factory::getUser();
		$db     = Factory::getDbo();

		static $isloaded_css = false;
		// this will get the viewname based on which classes have been implemented
		$cfg      = JEVConfig::getInstance();
		$viewname = ucfirst($cfg->get('com_calViewName', "default"));

		$cfg = JEVConfig::getInstance();

		// get array
		$day_name    = JEVHelper::getWeekdayLetter(null, 1);
		$day_name[0] = '<span class="sunday">' . $day_name[0] . '</span>';
		$day_name[6] = '<span class="saturday">' . $day_name[6] . '</span>';

		$content = "";
		$mod     = "";
		if (isset($this->_modid) && $this->_modid > 0)
		{
			$mod     = 'id="modid_' . $this->_modid . '" ';
			$content .= "<span id='testspan" . $this->_modid . "' style='display:none'></span>\n";
		}


		$temptime = JevDate::mktime(12, 0, 0, $month, 15, $year);

		//$content .= $this->_displayCalendarMod($temptime,$this->com_starday, Text::_('JEV_THIS_MONTH'),$day_name, false);

		$thisDayOfMonth  = date("j", $temptime);
		$daysLeftInMonth = date("t", $temptime) - date("j", $temptime) + 1;
		// calculate month offset from first of month
		$first_of_current_month = JevDate::strtotime(date('Y-m-01', $temptime));

		$base_year          = date("Y", $temptime);
		$base_month         = date("m", $temptime);
		$basefirst_of_month = JevDate::mktime(0, 0, 0, $base_month, 1, $base_year);

		if ($this->disp_lastMonth && (!$this->disp_lastMonthDays || $thisDayOfMonth <= $this->disp_lastMonthDays))
			$content .= $this->_displayCalendarMod(JevDate::strtotime("-1 month", $first_of_current_month),
				$this->com_starday, Text::_('JEV_LAST_MONTH'), $day_name, $this->disp_lastMonth == 2, $first_of_current_month);

		$content .= $this->_displayCalendarMod($temptime,
			$this->com_starday, Text::_('JEV_THIS_MONTH'), $day_name, false, $first_of_current_month);

		if ($this->disp_nextMonth && (!$this->disp_nextMonthDays || $daysLeftInMonth <= $this->disp_nextMonthDays))
			$content .= $this->_displayCalendarMod(JevDate::strtotime("+1 month", $first_of_current_month),
				$this->com_starday, Text::_('JEV_NEXT_MONTH'), $day_name, $this->disp_nextMonth == 2, $first_of_current_month);


		return $content;
	}

	protected function getTooltipReference(&$currentDay, $linkattr)
	{

		return "";
	}
}
