From cbb2d73b98f222f479a03d86c17657eb2c9680f3 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Mon, 2 May 2016 15:26:56 +0000 Subject: [PATCH] Make some old code that returns HTML unused, then remove it --- calendar/inc/class.calendar_uiforms.inc.php | 4 - calendar/inc/class.calendar_uiviews.inc.php | 1749 +------------------ home/inc/class.home_link_portlet.inc.php | 3 - 3 files changed, 2 insertions(+), 1754 deletions(-) diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php index 5727c695d6..d90590e5d8 100644 --- a/calendar/inc/class.calendar_uiforms.inc.php +++ b/calendar/inc/class.calendar_uiforms.inc.php @@ -1771,10 +1771,6 @@ class calendar_uiforms extends calendar_ui // Setup history tab $this->setup_history($content, $sel_options); - //echo "content="; _debug_array($content); - //echo "preserv="; _debug_array($preserved); - //echo "readonlys="; _debug_array($readonlys); - //echo "sel_options="; _debug_array($sel_options); $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . (!$event['id'] ? lang('Add') : ($view ? ($content['edit_single'] ? lang('View exception') : ($content['recur_type'] ? lang('View series') : lang('View'))) diff --git a/calendar/inc/class.calendar_uiviews.inc.php b/calendar/inc/class.calendar_uiviews.inc.php index 81238c0258..6468b6de3b 100644 --- a/calendar/inc/class.calendar_uiviews.inc.php +++ b/calendar/inc/class.calendar_uiviews.inc.php @@ -493,6 +493,8 @@ class calendar_uiviews extends calendar_ui /** * Displays the monthview or a multiple week-view * + * Used for home app + * * @param int $weeks = 0 number of weeks to show, if 0 (default) all weeks of one month are shown * @param boolean|etemplate2 $home = false if not false return content suitable for home-page */ @@ -598,21 +600,6 @@ class calendar_uiviews extends calendar_ui $last = $this->bo->date2ts($arr); } - /** - * Display a button to close one of multiple calendars shown - * - * Necessare to eg. close the calendar of a contact - * - * @param string $uid calendar to close - */ - private function close_button($uid) - { - return Api\Html::a_href(Api\Html::image('phpgwapi', 'close.button', 'Close','style="width: 12px; padding-top: 1px;"'), array( - 'menuaction' => 'calendar.calendar_uiviews.index', - 'close' => $uid, - )); - } - /** * Displays the weekview, with 5 or 7 days * @@ -826,811 +813,6 @@ class calendar_uiviews extends calendar_ui return $todos; } - /** - * Calculates the vertical position based on the time - * - * workday start- and end-time, is taken into account, as well as timeGrids px_m - minutes per pixel param - * - * @param int $time in minutes - * @return float position in percent - */ - function time2pos($time) - { - if ($this->scroll_to_wdstart) // we display the complete day - thought only workday is visible without scrolling - { - return $this->rowHeight * (1 + $this->extraRows + $time/$this->granularity_m); - } - // time before workday => condensed in the first $this->extraRows rows - if ($this->wd_start > 0 && $time < $this->wd_start) - { - $pos = (($this->extraRows - $this->extraRowsOriginal + 1) + ($time / $this->wd_start * ($this->extraRowsOriginal - 1))) * $this->rowHeight; - } - // time after workday => condensed in the last row - elseif ($this->wd_end < 24*60 && $time > $this->wd_end+1*$this->granularity_m) - { - $pos = 100 - (($this->extraRows - $this->remBotExtraRows) * $this->rowHeight * (1 - ($time - $this->wd_end) / (24*60 - $this->wd_end))); - } - // time during the workday => 2. row on (= + granularity) - else - { - $pos = $this->rowHeight * (1+$this->extraRows+($time-$this->wd_start)/$this->granularity_m); - } - $pos = round($pos,1); - - if ($this->debug > 3) $this->bo->debug_message('uiviews::time2pos(%1)=%2',False,$time,$pos); - - return $pos; - } - - /** - * Calculates the height of a difference between 2 times - * - * workday start- and end-time, is taken into account, as well as timeGrids px_m - minutes per pixel param - * - * @param int $start time in minutes - * @param int $end time in minutes - * @return float height in percent - */ - function times2height($start,$end) - { - $minimum = $this->rowHeight; - $height = $this->time2pos($end) - $this->time2pos($start); - - if ($this->debug > 3) $this->bo->debug_message('uiviews::times2height(%1,%2,min=%3)=%4',False,$start,$end,$minimum,$height); - - return $height >= $minimum ? $height : $minimum; - } - - /** - * Creates a grid with rows for the time, columns for (multiple) days containing events - * - * Uses the dayColWidget to display each day. - * - * @param $daysEvents array with subarrays of events for each day to show, day as YYYYMMDD as key - * @param int $granularity_m = 30 granularity in minutes of the rows - * @param int $height = 400 height of the widget - * @param string $indent = '' string for correct indention - * @param string $title = '' title of the time-grid - * @param int/array $owner = 0 owner of the calendar (default 0 = $this->owner) or array with owner for each column - * @param boolean $last = true last timeGrid displayed, default true - */ - function &timeGridWidget($daysEvents,$granularity_m=30,$height=400,$indent='',$title='',$owner=0,$last=true) - { - if ($this->debug > 1 || $this->debug==='timeGridWidget') $this->bo->debug_message('uiviews::timeGridWidget(events=%1,granularity_m=%2,height=%3,,title=%4)',True,$daysEvents,$granularity_m,$height,$title); - - // determine if the browser supports scrollIntoView: IE4+, firefox1.0+ and safari2.0+ does - // then show all hours in a div of the size of the workday and scroll to the workday start - // still disabled, as things need to be re-aranged first, to that the column headers are not scrolled - $this->scroll_to_wdstart = false;/*$this->use_time_grid && (Api\Header\UserAgent::type() == 'msie' || - Api\Header\UserAgent::type() == 'mozilla' && Api\Html::ua_version >= 5.0 || - Api\Header\UserAgent::type() == 'safari' && Api\Html::ua_version >= 2.0);*/ - - if ($this->scroll_to_wdstart) - { - $this->extraRows = 0; // no extra rows necessary - $this->remBotExtraRows = 0; - $overflow = 'overflow: scroll;'; - } - $this->granularity_m = $granularity_m; - $this->display_start = $this->wd_start - ($this->extraRows * $this->granularity_m); - $this->display_end = $this->wd_end + (($this->extraRows - $this->remBotExtraRows) * $this->granularity_m); - - if (!$this->wd_end) $this->wd_end = 1440; - $totalDisplayMinutes = $this->wd_end - $this->wd_start; - $this->rowsToDisplay = ($totalDisplayMinutes/$granularity_m)+2+2*$this->extraRows - $this->remBotExtraRows; - $this->rowHeight = round(100/$this->rowsToDisplay,1); - - // ensure a minimum height of each row - if ($height < ($this->rowsToDisplay+1) * 12) - { - $height = ($this->rowsToDisplay+1) * 12; - } - $html = $indent.'
'."\n"; - - $html .= $indent."\t".'
'.$title."
\n"; - - if ($this->use_time_grid) - { - $off = false; // Off-row means a different bgcolor - $add_links = count($daysEvents) == 1; - - // the hour rows - for($t = $this->scroll_to_wdstart ? 0 : $this->wd_start,$i = 1+$this->extraRows; - $t <= $this->wd_end || $this->scroll_to_wdstart && $t < 24*60; - $t += $this->granularity_m,++$i) - { - $set_id = ''; - if ($t == $this->wd_start) - { - list($id) = @each($daysEvents); - if (is_numeric($id)) - { - $id = 'wd_start_'.$id; - $set_id = ' id="'.$id.'"'; - } - } - $html .= $indent."\t".''."\n"; - // show time for full hours, allways for 45min interval and at least on every 3 row - $time = ''; - static $show = array( - 5 => array(0,15,30,45), - 10 => array(0,30), - 15 => array(0,30), - 45 => array(0,15,30,45), - ); - if (!isset($show[$this->granularity_m]) ? $t % 60 == 0 : in_array($t % 60,$show[$this->granularity_m])) - { - $time = common::formattime(sprintf('%02d',$t/60),sprintf('%02d',$t%60)); - } - if ($add_links) $time = $this->add_link($time,$this->date,(int) ($t/60),$t%60); - $html .= $indent."\t\t".'
'.$time."
\n"; - $html .= $indent."\t
\n"; // calendar_calTimeRow - $off = !$off; - } - } - if (is_array($daysEvents) && count($daysEvents)) - { - $numberOfDays = count($daysEvents); - $dayColWidth = 100/$numberOfDays; - - $dayCols_width = $width - $this->timeRow_width - 1; - - $html .= $indent."\t".'
'."\n"; - - if (Api\Header\UserAgent::type() == 'msie') // necessary IE hack - stupid thing ... - { - // Lars Kneschke 2005-08-28 - // why do we use a div in a div which has the same height and width??? - // To make IE6 happy!!! Without the second div you can't use - // style="left: 50px; right: 0px;" - //$html .= '
'."\n"; - - // Ralf Becker 2006-06-19 - // Lars original typo "width=100%; height: 100%;" is important ;-) - // means you width: 100% does NOT work, you need no width! - $html .= '
'."\n"; - } - $dayCol_width = $dayCols_width / count($daysEvents); - $n = 0; - foreach($daysEvents as $day => $events) - { - $this->wholeDayPosCounter=1; - $short_title = count($daysEvents) > 1; - $col_owner = $owner; - if (!is_numeric($day)) - { - $short_title = $day; - $day = $this->date; - $col_owner = $owner[$n]; - } - $html .= $this->dayColWidget($day,$events,$n*$dayColWidth, - $dayColWidth,$indent."\t\t",$short_title,++$on_off & 1,$col_owner); - ++$n; - } - if (Api\Header\UserAgent::type() == 'msie') $html .= "
\n"; - - $html .= $indent."\t
\n"; // calendar_calDayCols - } - $html .= $indent."
\n"; // calendar_calTimeGrid - - if ($this->scroll_to_wdstart) - { - $html .= "\n"; - } - - return $html; - } - - /** - * Sorts the events of a day into columns with non-overlapping events, the events - * are already sorted by start-time - * - * @param string/int $day_ymd date as Ymd - * @param array &$events events to split into non-overlapping groups - */ - function getEventCols($day_ymd, &$events) - { - $day_start = $this->bo->date2ts((string)$day_ymd); - - // if daylight saving is switched on or off, correct $day_start - // gives correct times after 2am, times between 0am and 2am are wrong - if(($daylight_diff = $day_start + 12*HOUR_s - ($this->bo->date2ts($day_ymd."T120000")))) - { - $day_start -= $daylight_diff; - } - - $eventCols = $col_ends = array(); - foreach($events as $event) - { - $event['multiday'] = False; - $event['start_m'] = ($event['start'] - $day_start) / 60; - if ($event['start_m'] < 0) - { - $event['start_m'] = 0; - $event['multiday'] = True; - } - $event['end_m'] = ($event['end'] - $day_start) / 60; - if ($event['end_m'] >= 24*60) - { - $event['end_m'] = 24*60-1; - $event['multiday'] = True; - } - if ($this->use_time_grid && !$event['whole_day_on_top']) - { - for($c = 0; $event['start_m'] < $col_ends[$c]; ++$c); - $col_ends[$c] = $event['end_m']; - } - else - { - $c = 0; // without grid we only use one column - } - $eventCols[$c][] = $event; - } - return $eventCols; - } - - /** - * Creates (if necessary multiple) columns for the events of a day - * - * Uses the eventColWidget to display each column. - * - * @param string/int $day_ymd date as Ymd - * @param array $events of events to show - * @param int $pleft start of the widget - * @param int $pwidth width of the widget - * @param string $indent string for correct indention - * @param boolean/string $short_title = True should we add a label (weekday, day) with link to the day-view above each day or string with title - * @param boolean $on_off = false start with row_on or row_off, default false=row_off - * @param int $owner = 0 if != 0 owner to add to the add-event link - */ - function dayColWidget($day_ymd,$events,$pleft,$pwidth,$indent,$short_title=True,$on_off=False,$owner=0) - { - if ($this->debug > 1 || $this->debug==='dayColWidget') $this->bo->debug_message('uiviews::dayColWidget(%1,%2,left=%3,width=%4,)',False,$day_ymd,$events,$pleft,$pwidth); - - $html = $indent.'
'."\n"; - - // Creation of the header-column with date, evtl. holiday-names and a matching background-color - $ts = $this->bo->date2ts((string)$day_ymd); - $title = !is_bool($short_title) ? $short_title : - ($short_title ? lang(adodb_date('l',$ts)).' '.adodb_date('d.',$ts) : $this->bo->long_date($ts,0,false,true)); - - $day_view = array( - 'menuaction' => 'calendar.calendar_uiviews.day', - 'date' => $day_ymd, - ); - $this->_day_class_holiday($day_ymd,$class,$holidays); - // the weekday and date - if (!$short_title && $holidays) $title .= Api\Html::htmlspecialchars(': '.$holidays); - - if ($short_title === true) - { - if ($this->allowEdit) - { - $title = Api\Html::a_href($title,$day_view,'', - !isset($this->holidays[$day_ymd])?' title="'.$this->bo->long_date($ts,0,false,true).'"':''); - } - } - elseif ($short_title === false) - { - // add arrows to go to the previous and next day (dayview only) - $day_view['date'] = $this->bo->date2string($ts -= 12*HOUR_s); - if ($this->allowEdit) - { - $title = Api\Html::a_href(Api\Html::image('phpgwapi','left',$this->bo->long_date($ts)),$day_view).' '.$title; - } - else - { - $title = $day_view.' '.$title; - } - $day_view['date'] = $this->bo->date2string($ts += 48*HOUR_s); - if ($this->allowEdit) - { - $title .= ' '.Api\Html::a_href(Api\Html::image('phpgwapi','right',$this->bo->long_date($ts)),$day_view); - } - else - { - $title .= ' '.$day_view; - } - } - if (is_bool($short_title) || ($short_title != "")) { - $html .= $indent."\t".'
'.$title."
\n"; - } - - if ($this->use_time_grid) - { - // drag and drop: check if the current user has EDIT permissions on the grid - if($owner) - { - $dropPermission = $this->bo->check_perms(Acl::EDIT,0,$owner); - } - else - { - $dropPermission = true; - } - - // adding divs to click on for each row / time-span - for($t = $this->scroll_to_wdstart ? 0 : $this->wd_start,$i = 1 + $this->extraRows; - $t <= $this->wd_end || $this->scroll_to_wdstart && $t < 24*60; - $t += $this->granularity_m,++$i) - { - $linkData = array( - 'menuaction' =>'calendar.calendar_uiforms.edit', - 'date' => $day_ymd, - 'hour' => sprintf("%02d",floor($t / 60)), - 'minute' => sprintf("%02d",floor($t % 60)), - ); - if ($owner) $linkData['owner'] = $owner; - - $droppableDateTime = $linkData['date'] . "T" . $linkData['hour'] . $linkData['minute']; - $droppableID='drop_'.$droppableDateTime.'_O'.($owner<0?str_replace('-','group',$owner):$owner); - - $html .= $indent."\t".'
allowEdit) - { - $html .= ' data-date=' .$linkData['date'].'|'.$linkData['hour'].'|'.$linkData['minute']; - } - if($dropPermission && $owner) - { - $html .= ' data-owner ='.$owner; - - } - $html .= '>
'."\n"; - - } - } - - $eventCols = $this->getEventCols($day_ymd,$events); - // displaying all event columns of the day - foreach($eventCols as $n => $eventCol) - { - // equal sized columns - //$width = 95.0 / count($eventCols); - //$left = 2.5 + $n * $width; - // alternative overlapping columns - $left = 2.5 + (1.5 * 100 / $pwidth); - if (count($eventCols) == 1) - { - $width = 100 - $left; - } - else - { - $width = !$n ? 70 : 50; - $left += $n * (100.0-$left) / count($eventCols); - } - if ($left + $width > 100.0) $width = 100.0 - $left; - //echo "

