start / $granularity * 100, 2); $width = number_format($item->size / $granularity * 100, 2); $attr = array('style' => "left:{$left}%; width:{$width}%;"); $attr['class'] = 'litecal-item'; $attr['class'] .= $item->starts ? ' starts' : ''; $attr['class'] .= $item->ends ? ' ends' : ''; if (module_exists('crayon')) { $attr['class'] .= ' crayon-anchor crayon-'. crayon_generate_index($item->id); $popup = theme('crayon_popup', $item->data, $item->id); } else { $attr['class'] .= ' color'; $popup = ''; } if (!empty($item->url)) { return l("$popup{$item->data}", $item->url, array('attributes' => $attr, 'html' => TRUE)); } else { $attr = drupal_attributes($attr); return "
$popup{$item->data}
"; } } /** * Theme all timeslots for a given timespan. */ function theme_litecal_timeslots($timespan, $quickadd = array()) { switch ($timespan->unit) { case 'days': $format = 'j'; break; } $slots = array(); $date = drupal_clone($timespan->from); for ($i = 0; $i < $timespan->granularity; $i++) { $slots[] = theme('litecal_timeslot', $timespan, $i, $date, $format, $quickadd); date_modify($date, "+1 {$timespan->unit}"); } return $slots; } /** * Theme a single timeslot. */ function theme_litecal_timeslot($timespan, $start, $date, $format, $quickadd = array()) { $add = ''; $attr = array('style' => ''); $link_attr = array('class' => 'label'); // Position if ($start < $timespan->granularity - 1) { $attr['style'] .= ' left:'. number_format($start / $timespan->granularity * 100, 2) .'%;'; } // We position last items differently since slots often use borders and need tight alignment. else { $attr['style'] .= ' right:0%;'; } // Width $attr['style'] .= ' width:'. number_format(1 / $timespan->granularity * 100, 2) .'%'; // Classes $attr['class'] = 'litecal-slot rows-'. count($timespan->built); // Add class for today's slot. static $today; $today = !isset($today) ? date_format_date(date_now(), 'custom', 'Y-m-d') : $today; if ($today == date_format_date($date, 'custom', 'Y-m-d')) { $attr['class'] .= ' litecal-slot-today'; } // If this timeslot is outside of the timespan's real time range, // add a class so it can be displayed accordingly. if (!litecal_date_between($date, $timespan->real_from, $timespan->real_to)) { $attr['class'] .= ' litecal-slot-gutter'; } $attr = drupal_attributes($attr); // Quickadd if (!empty($quickadd['type'])) { $type = str_replace('_', '-', $quickadd['type']); $item = menu_get_item("node/add/{$type}"); if ($item && $item['access']) { $options = array('query' => "edit[{$quickadd['field']}][0][value][date]=". date_format_date($date, 'custom', 'm/d/Y') . "&edit[{$quickadd['field']}][0][value][time]=" . date_format_date($date, 'custom', 'g:iA') ."&destination=" . $_GET['q']); $link_attr['href'] = url("node/add/{$type}", $options); $add = "". t('+ Add') .""; } } $link_attr = drupal_attributes($link_attr); $formatted = date_format_date($date, 'custom', $format); return "
{$add}{$formatted}
"; } /** * Theme a header, like days of the week for a month. */ function theme_litecal_header($label, $start, $granularity) { $left = number_format($start / $granularity * 100, 2); $width = number_format(1 / $granularity * 100, 2); $attr = array('style' => "left:{$left}%; width:{$width}%;"); $attr = drupal_attributes($attr); return "
{$label}
"; }