function print_day($params)
 {
     if (!is_array($params)) {
         $this->index();
     }
     print_debug('in print_day()');
     $this->bo->store_to_cache(array('syear' => $params['year'], 'smonth' => $params['month'], 'sday' => $params['day'], 'eyear' => $params['year'], 'emonth' => $params['month'], 'eday' => $params['day']));
     $p = CreateObject('phpgwapi.Template', $this->template_dir);
     $p->set_unknowns('keep');
     $templates = array('day_cal' => 'day_cal.tpl');
     $p->set_file($templates);
     $p->set_block('day_cal', 'day', 'day');
     $p->set_block('day_cal', 'day_row', 'day_row');
     $p->set_block('day_cal', 'day_event_on', 'day_event_on');
     $p->set_block('day_cal', 'day_event_off', 'day_event_off');
     $p->set_block('day_cal', 'day_event_holiday', 'day_event_holiday');
     $p->set_block('day_cal', 'day_time', 'day_time');
     $date_to_eval = sprintf("%04d%02d%02d", $params['year'], $params['month'], $params['day']);
     //			$day_start = mktime(intval($this->bo->prefs['calendar']['workdaystarts']),0,0,$params['month'],$params['day'],$params['year']);
     //			$day_end = mktime(intval($this->bo->prefs['calendar']['workdayends']),0,1,$params['month'],$params['day'],$params['year']);
     $day_start = mktime(intval($this->bo->prefs['calendar']['workdaystarts']), 0, 0, 0, 0, 0);
     $day_end = mktime(intval($this->bo->prefs['calendar']['workdayends']), 0, 1, 0, 0, 0);
     $daily = $this->set_week_array(phpgwapi_datetime::get_weekday_start($params['year'], $params['month'], $params['day']), $this->theme['row_on'], True);
     print_debug('Date to Eval', $date_to_eval);
     $rows = array();
     $last_slot = $this->slot_num($day_end, $day_start, $day_end);
     if ($daily[$date_to_eval]['appts']) {
         $events = $this->bo->cached_events[$date_to_eval];
         print_debug('Date', $date_to_eval);
         print_debug('Count', count($events));
         $last_slot_end = -1;
         foreach ($events as $event) {
             ## by tb: 	we don't want a user to be able to see a event if he has no permission to read it !!!
             ## 				this shoud be in class.bocalendar->get_cached_events() !!!
             #echo '<br><b>check_perms: |'.$this->bo->check_perms(PHPGW_ACL_READ).'|</b><br>';
             if (!$this->bo->check_perms(PHPGW_ACL_READ)) {
                 continue;
                 ##						echo '<center>'.lang('You do not have permission to read this record!').'</center>'."\n";
                 ##						$GLOBALS['phpgw']->common->phpgw_exit(True);
             }
             ## by tb
             if ($this->bo->rejected_no_show($event)) {
                 continue;
                 // user does not want to see rejected events
             }
             if (isset($event['recur_type']) && $event['recur_type']) {
                 $this->bo->set_recur_date($event, $date_to_eval);
             }
             $starttime = $this->bo->maketime($event['start']);
             $endtime = $this->bo->maketime($event['end']);
             $slot = $this->slot_num($starttime, mktime(intval($this->bo->prefs['calendar']['workdaystarts']), 0, 0, $event['start']['month'], $event['start']['mday'], $event['start']['year']), mktime(intval($this->bo->prefs['calendar']['workdaystarts']), 0, 0, $event['end']['month'], $event['end']['mday'], $event['end']['year']));
             $slot_end = $this->slot_num($endtime - 1);
             // -1 to no occupy eg. the 18.00 slot for a 17-18h date
             if ($slot <= $last_slot_end) {
                 $slot = $last_slot;
                 $slot_end = max($last_slot_end, $slot_end);
             }
             if (isset($rows[$slot])) {
                 $rows[$slot] .= $this->link_to_entry($event, $params['month'], $params['day'], $params['year']);
             } else {
                 $rows[$slot] = $this->link_to_entry($event, $params['month'], $params['day'], $params['year']);
             }
             ## by tb  --> old cat-colors: has problems with overlaying events
             #					$tmp_cats = explode(',',$event['category']);
             #					$tmp_cat  = $tmp_cats[0];
             #					$color[$slot] = ( $this->cat_colors[$tmp_cat]) ? $this->cat_colors[$tmp_cat] : 'noColor';
             ## by tb
             print_debug('slot', $slot);
             print_debug('row', $rows[$slot]);
             $row_span[$slot] = 1 + $slot_end - $slot;
             $last_slot = $slot;
             $last_slot_end = $slot_end;
             $user_timezone = phpgwapi_datetime::user_timezone();
             print_debug('Time', $GLOBALS['phpgw']->common->show_date($this->bo->maketime($event['start']) - $user_timezone) . ' - ' . $GLOBALS['phpgw']->common->show_date($this->bo->maketime($event['end']) - $user_timezone));
             print_debug('Slot', $slot);
         }
         //echo "rows=<pre>"; print_r($rows); echo "<br />row_span="; print_r($row_span); echo "</pre>\n";
     }
     $holiday_names = $daily[$date_to_eval]['holidays'];
     if (!$holiday_names) {
         $row_to_print = $this->nm_on_off();
     } else {
         $row_to_print = '_holiday';
         foreach ($holiday_names as $name) {
             $rows[0] = '<center>' . $name . '</center>' . $rows[0];
         }
     }
     $last_slot = $this->slot_num($day_end, $day_start, $day_end);
     $rowspan = 0;
     for ($slot = 0; $slot <= $last_slot; ++$slot) {
         $p->set_var('extras', '');
         if ($rowspan > 1) {
             $p->set_var('item', '');
             $rowspan--;
         } elseif (!isset($rows[$slot])) {
             $p->set_var('event', '&nbsp;');
             $row_to_print = $this->nm_on_off();
             $p->parse('item', 'day_event' . $row_to_print, False);
         } else {
             $rowspan = intval($row_span[$slot]);
             if ($rowspan > 1) {
                 ## by tb --> old catcolors: has problems with overlaying event
                 #						$p->set_var('extras',' rowspan="'.$rowspan.'"'.' style="border-left:3px solid '.$color[$slot].';padding:3px;vertical-align:top;" ');
                 $p->set_var('extras', ' rowspan="' . $rowspan . '"' . ' style="vertical-align:top;" ');
                 ## END - by tb
             } else {
                 #						$p->set_var('extras',' style="border-left:3px solid '.$color[$slot].';padding:3px;vertical-align:top;" ');
                 $p->set_var('extras', ' style="border-left:vertical-align:top;" ');
             }
             ## END - by tb
             $p->set_var('event', $rows[$slot]);
             $row_to_print = $this->nm_on_off();
             $p->parse('item', 'day_event' . $row_to_print, False);
         }
         $open_link = $close_link = '';
         $time = '&nbsp;';
         if (0 < $slot && $slot < $last_slot) {
             $time = $day_start + ($slot - 1) * 60 * $this->bo->prefs['calendar']['interval'];
             $hour = date('H', $time);
             $min = date('i', $time);
             $time = phpgwapi_datetime::formattime($hour, $min);
             ## by tb
             $open_link = $this->week_type != 'new' ? ' - ' : '';
             ## by tb
             if ($this->bo->check_perms(PHPGW_ACL_ADD)) {
                 $open_link .= '<a href="' . $this->page('add', array('date' => $date_to_eval, 'hour' => $hour, 'minute' => $min)) . '">';
                 $close_link = '</a>';
             }
         }
         $var = array('open_link' => $open_link, 'time' => $time, 'close_link' => $close_link, 'tr_color' => '');
         ## by tb
         if ($this->week_type != 'new' || $this->week_type == 'new' && $this->bo->prefs['calendar']['show_time_line'] == '1') {
             $this->output_template_array($p, 'item', 'day_time', $var);
         }
         $p->parse('row', 'day_row', True);
     }
     $this->time_line_saved = TRUE;
     ## END - by tb
     return $p->fp('out', 'day');
 }