count(\$eventCols)=".count($eventCols).", n=$n, pWidth=$pwidth, pLeft=$pleft, width=$width, left=$left

\n"; - $html .= $this->eventColWidget($eventCol,$left,$width,$indent."\t", - $owner ? $owner : $this->user, 20+10*$n); - } - $html .= $indent."
\n"; // calendar_calDayCol - - return $html; - } - - /** - * get the CSS class and holidays for a given day - * - * @param string $day_ymd date - * @param string &$class class to use - * @param string &$holidays commaseparted holidays or empty if none - * @param boolean $only_weekend = false show only the weekend in header-color, otherwise every second days is shown too - * @param boolean $show_bdays = true If available, also show birthdays (or hide Bdays) - * Note that this is not the place to disable a preference. - * If the Api\Preferences allow birthdays to be displayed, they are cached within the holidays structure. - * This setting just suppressing the available data in the view. - */ - function _day_class_holiday($day_ymd,&$class,&$holidays,$only_weekend=false,$show_bdays=true) - { - $class = $holidays = ''; - $bday = false; - if (isset($this->holidays[$day_ymd])) - { - $h = array(); - foreach($this->holidays[$day_ymd] as $holiday) - { - if (isset($holiday['birthyear'])) - { - if ($show_bdays) - { - $bday = true; - - //If the birthdays are already displayed as event, don't - //show them in the caption - if (!$this->display_holiday_event_types['bdays']) - { - $h[] = $holiday['name']; - } - } - } - else - { - $class = 'calendar_calHoliday'; - - //If the birthdays are already displayed as event, don't - //show them in the caption - if (!$this->display_holiday_event_types['hdays']) - { - $h[] = $holiday['name']; - } - } - } - $holidays = implode(', ',$h); - } - if (!$class) - { - if ($day_ymd == $this->bo->date2string($this->bo->now_su)) - { - $class = 'calendar_calToday'; - } - else - { - $day = (int) date('w',$this->bo->date2ts((string) $day_ymd)); - - if ($only_weekend) - { - $class = $day == 0 || $day == 6 ? 'th' : 'row_off'; - } - else - { - $class = $day & 1 ? 'row_on' : 'th'; - } - } - } - if ($bday) $class .= ' calendar_calBirthday'; - } - - /** - * Creates colunm for non-overlaping (!) events - * - * Uses the eventWidget to display each event. - * - * @param array $events of events to show - * @param int $left start of the widget - * @param int $width width of the widget - * @param string $indent string for correct indention - * @param int $owner owner of the eventCol - */ - function eventColWidget($events,$left,$width,$indent,$owner,$z_index=null) - { - if ($this->debug > 1 || $this->debug==='eventColWidget') $this->bo->debug_message('uiviews::eventColWidget(%1,left=%2,width=%3,)',False,$events,$left,$width); - - $html = $indent.'
use_time_grid ? ' top: '.$this->rowHeight.'%;' : '').'">'."\n"; - foreach($events as $event) - { - $html .= $this->eventWidget($event,$width,$indent."\t",$owner,false,'event_widget',$z_index); - } - $html .= $indent."
\n"; - - return $html; - } - - /** - * Shows one event - * - * The display of the event and it's tooltip is done via the event_widget.tpl template - * - * @param $event array with the data of event to show - * @param $width int width of the widget - * @param string $indent string for correct indention - * @param int $owner owner of the calendar the event is in - * @param boolean $return_array = false should an array with keys(tooltip,popup,Api\Html) be returned or the complete widget as string - * @param string $block = 'event_widget' template used the render the widget - * @param int $z_index is the z-index of the drag-drobable outer box of the event. - * @return string/array - */ - function eventWidget($event,$width,$indent,$owner,$return_array=false,$block='event_widget',$z_index=null) - { - if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1,width=%2)',False,$event,$width); - - if($this->use_time_grid && $event['whole_day_on_top']) $block = 'event_widget_wholeday_on_top'; - - static $tpl = False; - if (!$tpl) - { - $tpl = new Framework\Template(Framework\Template::get_dir('calendar')); - - $tpl->set_file('event_widget_t','event_widget.tpl'); - $tpl->set_block('event_widget_t','event_widget'); - $tpl->set_block('event_widget_t','event_widget_wholeday_on_top'); - $tpl->set_block('event_widget_t','event_tooltip'); - $tpl->set_block('event_widget_t','planner_event'); - } - if (($return_array || $event['start_m'] == 0) && $event['end_m'] >= 24*60-1) - { - if ($return_array && $event['end_m'] > 24*60) - { - $timespan = $this->bo->format_date($event['start'],false).' - '.$this->bo->format_date($event['end']); - } - else - { - $timespan = lang('all day'); - } - } - else - { - $timespan = $this->bo->timespan($event['start_m'],$event['end_m']); - } - $icons = array(); - if(!(int)$event['id'] && preg_match('/^([a-z_-]+)([0-9]+)$/i',$event['id'],$matches)) - { - $app = $matches[1]; - $app_id = $matches[2]; - if (($is_private = calendar_bo::integration_get_private($app,$app_id,$event))) - { - $icons[] = Api\Html::image('calendar','private'); - } - else - { - $icons = self::integration_get_icons($app,$app_id,$event); - } - } - elseif($event['id']) - { - if (($is_private = !$this->bo->check_perms(Acl::READ,$event))) - { - $icons = array(Api\Html::image('calendar','private')); - } - else - { - $icons = $this->event_icons($event); - } - } - $cats = $this->bo->categories($this->categories->check_list(Acl::READ, $event['category']),$color); - // these values control varius aspects of the geometry of the eventWidget - $small_trigger_width = 120 + 20*count($icons); - $corner_radius=$width > $small_trigger_width ? 10 : 5; - $header_height=$width > $small_trigger_width ? 19 : 12; // multi_3 icon has a height of 19=16+2*1padding+1border ! - if (!$return_array) - { - $height = $this->times2height($event['start_m'],$event['end_m'],$header_height); - } - //$body_height = max(0,$height - $header_height - $corner_radius); - $border=1; - $headerbgcolor = $color ? $color : '#808080'; - $headercolor = self::brightness($headerbgcolor) > 128 ? 'black' : 'white'; - // the body-colors (gradient) are calculated from the headercolor, which depends on the cat of an event - $bodybgcolor1 = $this->brighter($headerbgcolor,$headerbgcolor == '#808080' ? 100 : 170); - $bodybgcolor2 = $this->brighter($headerbgcolor,220); - - // mark event as invitation, by NOT using category based background color, but plain white - if ($event['participants'][$this->user][0] == 'U') - { - $bodybgcolor1 = $bodybgcolor2 = 'white'; - } - - // get status class of event: calendar_calEventAllAccepted, calendar_calEventAllAnswered or calendar_calEventSomeUnknown - $status_class = 'calendar_calEventAllAccepted'; - foreach($event['participants'] as $id => $status) - { - if ($id < 0) continue; // as we cant accept/reject groups, we dont care about them here - - calendar_so::split_status($status,$quantity,$role); - - switch ($status) - { - case 'A': - case '': // app without status - break; - case 'U': - $status_class = 'calendar_calEventSomeUnknown'; - break 2; // break foreach - default: - $status_class = 'calendar_calEventAllAnswered'; - break; - } - } - // seperate each participant types - $part_array = array(); - if ($this->allowEdit) - { - foreach($this->bo->participants($event) as $part_key => $participant) - { - if(is_numeric($part_key)) - { - $part_array[lang('Participants')][$part_key] = $participant; - } - elseif(isset($this->bo->resources[$part_key[0]])) - { - $part_array[((isset($this->bo->resources[$part_key[0]]['participants_header'])) ? $this->bo->resources[$part_key[0]]['participants_header'] : lang($this->bo->resources[$part_key[0]]['app']))][$part_key] = $participant; - } - } - foreach($part_array as $part_group => $participant) - { - $participants .= $this->add_nonempty($participant,$part_group,True,False,false); - } - } - // as we only deal with percentual widht, we consider only the full dayview (1 colum) as NOT small - $small = $this->view != 'day' || $width < 50; - // $small = $width <= $small_trigger_width - - $small_height = $this->use_time_grid && ( $event['end_m']-$event['start_m'] < 2*$this->granularity_m || - $event['end_m'] <= $this->wd_start || $event['start_m'] >= $this->wd_end); - - $tpl->set_var(array( - // event-content, some of it displays only if it really has content or is needed - 'owner' => Api\Accounts::username($event['owner']), - 'header_icons' => $small ? '' : implode("",$icons), - 'body_icons' => $small ? implode("\n",$icons) : '', - 'icons' => implode('',$icons), - 'timespan' => $timespan, - 'title' => ($title = !$is_private ? Api\Html::htmlspecialchars($event['title']) : lang('private')), - 'header' => $small_height ? $title : $timespan, - 'description' => !$is_private ? nl2br(Api\Html::htmlspecialchars($event['description'])) : '', - 'location' => !$is_private ? $this->add_nonempty($event['location'],lang('Location')) : '', - 'participants' => $participants, - 'times' => !$event['multiday'] ? $this->add_nonempty($this->bo->timespan($event['start_m'],$event['end_m'],true),lang('Time')) : - $this->add_nonempty($this->bo->format_date($event['start']),lang('Start')). - $this->add_nonempty($this->bo->format_date($event['end']),lang('End')), - 'multidaytimes' => !$event['multiday'] ? '' : - $this->add_nonempty($this->bo->format_date($event['start']),lang('Start')). - $this->add_nonempty($this->bo->format_date($event['end']),lang('End')), - 'category' => !$is_private ? $this->add_nonempty($cats,lang('Category')) : '', - // the tooltip is based on the content of the actual widget, this way it takes no extra bandwidth/volum -// 'tooltip' => Api\Html::tooltip(False,False,array('BorderWidth'=>0,'Padding'=>0)), - // various aspects of the geometry or style - 'corner_radius' => $corner_radius.'px', - 'header_height' => $header_height.'px', - //'body_height' => $body_height.'px', - 'height' => $height, - 'width' => ($width-20).'px', - 'border' => $border, - 'bordercolor' => $headerbgcolor, - 'headerbgcolor' => $headerbgcolor, - 'headercolor' => $headercolor, - 'bodybackground' => ($background = 'url('.$GLOBALS['egw_info']['server']['webserver_url']. - '/calendar/inc/gradient.php?color1='.urlencode($bodybgcolor1).'&color2='.urlencode($bodybgcolor2). - '&width='.$width.') repeat-y '.$bodybgcolor2), - 'Small' => $small ? 'Small' : '', // to use in css class-names - 'indent' => $indent."\t", - 'status_class' => $status_class, - )); -/* not used at the moment - foreach(array( - 'upper_left'=>array('width'=>-$corner_radius,'height'=>$header_height,'border'=>0,'bgcolor'=>$headerbgcolor), - 'upper_right'=>array('width'=>$corner_radius,'height'=>$header_height,'border'=>0,'bgcolor'=>$headerbgcolor), - 'lower_left'=>array('width'=>-$corner_radius,'height'=>-$corner_radius,'border'=>$border,'color'=>$headerbgcolor,'bgcolor'=>$bodybgcolor1), - 'lower_right'=>array('width'=>$corner_radius,'height'=>-$corner_radius,'border'=>$border,'color'=>$headerbgcolor,'bgcolor'=>$bodybgcolor2), - ) as $name => $data) - { - $tpl->set_var($name.'_corner',$GLOBALS['egw_info']['server']['webserver_url']. - '/calendar/inc/round_corners.php?width='.$data['width'].'&height='.$data['height']. - '&bgcolor='.urlencode($data['bgcolor']). - (isset($data['color']) ? '&color='.urlencode($data['color']) : ''). - (isset($data['border']) ? '&border='.urlencode($data['border']) : '')); - } -*/ - // Add event description to cal event view body if the event is long enough (ATM 3 times longer than interval) - // to be able to show some lines of description text - if ($event['whole_day'] || ($event['end'] - $event['start']) > ($this->cal_prefs['interval'] * 3 * 60)) - { - $tpl->set_var('bodydescription', !$is_private ? nl2br(Api\Html::htmlspecialchars($event['description'])) : ''); - } - // set the bodydescription to empty if it is not visible - else - { - $tpl->set_var('bodydescription', ''); - } - - $tooltip = $tpl->fp('tooltip','event_tooltip'); - $html = $tpl->fp('out',$block); - - if ($is_private || !$this->allowEdit) - { - $popup = ''; - } - elseif($app && $app_id) - { - $popup = $this->integration_get_popup($app,$app_id); - } - else - { - if ($event['recur_type'] != MCAL_RECUR_NONE) - { - $popup = $event['id']."|r"; - } - else - { - $popup = $event['id']."|n"; - } - } - $tooltip = Api\Html::htmlspecialchars($tooltip, true); // true=need double-encoding, as it is transported as attribute! - //_debug_array($event); - - if ($return_array) - { - return array( - 'tooltip' => $tooltip, - 'popup' => $popup, - 'html' => $html, - 'private' => $is_private, - 'color' => $color, - ); - } - - $draggableID = $event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner); - - if ($this->use_time_grid) - { - if($event['whole_day_on_top']) - { - $style = 'top: '.($this->rowHeight*$this->wholeDayPosCounter).'%; height: '.$this->rowHeight.'%;'; - $this->wholeDayPosCounter++; - } - else - { $view_link = $GLOBALS['egw']->link('/index.php',array('menuaction'=>'calendar.calendar_uiforms.edit','cal_id'=>$event['id'],'date'=>$this->bo->date2string($event['start']))); - - $style = 'top: '.$this->time2pos($event['start_m']).'%; height: '.$height.'%;'; - } - } - else - { - $style = 'position: relative; margin-top: 3px;'; - } - - $prefix_icon = isset($event['prepend_icon']) ? $event['prepend_icon'] : ''; - - $z_index = is_null($z_index) ? 20 : (int)$z_index; - - if ($this->use_time_grid && - ((int)$event['id'] || substr($event['id'],0,7) == 'infolog') && $this->bo->check_perms(Acl::EDIT,$event)) - { - if (!$event['whole_day_on_top'] && - !$event['whole_day'] && - !$event['recur_type']) - { - $draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner); - } - else - { - $draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.($owner<0?str_replace('-','group',$owner):$owner); - - } - } - if (!$event['whole_day_on_top'] && - !$event['whole_day']) - { - // S represents Series - // '' represents Single - $eventTypeTag = $event['recur_type']?'S':''; - } - else if (!$event['recur_type']) - { - // WD represents Whole Day - $eventTypeTag = 'WD'; - } - else - { - // WDS represents Whole Day Series (recurrent whole day event) - $eventTypeTag = 'WDS'; - } - // Helps client-side to bind handler to events with specific types tag - $resizableHelper = $this->bo->date2string($event['start']). '|' .$this->bo->format_date($event['start'],false) . '|' . $this->cal_prefs['interval'].'|'.$eventTypeTag; - - $html = $indent.'
'.$prefix_icon."\n".$html."\n". - $indent."
"."\n"; - - return $html; - } - /** * Get onclick attribute to open integration item for edit * @@ -1712,839 +894,6 @@ class calendar_uiviews extends calendar_ui return $icons; } - function add_nonempty($content,$label,$one_per_line=False,$space = True,$htmlspecialchars=true) - { - if (is_array($content)) - { - if($space) - { - $content = implode($one_per_line ? ",\n" : ', ',$content); - } - else - { - $content = implode($one_per_line ? "\n" : ', ',$content); - } - } - if (!empty($content)) - { - return ''.$label.':'. - ($one_per_line ? '
' : ' '). - nl2br($htmlspecialchars?html::htmlspecialchars($content):$content).'
'; - } - return ''; - } - - /** - * Calculates a brighter color for a given color - * - * @param $rgb string color as #rrggbb value - * @param $decr int value to add to each component, default 64 - * @return string the brighter color - */ - static function brighter($rgb,$decr=64) - { - if (!preg_match('/^#?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})$/',$rgb,$components)) - { - return '#ffffff'; - } - $brighter = '#'; - for ($i = 1; $i <=3; ++$i) - { - $val = hexdec($components[$i]) + $decr; - if ($val > 255) $val = 255; - $brighter .= sprintf('%02x',$val); - } - //echo "brighter($rgb=".print_r($components,True).")=$brighter

