function JEventDate($datetime = '') { $time = JevDate::strtotime($datetime); if ($datetime != "" && $time !== false) { $this->date = $time; $parts = explode(":", date("Y:m:j:G:i:s:t", $this->date)); $this->year = intval($parts[0]); $this->month = intval($parts[1]); $this->day = intval($parts[2]); $this->hour = intval($parts[3]); $this->minute = intval($parts[4]); $this->second = intval($parts[5]); $this->dim = intval($parts[6]); } else { $this->date = time(); $parts = explode(":", date("Y:m:j:G:i:s:t", $this->date)); $this->year = intval($parts[0]); $this->month = intval($parts[1]); $this->day = intval($parts[2]); $this->hour = 0; $this->minute = 0; $this->second = 0; $this->dim = intval($parts[6]); } }
function Defaultgetstartenddates($view) { $params = JComponentHelper::getParams(JEV_COM_COMPONENT); $startdate = JRequest::getString("startdate", ""); $enddate = JRequest::getString("enddate", ""); if ($startdate == "") { if ($params->get("relative", "rel") == "abs") { $startdate = $params->get("absstart", ""); list($startyear, $startmonth, $startday) = explode("-", $startdate); } else { if ($params->get("relative", "rel") == "strtotime") { $value = $params->get("strstart", ""); $value = new JevDate(JevDate::strtotime($value)); $startdate = $value->toFormat("%Y-%m-%d"); } else { $value = $params->get("relstart", ""); $value = str_replace(",", " ", $value); $value = str_replace("y", "year", $value); $value = str_replace("d", "day", $value); $value = str_replace("w", "week", $value); $value = str_replace("m", "month", $value); $value = new JevDate($value); $startdate = $value->toFormat("%Y-%m-%d"); } } } if ($enddate == "") { if ($params->get("relative", "rel") == "abs") { $enddate = $params->get("absend", ""); } else { if ($params->get("relative", "rel") == "strtotime") { $value = $params->get("strend", ""); $value = new JevDate(JevDate::strtotime($value)); $enddate = $value->toFormat("%Y-%m-%d"); } else { $value = $params->get("relend", ""); $value = str_replace(",", " ", $value); $value = str_replace("y", "year", $value); $value = str_replace("d", "day", $value); $value = str_replace("w", "week", $value); $value = str_replace("m", "month", $value); $value = new JevDate($value); $enddate = $value->toFormat("%Y-%m-%d"); } } } if ($enddate < $startdate) { // default to 1 year when input dates are not valid! $value = new JevDate($startdate); $value->add(new DateInterval('P1Y')); $enddate = $value->toFormat("%Y-%m-%d"); } return array($startdate, $enddate); }
function _createFilter($prefix = "") { if (!$this->filterField) { return ""; } // first time visit if (isset($this->filter_values[2]) && $this->filter_values[2] == 0) { $this->filter_values = array(); $this->filter_values[0] = 1; // default scenario is only events starting after 2 weeeks ago $fulldate = date('Y-m-d H:i:s', JevDate::strtotime("-2 weeks")); $this->filter_values[1] = substr($fulldate, 0, 10); $this->filter_values[2] = 1; return $this->dmap . ".startrepeat>='{$fulldate}'"; } else { if ($this->filter_values[0] == 0) { $this->filter_values[1] = ""; $this->_date = $this->filter_values[1]; } else { if ($this->filter_values[0] == -1 && $this->filter_values[1] == "") { $fulldate = date('Y-m-d H:i:s', JevDate::strtotime("+2 weeks")); $this->filter_values[1] = substr($fulldate, 0, 10); $this->_date = $this->filter_values[1]; } else { if ($this->filter_values[0] == 1 && $this->filter_values[1] == "") { $fulldate = date('Y-m-d H:i:s', JevDate::strtotime("-2 weeks")); $this->filter_values[1] = substr($fulldate, 0, 10); $this->_date = $this->filter_values[1]; } } } } $filter = ""; if ($this->_date != "" && $this->_onorbefore != 0) { $date = JevDate::strtotime($this->_date); $fulldate = date('Y-m-d H:i:s', $date); if ($this->_onorbefore > 0) { $date = $this->dmap . ".startrepeat>='{$fulldate}'"; } else { $date = $this->dmap . ".startrepeat<'{$fulldate}'"; } } else { $date = ""; } $filter = $date; return $filter; }
protected function processMatch(&$content, $match, $dayEvent, $dateParm, $relDay) { $datenow = JEVHelper::getNow(); $dispatcher = JDispatcher::getInstance(); // get the title and start time $startDate = JevDate::strtotime($dayEvent->publish_up()); if ($relDay > 0) { $eventDate = JevDate::strtotime($datenow->toFormat('%Y-%m-%d ') . JevDate::strftime('%H:%M', $startDate) . " +{$relDay} days"); } else { $eventDate = JevDate::strtotime($datenow->toFormat('%Y-%m-%d ') . JevDate::strftime('%H:%M', $startDate) . " {$relDay} days"); } $endDate = JevDate::strtotime($dayEvent->publish_down()); list($st_year, $st_month, $st_day) = explode('-', JevDate::strftime('%Y-%m-%d', $startDate)); list($ev_year, $ev_month, $ev_day) = explode('-', JevDate::strftime('%Y-%m-%d', $startDate)); $task_events = 'icalrepeat.detail'; switch ($match) { case 'endDate': case 'startDate': case 'eventDate': // Note we need to examine the date specifiers used to determine if language translation will be // necessary. Do this later when script is debugged. if (!$this->disableDateStyle) { $content .= '<span class="mod_events_latest_date">'; } if (!$dayEvent->alldayevent() && $match == "endDate" && ($dayEvent->noendtime() && $dayEvent->getUnixStartDate() == $dayEvent->getUnixEndDate() || $dayEvent->getUnixStartTime() == $dayEvent->getUnixEndTime())) { $time_fmt = ""; } else { if (!isset($dateParm) || $dateParm == '') { if ($this->com_calUseStdTime) { $time_fmt = $dayEvent->alldayevent() ? '' : IS_WIN ? ' @%I:%M%p' : ' @%l:%M%p'; } else { $time_fmt = $dayEvent->alldayevent() ? '' : ' @%H:%M'; } $dateFormat = $this->displayYear ? '%a %b %d, %Y' . $time_fmt : '%a %b %d' . $time_fmt; $jmatch = new JevDate(${$match}); $content .= $jmatch->toFormat($dateFormat); //$content .= JEV_CommonFunctions::jev_strftime($dateFormat, $$match); } else { // format endDate when midnight to show midnight! if ($match == "endDate" && $dayEvent->sdn() == 59) { $tempEndDate = $endDate + 1; if ($dayEvent->alldayevent()) { // if an all day event then we don't want to roll to the next day $tempEndDate -= 86400; } $match = "tempEndDate"; } // if a '%' sign detected in date format string, we assume JevDate::strftime() is to be used, if (preg_match("/\\%/", $dateParm)) { $jmatch = new JevDate(${$match}); $content .= $jmatch->toFormat($dateParm); } else { $content .= date($dateParm, ${$match}); } if ($match == "tempDndDate") { $match = "endDate"; } } } if (!$this->disableDateStyle) { $content .= "</span>"; } break; case 'title': $title = $dayEvent->title(); if (!empty($dateParm)) { $parts = explode("|", $dateParm); if (count($parts) > 0 && strlen($title) > intval($parts[0])) { $title = substr($title, 0, intval($parts[0])); if (count($parts) > 1) { $title .= $parts[1]; } } } if (!$this->disableTitleStyle) { $content .= '<span class="mod_events_latest_content">'; } if ($this->displayLinks) { $link = $dayEvent->viewDetailLink($ev_year, $ev_month, $ev_day, false, $this->myItemid); if ($this->modparams->get("ignorefiltermodule", 0)) { $link = JRoute::_($link . $this->datamodel->getCatidsOutLink() . "&filter_reset=1"); } else { $link = JRoute::_($link . $this->datamodel->getCatidsOutLink()); } $content .= $this->_htmlLinkCloaking($link, JEventsHTML::special($title)); } else { $content .= JEventsHTML::special($title); } if (!$this->disableTitleStyle) { $content .= '</span>'; } break; case 'category': $catobj = $dayEvent->getCategoryName(); $content .= JEventsHTML::special($catobj); break; case 'categoryimage': $catobj = $dayEvent->getCategoryImage(); $content .= $catobj; break; case 'calendar': $catobj = $dayEvent->getCalendarName(); $content .= JEventsHTML::special($catobj); break; case 'contact': // Also want to cloak contact details so $this->modparams->set("image", 1); $dayEvent->text = $dayEvent->contact_info(); $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent, &$this->modparams, 0)); $dayEvent->contact_info($dayEvent->text); $content .= $dayEvent->contact_info(); break; case 'content': // Added by Kaz McCoy 1-10-2004 $this->modparams->set("image", 1); $dayEvent->data->text = $dayEvent->content(); $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent->data, &$this->modparams, 0)); if (!empty($dateParm)) { $parts = explode("|", $dateParm); if (count($parts) > 0 && strlen(strip_tags($dayEvent->data->text)) > intval($parts[0])) { $dayEvent->data->text = substr(strip_tags($dayEvent->data->text), 0, intval($parts[0])); if (count($parts) > 1) { $dayEvent->data->text .= $parts[1]; } } } $dayEvent->content($dayEvent->data->text); //$content .= substr($dayEvent->content, 0, 150); $content .= $dayEvent->content(); break; case 'addressInfo': case 'location': $this->modparams->set("image", 0); $dayEvent->data->text = $dayEvent->location(); $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent->data, &$this->modparams, 0)); $dayEvent->location($dayEvent->data->text); $content .= $dayEvent->location(); break; case 'duration': $timedelta = $dayEvent->noendtime() || $dayEvent->alldayevent() ? "" : $dayEvent->getUnixEndTime() - $dayEvent->getUnixStartTime(); if ($timedelta == "") { break; } $fieldval = isset($dateParm) && $dateParm != '' ? $dateParm : JText::_("JEV_DURATION_FORMAT"); $shownsign = false; // whole days! if (stripos($fieldval, "%wd") !== false) { $days = intval($timedelta / (60 * 60 * 24)); $timedelta -= $days * 60 * 60 * 24; if ($timedelta > 3610) { //if more than 1 hour and 10 seconds over a day then round up the day output $days += 1; } $fieldval = str_ireplace("%wd", $days, $fieldval); $shownsign = true; } if (stripos($fieldval, "%d") !== false) { $days = intval($timedelta / (60 * 60 * 24)); $timedelta -= $days * 60 * 60 * 24; /* if ($timedelta>3610){ //if more than 1 hour and 10 seconds over a day then round up the day output $days +=1; } */ $fieldval = str_ireplace("%d", $days, $fieldval); $shownsign = true; } if (stripos($fieldval, "%h") !== false) { $hours = intval($timedelta / (60 * 60)); $timedelta -= $hours * 60 * 60; if ($shownsign) { $hours = abs($hours); } $hours = sprintf("%02d", $hours); $fieldval = str_ireplace("%h", $hours, $fieldval); $shownsign = true; } if (stripos($fieldval, "%m") !== false) { $mins = intval($timedelta / 60); $timedelta -= $hours * 60; if ($mins) { $mins = abs($mins); } $mins = sprintf("%02d", $mins); $fieldval = str_ireplace("%m", $mins, $fieldval); } $content .= $fieldval; break; case 'extraInfo': $this->modparams->set("image", 0); $dayEvent->data->text = $dayEvent->extra_info(); $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent->data, &$this->modparams, 0)); $dayEvent->extra_info($dayEvent->data->text); $content .= $dayEvent->extra_info(); break; case 'countdown': $timedelta = $dayEvent->getUnixStartTime() - JevDate::mktime(); $eventPassed = !($timedelta >= 0); $fieldval = $dateParm; $shownsign = false; if (stripos($fieldval, "%nopast") !== false) { if (!$eventPassed) { $fieldval = str_ireplace("%nopast", "", $fieldval); } else { $fieldval = JText::_('JEV_EVENT_FINISHED'); } } if (stripos($fieldval, "%d") !== false) { $days = intval($timedelta / (60 * 60 * 24)); $timedelta -= $days * 60 * 60 * 24; $fieldval = str_ireplace("%d", $days, $fieldval); $shownsign = true; } if (stripos($fieldval, "%h") !== false) { $hours = intval($timedelta / (60 * 60)); $timedelta -= $hours * 60 * 60; if ($shownsign) { $hours = abs($hours); } $hours = sprintf("%02d", $hours); $fieldval = str_ireplace("%h", $hours, $fieldval); $shownsign = true; } if (stripos($fieldval, "%m") !== false) { $mins = intval($timedelta / 60); $timedelta -= $hours * 60; if ($mins) { $mins = abs($mins); } $mins = sprintf("%02d", $mins); $fieldval = str_ireplace("%m", $mins, $fieldval); } $content .= $fieldval; break; case 'createdByAlias': $content .= $dayEvent->created_by_alias(); break; case 'createdByUserName': $catobj = JEVHelper::getUser($dayEvent->created_by()); $content .= isset($catobj->username) ? $catobj->username : ""; break; case 'createdByUserEmail': // Note that users email address will NOT be available if they don't want to receive email $catobj = JEVHelper::getUser($dayEvent->created_by()); $content .= $catobj->sendEmail ? $catobj->email : ''; break; case 'createdByUserEmailLink': // Note that users email address will NOT be available if they don't want to receive email $content .= JRoute::_("index.php?option=" . $compname . "&task=" . $task_events . "&agid=" . $dayEvent->id() . "&year=" . $st_year . "&month=" . $st_month . "&day=" . $st_day . "&Itemid=" . $this->myItemid . $this->catout); break; case 'color': $content .= $dayEvent->bgcolor(); break; case 'eventDetailLink': $link = $dayEvent->viewDetailLink($st_year, $st_month, $st_day, false, $this->myItemid); $link = JRoute::_($link . $this->datamodel->getCatidsOutLink()); $content .= $link; /* $content .= JRoute::_("index.php?option=" . $compname . "&task=".$task_events . "&agid=".$dayEvent->id() . "&year=".$st_year . "&month=".$st_month . "&day=".$st_day . "&Itemid=".$this->myItemid . $this->catout); */ break; default: try { if (strpos($match, '${') !== false) { $parts = explode('${', $match); $tempstr = ""; foreach ($parts as $part) { if (strpos($part, "}") !== false) { // limit to 2 because we may be using joomla content plugins $subparts = explode("}", $part, 2); if (strpos($subparts[0], "#") > 0) { $formattedparts = explode("#", $subparts[0]); $subparts[0] = $formattedparts[0]; } else { $formattedparts = array($subparts[0], "%s", ""); } $subpart = "_" . $subparts[0]; if (isset($dayEvent->{$subpart})) { $temp = $dayEvent->{$subpart}; if ($temp != "") { $tempstr .= str_replace("%s", $temp, $formattedparts[1]); } else { if (isset($formattedparts[2])) { $tempstr .= str_replace("%s", $temp, $formattedparts[2]); } } } else { if (isset($dayEvent->customfields[$subparts[0]]['value'])) { $temp = $dayEvent->customfields[$subparts[0]]['value']; if ($temp != "") { $tempstr .= str_replace("%s", $temp, $formattedparts[1]); } else { if (isset($formattedparts[2])) { $tempstr .= str_replace("%s", $temp, $formattedparts[2]); } } } else { $matchedByPlugin = false; $layout = "list"; static $fieldNameArrays = array(); $jevplugins = JPluginHelper::getPlugin("jevents"); foreach ($jevplugins as $jevplugin) { $classname = "plgJevents" . ucfirst($jevplugin->name); if (is_callable(array($classname, "substitutefield"))) { if (!isset($fieldNameArrays[$classname])) { $fieldNameArrays[$classname] = call_user_func(array($classname, "fieldNameArray"), $layout); } if (isset($fieldNameArrays[$classname]["values"])) { if (in_array($subparts[0], $fieldNameArrays[$classname]["values"])) { $matchedByPlugin = true; // is the event detail hidden - if so then hide any custom fields too! if (!isset($event->_privateevent) || $event->_privateevent != 3) { $temp = call_user_func(array($classname, "substitutefield"), $dayEvent, $subparts[0]); if ($temp != "") { $tempstr .= str_replace("%s", $temp, $formattedparts[1]); } else { if (isset($formattedparts[2])) { $tempstr .= str_replace("%s", $temp, $formattedparts[2]); } } } } } } } if (!$matchedByPlugin) { // Layout editor code include_once JEV_PATH . "/views/default/helpers/defaultloadedfromtemplate.php"; ob_start(); // false at the end to stop it running through the plugins $part = "{{Dummy Label:" . implode("#", $formattedparts) . "}}"; DefaultLoadedFromTemplate(false, false, $dayEvent, 0, $part, false); $newpart = ob_get_clean(); if ($newpart != $part) { $tempstr .= $newpart; $matchedByPlugin = true; } } // none of the plugins has replaced the output so we now replace the blank formatted part! if (!$matchedByPlugin && isset($formattedparts[2])) { $tempstr .= str_replace("%s", "", $formattedparts[2]); } //$dispatcher->trigger( 'onLatestEventsField', array( &$dayEvent, $subparts[0], &$tempstr)); } } $tempstr .= $subparts[1]; } else { $tempstr .= $part; } } $content .= $tempstr; } else { if ($match) { $content .= $match; } } } catch (Exception $e) { if ($match) { $content .= $match; } } break; } // end of switch }
/** * Get week number according ISO 8601 * * @static * @param int $date date * @return int weeknumber */ function _getWeekNumberISO8601($date) { $thursday = JEV_CompatWin::_getThursdayOfWeek($date); $thursday_Y = JevDate::strftime('%Y', $thursday); $first_th = JEV_CompatWin::_getThursdayOfWeek(JevDate::strtotime($thursday_Y . '-01-04')); return (JevDate::strftime('%j', $thursday) - JevDate::strftime('%j', $first_th)) / 7 + 1; }
function fixDtstart() { // must only ever do this once! if (isset($this->dtfixed) && $this->dtfixed) { return; } $this->dtfixed = 1; $db =& JFactory::getDBO(); // Now get the first repeat since dtstart may have been set in a different timezeone and since it is a unixdate it would then be wrong if (strtolower($this->freq()) == "none") { $repeat = $this->getFirstRepeat(); $this->dtstart($repeat->getUnixStartTime()); $this->dtend($repeat->getUnixEndTime()); } else { $repeat = $this->getFirstRepeat(); // Is this repeat an exception? $db->setQuery("SELECT * FROM #__jevents_exception WHERE rp_id=" . intval($repeat->rp_id())); $exception = $db->loadObject(); if (!$exception) { $this->dtstart($repeat->getUnixStartTime()); $this->dtend($repeat->getUnixEndTime()); } else { // This is the scenario where the first repeat is an exception so check to see if we need to be worried $jregistry =& JRegistry::getInstance("jevents"); // This is the server default timezone $jtimezone = $jregistry->getValue("jevents.timezone", false); if ($jtimezone) { // This is the JEvents set timezone $timezone = date_default_timezone_get(); // Only worry if the JEvents set timezone is different to the server timezone if ($timezone != $jtimezone) { // look for repeats that are not exceptions $repeat2 = $this->getFirstRepeat(false); // if we have none then use the first repeat and give a warning if (!$repeat2) { $this->dtstart($repeat->getUnixStartTime()); $this->dtend($repeat->getUnixEndTime()); JFactory::getApplication()->enqueueMessage(JText::_('JEV_PLEASE_CHECK_START_AND_END_TIMES_FOR_THIS_EVENT')); } else { // Calculate the time adjustment (if any) then check against the non-exceptional repeat // Convert dtstart using system timezone to date date_default_timezone_set($jtimezone); $truestarttime = JevDate::strftime("%H:%M:%S", $this->dtstart()); // if the system timezone version of dtstart is the same time as the first non-exceptional repeat // then we are safe to use this adjustment mechanism to dtstart. We use the real "date" and convert // back into unix time using the Jevents timezone if ($truestarttime == JevDate::strftime("%H:%M:%S", JevDate::mktime($repeat2->hup(), $repeat2->minup(), $repeat2->sup(), 0, 0, 0))) { $truedtstart = JevDate::strftime("%Y-%m-%d %H:%M:%S", $this->dtstart()); $truedtend = JevDate::strftime("%Y-%m-%d %H:%M:%S", $this->dtend()); // switch timezone back to Jevents timezone date_default_timezone_set($timezone); $this->dtstart(JevDate::strtotime($truedtstart)); $this->dtend(JevDate::strtotime($truedtend)); } else { // In this scenario we have no idea what the time should be unfortunately JFactory::getApplication()->enqueueMessage(JText::_('JEV_PLEASE_CHECK_START_AND_END_TIMES_FOR_THIS_EVENT')); // switch timezone back date_default_timezone_set($timezone); } } } } } } }
function _displayCalendarMod($time, $startday, $linkString, &$day_name, $monthMustHaveEvent = false, $basedate = false) { $db = JFactory::getDBO(); $cfg = JEVConfig::getInstance(); $compname = JEV_COM_COMPONENT; $cal_day = date("d", $time); //$cal_year=date("Y",$time); //$cal_month=date("m",$time); //list($cal_year,$cal_month,$cal_day) = JEVHelper::getYMD(); 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); $requestYear = JRequest::getInt("year", 0); $requestMonth = JRequest::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 && JRequest::getString("task", "") != "modcal.ajax" && $this->modparams->get("minical_usedate", 0)) { $requestDay = JRequest::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_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); } $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; } $reg = JFactory::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", "135px"); $height = $this->modparams->get("mod_cal_height", "auto"); $rowheight = $this->modparams->get("mod_cal_rowheight", "auto"); $month_name = JEVHelper::getMonthName($cal_month); $to_day = date("Y-m-d", $this->timeWithOffset); $today = JevDate::mktime(0, 0, 0, $cal_month, $cal_day, $cal_year); $cal_prev_month = $cal_month - 1; $cal_next_month = $cal_month + 1; $cal_next_month_year = $cal_year; $cal_prev_month_year = $cal_year; // additional EBS if ($cal_prev_month == 0) { $cal_prev_month = 12; $cal_prev_month_year -= 1; } if ($cal_next_month == 13) { $cal_next_month = 1; $cal_next_month_year += 1; } $viewname = $this->getTheme(); $viewpath = JURI::root(true) . "/components/{$compname}/views/" . $viewname . "/assets"; $viewimages = $viewpath . "/images"; $linkpref = "index.php?option={$compname}&Itemid=" . $this->myItemid . $this->cat . "&task="; /* $linkprevious = $linkpref."month.calendar&day=$cal_day&month=$cal_prev_month&year=$cal_prev_month_year"; $linkprevious = JRoute::_($linkprevious); $linkprevious = $this->htmlLinkCloaking($linkprevious, '<img border="0" title="' . JText::_("JEV_PREVIOUSMONTH") . '" alt="' . JText::_("JEV_PREVIOUSMONTH") . '" src="'.$viewimages.'/mini_arrowleft.gif"/>' ); */ $jev_component_name = JEV_COM_COMPONENT; $this->_navigationJS($this->_modid); $scriptlinks = ""; if ($this->minical_prevmonth) { $linkprevious = htmlentities(JURI::base() . "index.php?option={$jev_component_name}&task=modcal.ajax&day=1&month={$base_prev_month}&year={$base_prev_month_year}&modid={$this->_modid}&tmpl=component" . $this->cat); $scriptlinks .= "linkprevious = '" . $linkprevious . "';\n"; $linkprevious = '<img border="0" title="' . JText::_("JEV_PREVIOUSMONTH") . '" alt="' . JText::_("JEV_LAST_MONTH") . '" class="mod_events_link" src="' . $viewimages . '/mini_arrowleft.gif" onmousedown="callNavigation(\'' . $linkprevious . '\');" />'; } else { $linkprevious = ""; } if ($this->minical_actmonth == 1) { $linkcurrent = $linkpref . "month.calendar&day={$cal_day}&month={$cal_month}&year={$cal_year}"; $linkcurrent = JRoute::_($linkcurrent); $linkcurrent = $this->htmlLinkCloaking($linkcurrent, $month_name . " " . $cal_year, array("style" => "text-decoration:none;color:inherit;")); } elseif ($this->minical_actmonth == 2) { $linkcurrent = $month_name . " " . $cal_year; } else { $linkcurrent = ""; } /* $linknext = $linkpref."month.calendar&day=$cal_day&month=$cal_next_month&year=$cal_next_month_year"; $linknext = JRoute::_($linknext); $linknext = $this->htmlLinkCloaking($linknext, '<img border="0" title="' . JText::_("JEV_NEXT_MONTH") . '" alt="' . JText::_("JEV_NEXT_MONTH") . '" src="'.$viewimages.'/mini_arrowright.gif"/>' ); */ $this->_navigationJS($this->_modid); if ($this->minical_nextmonth) { $linknext = htmlentities(JURI::base() . "index.php?option={$jev_component_name}&task=modcal.ajax&day=1&month={$base_next_month}&year={$base_next_month_year}&modid={$this->_modid}&tmpl=component" . $this->cat); $scriptlinks .= "linknext = '" . $linknext . "';\n"; $linknext = '<img border="0" title="' . JText::_("JEV_NEXT_MONTH") . '" alt="' . JText::_("JEV_NEXT_MONTH") . '" class="mod_events_link" src="' . $viewimages . '/mini_arrowright.gif" onmousedown="callNavigation(\'' . $linknext . '\');" />'; } else { $linknext = ""; } $content = <<<START <div id="extcal_minical"> \t<table cellspacing="1" cellpadding="0" style="width:{$width}; text-align:center;border: 1px solid rgb(190, 194, 195); background-color: rgb(255, 255, 255);"> \t\t<tr> \t\t\t<td style="vertical-align: top;"> START; if ($this->minical_showlink) { $content .= <<<START \t\t\t\t<table style="width:{$width};" cellspacing="0" cellpadding="2" border="0" class="extcal_navbar"> \t\t\t\t\t<tr> \t\t\t\t\t\t<td valign="middle" height="18" align="center"> \t\t\t\t\t\t\t{$linkprevious} \t\t</td> \t\t <td width="98%" valign="middle" nowrap="nowrap" height="18" align="center" class="extcal_month_label"> \t\t\t\t\t\t\t{$linkcurrent} \t\t </td> \t\t\t\t\t\t<td valign="middle" height="18" align="center" style="margin: 0 auto; min-width: 4px;"> \t\t {$linknext} \t\t</td> \t\t\t\t\t</tr> \t\t\t\t</table> START; } $content .= <<<START \t\t\t\t<table style="width:{$width};height:{$height}; " class="extcal_weekdays"> START; $lf = "\n"; // Days name rows - with blank week no. $content .= "<tr>\n<td/>\n"; for ($i = 0; $i < 7; $i++) { $content .= "<td class='extcal_weekdays'>" . $day_name[($i + $startday) % 7] . "</td>" . $lf; } $content .= "</tr>\n"; $datacount = count($data["dates"]); $dn = 0; for ($w = 0; $w < 6 && $dn < $datacount; $w++) { $content .= "<tr style='height:{$rowheight};'>\n"; // the week column list($week, $link) = each($data['weeks']); $content .= '<td class="extcal_weekcell">'; $content .= $this->htmlLinkCloaking($link, "<img width='5' height='20' border='0' alt='week " . $week . "' src='" . $viewimages . "/icon-mini-week.gif'/>"); $content .= "</td>\n"; for ($d = 0; $d < 7 && $dn < $datacount; $d++) { $currentDay = $data["dates"][$dn]; switch ($currentDay["monthType"]) { case "prior": case "following": $content .= "<td class='extcal_othermonth'/>\n"; break; case "current": $dayOfWeek = JevDate::strftime("%w", $currentDay["cellDate"]); $class = $currentDay["today"] ? "extcal_todaycell" : "extcal_daycell"; $linkclass = "extcal_daylink"; if ($dayOfWeek == 0 && !$currentDay["today"]) { $class = "extcal_sundaycell"; $linkclass = "extcal_sundaylink"; } if ($currentDay["events"] || $this->modparams->get("noeventcheck", 0)) { $linkclass = "extcal_busylink"; } $content .= "<td class='" . $class . "'>\n"; $tooltip = $this->getTooltip($currentDay, array('class' => $linkclass)); 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' => $linkclass, 'title' => JText::_('JEV_CLICK_TOSWITCH_DAY'))); } else { $content .= $currentDay['d']; } } $content .= "</td>\n"; break; } $dn++; } $content .= "</tr>\n"; } $content .= "</table>\n"; $content .= "</td></tr></table></div>\n"; if ($scriptlinks != "") { $content .= "<script style='text/javascript'>xyz=1;" . $scriptlinks . "zyx=1;</script>"; } // Now check to see if this month needs to have at least 1 event in order to display // if (!$monthMustHaveEvent || $monthHasEvent) return $content; // else return ''; return $content; }
function simulateSaveRepeat($requestObject) { include_once JPATH_SITE . "/components/com_jevents/jevents.defines.php"; if (!JEVHelper::isEventCreator()) { throwerror(JText::_('ALERTNOTAUTH')); } // Convert formdata to array $formdata = array(); foreach (get_object_vars($requestObject->formdata) as $k => $v) { $k = str_replace("[]", "", $k); $formdata[$k] = $v; } $array = JRequest::_cleanVar($formdata, JREQUEST_ALLOWHTML); if (!array_key_exists("rp_id", $array) || intval($array["rp_id"]) <= 0) { throwerror(JText::_("Not a repeat", true)); } $rp_id = intval($array["rp_id"]); $dataModel = new JEventsDataModel("JEventsAdminDBModel"); $queryModel = new JEventsDBModel($dataModel); // I should be able to do this in one operation but that can come later $event = $queryModel->listEventsById(intval($rp_id), 1, "icaldb"); if (!JEVHelper::canEditEvent($event)) { throwerror(JText::_('ALERTNOTAUTH')); } $db =& JFactory::getDBO(); $rpt = new iCalRepetition($db); $rpt->load($rp_id); $query = "SELECT detail_id FROM #__jevents_vevent WHERE ev_id={$rpt->eventid}"; $db->setQuery($query); $eventdetailid = $db->loadResult(); $data["UID"] = valueIfExists($array, "uid", md5(uniqid(rand(), true))); $data["X-EXTRAINFO"] = valueIfExists($array, "extra_info", ""); $data["LOCATION"] = valueIfExists($array, "location", ""); $data["allDayEvent"] = valueIfExists($array, "allDayEvent", "off"); $data["CONTACT"] = valueIfExists($array, "contact_info", ""); // allow raw HTML (mask =2) $data["DESCRIPTION"] = valueIfExists($array, "jevcontent", "", 'request', 'html', 2); $data["publish_down"] = valueIfExists($array, "publish_down", "2006-12-12"); $data["publish_up"] = valueIfExists($array, "publish_up", "2006-12-12"); $interval = valueIfExists($array, "rinterval", 1); $data["SUMMARY"] = valueIfExists($array, "title", ""); $data["MULTIDAY"] = intval(valueIfExists($array, "multiday", "1")); $data["NOENDTIME"] = intval(valueIfExists($array, "noendtime", 0)); $ics_id = valueIfExists($array, "ics_id", 0); if ($data["allDayEvent"] == "on") { $start_time = "00:00"; } else { $start_time = valueIfExists($array, "start_time", "08:00"); } $publishstart = $data["publish_up"] . ' ' . $start_time . ':00'; $data["DTSTART"] = JevDate::strtotime($publishstart); if ($data["allDayEvent"] == "on") { $end_time = "23:59"; $publishend = $data["publish_down"] . ' ' . $end_time . ':59'; } else { $end_time = valueIfExists($array, "end_time", "15:00"); $publishend = $data["publish_down"] . ' ' . $end_time . ':00'; } $data["DTEND"] = JevDate::strtotime($publishend); // iCal for whole day uses 00:00:00 on the next day JEvents uses 23:59:59 on the same day list($h, $m, $s) = explode(":", $end_time . ':00'); if ($h + $m + $s == 0 && $data["allDayEvent"] == "on" && $data["DTEND"] > $data["DTSTART"]) { $publishend = JevDate::strftime('%Y-%m-%d 23:59:59', $data["DTEND"] - 86400); $data["DTEND"] = JevDate::strtotime($publishend); } $data["X-COLOR"] = valueIfExists($array, "color", ""); // Add any custom fields into $data array foreach ($array as $key => $value) { if (strpos($key, "custom_") === 0) { $data[$key] = $value; } } // populate rpt with data $start = $data["DTSTART"]; $end = $data["DTEND"]; $rpt->startrepeat = JevDate::strftime('%Y-%m-%d %H:%M:%S', $start); $rpt->endrepeat = JevDate::strftime('%Y-%m-%d %H:%M:%S', $end); $rpt->duplicatecheck = md5($rpt->eventid . $start); $rpt->rp_id = $rp_id; $rpt->event = $event; return $rpt; }
$this->data["dates"][$dn]["slots"][$slot_to_use] = array($event, $blocks, $i); for ($block = 1; $block < $blocks; $block++) { if ($cfg->get('flattruncpriorpost', 0) && $this->data["dates"][$dn + $block]["month"] != $this->month) { // RESET THE BLOCK COUNT FOR THE END OF MONTH AND BREAK $this->data["dates"][$dn]["slots"][$slot_to_use] = array($event, $block, $i); break; } $this->data["dates"][$dn + $block]["slots"][$slot_to_use] = array($event, 0, $i); } } } else { $event->_length = 1; } // For events into their second or third week then update blocks accordingly if ($dayOfWeek == 0 && $currentDay["cellDate"] != $event->_startday) { $event->_length = JevDate::strtotime($event->endDate()) - $currentDay["cellDate"]; $event->_length = intval(round($event->_length / 86400, 0)) + 1; if ($dayOfWeek + $event->_length > 6) { $blocks = 7 - $dayOfWeek; } else { $blocks = $event->_length; } $this->data["dates"][$dn]["slots"][$slot_to_use] = array($event, $blocks, $i); for ($block = 1; $block < $blocks; $block++) { $this->data["dates"][$dn + $block]["slots"][$slot_to_use] = array($event, 0, $i); } } // mark event as shown $event->_shown = true; } }
function getAjaxCal($modid = 0, $month, $year) { // capture module id so that we can use it for ajax type navigation if ($modid != 0) { $this->_modid = $modid; } $user =& JFactory::getUser(); $db =& JFactory::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, JText::_('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, JText::_('JEV_LAST_MONTH'), $day_name, $this->disp_lastMonth == 2, $first_of_current_month); } $content .= $this->_displayCalendarMod($temptime, $this->com_starday, JText::_('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, JText::_('JEV_NEXT_MONTH'), $day_name, $this->disp_nextMonth == 2, $first_of_current_month); } return $content; }
/** * iCal spec represents date in ISO 8601 format followed by "T" then the time * a "Z at the end means the time is UTC and not local time zone * * TODO make sure if time is UTC we take account of system time offset properly * */ function unixTime($ical_date, $tz = false) { jimport("joomla.utilities.date"); static $offset = null; if (is_null($offset)) { $config =& JFactory::getConfig(); $offset = $config->getValue('config.offset', 0); } if (!is_numeric($ical_date)) { $t = JevDate::strtotime($ical_date); if (JString::strpos($ical_date, "Z") > 0) { if (is_callable("date_default_timezone_set")) { $timezone = date_default_timezone_get(); // See http://www.php.net/manual/en/timezones.php $params = JComponentHelper::getParams(JEV_COM_COMPONENT); // server offset tiemzone if ($params->get("icaltimezone", "") != "") { date_default_timezone_set($params->get("icaltimezone", "")); } // server offset PARAMS $serveroffset1 = (JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%S', $t)) - JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%SZ', $t))) / 3600; // server offset SERVER date_default_timezone_set($timezone); $serveroffset2 = (JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%S', $t)) - JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%SZ', $t))) / 3600; $t = new JevDate($ical_date, $serveroffset1 - $serveroffset2); //$t = new JevDate($ical_date ); date_default_timezone_set($timezone); echo "icaldate = " . $ical_date . " imported date=" . $t->toMySQL() . "<br/>"; } else { // Summer Time adjustment list($y, $m, $d, $h, $min, $s) = explode(":", JevDate::strftime('%Y:%m:%d:%H:%M:%S', $t)); $dst = (JevDate::mktime($h, $min, $s, $m, $d, $y, 0) - JevDate::mktime($h, $min, $s, $m, $d, $y, -1)) / 3600; // server offset including DST $serveroffset = (JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%S', $t)) - JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%SZ', $t))) / 3600; $serveroffset += $dst; $t = new JevDate($ical_date, -($serveroffset + $offset)); } /* echo "<h3>SET TIMEZONE</h3>"; $timezone= date_default_timezone_get(); date_default_timezone_set('America/New_York'); $tempIcal = "20091020T163000Z"; echo $tempIcal."<br/>"; $temp = JevDate::strtotime($tempIcal); list($y,$m,$d,$h,$min,$s) = explode(":", JevDate::strftime('%Y:%m:%d:%H:%M:%S',$temp)); echo "$y,$m,$d,$h,$min,$s<br/>"; $dst = (JevDate::mktime($h,$min,$s,$m,$d,$y,0)-JevDate::mktime($h,$min,$s,$m,$d,$y,-1))/3600; $so = (JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%S',$temp))-JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%SZ',$temp)))/3600; echo " dst=".$dst." serverforoffset=".$so."<br/>"; $so += $dst; $t = new JevDate($tempIcal); echo $t->toMySQL()."<br><br/>"; $tempIcal = "20091029T163000Z"; echo $tempIcal."<br/>"; $temp = JevDate::strtotime($tempIcal); list($y,$m,$d,$h,$min,$s) = explode(":", JevDate::strftime('%Y:%m:%d:%H:%M:%S',$temp)); echo "$y,$m,$d,$h,$min,$s<br/>"; $dst = (JevDate::mktime($h,$min,$s,$m,$d,$y,0)-JevDate::mktime($h,$min,$s,$m,$d,$y,-1))/3600; $so = (JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%S',$temp))-JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%SZ',$temp)))/3600; echo " dst=".$dst." serverforoffset=".$so."<br/>"; $so += $dst; $t = new JevDate($tempIcal ); echo $t->toMySQL()."<br><br/>"; $tempIcal = "20091103T163000Z"; echo $tempIcal."<br/>"; $temp = JevDate::strtotime($tempIcal); list($y,$m,$d,$h,$min,$s) = explode(":", JevDate::strftime('%Y:%m:%d:%H:%M:%S',$temp)); echo "$y,$m,$d,$h,$min,$s<br/>"; $dst = (JevDate::mktime($h,$min,$s,$m,$d,$y,0)-JevDate::mktime($h,$min,$s,$m,$d,$y,-1))/3600; $so = (JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%S',$temp))-JevDate::strtotime(JevDate::strftime('%Y%m%dT%H%M%SZ',$temp)))/3600; echo " dst=".$dst." serverforoffset=".$so."<br/>"; $so += $dst; $t = new JevDate($tempIcal); echo $t->toMySQL()."<br>"; */ } else { if ($tz != false && $tz != "") { // really should use the timezone of the inputted date $tz = new DateTimeZone($tz); $t = new JevDate($ical_date, $tz); echo "icaldate = " . $ical_date . " imported date=" . $t->toMySQL() . "<br/>"; } else { $compparams = JComponentHelper::getParams(JEV_COM_COMPONENT); $jtz = $compparams->get("icaltimezonelive", ""); if ($jtz) { $t = new JevDate($ical_date, $jtz); } else { $t = new JevDate($ical_date); } } } //$result = $t->toMySQL(); $result = $t->toUnix(); return $result; } $isUTC = false; if (JString::strpos($ical_date, "Z") !== false) { $isUTC = true; } // strip "T" and "Z" from the string $ical_date = str_replace('T', '', $ical_date); $ical_date = str_replace('Z', '', $ical_date); // split it out intyo YYYY MM DD HH MM SS preg_match("#([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{0,2})([0-9]{0,2})([0-9]{0,2})#", $ical_date, $date); list($temp, $y, $m, $d, $h, $min, $s) = $date; if (!$min) { $min = 0; } if (!$h) { $h = 0; } if (!$d) { $d = 0; } if (!$s) { $s = 0; } // Trap unix dated beofre 1970 $y = max($y, 1970); if ($isUTC) { $t = gmJevDate::mktime($h, $min, $s, $m, $d, $y) + 3600 * $offset; $result = JevDate::strtotime(gmdate('Y-m-d H:i:s', $t)); } else { $result = JevDate::mktime($h, $min, $s, $m, $d, $y); } // double check!! //list($y1,$m1,$d1,$h1,$min1,$s1)=explode(":",JevDate::strftime('%Y:%m:%d:%H:%M:%S',$result)); return $result; }
protected function processMatch(&$content, $match, $dayEvent, $dateParm, $relDay) { $datenow = JEVHelper::getNow(); $dispatcher =& JDispatcher::getInstance(); // get the title and start time $startDate = JevDate::strtotime($dayEvent->publish_up()); if ($relDay > 0) { $eventDate = JevDate::strtotime($datenow->toFormat('%Y-%m-%d ') . JevDate::strftime('%H:%M', $startDate) . " +{$relDay} days"); } else { $eventDate = JevDate::strtotime($datenow->toFormat('%Y-%m-%d ') . JevDate::strftime('%H:%M', $startDate) . " {$relDay} days"); } $endDate = JevDate::strtotime($dayEvent->publish_down()); list($st_year, $st_month, $st_day) = explode('-', JevDate::strftime('%Y-%m-%d', $startDate)); list($ev_year, $ev_month, $ev_day) = explode('-', JevDate::strftime('%Y-%m-%d', $startDate)); $task_events = 'icalrepeat.detail'; switch ($match) { case 'endDate': case 'startDate': case 'eventDate': // Note we need to examine the date specifiers used to determine if language translation will be // necessary. Do this later when script is debugged. if (!$this->disableDateStyle) { $content .= '<span class="mod_events_latest_date">'; } if (!$dayEvent->alldayevent() && $match == "endDate" && ($dayEvent->noendtime() || $dayEvent->getUnixStartTime() == $dayEvent->getUnixEndTime())) { $time_fmt = ""; } else { if (!isset($dateParm) || $dateParm == '') { if ($this->com_calUseStdTime) { $time_fmt = $dayEvent->alldayevent() ? '' : ' @%l:%M%p'; } else { $time_fmt = $dayEvent->alldayevent() ? '' : ' @%H:%M'; } $dateFormat = $this->displayYear ? '%a %b %d, %Y' . $time_fmt : '<span class="eventDay">%a</span> <span class="eventDate">%d<span class="eventMonth">%b</span></span>'; $jmatch = new JevDate(${$match}); $content .= $jmatch->toFormat($dateFormat); //$content .= JEV_CommonFunctions::jev_strftime($dateFormat, $$match); } else { // format endDate when midnight to show midnight! if ($match == "endDate" && $dayEvent->sdn() == 59) { $tempEndDate = $endDate + 1; if ($dayEvent->alldayevent()) { // if an all day event then we don't want to roll to the next day $tempEndDate -= 86400; } $match = "tempEndDate"; } // if a '%' sign detected in date format string, we assume JevDate::strftime() is to be used, if (preg_match("/\\%/", $dateParm)) { $jmatch = new JevDate(${$match}); $content .= $jmatch->toFormat($dateParm); } else { $content .= date($dateParm, ${$match}); } if ($match == "tempDndDate") { $match = "endDate"; } } } if (!$this->disableDateStyle) { $content .= "</span>"; } break; case 'title': $title = $dayEvent->title(); if (!empty($dateParm)) { $parts = explode("|", $dateParm); if (count($parts) > 0 && strlen($title) > intval($parts[0])) { $title = substr($title, 0, intval($parts[0])); if (count($parts) > 1) { $title .= $parts[1]; } } } if (!$this->disableTitleStyle) { $content .= '<span class="mod_events_latest_content">'; } if ($this->displayLinks) { $link = $dayEvent->viewDetailLink($ev_year, $ev_month, $ev_day, false, $this->myItemid); $link = JRoute::_($link . $this->datamodel->getCatidsOutLink()); $content .= $this->_htmlLinkCloaking($link, JEventsHTML::special($title)); } else { $content .= JEventsHTML::special($title); } if (!$this->disableTitleStyle) { $content .= '</span>'; } break; case 'category': $catobj = $dayEvent->getCategoryName(); $content .= JEventsHTML::special($catobj); break; case 'calendar': $catobj = $dayEvent->getCalendarName(); $content .= JEventsHTML::special($catobj); break; case 'contact': // Also want to cloak contact details so $this->modparams->set("image", 1); $dayEvent->text = $dayEvent->contact_info(); if (JVersion::isCompatible("1.6.0")) { $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent, &$this->modparams, 0)); } else { $dispatcher->trigger('onPrepareContent', array(&$dayEvent, &$this->modparams, 0), true); } $dayEvent->contact_info($dayEvent->text); $content .= $dayEvent->contact_info(); break; case 'content': // Added by Kaz McCoy 1-10-2004 $this->modparams->set("image", 1); $dayEvent->data->text = $dayEvent->content(); if (JVersion::isCompatible("1.6.0")) { $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent->data, &$this->modparams, 0)); } else { $results = $dispatcher->trigger('onPrepareContent', array(&$dayEvent->data, &$this->modparams, 0), true); } if (!empty($dateParm)) { $parts = explode("|", $dateParm); if (count($parts) > 0 && strlen(strip_tags($dayEvent->data->text)) > intval($parts[0])) { $dayEvent->data->text = substr(strip_tags($dayEvent->data->text), 0, intval($parts[0])); if (count($parts) > 1) { $dayEvent->data->text .= $parts[1]; } } } $dayEvent->content($dayEvent->data->text); //$content .= substr($dayEvent->content, 0, 150); $content .= $dayEvent->content(); break; case 'addressInfo': case 'location': $this->modparams->set("image", 0); $dayEvent->data->text = $dayEvent->location(); if (JVersion::isCompatible("1.6.0")) { $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent->data, &$this->modparams, 0)); } else { $results = $dispatcher->trigger('onPrepareContent', array(&$dayEvent->data, &$this->modparams, 0), true); } $dayEvent->location($dayEvent->data->text); $content .= $dayEvent->location(); break; case 'extraInfo': $this->modparams->set("image", 0); $dayEvent->data->text = $dayEvent->extra_info(); if (JVersion::isCompatible("1.6.0")) { $dispatcher->trigger('onContentPrepare', array('com_jevents', &$dayEvent->data, &$this->modparams, 0)); } else { $results = $dispatcher->trigger('onPrepareContent', array(&$dayEvent->data, &$this->modparams, 0), true); } $dayEvent->extra_info($dayEvent->data->text); $content .= $dayEvent->extra_info(); break; case 'countdown': $timedelta = $dayEvent->getUnixStartTime() - JevDate::mktime(); $fieldval = $dateParm; $shownsign = false; if (stripos($fieldval, "%d") !== false) { $days = intval($timedelta / (60 * 60 * 24)); $timedelta -= $days * 60 * 60 * 24; $fieldval = str_ireplace("%d", $days, $fieldval); $shownsign = true; } if (stripos($fieldval, "%h") !== false) { $hours = intval($timedelta / (60 * 60)); $timedelta -= $hours * 60 * 60; if ($shownsign) { $hours = abs($hours); } $hours = sprintf("%02d", $hours); $fieldval = str_ireplace("%h", $hours, $fieldval); $shownsign = true; } if (stripos($fieldval, "%m") !== false) { $mins = intval($timedelta / 60); $timedelta -= $hours * 60; if ($mins) { $mins = abs($mins); } $mins = sprintf("%02d", $mins); $fieldval = str_ireplace("%m", $mins, $fieldval); } $content .= $fieldval; break; case 'createdByAlias': $content .= $dayEvent->created_by_alias(); break; case 'createdByUserName': $catobj = JEVHelper::getUser($dayEvent->created_by()); $content .= isset($catobj->username) ? $catobj->username : ""; break; case 'createdByUserEmail': // Note that users email address will NOT be available if they don't want to receive email $catobj = JEVHelper::getUser($dayEvent->created_by()); $content .= $catobj->sendEmail ? $catobj->email : ''; break; case 'createdByUserEmailLink': // Note that users email address will NOT be available if they don't want to receive email $content .= JRoute::_("index.php?option=" . $compname . "&task=" . $task_events . "&agid=" . $dayEvent->id() . "&year=" . $st_year . "&month=" . $st_month . "&day=" . $st_day . "&Itemid=" . $this->myItemid . $this->catout); break; case 'color': $content .= $dayEvent->bgcolor(); break; case 'eventDetailLink': $link = $dayEvent->viewDetailLink($st_year, $st_month, $st_day, false, $this->myItemid); $link = JRoute::_($link . $this->datamodel->getCatidsOutLink()); $content .= $link; /* $content .= JRoute::_("index.php?option=" . $compname . "&task=".$task_events . "&agid=".$dayEvent->id() . "&year=".$st_year . "&month=".$st_month . "&day=".$st_day . "&Itemid=".$this->myItemid . $this->catout); */ break; default: try { if (strpos($match, '${') !== false) { $parts = explode('${', $match); $tempstr = ""; foreach ($parts as $part) { if (strpos($part, "}") !== false) { $subparts = explode("}", $part); //$part = str_replace("}","",$part); $subpart = "_" . $subparts[0]; if (isset($dayEvent->{$subpart})) { $temp = $dayEvent->{$subpart}; $tempstr .= $temp; } else { if (isset($dayEvent->customfields[$subparts[0]]['value'])) { $temp = $dayEvent->customfields[$subparts[0]]['value']; $tempstr .= $temp; } else { $layout = "list"; $jevplugins = JPluginHelper::getPlugin("jevents"); foreach ($jevplugins as $jevplugin) { $classname = "plgJevents" . ucfirst($jevplugin->name); if (is_callable(array($classname, "substitutefield"))) { $fieldNameArray = call_user_func(array($classname, "fieldNameArray"), $layout); if (isset($fieldNameArray["values"])) { if (in_array($subparts[0], $fieldNameArray["values"])) { // is the event detail hidden - if so then hide any custom fields too! if (!isset($event->_privateevent) || $event->_privateevent != 3) { $tempstr .= call_user_func(array($classname, "substitutefield"), $dayEvent, $subparts[0]); } } } } } //$dispatcher->trigger( 'onLatestEventsField', array( &$dayEvent, $subparts[0], &$tempstr)); } } $tempstr .= $subparts[1]; } else { $tempstr .= $part; } } $content .= $tempstr; } else { if ($match) { $content .= $match; } } } catch (Exception $e) { if ($match) { $content .= $match; } } break; } // end of switch }
private function vtimezone($icalEvents) { $params = JComponentHelper::getParams(JEV_COM_COMPONENT); $tzid = ""; if (is_callable("date_default_timezone_set")) { $current_timezone = date_default_timezone_get(); // Do the Timezone definition $tzid = ";TZID={$current_timezone}"; // find the earliest start date $firststart = false; foreach ($icalEvents as $a) { if (!$firststart || $a->getUnixStartTime() < $firststart) { $firststart = $a->getUnixStartTime(); } } // Subtract 1 leap year to make sure we have enough transitions $firststart -= 31622400; $timezone = new DateTimeZone($current_timezone); if (version_compare(PHP_VERSION, "5.3.0") >= 0) { $transitions = $timezone->getTransitions($firststart); } else { $transitions = $timezone->getTransitions(); } $tzindex = 0; while (JevDate::strtotime($transitions[$tzindex]['time']) < $firststart) { $tzindex++; } $transitions = array_slice($transitions, $tzindex); if (count($transitions) >= 2) { $lastyear = $params->get("com_latestyear", 2020); echo "BEGIN:VTIMEZONE\n"; echo "TZID:{$current_timezone}\n"; for ($t = 0; $t < count($transitions); $t++) { $transition = $transitions[$t]; if ($transition['isdst'] == 0) { if (JevDate::strftime("%Y", $transition['ts']) > $lastyear) { continue; } echo "BEGIN:STANDARD\n"; echo "DTSTART:" . JevDate::strftime("%Y%m%dT%H%M%S\n", $transition['ts']); if ($t < count($transitions) - 1) { echo "RDATE:" . JevDate::strftime("%Y%m%dT%H%M%S\n", $transitions[$t + 1]['ts']); } // if its the first transition then assume the old setting is the same as the next otherwise use the previous value $prev = $t; $prev += $t == 0 ? 1 : -1; $offset = $transitions[$prev]["offset"]; $sign = $offset >= 0 ? "+" : "-"; $offset = abs($offset); $offset = $sign . sprintf("%04s", floor($offset / 3600) * 100 + $offset % 60); echo "TZOFFSETFROM:{$offset}\n"; $offset = $transitions[$t]["offset"]; $sign = $offset >= 0 ? "" : "-"; $offset = abs($offset); $offset = $sign . sprintf("%04s", floor($offset / 3600) * 100 + $offset % 60); echo "TZOFFSETTO:{$offset}\n"; echo "TZNAME:{$current_timezone} " . $transitions[$t]["abbr"] . "\n"; echo "END:STANDARD\n"; } } for ($t = 0; $t < count($transitions); $t++) { $transition = $transitions[$t]; if ($transition['isdst'] == 1) { if (JevDate::strftime("%Y", $transition['ts']) > $lastyear) { continue; } echo "BEGIN:DAYLIGHT\n"; echo "DTSTART:" . JevDate::strftime("%Y%m%dT%H%M%S\n", $transition['ts']); if ($t < count($transitions) - 1) { echo "RDATE:" . JevDate::strftime("%Y%m%dT%H%M%S\n", $transitions[$t + 1]['ts']); } // if its the first transition then assume the old setting is the same as the next otherwise use the previous value $prev = $t; $prev += $t == 0 ? 1 : -1; $offset = $transitions[$prev]["offset"]; $sign = $offset >= 0 ? "+" : "-"; $offset = abs($offset); $offset = $sign . sprintf("%04s", floor($offset / 3600) * 100 + $offset % 60); echo "TZOFFSETFROM:{$offset}\n"; $offset = $transitions[$t]["offset"]; $sign = $offset >= 0 ? "" : "-"; $offset = abs($offset); $offset = $sign . sprintf("%04s", floor($offset / 3600) * 100 + $offset % 60); echo "TZOFFSETTO:{$offset}\n"; echo "TZNAME:{$current_timezone} " . $transitions[$t]["abbr"] . "\n"; echo "END:DAYLIGHT\n"; } } echo "END:VTIMEZONE\n"; } } return $tzid; }
/** * Function converts datetime to iCal format * * @param datetime Datetime of the event * @return converted datetime in iCal format */ private function datetimeToUtcIcsFormat($datetime) { $datetime = JevDate::strtotime($datetime); return gmdate("Ymd", $datetime) . "T" . gmdate("His", $datetime) . "Z"; }
$doc->setDescription($this->info['description']); $docimage = new JFeedImage(); $docimage->set('description', $this->info['description']); $docimage->set('title', $this->info['title']); $docimage->set('url', $this->info['image_url']); $docimage->set('link', $this->info['imagelink']); $doc->set('image', $docimage); foreach ($this->eventsByRelDay as $relDay => $ebrd) { foreach ($ebrd as $row) { // title for particular item $item_title = htmlspecialchars($row->title()); $item_title = html_entity_decode($item_title); // url link to article $startDate = $row->publish_up(); //$eventDate = JevDate::mktime(substr($startDate,11,2),substr($startDate,14,2), substr($startDate,17,2),$this->jeventCalObject->now_m,$this->jeventCalObject->now_d + $relDay,$this->jeventCalObject->now_Y); $eventDate = JevDate::strtotime($startDate); $targetid = $this->modparams->get("target_itemid", 0); $link = $row->viewDetailLink(date("Y", $eventDate), date("m", $eventDate), date("d", $eventDate), false, $targetid); $item_link = JRoute::_($link . $this->jeventCalObject->datamodel->getCatidsOutLink()); // removes all formating from the intro text for the description text $item_description = $row->content(); if ($this->info['limit_text']) { if ($this->info['text_length']) { $item_description = JFilterOutput::cleanText($item_description); // limits description text to x words $item_description_array = explode(' ', $item_description); $count = count($item_description_array); if ($count > $this->info['text_length']) { $item_description = ''; for ($a = 0; $a < $this->info['text_length']; $a++) { $item_description .= $item_description_array[$a] . ' ';
function Defaultgetstartenddates($view) { $params = JComponentHelper::getParams(JEV_COM_COMPONENT); // fix to allow start/end date to be preserved during pagination IF filter module before/after dates are used $Itemid = JRequest::getInt("Itemid", 0); // This causes the filter module to reset $filters = jevFilterProcessing::getInstance(array()); $activeFilterMenu = JFactory::getApplication()->getUserState('active_filter_menu ', $Itemid); if (intval(JRequest::getVar('filter_reset', 0)) || $activeFilterMenu > 0 && $activeFilterMenu != $Itemid) { JRequest::setVar('startdate', ''); JRequest::setVar('enddate', ''); JFactory::getApplication()->setUserState('range_enddate' . $Itemid, ''); JFactory::getApplication()->setUserState('range_startdate' . $Itemid, ''); JFactory::getApplication()->setUserState('active_filter_menu ', 0); } $startdate = JFactory::getApplication()->getUserStateFromRequest('range_startdate' . $Itemid, 'startdate', ""); $enddate = JFactory::getApplication()->getUserStateFromRequest('range_enddate' . $Itemid, 'enddate', ""); if ($startdate == "") { if ($params->get("relative", "rel") == "abs") { $startdate = $params->get("absstart", ""); list($startyear, $startmonth, $startday) = explode("-", $startdate); } else { if ($params->get("relative", "rel") == "strtotime") { $value = $params->get("strstart", ""); $value = new JevDate(JevDate::strtotime($value)); $startdate = $value->toFormat("%Y-%m-%d"); } else { $value = $params->get("relstart", ""); $value = str_replace(",", " ", $value); $value = str_replace("y", "year", $value); $value = str_replace("d", "day", $value); $value = str_replace("w", "week", $value); $value = str_replace("m", "month", $value); $value = new JevDate($value); $startdate = $value->toFormat("%Y-%m-%d"); } } } if ($enddate == "") { if ($params->get("relative", "rel") == "abs") { $enddate = $params->get("absend", ""); } else { if ($params->get("relative", "rel") == "strtotime") { $value = $params->get("strend", ""); $value = new JevDate(JevDate::strtotime($value)); $enddate = $value->toFormat("%Y-%m-%d"); } else { $value = $params->get("relend", ""); $value = str_replace(",", " ", $value); $value = str_replace("y", "year", $value); $value = str_replace("d", "day", $value); $value = str_replace("w", "week", $value); $value = str_replace("m", "month", $value); $value = new JevDate($value); $enddate = $value->toFormat("%Y-%m-%d"); } } } if ($enddate < $startdate) { // default to 1 year when input dates are not valid! $value = new JevDate($startdate); $value->add(new DateInterval('P1Y')); $enddate = $value->toFormat("%Y-%m-%d"); } return array($startdate, $enddate); }
/** * Function converts datetime to iCal format * * @param datetime Datetime of the event * @return converted datetime in iCal format */ private function datetimeToIcsFormat($datetime) { $datetime = JevDate::strtotime($datetime); return date("Ymd", $datetime) . "T" . date("His", $datetime); }
/** * Function converts datetime to iCal format * * @param datetime Datetime of the event * @return converted datetime in iCal format */ private function datetimeToIcsFormat($datetime) { $newdatetime = JevDate::strtotime($datetime); $tempdate = new JevDate($newdatetime); if (strlen($datetime) <= 10 && $tempdate->toFormat("%H:%M:%S") == "00:00:00") { // in this case we have not time element so don't set it otherwise iCal import will think a time is actually set and not process all day or no end time events correctly return date("Ymd", $newdatetime); } return date("Ymd", $newdatetime) . "T" . date("His", $newdatetime); }
} $html .= "SUMMARY:" . $a->title() . "\r\n"; if ($a->location() != "") { $html .= "LOCATION:" . $this->wraplines($this->replacetags($a->location())) . "\r\n"; } // We Need to wrap this according to the specs $html .= $this->setDescription($a->content()) . "\r\n"; if ($a->hasContactInfo()) { $html .= "CONTACT:" . $this->replacetags($a->contact_info()) . "\r\n"; } if ($a->hasExtraInfo()) { $html .= "X-EXTRAINFO:" . $this->wraplines($this->replacetags($a->_extra_info)); } $html .= "\r\n"; $exception = $changedexceptions[$a->rp_id()]; $originalstart = JevDate::strtotime($exception->oldstartrepeat); $chstart = $a->getUnixStartTime(); $chend = $a->getUnixEndTime(); // No doing true timezones! if ($tzid == "" && is_callable("date_default_timezone_set")) { // UTC! // Change timezone to UTC $current_timezone = date_default_timezone_get(); date_default_timezone_set("UTC"); // Do not use JevDate version since this sets timezone to config value! $chstart = strftime("%Y%m%dT%H%M%SZ", $chstart); $chend = strftime("%Y%m%dT%H%M%SZ", $chend); $stamptime = strftime("%Y%m%dT%H%M%SZ", time()); $originalstart = strftime("%Y%m%dT%H%M%SZ", $originalstart); // Change back date_default_timezone_set($current_timezone);
/** * Function that overwrites meta-tags in mainframe!! * * @static * @param string $name - metatag name * @param string $content - metatag value */ function checkRobotsMetaTag($name = "robots", $content = "noindex, nofollow") { // force robots metatag $cfg =& JEVConfig::getInstance(); if ($cfg->get('com_blockRobots', 0) >= 1) { $document =& JFactory::getDocument(); // Allow on content pages if ($cfg->get('com_blockRobots', 0) == 3) { if (strpos(JRequest::getString("jevtask", ""), ".detail") > 0) { $document->setMetaData($name, "nofollow"); return; } $document->setMetaData($name, $content); return; } if ($cfg->get('com_blockRobots', 0) == 1) { $document->setMetaData($name, $content); return; } list($cyear, $cmonth, $cday) = JEVHelper::getYMD(); $cdate = JevDate::mktime(0, 0, 0, $cmonth, $cday, $cyear); $prior = JevDate::strtotime($cfg->get('robotprior', "-1 day")); if ($cdate < $prior) { $document->setMetaData($name, $content); return; } $post = JevDate::strtotime($cfg->get('robotpost', "-1 day")); if ($cdate > $post) { $document->setMetaData($name, $content); return; } } }
function generateRRule($array) { //static $weekdayMap=array("SU"=>0,"MO"=>1,"TU"=>2,"WE"=>3,"TH"=>4,"FR"=>5,"SA"=>6); static $weekdayReverseMap = array("SU", "MO", "TU", "WE", "TH", "FR", "SA"); $interval = JArrayHelper::getValue($array, "rinterval", 1); $freq = JArrayHelper::getValue($array, "freq", "NONE"); if ($freq != "NONE") { $rrule = array(); $rrule["FREQ"] = $freq; $countuntil = JArrayHelper::getValue($array, "countuntil", "count"); if ($countuntil == "count") { $count = intval(JArrayHelper::getValue($array, "count", 1)); if ($count <= 0) { $count = 1; } $rrule["COUNT"] = $count; } else { $publish_down = JArrayHelper::getValue($array, "publish_down", "2006-12-12"); $until = JArrayHelper::getValue($array, "until", $publish_down); $rrule["UNTIL"] = JevDate::strtotime($until . " 00:00:00"); } $rrule["INTERVAL"] = $interval; } $whichby = JArrayHelper::getValue($array, "whichby", "bd"); switch ($whichby) { case "byd": $byd_direction = JArrayHelper::getValue($array, "byd_direction", "off") == "off" ? "+" : "-"; $byyearday = JArrayHelper::getValue($array, "byyearday", ""); $rrule["BYYEARDAY"] = $byd_direction . $byyearday; break; case "bm": $bm_direction = JArrayHelper::getValue($array, "bm_direction", "off") == "off" ? "+" : "-"; $bymonth = JArrayHelper::getValue($array, "bymonth", ""); $rrule["BYMONTH"] = $bymonth; break; case "bwn": $bwn_direction = JArrayHelper::getValue($array, "bwn_direction", "off") == "off" ? "+" : "-"; $byweekno = JArrayHelper::getValue($array, "byweekno", ""); $rrule["BYWEEKNO"] = $bwn_direction . $byweekno; break; case "bmd": $bmd_direction = JArrayHelper::getValue($array, "bmd_direction", "off") == "off" ? "+" : "-"; $bymonthday = JArrayHelper::getValue($array, "bymonthday", ""); $rrule["BYMONTHDAY"] = $bmd_direction . $bymonthday; break; case "bd": $bd_direction = JArrayHelper::getValue($array, "bd_direction", "off") == "off" ? "+" : "-"; $weekdays = JArrayHelper::getValue($array, "weekdays", array()); $weeknums = JArrayHelper::getValue($array, "weeknums", array()); $byday = ""; if (count($weeknums) == 0) { // special case for weekly repeats which don't specify eeek of a month foreach ($weekdays as $wd) { if (strlen($byday) > 0) { $byday .= ","; } $byday .= $weekdayReverseMap[$wd]; } } foreach ($weeknums as $week) { foreach ($weekdays as $wd) { if (strlen($byday) > 0) { $byday .= ","; } $byday .= $bd_direction . $week . $weekdayReverseMap[$wd]; } } $rrule["BYDAY"] = $byday; break; } return $rrule; }
function listIcalEventsByCat($catids, $showrepeats = false, $total = 0, $limitstart = 0, $limit = 0, $order = "rpt.startrepeat asc, rpt.endrepeat ASC, det.summary ASC", $filters = false, $extrafields = "", $extratables = "") { $db =& JFactory::getDBO(); $user = JFactory::getUser(); // Use catid in accessibleCategoryList to pick up offsping too! $aid = null; $catidlist = implode(",", $catids); // process the new plugins // get extra data and conditionality from plugins $extrafields = ""; // must have comma prefix $extratables = ""; // must have comma prefix $extrawhere = array(); $extrajoin = array(); $needsgroup = false; if (!$this->cfg->getValue("showyearpast", 1)) { list($year, $month, $day) = JEVHelper::getYMD(); $startdate = JevDate::mktime(0, 0, 0, $month, $day, $year); $today = JevDate::strtotime("+0 days"); if ($startdate < $today) { $startdate = $today; } $startdate = JevDate::strftime('%Y-%m-%d 00:00:00', $startdate); $extrawhere[] = "rpt.endrepeat >= '{$startdate}'"; } if (!$filters) { $filters = jevFilterProcessing::getInstance(array("published", "justmine", "category", "search")); $filters->setWhereJoin($extrawhere, $extrajoin); $needsgroup = $filters->needsGroupBy(); $dispatcher =& JDispatcher::getInstance(); $dispatcher->trigger('onListIcalEvents', array(&$extrafields, &$extratables, &$extrawhere, &$extrajoin, &$needsgroup)); } else { $filters->setWhereJoin($extrawhere, $extrajoin); } $catwhere = "\n WHERE ev.catid IN(" . $this->accessibleCategoryList() . ")"; $params = JComponentHelper::getParams("com_jevents"); if ($params->get("multicategory", 0)) { $extrajoin[] = "\n #__jevents_catmap as catmap ON catmap.evid = rpt.eventid"; $extrajoin[] = "\n #__categories AS catmapcat ON catmap.catid = catmapcat.id"; $extrafields .= ", GROUP_CONCAT(DISTINCT catmap.catid SEPARATOR ',') as catids"; $extrawhere[] = " catmapcat.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . JEVHelper::getAid($user) . ')' : ' <= ' . JEVHelper::getAid($user)); $extrawhere[] = " catmap.catid IN(" . $this->accessibleCategoryList() . ")"; $needsgroup = true; $catwhere = "\n WHERE 1 "; } $extrajoin = count($extrajoin) ? " \n LEFT JOIN " . implode(" \n LEFT JOIN ", $extrajoin) : ''; $extrawhere = count($extrawhere) ? ' AND ' . implode(' AND ', $extrawhere) : ''; if ($limit > 0 || $limitstart > 0) { if (empty($limitstart) || !$limitstart) { $limitstart = 0; } $rows_per_page = $limit; $limit = " LIMIT {$limitstart}, {$rows_per_page}"; } else { $limit = ""; } if ($order != "") { $order = (strpos($order, 'ORDER BY') === false ? " ORDER BY " : " ") . $order; } $user = JFactory::getUser(); if ($showrepeats) { $query = "SELECT ev.*, rpt.*, rr.*, det.* {$extrafields}" . "\n , YEAR(rpt.startrepeat) as yup, MONTH(rpt.startrepeat ) as mup, DAYOFMONTH(rpt.startrepeat ) as dup" . "\n , YEAR(rpt.endrepeat ) as ydn, MONTH(rpt.endrepeat ) as mdn, DAYOFMONTH(rpt.endrepeat ) as ddn" . "\n , HOUR(rpt.startrepeat) as hup, MINUTE(rpt.startrepeat ) as minup, SECOND(rpt.startrepeat ) as sup" . "\n , HOUR(rpt.endrepeat ) as hdn, MINUTE(rpt.endrepeat ) as mindn, SECOND(rpt.endrepeat ) as sdn" . "\n FROM #__jevents_vevent as ev" . "\n LEFT JOIN #__jevents_icsfile as icsf ON icsf.ics_id=ev.icsid" . "\n LEFT JOIN #__jevents_repetition as rpt ON rpt.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_rrule as rr ON rr.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_vevdetail as det ON det.evdet_id = rpt.eventdetail_id" . $extrajoin . $catwhere . $extrawhere . "\n AND icsf.state=1" . "\n AND ev.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . JEVHelper::getAid($user) . ')' : ' <= ' . JEVHelper::getAid($user)) . "\n GROUP BY rpt.rp_id" . $order . $limit; } else { // TODO find a single query way of doing this !!! $query = "SELECT MIN(rpt.rp_id) as rp_id FROM #__jevents_repetition as rpt " . "\n LEFT JOIN #__jevents_vevent as ev ON rpt.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_rrule as rr ON rr.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_vevdetail as det ON det.evdet_id = rpt.eventdetail_id" . "\n LEFT JOIN #__jevents_icsfile as icsf ON icsf.ics_id=ev.icsid" . $extrajoin . $catwhere . $extrawhere . "\n AND icsf.state=1" . "\n AND ev.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . JEVHelper::getAid($user) . ')' : ' <= ' . JEVHelper::getAid($user)) . "\n GROUP BY ev.ev_id"; $db->setQuery($query); //echo $db->explain(); $rplist = $db->loadResultArray(); $rplist = implode(',', array_merge(array(-1), $rplist)); $query = "SELECT rpt.rp_id,ev.*, rpt.*, rr.*, det.* {$extrafields}" . "\n , YEAR(rpt.startrepeat) as yup, MONTH(rpt.startrepeat ) as mup, DAYOFMONTH(rpt.startrepeat ) as dup" . "\n , YEAR(rpt.endrepeat ) as ydn, MONTH(rpt.endrepeat ) as mdn, DAYOFMONTH(rpt.endrepeat ) as ddn" . "\n , HOUR(rpt.startrepeat) as hup, MINUTE(rpt.startrepeat ) as minup, SECOND(rpt.startrepeat ) as sup" . "\n , HOUR(rpt.endrepeat ) as hdn, MINUTE(rpt.endrepeat ) as mindn, SECOND(rpt.endrepeat ) as sdn" . "\n FROM #__jevents_repetition as rpt " . "\n LEFT JOIN #__jevents_vevent as ev ON rpt.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_icsfile as icsf ON icsf.ics_id=ev.icsid" . "\n LEFT JOIN #__jevents_rrule as rr ON rr.eventid = ev.ev_id" . "\n LEFT JOIN #__jevents_vevdetail as det ON det.evdet_id = rpt.eventdetail_id" . $extrajoin . $catwhere . $extrawhere . "\n AND rpt.rp_id IN({$rplist})" . "\n AND icsf.state=1" . "\n AND ev.access " . (version_compare(JVERSION, '1.6.0', '>=') ? ' IN (' . JEVHelper::getAid($user) . ')' : ' <= ' . JEVHelper::getAid($user)) . ($needsgroup ? "\n GROUP BY rpt.rp_id" : "") . $order . $limit; } $cache =& JFactory::getCache(JEV_COM_COMPONENT); $lang =& JFactory::getLanguage(); $langtag = $lang->getTag(); $rows = $cache->call('JEventsDBModel::_cachedlistIcalEvents', $query, $langtag); $dispatcher =& JDispatcher::getInstance(); $dispatcher->trigger('onDisplayCustomFieldsMultiRowUncached', array(&$rows)); return $rows; }
function _deleteFuture() { $cid = JRequest::getVar('cid', array(0)); if (!is_array($cid)) { $cid = array(intval($cid)); } JArrayHelper::toInteger($cid); $db = JFactory::getDBO(); foreach ($cid as $id) { // I should be able to do this in one operation but that can come later $event = $this->queryModel->listEventsById(intval($id), 1, "icaldb"); if (!JEVHelper::canDeleteEvent($event)) { throw new Exception(JText::_('ALERTNOTAUTH'), 403); return false; } $query = "SELECT * FROM #__jevents_repetition WHERE rp_id={$id}"; $db->setQuery($query); $repeatdata = null; $repeatdata = $db->loadObject(); if (is_null($repeatdata)) { throw new Exception(JText::_('NO_SUCH_EVENT'), 4777); return; } $query = "SELECT detail_id FROM #__jevents_vevent WHERE ev_id={$repeatdata->eventid}"; $db->setQuery($query); $eventdetailid = $db->loadResult(); // Find detail ids for future repetitions that don't match the global event detail $query = "SELECT eventdetail_id FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "' AND eventdetail_id<>" . $eventdetailid; $db->setQuery($query); $detailids = $db->loadColumn(); // Find repeat ids future repetitions $query = "SELECT rp_id FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $rp_ids = $db->loadColumn(); foreach ($rp_ids as $rp_id) { // May want to send notification messages etc. $dispatcher = JDispatcher::getInstance(); // just incase we don't have jevents plugins registered yet JPluginHelper::importPlugin("jevents"); $res = $dispatcher->trigger('onDeleteEventRepeat', $rp_id); } // Change the underlying event repeat rule details !! $query = "SELECT * FROM #__jevents_rrule WHERE eventid={$repeatdata->eventid}"; $db->setQuery($query); $this->rrule = null; $this->rrule = $db->loadObject(); $this->rrule = iCalRRule::iCalRRuleFromDB(get_object_vars($this->rrule)); if (intval($this->rrule->until) > 0) { // Find latest matching repetition $query = "SELECT max(startrepeat) FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat<'" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $lastrepeat = $db->loadResult(); $this->rrule->until = JevDate::strtotime($lastrepeat); } else { // Find latest matching repetition $query = "SELECT count(startrepeat) FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat<'" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $countrepeat = $db->loadResult(); $this->rrule->count = $countrepeat; } $this->rrule->store(); if (!is_null($detailids) && count($detailids) > 0) { $query = "DELETE FROM #__jevents_vevdetail WHERE evdet_id IN (" . implode(",", $detailids) . ")"; $db->setQuery($query); $db->query(); // I also need to clean out associated custom data $dispatcher = JDispatcher::getInstance(); // just incase we don't have jevents plugins registered yet JPluginHelper::importPlugin("jevents"); $res = $dispatcher->trigger('onDeleteEventDetails', array(implode(",", $detailids))); } // setup exception data foreach ($rp_ids as $rp_id) { $query = "SELECT * FROM #__jevents_repetition WHERE rp_id={$rp_id}"; $db->setQuery($query); $data = null; $data = $db->loadObject(); $exception = iCalException::loadByRepeatId($rp_id); if (!$exception) { $exception = new iCalException($db); $exception->bind(get_object_vars($data)); } $exception->exception_type = 0; // deleted $exception->store(); } $query = "DELETE FROM #__jevents_repetition WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "'"; $db->setQuery($query); $db->query(); // Also clear out defunct exceptions $query = "DELETE FROM #__jevents_exception WHERE eventid=" . $repeatdata->eventid . " AND startrepeat>='" . $repeatdata->startrepeat . "' and exception_type=1 "; $db->setQuery($query); $db->query(); } }
/** * Generates repetition from vevent & rrule data from scratch * The result can then be saved to the database */ function getRepetitions($dtstart, $dtend, $duration, $recreate = false, $exdate = array()) { // put exdate into somewhere that I can get from _makerepeat $this->_exdate = $exdate; // TODO "getRepetitions doesnt yet deal with Short months and 31st or leap years/week 53<br/>"; if ($dtend == 0 && $duration > 0) { $dtend = $dtstart + $duration; } if (!$recreate && isset($this->_repetitions)) { return $this->_repetitions; } $this->_repetitions = array(); if (!isset($this->eventid)) { echo "no eventid set in generateRepetitions<br/>"; return $this->_repetitions; } if ($this->count == 1 && $this->freq != "IRREGULAR") { //echo "count=1 returing<br/>"; $this->_makeRepeat($dtstart, $dtend); return $this->_repetitions; } //list ($h,$min,$s,$d,$m,$y) = explode(":",JevDate::strftime("%H:%M:%S:%d:%m:%Y",$end)); list($startHour, $startMin, $startSecond, $startDay, $startMonth, $startYear, $startWD) = explode(":", JevDate::strftime("0%H:0%M:0%S:%d:%m:%Y:%w", $dtstart)); //echo "$startHour,$startMin,$startSecond,$startDay,$startMonth,$startYear,$startWD,$dtstart<br/>"; $dtstartMidnight = JevDate::mktime(0, 0, 0, $startMonth, $startDay, $startYear); list($endDay, $endMonth, $endYear, $endWD) = explode(":", JevDate::strftime("%d:%m:%Y:%w", $dtend)); $duration = $dtend - $dtstart; static $weekdayMap = array("SU" => 0, "MO" => 1, "TU" => 2, "WE" => 3, "TH" => 4, "FR" => 5, "SA" => 6); static $weekdayReverseMap = array("SU", "MO", "TU", "WE", "TH", "FR", "SA"); static $dailySecs = 86400; static $weeklySecs = 604800; // TODO implement byyearday // TODO do full leap year audit e.g. YEARLY repeats //echo "freq = ".$this->freq."<br/>"; switch ($this->freq) { case "YEARLY": // TODO the code doesn't yet deal with multiple bymonths if ($this->bymonth == "") { $this->bymonth = $startMonth; } //if ($this->byday=="") $this->byday=$weekdayReverseMap[$startWD]; // If I have byday and bymonthday then the two considions must be met $weekdays = array(); if ($this->byday != "") { foreach (explode(",", $this->byday) as $bday) { if (array_key_exists($bday, $weekdayMap)) { $weekdays[] = $weekdayMap[$bday]; } } } if ($this->byyearday != "") { echo "byyearday <br/>"; $days = explode(",", $this->byyearday); $start = $dtstart; $end = $dtend; $countRepeats = 0; $currentYearStart = JevDate::mktime(0, 0, 0, 1, 1, $startYear); // do the current month first while ($countRepeats < $this->count && !$this->_afterUntil($currentYearStart)) { $currentYear = JevDate::strftime("%Y", $currentYearStart); $currentYearDays = date("L", $currentYearStart) ? 366 : 365; foreach ($days as $day) { if ($countRepeats >= $this->count || $this->_afterUntil($start)) { return $this->_repetitions; } // TODO I am assuming all + or all -ve $details = array(); preg_match("/(\\+|-?)(\\d*)/", $day, $details); list($temp, $plusminus, $daynumber) = $details; if (JString::strlen($plusminus) == 0) { $plusminus = "+"; } // do not go over year end if ($daynumber > $currentYearDays) { continue; } if ($plusminus == "+") { $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, 12, 31, $currentYear - 1); $targetStart = JevDate::strtotime("+{$daynumber} days", $targetStart); } else { $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, 1, 1, $currentYear + 1); $targetStart = JevDate::strtotime("-{$daynumber} days", $targetStart); } $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { // double check for byday constraints if ($this->byday != "") { if (!in_array(JevDate::strftime("%w", $targetStart), $weekdays)) { continue; } } $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } // now ago to the start of next year if ($currentYear + $this->rinterval > 2099) { return $this->_repetitions; } $currentYearStart = JevDate::mktime(0, 0, 0, 1, 1, $currentYear + $this->rinterval); } } else { if ($this->bymonthday != "") { echo "bymonthday" . $this->bymonthday . " <br/>"; $days = explode(",", $this->bymonthday); $start = $dtstart; $end = $dtend; $countRepeats = 0; $currentMonthStart = JevDate::mktime(0, 0, 0, $startMonth, 1, $startYear); // do the current month first while ($countRepeats < $this->count && !$this->_afterUntil($currentMonthStart)) { list($currentMonth, $currentYear) = explode(":", JevDate::strftime("%m:%Y", $currentMonthStart)); $currentMonthDays = date("t", $currentMonthStart); foreach ($days as $day) { if ($countRepeats >= $this->count || $this->_afterUntil($start)) { return $this->_repetitions; } // Assume no negative bymonthday values // TODO relax this assumption // do not go over month end if ($day > $currentMonthDays) { continue; } $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, $currentMonth, $day, $currentYear); $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { // double check for byday constraints if ($this->byday != "") { if (!in_array(JevDate::strftime("%w", $targetStart), $weekdays)) { continue; } } $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } // now ago to the start of next month if ($currentYear + $this->rinterval > 2099) { return $this->_repetitions; } $currentMonthStart = JevDate::mktime(0, 0, 0, $currentMonth, 1, $currentYear + $this->rinterval); } } else { if ($this->byday == "") { $start = $dtstart; $end = $dtend; $countRepeats = 0; while ($countRepeats < $this->count && !$this->_afterUntil($start)) { $countRepeats += $this->_makeRepeat($start, $end); $currentYear = JevDate::strftime("%Y", $start); list($h, $min, $s, $d, $m, $y) = explode(":", JevDate::strftime("%H:%M:%S:%d:%m:%Y", $start)); $maxyear = PHP_INT_SIZE === 8 ? 2999 : 2037; if ($currentYear + $this->rinterval >= $maxyear) { break; } $start = JevDate::strtotime("+" . $this->rinterval . " years", $start); $end = JevDate::strtotime("+" . $this->rinterval . " years", $end); } } else { $days = explode(",", $this->byday); // duplicate where necessary $extradays = array(); foreach ($days as $day) { if (strpos($day, "+") === false && strpos($day, "-") === false) { for ($i = 2; $i <= 52; $i++) { $extradays[] = "+" . $i . $day; } } } $days = array_merge($days, $extradays); $start = $dtstart; $end = $dtend; $countRepeats = 0; // do the current month first while ($countRepeats < $this->count && !$this->_afterUntil($start)) { $currentMonth = JevDate::strftime("%m", $start); foreach ($days as $day) { if ($countRepeats >= $this->count || $this->_afterUntil($start)) { return $this->_repetitions; } $details = array(); if (strpos($day, "+") === false && strpos($day, "-") === false) { $day = "+1" . $day; } preg_match("/(\\+|-?)(\\d+)(.{2})/", $day, $details); if (count($details) != 4) { echo "<br/><br/><b>PROBLEMS with {$day}</b><br/><br/>"; return $this->_repetitions; } else { list($temp, $plusminus, $weeknumber, $dayname) = $details; if (JString::strlen($plusminus) == 0) { $plusminus = "+"; } if (JString::strlen($weeknumber) == 0) { $weeknumber = 1; } // always check for dtstart (nothing is allowed earlier) if ($plusminus == "-") { //echo "count back $weeknumber weeks on $dayname<br/>"; list($startDay, $startMonth, $startYear, $startWD) = explode(":", JevDate::strftime("%d:%m:%Y:%w", $start)); $startLast = date("t", $start); $monthEnd = JevDate::mktime(0, 0, 0, $startMonth, $startLast, $startYear); $meWD = JevDate::strftime("%w", $monthEnd); $adjustment = $startLast - (7 + $meWD - $weekdayMap[$dayname]) % 7; $targetstartDay = $adjustment - ($weeknumber - 1) * 7; $targetendDay = $targetstartDay + $endDay - $startDay; list($h, $min, $s, $d, $m, $y) = explode(":", JevDate::strftime("%H:%M:%S:%d:%m:%Y", $start)); $testStart = JevDate::mktime($h, $min, $s, $m, $targetstartDay, $y); if ($currentMonth == JevDate::strftime("%m", $testStart)) { $targetStart = $testStart; $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } } else { //echo "count forward $weeknumber weeks on $dayname<br/>"; list($startDay, $startMonth, $startYear, $startWD) = explode(":", JevDate::strftime("%d:%m:%Y:%w", $start)); $monthStart = JevDate::mktime(0, 0, 0, $startMonth, 1, $startYear); $msWD = JevDate::strftime("%w", $monthStart); if (!isset($weekdayMap[$dayname])) { $x = 1; } $adjustment = 1 + (7 + $weekdayMap[$dayname] - $msWD) % 7; $targetstartDay = $adjustment + ($weeknumber - 1) * 7; $targetendDay = $targetstartDay + $endDay - $startDay; list($h, $min, $s, $d, $m, $y) = explode(":", JevDate::strftime("%H:%M:%S:%d:%m:%Y", $start)); $testStart = JevDate::mktime($h, $min, $s, $m, $targetstartDay, $y); if ($currentMonth == JevDate::strftime("%m", $testStart)) { $targetStart = $testStart; $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } } } } // now ago to the start of the next month $start = $targetStart; $end = $targetEnd; list($h, $min, $s, $d, $m, $y) = explode(":", JevDate::strftime("%H:%M:%S:%d:%m:%Y", $start)); if ($y + $this->rinterval + $m / 12 > 2099) { return $this->_repetitions; } $start = JevDate::mktime($h, $min, $s, $m, 1, $y + $this->rinterval); $end = $start + $duration; } } } } return $this->_repetitions; break; case "MONTHLY": if ($this->bymonthday == "" && $this->byday == "") { $this->bymonthday = $startDay; } if ($this->bymonthday != "") { echo "bymonthday" . $this->bymonthday . " <br/>"; // if not byday then by monthday $days = explode(",", $this->bymonthday); // If I have byday and bymonthday then the two considions must be met $weekdays = array(); if ($this->byday != "") { foreach (explode(",", $this->byday) as $bday) { $weekdays[] = $weekdayMap[$bday]; } } $start = $dtstart; $end = $dtend; $countRepeats = 0; $currentMonthStart = JevDate::mktime(0, 0, 0, $startMonth, 1, $startYear); // do the current month first while ($countRepeats < $this->count && !$this->_afterUntil($currentMonthStart)) { //echo $countRepeats ." ".$this->count." ".$currentMonthStart."<br/>"; list($currentMonth, $currentYear) = explode(":", JevDate::strftime("%m:%Y", $currentMonthStart)); $currentMonthDays = date("t", $currentMonthStart); foreach ($days as $day) { if ($countRepeats >= $this->count || $this->_afterUntil($start)) { return $this->_repetitions; } $details = array(); preg_match("/(\\+|-?)(\\d+)/", $day, $details); if (count($details) != 3) { echo "<br/><br/><b>PROBLEMS with {$day}</b><br/><br/>"; return $this->_repetitions; } else { list($temp, $plusminus, $daynumber) = $details; if (JString::strlen($plusminus) == 0) { $plusminus = "+"; } if (JString::strlen($daynumber) == 0) { $daynumber = $startDay; } // always check for dtstart (nothing is allowed earlier) if ($plusminus == "-") { // must not go before start of month etc. if ($daynumber > $currentMonthDays) { continue; } echo "I need to check negative bymonth days <br/>"; $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, $currentMonth, $currentMonthDays + 1 - $daynumber, $currentYear); $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } else { //echo "$daynumber $currentMonthDays bd=".$this->byday." <br/>"; // must not go over end month etc. if ($daynumber > $currentMonthDays) { continue; } //echo "$startHour,$startMin,$startSecond,$currentMonth,$daynumber,$currentYear<br/>"; $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, $currentMonth, $daynumber, $currentYear); $targetEnd = $targetStart + $duration; //echo "$targetStart $targetEnd $dtstartMidnight<br/>"; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { // double check for byday constraints if ($this->byday != "") { if (!in_array(JevDate::strftime("%w", $targetStart), $weekdays)) { continue; } } $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); //echo "countrepeats = $countRepeats<br/>"; } } } } // now ago to the start of next month if ($currentYear + ($currentMonth + $this->rinterval) / 12 > 2099) { return $this->_repetitions; } $currentMonthStart = JevDate::mktime(0, 0, 0, $currentMonth + $this->rinterval, 1, $currentYear); } } else { $days = explode(",", $this->byday); // TODO I should also iterate over week number if this is used //$weeknumbers = explode(",",$this->byweekno); if ($this->bysetpos != "") { $newdays = array(); $setpositions = explode(",", $this->bysetpos); foreach ($setpositions as $setposition) { foreach ($days as $day) { if (strpos($setposition, "+") === false && strpos($setposition, "-") === false) { $setposition = "+" . $setposition; } $newdays[] = $setposition . $day; } } $days = $newdays; $this->byday = implode(",", $days); } $start = $dtstart; $end = $dtend; $countRepeats = 0; $currentMonthStart = JevDate::mktime(0, 0, 0, $startMonth, 1, $startYear); // do the current month first while ($countRepeats < $this->count && !$this->_afterUntil($currentMonthStart)) { list($currentMonth, $currentYear, $currentMonthStartWD) = explode(":", JevDate::strftime("%m:%Y:%w", $currentMonthStart)); $currentMonthDays = date("t", $currentMonthStart); $this->sortByDays($days, $currentMonthStart, $dtstart); foreach ($days as $day) { if ($countRepeats >= $this->count || $this->_afterUntil($start)) { return $this->_repetitions; } $details = array(); preg_match("/(\\+|-?)(\\d?)(.+)/", $day, $details); if (count($details) != 4) { echo "<br/><br/><b>PROBLEMS with {$day}</b><br/><br/>"; return $this->_repetitions; } else { list($temp, $plusminus, $weeknumber, $dayname) = $details; if (JString::strlen($plusminus) == 0) { $plusminus = "+"; } if (JString::strlen($weeknumber) == 0) { $weeknumber = 1; } $multiplier = $plusminus == "+" ? 1 : -1; // always check for dtstart (nothing is allowed earlier) if ($plusminus == "-") { //echo "count back $weeknumber weeks on $dayname<br/>"; $startLast = date("t", $currentMonthStart); $currentMonthEndWD = ($startLast - 1 + $currentMonthStartWD) % 7; $adjustment = $startLast - (7 + $currentMonthEndWD - $weekdayMap[$dayname]) % 7; $targetstartDay = $adjustment - ($weeknumber - 1) * 7; } else { //echo "count forward $weeknumber weeks on $dayname<br/>"; $adjustment = 1 + (7 + $weekdayMap[$dayname] - $currentMonthStartWD) % 7; $targetstartDay = $adjustment + ($weeknumber - 1) * 7; } $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, $currentMonth, $targetstartDay, $currentYear); if ($currentMonth == JevDate::strftime("%m", $targetStart)) { $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } } } // now go to the start of next month if ($currentYear + ($currentMonth + $this->rinterval) / 12 > 2099) { return $this->_repetitions; } $currentMonthStart = JevDate::mktime(0, 0, 0, $currentMonth + $this->rinterval, 1, $currentYear); } } return $this->_repetitions; break; case "WEEKLY": $days = explode(",", $this->byday); $start = $dtstart; $end = $dtend; $countRepeats = 0; $currentWeekDay = JevDate::strftime("%w", $start); // Go to the zero day of the first week (even if this is in the past) // this will be the base from which we count the weeks and weekdays $currentWeekStart = JevDate::strtotime("-{$currentWeekDay} days", $start); // no BYDAY specified if ($this->byday == "") { $daynames = array("SU", "MO", "TU", "WE", "TH", "FR", "SA", "SU"); $this->byday = "+" . $daynames[$currentWeekDay]; $days = array($this->byday); } while ($countRepeats < $this->count && !$this->_afterUntil($currentWeekStart)) { list($currentDay, $currentMonth, $currentYear) = explode(":", JevDate::strftime("%d:%m:%Y", $currentWeekStart)); foreach ($days as $day) { if ($countRepeats >= $this->count || $this->_afterUntil($start)) { return $this->_repetitions; } $details = array(); preg_match("/(\\+|-?)(\\d?)(.+)/", $day, $details); if (count($details) != 4) { continue; echo "<br/><br/><b>PROBLEMS with {$day}</b><br/><br/>"; return $this->_repetitions; } else { list($temp, $plusminus, $daynumber, $dayname) = $details; if (JString::strlen($plusminus) == 0) { $plusminus = "+"; } // this is not relevant for weekly recurrence ?!?!? //if (JString::strlen($daynumber)==0) $daynumber=1; $multiplier = $plusminus == "+" ? 1 : -1; if ($plusminus == "-") { // TODO find out if I ever have this situation? // It would seem meaningless } else { //echo "count forward $daynumber days on $dayname<br/>"; $targetstartDay = $currentDay + $weekdayMap[$dayname]; } $targetStart = JevDate::mktime($startHour, $startMin, $startSecond, $currentMonth, $targetstartDay, $currentYear); $targetEnd = $targetStart + $duration; if ($countRepeats >= $this->count) { return $this->_repetitions; } if ($targetStart >= $dtstartMidnight && !$this->_afterUntil($targetStart)) { $countRepeats += $this->_makeRepeat($targetStart, $targetEnd); } } } // now go to the start of next week if ($currentYear + $currentMonth / 12 > 2099) { return $this->_repetitions; } $currentWeekStart = JevDate::strtotime("+" . $this->rinterval . " weeks", $currentWeekStart); } return $this->_repetitions; break; case "DAILY": $start = $dtstart; $end = $dtend; $countRepeats = 0; $startYear = JevDate::strftime("%Y", $start); while ($startYear < 2027 && $countRepeats < $this->count && !$this->_afterUntil($start)) { //while ($startYear<5027 && $countRepeats < $this->count && !$this->_afterUntil($start)) { $countRepeats += $this->_makeRepeat($start, $end); $start = JevDate::strtotime("+" . $this->rinterval . " days", $start); $end = JevDate::strtotime("+" . $this->rinterval . " days", $end); $startYear = JevDate::strftime("%Y", $start); } return $this->_repetitions; break; case "IRREGULAR": $processedDates = array(); // current date is ALWAYS a repeat $processedDates[] = $dtstart; $this->_makeRepeat($dtstart, $dtend); if (is_string($this->irregulardates) && $this->irregulardates != "") { $this->irregulardates = @json_decode($this->irregulardates); } if (!is_array($this->irregulardates)) { $this->irregulardates = array(); } sort($this->irregulardates); foreach ($this->irregulardates as $irregulardate) { // avoid duplicate values if (in_array($irregulardate, $processedDates)) { continue; } $processedDates[] = $irregulardate; // find the start and end times of the initial event $irregulardate += $dtstart - $dtstartMidnight; $this->_makeRepeat($irregulardate, $irregulardate + $duration); } return $this->_repetitions; break; default: echo "UNKNOWN TYPE<br/>"; return $this->_repetitions; break; } }
function repeatSummary() { $cfg = JEVConfig::getInstance(); // i.e. 1 = follow english word order by default $grammar = intval(JText::_('JEV_REPEAT_GRAMMAR')); // if starttime and end time the same then show no times! if ($this->start_date == $this->stop_date) { if ($this->start_time != $this->stop_time && !$this->alldayevent()) { echo $this->start_date . ', ' . $this->start_time . ' - ' . $this->stop_time_midnightFix; } else { echo $this->start_date; } } else { // recurring events should have time related to recurrance not range of dates if ($this->start_time != $this->stop_time && !($this->reccurtype() > 0)) { echo JText::_('JEV_FROM') . ' ' . $this->start_date . ' - ' . $this->start_time . '<br />' . JText::_('JEV_TO') . ' ' . $this->stop_date . ' - ' . $this->stop_time_midnightFix . '<br/>'; } else { echo JText::_('JEV_FROM') . ' ' . $this->start_date . '<br />' . JText::_('JEV_TO') . ' ' . $this->stop_date . '<br/>'; } } if ($this->reccurtype() > 0) { switch ($this->reccurtype()) { case '1': $reccur = JText::_('JEV_REP_WEEK'); break; case '2': $reccur = JText::_('JEV_REP_WEEK'); break; case '3': $reccur = JText::_('JEV_REP_MONTH'); break; case '4': $reccur = JText::_('JEV_REP_MONTH'); break; case '5': $reccur = JText::_('JEV_REP_YEAR'); break; } if ($this->reccurday() >= 0 || ($this->reccurtype() == 1 || $this->reccurtype() == 2)) { $timeString = ""; if ($this->start_time != $this->stop_time) { $timeString = $this->start_time . " - " . $this->stop_time_midnightFix . " "; } echo $timeString; if (intval($this->reccurday()) < 0) { $event_start_date = JevDate::strtotime($this->startDate()); $reccurday = intval(date('w', $event_start_date)); } else { $reccurday = $this->reccurday(); } if ($this->reccurtype() == 1) { $dayname = JEventsHTML::getDayName($reccurday); echo $dayname . ' ' . JText::_('JEV_EACHOF') . ' ' . $reccur; } else { if ($this->reccurtype() == 2) { $each = JText::_('JEV_EACH') . ' '; if ($grammar == 1) { $each = strtolower($each); } $daystring = ""; if (JString::strlen($this->reccurweeks()) == 0) { $days = explode("|", $this->reccurweekdays()); for ($d = 0; $d < count($days); $d++) { $daystring .= JEventsHTML::getDayName($days[$d]); $daystring .= ($d == 0 ? "," : "") . " "; } $weekstring = ""; } else { $days = explode("|", $this->reccurweekdays()); for ($d = 0; $d < count($days); $d++) { $daystring .= JEventsHTML::getDayName($days[$d]); $daystring .= ($d == 0 ? "," : "") . " "; } $weekstring = $this->reccurweeks() == 'pair' ? JText::_('JEV_REP_WEEKPAIR') : ($this->reccurweeks() == 'impair' ? JText::_('JEV_REP_WEEKIMPAIR') : ""); if ($weekstring == "") { switch ($grammar) { case 1: $weekstring = "- " . JText::_('JEV_REP_WEEK') . " "; $weekstring .= str_replace("|", ", ", $this->reccurweeks()) . " "; $weekstring .= strtolower(JText::_('JEV_EACHMONTH')); break; default: $weekstring = str_replace("|", ", ", $this->reccurweeks()) . " "; $weekstring .= $reccur; $weekstring .= JText::_('JEV_EACHMONTH'); break; } } } $firstword = true; switch ($grammar) { case 1: echo $daystring . $weekstring; break; default: echo $each . $daystring . $weekstring; break; } } else { echo JText::_('JEV_EACH') . ' ' . $reccur; } } } else { echo JText::_('JEV_EACH') . ' ' . $reccur; } } else { if ($this->start_date != $this->stop_date) { echo JText::_('JEV_ALLDAYS'); } } }
$docimage->link = $this->info['imagelink']; $doc->image = $docimage; foreach ($this->eventsByRelDay as $relDay => $ebrd) { foreach ($ebrd as $row) { // title for particular item $item_title = htmlspecialchars($row->title()); $item_title = html_entity_decode($item_title); // url link to article $startDate = $row->publish_up(); //$eventDate = JevDate::mktime(JString::substr($startDate,11,2),JString::substr($startDate,14,2), JString::substr($startDate,17,2),$this->jeventCalObject->now_m,$this->jeventCalObject->now_d + $relDay,$this->jeventCalObject->now_Y); $eventDate = JevDate::strtotime($startDate); $datenow = JEVHelper::getNow(); if ($relDay > 0) { $eventDate = JevDate::strtotime($datenow->toFormat('%Y-%m-%d ') . JevDate::strftime('%H:%M', $eventDate) . " +{$relDay} days"); } else { $eventDate = JevDate::strtotime($datenow->toFormat('%Y-%m-%d ') . JevDate::strftime('%H:%M', $eventDate) . " {$relDay} days"); } $targetid = $this->modparams->get("target_itemid", 0); $link = $row->viewDetailLink(date("Y", $eventDate), date("m", $eventDate), date("d", $eventDate), false, $targetid); $link = str_replace("&tmpl=component", "", $link); $item_link = JRoute::_($link . $this->jeventCalObject->datamodel->getCatidsOutLink()); // removes all formating from the intro text for the description text $item_description = $row->content(); // remove dodgy border e.g. "diamond/question mark" $item_description = preg_replace('#border=[\\"\'][^0-9]*[\\"\']#i', '', $item_description); if ($this->info['limit_text']) { if ($this->info['text_length']) { $item_description = JFilterOutput::cleanText($item_description); // limits description text to x words $item_description_array = explode(' ', $item_description); $count = count($item_description_array);