_callerObj = $caller; if(isset($module)) $this->_module = $module; $this->_ts = time(); $this->_tsSmall = time(); } function turnOffMouseOvers() { $this->_useMouseOvers = FALSE; } function _createDayHeaders($abbr=false) { if(!$abbr) { $days = array($_SESSION["translate"]->it("Sunday"), $_SESSION["translate"]->it("Monday"), $_SESSION["translate"]->it("Tuesday"), $_SESSION["translate"]->it("Wednesday"), $_SESSION["translate"]->it("Thursday"), $_SESSION["translate"]->it("Friday"), $_SESSION["translate"]->it("Saturday")); } else { $days = array($_SESSION["translate"]->it("S"), $_SESSION["translate"]->it("M"), $_SESSION["translate"]->it("T"), $_SESSION["translate"]->it("W"), $_SESSION["translate"]->it("T"), $_SESSION["translate"]->it("F"), $_SESSION["translate"]->it("S")); } $index = FIRST_DAY_OF_WEEK; $daysPrinted = 0; $tags = array(); while($daysPrinted < 7) { $daysPrinted++; $tags["DAY_".$daysPrinted] = $days[$index % 7]; $index++; } return $tags; } function getExpandedMonthView() { require_once('Calendar/Month/Weekdays.php'); require_once('Calendar/Day.php'); if(isset($_REQUEST["ts"])) { $this->_ts = $_REQUEST["ts"]; } else $this->_ts = time(); if(isset($this->_itemOp)) $activeOp = $this->_itemOp; else $activeOp = $this->_linkBack; if(isset($this->_blankOp)) $blankOp = $this->_blankOp; else $blankOp = $this->_linkBack; $Month =& new Calendar_Month_Weekdays(date("Y", $this->_ts), date("m", $this->_ts), FIRST_DAY_OF_WEEK); $start = $Month->thisMonth(true); $end = $Month->nextMonth(true); $result = $this->getFullMonthActiveDays(date("m", $this->_ts), date('Y', $this->_ts)); $selection = array(); if(is_array($result) && (sizeof($result) > 0)) { foreach($result as $row) { $start = $row['start']; do { $Day =& new Calendar_Day(date('Y', $row['start']), date('m', $row['start']), date('d', $row['start'])); $ts = $Day->getTimeStamp(); $label = $row['label']; $id = $row['id']; if(isset($row['idPrefix'])) $prefix = $row['idPrefix']; else $prefix = NULL; if(array_key_exists($ts, $selection)) { // key exists so just add the next label $selection[$ts]->add($label, $id, $prefix); } else { $Event =& new Event($Day); $Event->add($label, $id, $prefix); $selection[$ts] = $Event; } $row['start'] = $ts + (3600*24); } while($row['start'] <= $row['end']); } } $Month->build($selection); $tags = array(); $content = array(); $tags = array(); $tags = $this->getQuickSelect(FALSE); $tags['TODAY'] = date("l F d, Y", time()); $tags['BACK_LINK'] = str_replace('&', '&', $this->_linkBack); $tags['BACK_LINK'] .= '&ts='; $tags['LINK_BACK'] = $this->_linkBack; $tags['PREV_MONTH'] = $Month->prevMonth('timestamp'); $tags['NEXT_MONTH'] = $Month->nextMonth('timestamp'); $tags['DATE'] = date("F Y", $Month->getTimeStamp()); while($Day =& $Month->fetch()) { if($Day->isFirst()) { $content[] = ""; } if($Day->isEmpty()) { $content[] = " "; } else { $timestamp = $Day->getTimeStamp(); $date = date("l F d, Y", $timestamp); $inactiveShade = "no-shade"; if($this->today($Day, $timestamp)) $inactiveShade = "today"; $jsArr = array("onclick=\"viewEvent('".$this->_linkBack . "&" . $blankOp . "','{$timestamp}');\""); if($this->_useMouseOvers) { $jsArr[] = "onmouseover=\"this.className='shade'; window.status='View {$date}';\""; $jsArr[] = "onmouseout=\"this.className='$inactiveShade'; window.status='';\""; $jsArr[] = "onmousedown=\"this.className='click';\""; } $js = implode(" ", $jsArr); $content[] = "today($Day, $timestamp)) $content[] = " class=\"$inactiveShade\" "; else $content[] = " class=\"$inactiveShade\" "; $content[] = " {$js}>"; if($this->_useMouseOvers) { $js = implode(" ", array("onmouseover=\"window.status='View {$date}';\"", "onmouseout=\"window.status='';\"")); } $day = $Day->thisDay(); $link = implode("", array("_linkBack . "&" . $blankOp . "&fullMonthCal=1&ts={$timestamp}\" {$js}>", $day, "")); $content[] = "
{$link}

"; if($Day->isSelected()) { $events = $Day->getEvents(); $list = array(); foreach($events as $value) { if(isset($value["idPrefix"])) $prefix = $value["idPrefix"] . "_"; $list[] = implode("", array("
  • ", "_linkBack . "&" . $activeOp . "&fullMonthCal=1&ts={$timestamp}&".$prefix."id=".$value["id"]."\" {$js}>", $value["label"], "", "
  • "));; } $content[] = implode("\n", array("")); } $content[] = ""; } if($Day->isLast()) { $content[] = ""; } } $tags = array_merge($tags, $this->_createDayHeaders(FALSE)); $tags['ROWS'] = implode("\n", $content); $tags['LBL_TODAY'] = $_SESSION["translate"]->it("Today is"); return $this->_processTemplate($tags, "month.tpl"); } function today($Day, $timestamp) { if($Day->thisDay() == date('d') && date('m',$timestamp) == date('m') && date('Y', $timestamp) == date('Y')) return true; else return false; } /** * Used the items retrieved from a module and builds the month * and addes the events on the proper dates. * */ function buildMonth($data=NULL) { $this->_month =& new Calendar_Month_Weekdays(date("Y", $this->_tsSmall), date("n", $this->_tsSmall), FIRST_DAY_OF_WEEK); $selection = array(); if(!isset($this->_jsOnClickDaysFunc)) { if(is_array($data) && (sizeof($data) > 0)) { foreach($data as $row) { $start = $row['start']; do { $Day =& new Calendar_Day(date('Y', $row['start']), date('m', $row['start']), date('d', $row['start'])); $ts = $Day->getTimeStamp(); $label = $row['label']; $id = $row['id']; if(isset($row['idPrefix'])) $prefix = $row['idPrefix']; else $prefix = NULL; if(array_key_exists($ts, $selection)) { // key exists so just add the next label $selection[$ts]->add($label, $id, $prefix); } else { $Event =& new Event($Day); $Event->add($label, $id, $prefix); $selection[$ts] = $Event; } $row['start'] = $ts + (3600*24); } while($row['start'] <= $row['end']); } } } $this->_month->build($selection); } function getYears($offset=10, $miniView=TRUE) { $ts = null; if($miniView) $ts = $this->_tsSmall; else $ts = $this->_ts; $selMon = date('m', $ts); $selYear = date('Y', $ts); $selDay = 1; $count = $offset; while($count > 0) { $newYear = $selYear - $count; $yearsArr[mktime(0,0,0,$selMon, $selDay, $newYear)] = $newYear; $count--; } $yearsArr[mktime(0,0,0,$selMon, $selDay, $selYear)] = $selYear; $count = 0; while($count < $offset) { $count++; $newYear = $selYear + $count; $yearsArr[mktime(0,0,0,$selMon, $selDay, $newYear)] = $newYear; } return $yearsArr; } function getMonths() { $month_list = array(); if(isset($_SESSION["translate"]) && is_object($_SESSION["translate"])) { $month_list = array($_SESSION["translate"]->it("January"), $_SESSION["translate"]->it("Febuary"), $_SESSION["translate"]->it("March"), $_SESSION["translate"]->it("April"), $_SESSION["translate"]->it("May"), $_SESSION["translate"]->it("June"), $_SESSION["translate"]->it("July"), $_SESSION["translate"]->it("August"), $_SESSION["translate"]->it("September"), $_SESSION["translate"]->it("October"), $_SESSION["translate"]->it("November"), $_SESSION["translate"]->it("December")); } else { $month_list = array("January", "Febuary", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); } return $month_list; } function getMonthSelect($miniView=FALSE) { $ts = null; if($miniView) $ts = $this->_tsSmall; else $ts = $this->_ts; $selMon = date('m', $ts); $selYear = date('Y', $ts); $selDay = 1; $months = $this->getMonths(); $month_list = array(mktime(0,0,0,1, $selDay, $selYear) => $months[0], mktime(0,0,0,2, $selDay, $selYear) => $months[1], mktime(0,0,0,3, $selDay, $selYear) => $months[2], mktime(0,0,0,4, $selDay, $selYear) => $months[3], mktime(0,0,0,5, $selDay, $selYear) => $months[4], mktime(0,0,0,6, $selDay, $selYear) => $months[5], mktime(0,0,0,7, $selDay, $selYear) => $months[6], mktime(0,0,0,8, $selDay, $selYear) => $months[7], mktime(0,0,0,9, $selDay, $selYear) => $months[8], mktime(0,0,0,10, $selDay, $selYear) => $months[9], mktime(0,0,0,11, $selDay, $selYear) => $months[10], mktime(0,0,0,12, $selDay, $selYear) => $months[11]); return $month_list; } function getQuickSelect($miniView=TRUE) { $ts = null; if($miniView) { $ts = $this->_tsSmall; } else { $ts = $this->_ts; } $form = new EZform("quick_select"); $form->add("FLD_quick_select_month", "select", $this->getMonthSelect($miniView)); $form->setExtra("FLD_quick_select_month", 'onchange=\'quickSelectMonth();\''); $form->setMatch("FLD_quick_select_month", mktime(0,0,0,date('m', $ts), 1, date('Y', $ts))); $form->setId("FLD_quick_select_month", "FLD_quick_select_month"); $form->add("FLD_quick_select_years", "select", $this->getYears(10,$miniView)); $form->setMatch("FLD_quick_select_years", mktime(0,0,0,date('m', $ts), 1, date('Y', $ts))); $form->setExtra("FLD_quick_select_years", 'onchange=\'quickSelectYear();\''); $form->setId("FLD_quick_select_years", "FLD_quick_select_years"); return $form->getTemplate(); } function getMiniMonthView() { require_once('Calendar/Month/Weekdays.php'); require_once('Calendar/Day.php'); $timestamp = null; if(isset($_REQUEST["tsSmall"])) { $this->_tsSmall = $timestamp = $_REQUEST["tsSmall"]; } else { $this->_tsSmall = $timestamp = time(); } if(empty($this->_jsOnClickDaysFunc)) { $result = $this->getActiveDays(date("m", $timestamp), date('Y', $timestamp)); $this->buildMonth($result); } else { $this->buildMonth(); } $tags = array(); $content = array(); $tags = $this->getQuickSelect(TRUE); $tags['PREV_MONTH_LINK'] = $this->_linkBack . "&miniMonthCal=1&tsSmall=".$this->_month->prevMonth(true); $tags['NEXT_MONTH_LINK'] = $this->_linkBack . "&miniMonthCal=1&tsSmall=".$this->_month->nextMonth(true); $tags['BACK_LINK'] = str_replace('&', '&', $this->_linkBack); $tags['BACK_LINK'] .= '&tsSmall='; $timestamp = $this->_month->getTimeStamp(); $month = date("F", $timestamp); $year = date("Y", $timestamp); $js = implode(" ", array("onMouseOver=\"window.status='View {$month} {$year}'; return true;\"", "onMouseOut=\"window.status='';\"")); $tags['DATE'] = array(); if(!empty($this->_fullMonthLink)) $tags['DATE'][] = "_fullMonthLink . "&miniMonthCal=1&ts={$timestamp}\" {$js}>{$month}"; else $tags['DATE'][] = $month; $tags['DATE'][] = $year; $tags['DATE'] = implode(" ", $tags['DATE']); while($Day =& $this->_month->fetch()) { if($Day->isFirst()) { $content[] = ""; } if($Day->isEmpty()) { $content[] = " "; } else { $timestamp = $Day->getTimeStamp(); $class = null; if(date('Y n j', $timestamp) == date('Y n j', $this->_ts)) { $class = "today-border"; } $date = date("l F d, Y", $timestamp); $js = implode(" ", array("onmouseover=\"window.status='View {$date}'; return true;\"", "onmouseout=\"window.status='';\"")); if(isset($this->_jsOnClickDaysFunc)) { $js = "onclick=\"".$this->_jsOnClickDaysFunc."(". date('n', $timestamp) . "," . date('j', $timestamp) . "," . date('Y', $timestamp) . ");"."\""; $link = implode("", array("", $Day->thisDay(), "")); } else { if($Day->isSelected()) { $events = $Day->getEvents(); $todayEvntConflict = ""; if($this->today($Day, $timestamp)) { $todayEvntConflict = " class='today-border' "; } $link = "_linkBack; $link .= "&"; if(isset($this->_itemOp)) $link .= $this->_itemOp . "&"; if(count($events) > 1) { $link .= "multi_id="; foreach($events as $value) { if(isset($value["idPrefix"])) $prefix = $value["idPrefix"] . "_"; else $prefix = NULL; $link .= $prefix . $value["id"] . "::"; } $link = substr($link, 0, -2); } else { if(isset($events[0]["idPrefix"])) { $link .= $events[0]["idPrefix"] . '_id='; } else { $link .= "id="; } $link .= $events[0]["id"]; } $link .= "&miniMonthCal=1&tsSmall={$timestamp}\" {$js}>"; $link = implode("", array($link, $Day->thisDay(), "")); } else { $link = $Day->thisDay(); } } // end check for js $selClass = ""; if($Day->isSelected()) $selClass = " class=\"item {$class}\" onmouseover=\"this.className='overItem';\" onmouseout=\"this.className='item'\" "; else $selClass = " class=\"{$class}\" "; $content[] = "{$link}"; } // check if empty if($Day->isLast()) { $content[] = ""; } } // end while $tags = array_merge($tags, $this->_createDayHeaders(TRUE)); $tags['ROWS'] = implode("\n", $content); if(!isset($this->_jsOnClickDaysFunc)) { $tags['LBL_EVENT'] = $_SESSION["translate"]->it("Event"); $tags['LBL_TODAY'] = $_SESSION["translate"]->it("Today"); } return $this->_processTemplate($tags, "smallmonth.tpl"); } function getActiveDays($month, $year) { return $this->_callerObj->cal_getActiveDays($month, $year); } function getFullMonthActiveDays($month, $year) { return $this->_callerObj->cal_getFullMonthActiveDays($month, $year); } function _processTemplate(&$tags, $tplName) { if(isset($this->_templateDir)) { return PHPWS_Template::processTemplate($tags, $this->_module, $this->_templateDir . "/" . $tplName); } else { return PHPWS_Template::processTemplate($tags, "core", PHPWS_SOURCE_DIR . "templates/calendar/" . $tplName, FALSE); } } function getFirstEvent() { $events = NULL; while($Day =& $this->_month->fetch()) { if($Day->isSelected()) { $events = $Day->getEvents(); $events[1] = $Day->getTimeStamp(); break; } } if($events != null) { return $events; } else return false; } function getPrevEvent($currTS) { $events = null; $prevDay = null; reset($this->_month->children); while($Day =& $this->_month->fetch()) { if($Day->isSelected() && $Day->getTimeStamp() == $currTS ) { if(isset($prevDay)) { $events = $prevDay->getEvents(); $events["ts"] = $prevDay->getTimeStamp(); } } if($Day->isSelected()) { $prevDay = $Day; } } if($events != null) { return $events; } else return false; } function getNextEvent($currTS) { $events = null; reset($this->_month->children); while($Day =& $this->_month->fetch()) { if($Day->isSelected() && $Day->getTimeStamp() > $currTS ) { $events = $Day->getEvents(); $events["ts"] = $Day->getTimeStamp(); break; } } if($events != null) { return $events; } else return false; } /** * Op attended to any items. * Useful for editing. */ function setItemOp($op) { $this->_itemOp = $op; } /** * Used with the Expand Month View for Empty Days * * See the getExpandedMonthView for information. * */ function setBlankOp($op) { $this->_blankOp = $op; } /** * Set javascript function to call. * The month, day, and year selected will be passed to the * javascript function in that order. */ function jsOnClickFunc($jsFuncName) { $this->_jsOnClickDaysFunc = $jsFuncName; } /** * * Used with the Mini-View Month to make the name * of the month a link (such as to a full month view). * $link param * Ex. index.php?module=mname * The ts timestamp will be appended. * */ function setFullMonthLink($link) { $this->_fullMonthLink = $link; } /** * Used to set the link to get back to the calendar. * */ function setLinkBack($link) { $this->_linkBack = $link; } /** * Direct way to set the items for the calendar without the * callback function. * */ function setData($items) { $this->_items = $items; } /* * Used to provide your custom template that are different from the * default core calendar templates. */ function setTemplateDir($templateDir) { $this->_templateDir = $templateDir; } /** * Access Methods **/ function getFullMonthYear() { return date('Y', $this->_ts); } function getFullMonthMonth() { return date('m', $this->_ts); } function getMiniViewMonth() { if(isset($_REQUEST["tsSmall"])) $this->_tsSmall = $_REQUEST["tsSmall"]; return date('m', $this->_tsSmall); } } require_once('Calendar/Decorator.php'); class Event extends Calendar_Decorator { var $_data = array(); var $_currIndex; function Event(&$Day) { parent::Calendar_Decorator($Day); $this->_currIndex = 0; } function fetch() { if($Hour = parent::fetch()) { if($Hour->thisHour() < 8 || $Hour->thisHour() > 17) { return $this->fetch(); } else { return $Hour; } } else { return false; } } function add($label, $id=NULL, $prefix=NULL) { $this->_data[$this->_currIndex]["label"] = $label; if(isset($id)) $this->_data[$this->_currIndex]["id"] = $id; if(isset($prefix)) $this->_data[$this->_currIndex]["idPrefix"] = $prefix; $this->_currIndex++; } function getEvents() { return $this->_data; } } ?>