\n"; - return $brighter; - } - - /** - * Calculates the brightness of a hexadecimal rgb color (median of the r, g and b components) - * - * @param string $rgb eg. #808080 - * @return int between 0 and 255 - */ - static function brightness($rgb) - { - if ($rgb[0] != '#' || strlen($rgb) != 7) - { - return 128; // no rgb color, return some default - } - $dec = hexdec(substr($rgb,1)); - for($i = 0; $i < 24; $i += 8) - { - $sum += ($dec >> $i) & 255; - } - return (int)round($sum / 3.0, 0); - } - - /** - * Number of month to display in yearly planner - */ - const YEARLY_PLANNER_NUM_MONTH = 12; - - /** - * Creates a planner view: grid with columns for the time and rows for categories or users - * - * Uses the plannerRowWidget to display rows - * - * @param array $events events to show - * @param mixed $start start-time of the grid - * @param mixed $end end-time of the grid - * @param string|int $by_cat rows by sub-categories of $by_cat (cat_id or 0 for upmost level) or by 'user' or 'month' - * @param string $indent = '' string for correct indention - * @return string with widget - */ - function &plannerWidget(&$events,$start,$end,$by_cat=0,$indent='') - { - $content = $indent.'
'."\n"; - - // display the header, containing a headerTitle and multiple headerRows with the scales - $content .= $indent."\t".'
'."\n"; - - // display the headerTitle, and get sort2labels - switch($by_cat) - { - case 'user': - $title = lang('User'); - $sort2label = $this->_get_planner_users(); - break; - case 'month': - $title = lang('Month'); - $sort2label = array(); - $time = new Api\DateTime($start); - for($n = 0; $n < self::YEARLY_PLANNER_NUM_MONTH; ++$n) - { - $sort2label[$time->format('Y-m')] = lang($time->format('F')).' '.$time->format('Y'); - $time->modify('+1 month'); - } - break; - default: - $title = lang('Category'); - $sort2label = array(); - break; - } - $content .= $indent."\t\t".'
'.$title."
\n"; - - // display the headerRows with the scales - $content .= $indent."\t\t".'
'."\n"; - // set start & end to timestamp and first & last to timestamp of 12h midday, to avoid trouble with daylight saving - foreach(array('start' => 'first','end' => 'last') as $t => $v) - { - $$t = $this->bo->date2ts($$t); - $$v = $this->bo->date2array($$t); - unset(${$v}['raw']); - ${$v}['hour'] = 12; - ${$v}['minute'] = ${$v}['second'] = 0; - ${$v} = $this->bo->date2ts($$v); - } - if ($by_cat === 'month') - { - $content .= $this->plannerDayOfMonthScale($indent."\t\t\t"); - } - else - { - $days = 1 + (int) round(($last - $first) / DAY_s); // we have to use round to get the right number if daylight saving changes - if ($days >= 28) // display the month scale - { - $content .= $this->plannerMonthScale($first,$days,$indent."\t\t\t"); - } - if ($days >= 5) // display the week scale - { - $content .= $this->plannerWeekScale($first,$days,$indent."\t\t\t"); - } - $content .= $this->plannerDayScale($first,$days,$indent."\t\t\t"); // day-scale, always displayed - if ($days <= 7) // display the hour scale - { - $content .= $this->plannerHourScale($start,$days,$indent."\t\t\t"); - } - } - $content .= $indent."\t\t
\n"; // end of the plannerHeaderRows - $content .= $indent."\t
\n"; // end of the plannerHeader - - // sort the events after user or category - $rows = array(); - if (!is_array($events)) $events = array(); - - if ($by_cat === 'user') // planner by user - { - // convert filter to allowed status - switch($this->filter) - { - case 'unknown': - $status_to_show = array('U','G'); break; - case 'accepted': - $status_to_show = array('A'); break; - case 'tentative': - $status_to_show = array('T'); break; - case 'rejected': - $status_to_show = array('R'); break; - case 'delegated': - $status_to_show = array('D'); break; - case 'all': - $status_to_show = array('U','A','T','D','G','R'); break; - default: - $status_to_show = array('U','A','T','D','G'); break; - } - } - foreach($events as $key => $event) - { - if ($by_cat === 'user') // planner by user - { - foreach($event['participants'] as $sort => $status) - { - calendar_so::split_status($status,$nul,$nul); - // only show if participant with status visible with current filter - if (isset($sort2label[$sort]) && (in_array($status,$status_to_show) || - $this->filter == 'owner' && $event['owner'] == $sort)) // owner too additionally uses owner - { - $rows[$sort][] =& $events[$key]; - } - } - } - elseif ($by_cat === 'month') // planner by month / yearly planner - { - $sort = date('Y-m',$event['start']); - $rows[$sort][] =& $events[$key]; - // end in a different month? - if ($sort != ($end_sort = date('Y-m',$event['end']))) - { - while($sort != $end_sort) - { - list($y,$m) = explode('-',$sort); - if (++$m > 12) - { - ++$y; - $m = 1; - } - $sort = sprintf('%04d-%02d',$y,$m); - $rows[$sort][] =& $events[$key]; - } - } - } - else // planner by cat - { - foreach($this->_get_planner_cats($event['category'],$sort2label,$sort2color) as $sort) - { - if (!is_array($rows[$sort])) $rows[$sort] = array(); - - $rows[$sort][] =& $events[$key]; - } - } - } - $owners = explode(',',$this->owner); - // display a plannerRowWidget for each row (user or category) - foreach($sort2label as $sort => $label) - { - if (!isset($rows[$sort]) && (!$this->cal_prefs['planner_show_empty_rows'] || - $by_cat === 'user' && $this->cal_prefs['planner_show_empty_rows'] == 'cat' || - is_int($by_cat) && $this->cal_prefs['planner_show_empty_rows'] == 'user')) - { - continue; // dont show empty Api\Categories or user rows - } - $class = $class == 'row_on' ? 'row_off' : 'row_on'; - if ($by_cat === 'month') - { - $time = new Api\DateTime($sort.'-01'); - $start = $time->format('ts'); - $time->modify('+1month -1second'); - $end = $time->format('ts'); - } - // display close button only for directly set users, eg. not group-members (as we cant unset them!) - if ($by_cat === 'user' && in_array($sort, $owners)) - { - $label .= $this->close_button($sort); - } - $content .= $this->plannerRowWidget(isset($rows[$sort]) ? $rows[$sort] : array(),$start,$end,$label,$class,$indent."\t"); - } - $content .= $indent."
\n"; // end of the plannerWidget - - return $content; - } - - /** - * get all users to display in the planner_by_user - * - * @param boolean $enum_groups = true should groups be returned as there members (eg. planner) or not (day & week) - * @return array with uid => label pairs, first all users alphabetically sorted, then all resources - */ - function _get_planner_users($enum_groups=true) - { - $users = $resources = array(); - foreach(explode(',',$this->owner) as $user) - { - if($user === '0') - { - // 0 means current user - $user = $this->user; - } - if (!is_numeric($user)) // resources - { - $resources[$user] = $this->bo->participant_name($user); - } - elseif ($enum_groups && $GLOBALS['egw']->accounts->get_type($user) == 'g') // groups - { - foreach((array) $GLOBALS['egw']->accounts->members($user, true) as $user) - { - if ($this->bo->check_perms(Acl::READ | calendar_bo::ACL_FREEBUSY,0,$user)) - { - $users[$user] = $this->bo->participant_name($user); - } - } - } - else // users - { - $users[$user] = $this->bo->participant_name($user); - } - } - // Only sort users in planner views - if ($enum_groups) - { - asort($users); - asort($resources); - } - - return $users+$resources; - } - - /** - * get all Api\Categories used as sort criteria for the planner by category - * - * the returned cat is as direct sub-category of $this->cat_id or a main (level 1) category if !$this->cat_id - * - * @param string $cats comma-delimited cat_id's or empty for no cat - * @param array &$sort2label labels for the returned cats - * @return array with cat_id's - */ - function _get_planner_cats($cats,&$sort2label) - { - static $cat2sort; - - if (!is_array($cat2sort)) - { - $cat2sort = array(); - $cat_filter = $this->cat_id ? (array)$this->cat_id : array(); - foreach((array)$this->categories->return_sorted_array(0,false,'','','',true) as $data) - { - if (in_array($data['parent'], $cat_filter) || in_array($data['id'], $cat_filter) || - !$data['parent'] && !$cat_filter) // cat is a direct sub of $this->cat_id - { - $cat2sort[$data['id']] = $data['id']; - $sort2label[$data['id']] = stripslashes($data['name']); - } - elseif(isset($cat2sort[$data['parent']])) // parent is already in the array => add us with same target - { - $cat2sort[$data['id']] = $cat2sort[$data['parent']]; - } - } - } - $ret = array(); - foreach(!is_array($cats) ? explode(',',$cats) : $cats as $cat) - { - if (isset($cat2sort[$cat]) && !in_array($cat2sort[$cat],$ret)) - { - $ret[] = $cat2sort[$cat]; - } - } - if (!count($ret)) - { - $sort2label[0] = lang('none'); - $ret[] = 0; - } - //echo "

