R55977 - in /trunk: calendar/inc/ egroupware/home/inc/

Author: nathangray
New Revision: 55977

URL: http://svn.stylite.de/viewvc/egroupware?rev=55977&view=rev
Log:
Make some old code that returns HTML unused, then remove it

Modified:
trunk/calendar/inc/class.calendar_uiforms.inc.php
trunk/calendar/inc/class.calendar_uiviews.inc.php
trunk/egroupware/home/inc/class.home_link_portlet.inc.php

Modified: trunk/calendar/inc/class.calendar_uiforms.inc.php
URL: http://svn.stylite.de/viewvc/egroupware/trunk/calendar/inc/class.calendar_uiforms.inc.php?rev=55977&r1=55976&r2=55977&view=diff

— trunk/calendar/inc/class.calendar_uiforms.inc.php (original)
+++ trunk/calendar/inc/class.calendar_uiforms.inc.php Mon May 2 17:26:56 2016
@@ -1771,10 +1771,6 @@
// 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')))
    

Modified: trunk/calendar/inc/class.calendar_uiviews.inc.php
URL: http://svn.stylite.de/viewvc/egroupware/trunk/calendar/inc/class.calendar_uiviews.inc.php?rev=55977&r1=55976&r2=55977&view=diff

— trunk/calendar/inc/class.calendar_uiviews.inc.php (original)
+++ trunk/calendar/inc/class.calendar_uiviews.inc.php Mon May 2 17:26:56 2016
@@ -493,6 +493,8 @@
/**
* 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
      */
      @@ -596,21 +598,6 @@
      $arr[‘min’] = $arr[‘sec’] = 59;
      unset($arr[‘raw’]); // otherwise date2ts does not calc raw new, but uses it
      $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,
    
  •   ));
    

    }

    /**
    @@ -827,811 +814,6 @@
    }

    /**

    • 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.'<div class="calendar_calTimeGrid" style="height: '.$height.'px;'.$overflow.'">'."\n";
    
  •   $html .= $indent."\t".'<div class="calendar_calGridHeader" style="height: '.
    
  •   	$this->rowHeight.'%;">'.$title."</div>\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".'<div'.$set_id.' class="calendar_calTimeRow'.($off ? 'Off row_off' : ' row_on').
    
  •   			'" style="height: '.$this->rowHeight.'%; top:'. $i*$this->rowHeight .'%;">'."\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".'<div class="calendar_calTimeRowTime">'.$time."</div>\n";
    
  •   		$html .= $indent."\t</div>\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".'<div id="calendar_calDayCols" class="calendar_calDayCols'.
    
  •   		($this->use_time_grid ? ($this->bo->common_prefs['timeformat'] == 12 ? '12h' : '') : 'NoTime').'">'."\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 .= '<div style="width=100%; height: 100%;">'."\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 .= '<div style="height: 100%;">'."\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 .= "</div>\n";
    
  •   	$html .= $indent."\t</div>\n";	// calendar_calDayCols
    
  •   }
    
  •   $html .= $indent."</div>\n";	// calendar_calTimeGrid
    
  •   if ($this->scroll_to_wdstart)
    
  •   {
    
  •   	$html .= "<script>\n\tdocument.getElementById('$id').scrollIntoView();\n";
    
  •   	if ($last)	// last timeGrid --> scroll whole document back up
    
  •   	{
    
  •   		$html .= "\tdocument.getElementById('divMain').scrollIntoView();\n";
    
  •   	}
    
  •   	$html .= "</script>\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.'<div id="calColumn'.$this->calColumnCounter++.'" class="calendar_calDayCol" '.'data-sortable-id="'.$owner.'" style="left: '.$pleft.
    
  •   	'%;width: '.$pwidth.'%;">'."\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).' <span> '.$title;
    
  •   	}
    
  •   	else
    
  •   	{
    
  •   		$title = $day_view.' <span> '.$title;
    
  •   	}
    
  •   	$day_view['date'] = $this->bo->date2string($ts += 48*HOUR_s);
    
  •   	if ($this->allowEdit)
    
  •   	{
    
  •   		$title .= ' </span> '.Api\Html::a_href(Api\Html::image('phpgwapi','right',$this->bo->long_date($ts)),$day_view);
    
  •   	}
    
  •   	else
    
  •   	{
    
  •   		$title .= ' </span> '.$day_view;
    
  •   	}
    
  •   }
    
  •   if (is_bool($short_title) || ($short_title != "")) {
    
  •   	$html .= $indent."\t".'<div style="height: '. $this->rowHeight .'%;" class="calendar_calDayColHeader '.$class.'"'.
    
  •   		($holidays ? ' title="'.Api\Html::htmlspecialchars($holidays).'"':'').'>'.$title."</div>\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".'<div id="' . $droppableID . '" style="height:'. $this->rowHeight .'%; top: '. $i*$this->rowHeight .
    
  •   			'%;" class="calendar_calAddEvent"';
    
  •   		if ($this->allowEdit)
    
  •   		{
    
  •   			$html .= ' data-date=' .$linkData['date'].'|'.$linkData['hour'].'|'.$linkData['minute'];
    
  •   		}
    
  •   		if($dropPermission && $owner)
    
  •   		{
    
  •   			$html .= ' data-owner ='.$owner;
    
  •   		}
    
  •   		$html .= '></div>'."\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 "<p>count(\$eventCols)=".count($eventCols).", n=$n, pWidth=$pwidth, pLeft=$pleft, width=$width, left=$left</p>\n";
    
  •   	$html .= $this->eventColWidget($eventCol,$left,$width,$indent."\t",
    
  •   		$owner ? $owner : $this->user, 20+10*$n);
    
  •   }
    
  •   $html .= $indent."</div>\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.'<div class="calendar_calEventCol" style="left: '.$left.'%; width:'.$width.'%;'.
    
  •   	// the "calendar_calEventCol" spans across a whole column (as the name suggests) - setting the
    
  •   	// z-index here would give the whole invisible column a z-index and thus the underlying
    
  •   	// regions are not clickable anymore. The z_index has now moved the the eventWidget
    
  •   	// function.
    
  •   	//(!is_null($z_index) ? ' z-index:'.$z_index.';' : '').
    
  •   	(!$this->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."</div>\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.'<div id="'.$draggableID.'" data-tooltip ="'.$tooltip .'" data-resize="'.$resizableHelper.'" class="calendar_calEvent'.($is_private ? 'Private' : '').' '.$status_class.
    
  •   	'" style="'.$style.' border-color: '.$headerbgcolor.'; background: '.$background.'; z-index: '.$z_index.';"'.
    
  •   	'>'.$prefix_icon."\n".$html."\n".
    
  •   	$indent."</div>"."\n";
    
  •   return $html;
    
  • }
  • /**
    • Get onclick attribute to open integration item for edit
    • Name of the attribute is ‘edit_link’ and it should be an array with values for keys:
      @@ -1710,839 +892,6 @@
      $icons += (array)ExecMethod2($app_data,$id,$event);
      }
      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 '<span class="calendar_calEventLabel">'.$label.'</span>:'.
    
  •   		($one_per_line ? '<br>' : ' ').
    
  •   		nl2br($htmlspecialchars?html::htmlspecialchars($content):$content).'<br>';
    
  •   }
    
  •   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</p>\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.'<div class="calendar_plannerWidget">'."\n";
    
  •   // display the header, containing a headerTitle and multiple headerRows with the scales
    
  •   $content .= $indent."\t".'<div class="calendar_plannerHeader">'."\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".'<div class="calendar_plannerHeaderTitle th">'.$title."</div>\n";
    
  •   // display the headerRows with the scales
    
  •   $content .= $indent."\t\t".'<div class="calendar_plannerHeaderRows">'."\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</div>\n";	// end of the plannerHeaderRows
    
  •   $content .= $indent."\t</div>\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."</div>\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 "<p>uiviews::_get_planner_cats($cats=".$this->categories->id2name($cats).") (this->cat_id=$this->cat_id) = ".print_r($ret,true).'='.$this->categories->id2name($ret[0])."</p>\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.'<div class="calendar_plannerScale">'."\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,
    
  •   			))