<?php
/**
 * JEvents Component for Joomla! 3.x
 *
 * @version     $Id: modcal.php 3549 2012-04-20 09:26:21Z geraintedwards $
 * @package     JEvents
 * @copyright   Copyright (C) 2008-2018 GWE Systems Ltd
 * @license     GNU/GPLv2, see http://www.gnu.org/licenses/gpl-2.0.html
 * @link        http://www.jevents.net
 */

defined( 'JPATH_BASE' ) or die( 'Direct Access to this location is not allowed.' );

jimport('joomla.application.component.controller');

class ModCalController extends JControllerLegacy   {

	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;

	function __construct($config = array())
	{
		if (!isset($config['base_path'])){
			$config['base_path']=JEV_PATH;
		}
		parent::__construct($config);
		// TODO get this from config
		$this->registerDefaultTask( 'calendar' );

		$cfg = JEVConfig::getInstance();
		$theme = ucfirst(JEV_CommonFunctions::getJEventsViewName());
		JLoader::register('JEvents'.ucfirst($theme).'View',JEV_VIEWS."/".$theme."/abstract/abstract.php");

		include_once(JEV_LIBS."/modfunctions.php");
		if (!isset($this->_basePath)){
			$this->_basePath = $this->basePath;
			$this->_task = $this->task;
		}
	}

	function ajax() {
		$modid = intval((JRequest::getVar('modid', 0)));
		if ($modid<=0){
			echo "<script>alert('bad mod id');</script>";
			return;
		}

		// load language constants
		JEVHelper::loadLanguage('modcal');

		list($year,$month,$day) = JEVHelper::getYMD();

		$user = JFactory::getUser();
		$query = "SELECT id, params"
		. "\n FROM #__modules AS m"
		. "\n WHERE m.published = 1"
		. "\n AND m.id = ". $modid
		. "\n AND m.access IN (" .  JEVHelper::getAid($user, 'string') . ")"
		. "\n AND m.client_id != 1";
		$db	= JFactory::getDbo();
		$db->setQuery( $query );
		$modules = $db->loadObjectList();
		if (count($modules)<=0){
			if (!$modid<=0){
				echo "<script>alert('bad mod id');</script>";
				return;
			}
		}
		$params = new JRegistry( $modules[0]->params );

		$cfg = JEVConfig::getInstance();
		$theme = JEV_CommonFunctions::getJEventsViewName();
		$comptheme = $params->get("com_calViewName","global");
		$theme = ($comptheme=="global")?$theme : $comptheme;
		$modtheme = $params->get("com_calViewName", $theme);
		if ($modtheme=="" || $modtheme=="global" ){
			$modtheme=$theme;
		}
		$theme=$modtheme;

		//require(JModuleHelper::getLayoutPath('mod_jevents_cal',$theme.'/'."calendar"));
		require_once (JPATH_SITE.'/modules/mod_jevents_cal/helper.php');
		$jevhelper = new modJeventsCalHelper();
		$viewclass = $jevhelper->getViewClass($theme, 'mod_jevents_cal',$theme.'/'."calendar", $params);
		
		$modview = new $viewclass($params, $modid);
		$modview->jevlayout = $theme;
		$content = $modview->getAjaxCal($modid,$month,$year);
		$content = str_replace("<script style='text/javascript'>xyz=1;", "XYZ", $content);
		$content = str_replace("zyx=1;</script>", "ZYX", $content);
                // ungreedy match 
		preg_match("/XYZ(.*)ZYX/sU", $content, $match);
		$script = "";
		if (isset($match[1])){
			$script = $match[1];
			$content = str_replace($match[0],"", $content);
		}
		$json = array("data" => $content, "modid"=>$modid, "script"=>$script);
		ob_end_clean();
                // commmended out - see https://www.jevents.net/forum/viewtopic.php?f=24&t=40917&p=192337#p192337
		//ob_end_flush();
		if (JRequest::getCmd("callback", 0)){
			echo JRequest::getCmd("callback", 0)."(". json_encode($json),");";
			exit();
		}
		else if (JRequest::getInt("json")==1){
			$encoded =  json_encode($json);
			if ($encoded === false && json_last_error() == JSON_ERROR_UTF8) {
				$encoded = json_encode($this->utf8ize($json));
			}
			echo $encoded;
			exit();
		}
		else {
		?>
		<script type="text/javascript">
		var doitdone = false;
		function doit(){
			if (doitdone) return;
			doitdone = true;
			var sillydiv=document.getElementById('silly');
			parent.navLoaded(sillydiv,<?php echo $modid;?>);
		}
		window.onload=doit;
		</script>
		<?php
		echo "<div id='silly'>";
		echo $modview->getAjaxCal($modid,$month,$year);
		echo "</div>";
		?>
		<script type="text/javascript">
		doit();
		</script>
		<?php
		}
	}

	// see http://php.net/manual/en/function.json-last-error.php
	private  function utf8ize($mixed) {
		if (is_array($mixed)) {
		    foreach ($mixed as $key => $value) {
			$mixed[$key] = $this->utf8ize($value);
		    }
		} elseif (is_string($mixed)) {
		    return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
		}
		return $mixed;
	    }


	function getViewName(){
		$cfg = JEVConfig::getInstance();
		$theme = JEV_CommonFunctions::getJEventsViewName();
		return $theme;
	}

	/**
		* Pseudo Constructor
		*
		*/		
	function setup(&$params, $modid) {

		$this->modid = $modid;

		
		$user = JFactory::getUser();

		$cfg = JEVConfig::getInstance();
		$db	= JFactory::getDbo();

		$this->datamodel =new JEventsDataModel();

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

		$this->modparams	= & $params;
		$this->aid			= JEVHelper::getAid($user, 'string');   // RSH modified getAid to handle different return types 10/26/10
		$tmplang			= JFactory::getLanguage();

		// get params exclusive to module
		$this->inc_ec_css			= $this->modparams->get('inc_ec_css', 0);
		$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',0));

		// 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_COM_COMPONENT.'&Itemid='.$this->myItemid.$this->cat.'&task=';

	}

}