uiviews::_get_planner_cats($cats=".$this->categories->id2name($cats).") (this->cat_id=$this->cat_id) = ".print_r($ret,true).'='.$this->categories->id2name($ret[0])."

\n"; - return $ret; - } - - /** - * Creates month scale for the planner - * - * @param int $start start-time (12h) of the scale - * @param int $days number of days to display - * @param string $indent = '' string for correct indention - * @return string with scale - */ - function plannerMonthScale($start,$days,$indent) - { - $day_width = round(100 / $days,2); - - $content .= $indent.'
'."\n"; - for($t = $start,$left = 0,$i = 0; $i < $days; $t += $days_in_month*DAY_s,$left += $days_in_month*$day_width,$i += $days_in_month) - { - $t_arr = $this->bo->date2array($t); - unset($t_arr['raw']); // force recalculation - unset($t_arr['full']); - $days_in_month = $this->datetime->days_in_month($t_arr['month'],$t_arr['year']) - ($t_arr['day']-1); - if ($i + $days_in_month > $days) - { - $days_in_month = $days - $i; - } - if ($days_in_month > 10) - { - $title = lang(date('F',$t)).' '.$t_arr['year']; - // previous links - $prev = $t_arr; - $prev['day'] = 1; - if ($prev['month']-- <= 1) - { - $prev['month'] = 12; - $prev['year']--; - } - if ($this->bo->date2ts($prev) < $start-20*DAY_s) - { - $prev['day'] = $this->day; - $full = $this->bo->date2string($prev); - if ($this->day >= 15) $prev = $t_arr; // we stay in the same month - $prev['day'] = $this->day < 15 ? 15 : 1; - $half = $this->bo->date2string($prev); - $title = Api\Html::a_href(Api\Html::image('phpgwapi','first',lang('back one month'),$options=' alt="<<"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $full, - )) . '   '. - Api\Html::a_href(Api\Html::image('phpgwapi','left',lang('back half a month'),$options=' alt="<"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $half, - )) . '   '.$title; - } - // next links - $next = $t_arr; - if ($next['month']++ >= 12) - { - $next['month'] = 1; - $next['year']++; - } - // dont show next scales, if there are more then 10 days in the next month or there is no next month - $days_in_next_month = (int) date('d',$end = $start+$days*DAY_s); - if ($days_in_next_month <= 10 || date('m',$end) == date('m',$t)) - { - if ($this->day >= 15) $next = $t_arr; // we stay in the same month - $next['day'] = $this->day; - $full = $this->bo->date2string($next); - if ($this->day < 15) $next = $t_arr; // we stay in the same month - $next['day'] = $this->day < 15 ? 15 : 1; - $half = $this->bo->date2string($next); - $title .= '   '.Api\Html::a_href(Api\Html::image('phpgwapi','right',lang('forward half a month'),$options=' alt=">>"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $half, - )). '   '. - Api\Html::a_href(Api\Html::image('phpgwapi','last',lang('forward one month'),$options=' alt=">>"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $full, - )); - } - } - else - { - $title = ' '; - } - $class = $class == 'row_on' ? 'th' : 'row_on'; - $content .= $indent."\t".'
'. - $title."
\n"; - } - $content .= $indent."
\n"; // end of plannerScale - - return $content; - } - - /** - * Creates a week scale for the planner - * - * @param int $start start-time (12h) of the scale - * @param int $days number of days to display - * @param string $indent = '' string for correct indention - * @return string with scale - */ - function plannerWeekScale($start,$days,$indent) - { - $week_width = round(100 / $days * ($days <= 7 ? $days : 7),2); - - $content .= $indent.'
'."\n"; - for($t = $start,$left = 0,$i = 0; $i < $days; $t += 7*DAY_s,$left += $week_width,$i += 7) - { - $title = lang('Week').' '.$this->week_number($t); - if ($days > 7) - { - $title = Api\Html::a_href($title,array( - 'menuaction' => 'calendar.calendar_uiviews.planner', - 'planner_days' => 7, - 'date' => date('Ymd',$t), - ),false,' title="'.Api\Html::htmlspecialchars(lang('Weekview')).'"'); - } - else - { - // prev. week - $title = Api\Html::a_href(Api\Html::image('phpgwapi','first',lang('previous'),$options=' alt="<<"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => date('Ymd',$t-7*DAY_s), - )) . '   '.$title; - // next week - $title .= '   '.Api\Html::a_href(Api\Html::image('phpgwapi','last',lang('next'),$options=' alt=">>"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => date('Ymd',$t+7*DAY_s), - )); - } - $class = $class == 'row_on' ? 'th' : 'row_on'; - $content .= $indent."\t".'
'.$title."
\n"; - } - $content .= $indent."
\n"; // end of plannerScale - - return $content; - } - - /** - * Creates day scale for the planner - * - * @param int $start start-time (12h) of the scale - * @param int $days number of days to display - * @param string $indent = '' string for correct indention - * @return string with scale - */ - function plannerDayScale($start,$days,$indent) - { - $day_width = round(100 / $days,2); - - $content .= $indent.'
'."\n"; - for($t = $start,$left = 0,$i = 0; $i < $days; $t += DAY_s,$left += $day_width,++$i) - { - $this->_day_class_holiday($this->bo->date2string($t),$class,$holidays,$days > 7); - - if ($days <= 3) - { - $title = ''.lang(date('l',$t)).', '.date('j',$t).'. '.lang(date('F',$t)).''; - } - elseif ($days <= 7) - { - $title = lang(date('l',$t)).'
'.date('j',$t).'. '.lang(date('F',$t)); - } - else - { - $title = substr(lang(date('D',$t)),0,2).'
'.date('j',$t); - } - if ($days > 1) - { - $title = Api\Html::a_href($title,array( - 'menuaction' => 'calendar.calendar_uiviews.planner', - 'planner_days' => 1, - 'date' => date('Ymd',$t), - ),false,strpos($class,'calendar_calHoliday') !== false || strpos($class,'calendar_calBirthday') !== false ? '' : ' title="'.Api\Html::htmlspecialchars(lang('Dayview')).'"'); - } - if ($days < 5) - { - if (!$i) // prev. day only for the first day - { - $title = Api\Html::a_href(Api\Html::image('phpgwapi','first',lang('previous'),$options=' alt="<<"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => date('Ymd',$start-DAY_s), - )) . '   '.$title; - } - if ($i == $days-1) // next day only for the last day - { - $title .= '   '.Api\Html::a_href(Api\Html::image('phpgwapi','last',lang('next'),$options=' alt=">>"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => date('Ymd',$start+DAY_s), - )); - } - } - $content .= $indent."\t".'
'.$title."
\n"; - } - $content .= $indent."
\n"; // end of plannerScale - - return $content; - } - - /** - * Creates DayOfMonth scale for planner by month - * - * @param string $indent - * @return string - */ - function plannerDayOfMonthScale($indent) - { - $day_width = round(100 / 31,2); - - // month scale with navigation - $content .= $indent.'
'."\n"; - - $title = lang(Api\DateTime::to($this->first,'F')).' '.Api\DateTime::to($this->first,'Y').' - '. - lang(Api\DateTime::to($this->last,'F')).' '.Api\DateTime::to($this->last,'Y'); - - // calculate date for navigation links - $time = new Api\DateTime($this->first); - $time->modify('-1year'); - $last_year = $time->format('Ymd'); - $time->modify('+11month'); - $last_month = $time->format('Ymd'); - $time->modify('+2month'); - $next_month = $time->format('Ymd'); - $time->modify('+11month'); - $next_year = $time->format('Ymd'); - - $title = Api\Html::a_href(Api\Html::image('phpgwapi','first',lang('back one year'),$options=' alt="<<"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $last_year, - )) . '   '. - Api\Html::a_href(Api\Html::image('phpgwapi','left',lang('back one month'),$options=' alt="<"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $last_month, - )) . '   '.$title; - $title .= '   '.Api\Html::a_href(Api\Html::image('phpgwapi','right',lang('forward one month'),$options=' alt=">>"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $next_month, - )). '   '. - Api\Html::a_href(Api\Html::image('phpgwapi','last',lang('forward one year'),$options=' alt=">>"'),array( - 'menuaction' => $this->view_menuaction, - 'date' => $next_year, - )); - - $content .= $indent."\t".'
'. - $title."
\n"; - $content .= $indent."
\n"; // end of plannerScale - - // day of month scale - $content .= $indent.'
'."\n"; - $today = Api\DateTime::to('now','d'); - for($left = 0,$i = 0; $i < 31; $left += $day_width,++$i) - { - $class = $i & 1 ? 'row_on' : 'row_off'; - $content .= $indent."\t".'
'. - (1+$i)."
\n"; - } - $content .= $indent."
\n"; // end of plannerScale - - return $content; - } - - /** - * Creates hour scale for the planner - * - * @param int $start start-time (12h) of the scale - * @param int $days number of days to display - * @param string $indent = '' string for correct indention - * @return string with scale - */ - function plannerHourScale($start,$days,$indent) - { - foreach(array(1,2,3,4,6,8,12) as $d) // numbers dividing 24 without rest - { - if ($d > $days) break; - $decr = $d; - } - $hours = $days * 24; - if ($days == 1) // for a single day we calculate the hours of a days, to take into account daylight saving changes (23 or 25 hours) - { - $t_arr = $this->bo->date2array($start); - unset($t_arr['raw']); - $t_arr['hour'] = $t_arr['minute'] = $t_arr['second'] = 0; - $s = $this->bo->date2ts($t_arr); - $t_arr['hour'] = 23; $t_arr['minute'] = $t_arr['second'] = 59; - $hours = ($this->bo->date2ts($t_arr) - $s) / HOUR_s; - } - $cell_width = round(100 / $hours * $decr,2); - - $content .= $indent.'
'."\n"; - for($t = $start,$left = 0,$i = 0; $i < $hours; $t += $decr*HOUR_s,$left += $cell_width,$i += $decr) - { - $title = date($this->cal_prefs['timeformat'] == 12 ? 'ha' : 'H',$t); - - $class = $class == 'row_on' ? 'th' : 'row_on'; - $content .= $indent."\t".'
'.$title."
\n"; - } - $content .= $indent."
\n"; // end of plannerScale - - return $content; - } - - /** - * Creates a row for one user or category, with a header (user or category name) and (multiple) rows with non-overlapping events - * - * Uses the calendar_eventRowWidget to display a row of non-overlapping events - * - * @param array $events to show - * @param int $start start-time of the row - * @param int $end end-time of the row - * @param string $header user or category name for the row-header - * @param string $class additional css class for the row - * @param string $indent = '' string for correct indention - * @return string with widget - */ - function plannerRowWidget($events,$start,$end,$header,$class,$indent='') - { - $content = $indent.'
'."\n"; - - // display the row-header - $content .= $indent."\t".'
'.$header."
\n"; - - // sorting the events in non-overlapping rows - $rows = array(array()); - $row_end = array(); - foreach($events as $n => $event) - { - for($row = 0; (int) $row_end[$row] > $event['start']; ++$row); // find a "free" row (no other event) - $rows[$row][] =& $events[$n]; - $row_end[$row] = $event['end']; - } - //echo $header; _debug_array($rows); - // display the rows - $content .= $indent."\t".'
sortby == 'month' && ($days = date('j',$end)) < 31) - { - $width = round(85*$days/31,2); - $content .= ' style="width: '.$width.'%;"'; - } - $content .= ">\n"; - - // mark weekends and other special days in yearly planner - if ($this->sortby == 'month') - { - $content .= $this->yearlyPlannerMarkDays($start,$days,$indent."\t\t"); - } - foreach($rows as $row) - { - $content .= $this->eventRowWidget($row,$start,$end,$indent."\t\t"); - } - $content .= $indent."\t
\n"; // end of the eventRows - - if ($this->sortby == 'month' && $days < 31) - { - // add a filler for non existing days in that month - $content .= $indent."\t".'
'."\n"; - } - $content .= $indent."
\n"; // end of the plannerRowWidget - - return $content; - } - - /** - * Mark weekends and other special days in yearly planner - * - * @param int $start timestamp of start of row - * @param int $days number of days in month of row - * @param string $indent = '' - * @return string - */ - function yearlyPlannerMarkDays($start,$days,$indent='') - { - $day_width = round(100/$days,2); - for($t = $start,$left = 0,$i = 0; $i < $days; $t += DAY_s,$left += $day_width,++$i) - { - $this->_day_class_holiday($this->bo->date2string($t),$class,$holidays,true); - - $class = trim(str_replace(array('row_on','row_off'),'',$class)); - if ($class) // no regular weekday - { - $content .= $indent.'
'."\n"; - } - } - return $content; - } - - /** - * Creates a row with non-overlapping events - * - * Uses the plannerEventWidget to display the events - * - * @param array $events non-overlapping events to show - * @param int $start start-time of the row - * @param int $end end-time of the row - * @param string $indent = '' string for correct indention - * @return string with widget - */ - function eventRowWidget($events,$start,$end,$indent='') - { - $content = $indent.'
'."\n"; - - foreach($events as $event) - { - $content .= $this->plannerEventWidget($event,$start,$end,$indent."\t"); - } - $content .= $indent."
\n"; - - return $content; - } - - /** - * Calculate a time-dependent position in the planner - * - * We use a non-linear scale in the planner monthview, which shows the workday start or end - * as start or end of the whole day. This improves the resolution a bit. - * - * @param int $time - * @param int $start start-time of the planner - * @param int $end end-time of the planner - * @return float percentage position between 0-100 - */ - function _planner_pos($time,$start,$end) - { - if ($time <= $start) return 0; // we are left of our scale - if ($time >= $end) return 100; // we are right of our scale - - if ($this->planner_days || $this->sortby == 'month') - { - $percent = ($time - $start) / ($end - $start); - } - else // monthview - { - $t_arr = $this->bo->date2array($time); - $day_start = $this->bo->date2ts((string)$t_arr['full']); - $percent = ($day_start - $start) / ($end - $start); - - $time_of_day = 60 * $t_arr['hour'] + $t_arr['minute']; - if ($time_of_day >= $this->wd_start) - { - if ($time_of_day > $this->wd_end) - { - $day_percentage = 1; - } - else - { - $wd_lenght = $this->wd_end - $this->wd_start; - if ($wd_lenght <= 0) $wd_lenght = 24*60; - $day_percentage = ($time_of_day-$this->wd_start) / $wd_lenght; // between 0 and 1 - } - $days = ($end - $start) / DAY_s; - $percent += $day_percentage / $days; - } - } - $percent = round(100 * $percent,2); - - //echo "

_planner_pos(".date('Y-m-d H:i',$time).', '.date('Y-m-d H:i',$start).', '.date('Y-m-d H:i',$end).") = $percent

\n"; - return $percent; - } - - /** - * Displays one event for the planner, using the eventWidget of the other views - * - * @param array $event - * @param int $start start-time of the planner - * @param int $end end-time of the planner - * @return string with widget - */ - function plannerEventWidget($event,$start,$end,$indent='') - { - // some fields set by the dayColWidget for the other views - $day_start = $this->bo->date2ts((string)$this->bo->date2string($event['start'])); - $event['start_m'] = ($event['start'] - $day_start) / 60; - $event['end_m'] = round(($event['end'] - $day_start) / 60); - $event['multiday'] = true; - unset($event['whole_day_on_top']); - - $data = $this->eventWidget($event,200,$indent,$this->owner,true,'planner_event'); - - $left = $this->_planner_pos($event['start'],$start,$end); - $width = $this->_planner_pos($event['end'],$start,$end) - $left; - $color = $data['color'] ? $data['color'] : 'gray'; - - $tooltip = Api\Html::htmlspecialchars(str_replace(array("\n","\r","'",'"'),array('','',"\\'",'"'),$data['tooltip'])); - return $indent.'
'."\n".$data['html'].$indent."
\n"; - } - /** * Get the actions for the non-list views * @@ -2657,98 +1006,4 @@ class calendar_uiviews extends calendar_ui } return $dayEvents; } - - /** - * - * Returns the special icon Api\Html code for holidays - * - * @param string $type is the type of the holiday, currently either 'hday' or - * 'bday' - */ - function _get_holiday_icon($type) - { - //Set the special icon which will be prepended to the event - switch ($type) { - case "bday": - return Api\Html::image('calendar', 'cake', '', "style=\"float:left; padding: 1px 2px 0px 2px;\""); - case "hday": - return Api\Html::image('calendar', 'date', '', "style=\"float:left; padding: 1px 2px 0px 2px;\""); - } - } - - /** - * - * Creates a dummy holiday event. This event is shown in the day view, when - * added to the event list. - * - * @param int $day_start is a unix timestamp which contains the start of the day - * when the event occurs. - * @param string $title is the title of the dummy event which will be shown - * @param string $description is the long description of the event which will - * be shown in the event tooltip - */ - function _make_holiday_event($day_start, $title, $description, $type = 'bday') - { - //Calculate the end of the day by adding 23h:59min seconds - $day_end = $day_start + 24 * 3600 - 60; - - //Setup the event data - $event = array( - 'title' => $title, - 'description' => $description, - 'participants' => array( - ), - 'whole_day_on_top' => true, - 'start' => $day_start, - 'end' => $day_end, - 'non_blocking' => true, - 'prepend_icon' => $this->_get_holiday_icon($type) - ); - - return $event; - } - - /** - * - * Collects all holidays/birthdays corresponding to the given day and creates - * an array containing all this events. - * - * @param string $day_ymd contains the Ymd of the day - * @param array $types is an array which determines which types of events should - * be added to the holiday list. May contain the indices "bdays" and "hdays". - * The default is "bdays => true" - */ - function _get_holiday_events($day_ymd, $types = array("bdays" => true, "hdays" => false)) - { - //Check whether there are any holidays set for the current day_ymd - $events = array(); - if (isset($this->holidays[$day_ymd])) - { - //Translate the day_ymd to a timestamp - $day_start = $this->bo->date2ts((string)$day_ymd); - - //Iterate over the holidays array and add those the the events list - foreach($this->holidays[$day_ymd] as $holiday) - { - if (isset($holiday['birthyear'])) - { - if (array_key_exists("bdays", $types) && $types['bdays']) - { - $events[] = $this->_make_holiday_event( - $day_start, $holiday['name'], - lang('Age:').(date('Y') - $holiday['birthyear'])); - } - } - else - { - if (array_key_exists("hdays", $types) && $types['hdays']) - { - $events[] = $this->_make_holiday_event($day_start, $holiday['name'], '', 'hday'); - } - } - } - } - - return $events; - } } diff --git a/home/inc/class.home_link_portlet.inc.php b/home/inc/class.home_link_portlet.inc.php index ddd1264966..dc4b68f30f 100644 --- a/home/inc/class.home_link_portlet.inc.php +++ b/home/inc/class.home_link_portlet.inc.php @@ -143,9 +143,6 @@ class home_link_portlet extends home_portlet // Use calendar hover for calendar if($this->context['entry']['app'] == 'calendar') { - $cal_ui = new calendar_uiviews(); - $ug = $cal_ui->eventWidget($record->get_record_array(), $this->context['width'] * 50,'',0,true); - $content['tooltip'] = htmlspecialchars_decode($ug['tooltip']); $etemplate->setElementAttribute('tooltip','class', 'tooltip calendar_uitooltip'); } if($content['image'] == false)