«'.$this->get_long_month($month -1).' '.$year.'»'; for ($i = 1; $i <= 7; $i ++) { echo ''.$this->get_short_day($i == 7 ? 0 : $i).''; } echo ''; for ($i = 1; $i <= 42; $i ++) { if ($i - $dayofweek < $daysinmonth && $i >= $dayofweek) echo ''.($i - $dayofweek +1).''; elseif ($i < $dayofweek) echo ' '; else break; if ($i +1 - $dayofweek < $daysinmonth && $i +1 > $dayofweek && $i % 7 == 0) echo ''; } echo ''; } /* * Deze methode retourneert een balkje van een gegeven $width met een bepaalde kleur ($color) met evt. een titel * */ function get_bar($width, $color, $link = '', $title = '', $itemid=null, $cat=null) { // 1) width herberekenen om afrondingsfouten te beperken if($GLOBALS['weekday_pointer']!=$GLOBALS['last_weekday_pointer']) { $GLOBALS['daytotal']=0; $GLOBALS['lasttotal']=0; $GLOBALS['last_weekday_pointer']=$GLOBALS['weekday_pointer']; } $GLOBALS['daytotal']+=$width; $GLOBALS['rounded_total']=round($GLOBALS['daytotal']); $width=$GLOBALS['rounded_total']-$GLOBALS['lasttotal']; $GLOBALS['lasttotal']=$GLOBALS['rounded_total']; // 2) kleur aanpassen indien item op blackout staat if($GLOBALS['bblackout'] && $color!='red' && $color!='orange' && $color!='grey') { $color='black'; $link=''; } $img=''; // 3) html code returnen voor gekleurde bar if (!empty($itemid) && !empty($cat)&& !empty($link)) { $link.='&cat='.$cat.'&item='.$itemid; $img = ''; } else { $img = ''; } return $img; } /* * Deze methode retourneert de weekkalender * * - Deze methode ontvangt een item-id & 1 dag als parameter (dag+maand+jaar), de omliggende week (met reservaties etc.) wordt dan opgehaald * - hoe groter de $day_scale, hoe kleiner de tabel (86400/$day_scale=breedte van 1 dag) */ function get_week_view($day, $month, $year, $itemid, $day_scale = 180,$cat) { // 1) Item is blackout? >> True of False ... wordt gebruikt in get_bar methode om kleur indien nodig om te zetten $GLOBALS['bblackout']=Rsys::is_blackout($itemid); // 2) $day_scale controleren en aanpassen indien nodig // Day_scale mag niet groter zijn dan 3600 (anders wordt de tabel te klein) if ($day_scale > 3600) $day_scale = 3600; // Day_scale mag niet kleiner zijn dan 1 (anders wordt de tabel te groot) elseif ($day_scale < 1) $day_scale = 1; // 3) Een '0' voor de maand-integer zetten indien deze kleiner is dan 10, nodig voor datetime // bv voor 1 december 1985: '01-12-1985' ipv '1-12-1985' (S�ba's geboortedatum ^^) if ($month < 10) $month = '0'.$month; // 4) Bepaal de juiste start datum (maandag) van de omliggende week // (verander eventueel maand (en jaar) wanneer de maandag in de vorige maand/jaar ligt) $fromdate = $year.'-'.$month.'-'. ($day < 10 ? '0'.$day : $day).' 00:00:00'; $stamp = Rsys :: mysql_datetime_to_timestamp($fromdate); $dayofweek = date('w', $stamp); if ($dayofweek == 0) { $stamp = $stamp - (1); $datum = Rsys :: mysql_datetime_to_array(Rsys :: timestamp_to_datetime($stamp)); $day = $datum['day']; $month = $datum['month']; $year = $datum['year']; } $fromdate = $year.'-'.$month.'-'.$day.' 00:00:00'; $stamp = Rsys :: mysql_datetime_to_timestamp($fromdate); $dayofweek = date('w', $stamp); if ($day - $dayofweek < 0) { $stamp = $stamp - (60 * 60 * 24 * ($dayofweek -1)); $fromdate = Rsys :: timestamp_to_datetime($stamp); $tilldate = $stamp; } else { $day = $day - $dayofweek +1; // M-FIX: sunday + 1 = monday $fromdate = $year.'-'.$month.'-'. ($day < 10 ? '0'.$day : $day).' 00:00:00'; $tilldate = Rsys :: mysql_datetime_to_timestamp($fromdate); } //zeven Dagen opvullen en eind-datum bepalen (= startdatum + 7 dagen) for ($i = 1; $i <= 7; $i ++) { $day_start_dates[$i] = $tilldate; $tilldate += 60 * 60 * 24; } // 5) Haal de reservaties periodes (+ reservaties) op tussen de start en einddatum $arr = Rsys :: get_item_reservations($fromdate, Rsys :: timestamp_to_datetime($tilldate), $itemid); // 6) Doorloop $arr met reservatie periodes en vul de $days array op met balkjes (bars) voor elke dag $weekday_pointer = $GLOBALS['weekday_pointer'] = 1; // Stel de weekdag pointer in op 1 (=maandag) $one_day = 60 * 60 * 24 - 1; // Het aantal seconden dat ��n dag in beslag neemt (23:59:59) $last_end = $day_start_dates[1]; // Stel de $last_end pointer in op het begin van maandag (00:00:00) if (count($arr['reservations'])>0) { foreach ($arr['reservations'] as $res_id => $res) { // 6.1) Stel basis variabelen in $r = $res['info']; // Reservatie periode informatie (start en eind tijd etc.) $s = $res['subscriptions']; // Reservaties (inschrijvingen) op reservatie periode $start = Rsys :: mysql_datetime_to_timestamp($r['start_at']); // Start tijd van reservatie periode blok $end = Rsys :: mysql_datetime_to_timestamp($r['end_at']); // Eind tijd van reservatie periode blok $timepicker_min = $r['timepicker_min']; $timepicker_max = $r['timepicker_max']; $chunk_size = $end - $start; // Unscaled chunk_size (of "reservation-period-block") // een "chunk" is dus een balkje (bar) // 6.2) Als de weekdag van de huidige start-tijd (van de reservatieperiode) niet overeenkomt met de huidige weekdag-pointer (=$weekday_pointer) if (date('w', $start) != $weekday_pointer) { // a) Wijzig de $weekday_pointer naar de weekdag waarin de start-tijd (van de reservatieperiode) zich bevindt $weekday_pointer = $GLOBALS['weekday_pointer'] = date('w', $start); if ($weekday_pointer == 0) $weekday_pointer = 7; // b) Stel de $last_end in op het begin van de nieuwe dag $last_end = $day_start_dates[$weekday_pointer]; } // 6.3) Vul de ruimte tussen $last_end en de huidige start-tijd met een grijze balk if ($start - $last_end > 0) $days[$weekday_pointer] .= $this->get_bar(($start - $last_end) / $day_scale, 'grey'); // 6.4.A) Indien het NIET om een timepicker gaat... (= 1 reservatie-blok) if ($r['timepicker'] != 1) { // ..a1) bepaal kleur en link (of geen link) op basis van de inschrijvingsperiode en het aantal en het maximaal aantal inschrijvingen if ($r['subscribers'] < $r['max_users'] && Rsys :: mysql_datetime_to_timestamp($r['start_at']) > time() && ($r['subscribe_from']=='0000-00-00 00:00:00'||(Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) < time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()))) { // Subscription is allowed $color = "green"; $link = "subscribe.php?rid=".$r['id']; } elseif ($r['subscribers'] < $r['max_users'] && (Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) > time() || Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) < time() || Rsys :: mysql_datetime_to_timestamp($r['start_at']) < time())) { // Subscribe_from is not yet reached $color = "orange"; $link = null; } else { // Subscription is not allowed $color = "red"; $link = null; } // ..a2) stel titel in (dat je ziet als je over het balkje zweeft met je muis) $title = date('H:i (d/m/Y)', $start).' » '.date('H:i (d/m/Y)', $end); // ..a3) controleer of het reservatie-periode-blok de huidige dag overschrijdt if ($end > $day_start_dates[$weekday_pointer] + $one_day) { // indien ja, cree�r dan balkjes voor elke volgende dag $trimmed_chunk_size = $chunk_size - ($end - ($day_start_dates[$weekday_pointer] + $one_day)); $days[$weekday_pointer] .= $this->get_bar($trimmed_chunk_size / $day_scale, $color, $link, $title, $itemid, $cat); $new_day = true; while ($new_day && $weekday_pointer < 7) { $weekday_pointer ++; $GLOBALS['weekday_pointer']++; $start = $days[$weekday_pointer]; $chunk_size = $end - $start; if ($end > $day_start_dates[$weekday_pointer] + $one_day) { // If still larger than one day, trim chunk and continue $days[$weekday_pointer] .= $this->get_bar($one_day / $day_scale, $color, $link, $title, $itemid, $cat); } else { $trimmed_chunk_size = $end - $day_start_dates[$weekday_pointer]; $days[$weekday_pointer] .= $this->get_bar($trimmed_chunk_size / $day_scale, $color, $link, $title, $itemid, $cat); $new_day = false; } } } else // indien niet, voeg dan gewoon het balkje toe aan de huidige dag $days[$weekday_pointer] .= $this->get_bar($chunk_size / $day_scale, $color, $link, $title, $itemid, $cat); // 6.4.B) Indien het WEL om een timepicker gaat... (max_users telt hier niet) } else { $timepicker_min *= 60; $timepicker_max *= 60; $minute_interval = 30; $minute_interval *= 60; $color = "blue"; $pickedcolor = "red"; $tosmallchunkcolor = "yellow"; $start_pointer = $start; $link = "subscribe.php?rid=".$r['id'].'&timestart='; // + (start)tijd waarop geklikt werd = volwaardige link if(count($s)==0) { if ($start > time()) { //controle of dat de time tussen $r['subscribe_from'] en $r['subscribe_until'] ligt if((Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) <= time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()) || ($r['subscribe_from'] == '0000-00-00 00:00:00' && $r['subscribe_until'] == '0000-00-00 00:00:00')) { $days[$weekday_pointer] .= $this->get_bar(($end - $start) / $day_scale, $color, $link.$start_pointer, date('H:i', $start).' » '.date('H:i', $end), $itemid, $cat); } else { $days[$weekday_pointer] .= $this->get_bar(($end - $start) / $day_scale, 'orange', null, date('H:i', $start).' » '.date('H:i', $end)); } } else { if (time() < $end) { //eerst oranje daarna blauw of geel $days[$weekday_pointer] .= $this->get_bar((time() - $start) / $day_scale, 'orange', null, date('H:i', $start).' » '.date('H:i', time())); //controle of het stuk nog kan gereserveerd worden -> stuk > timepicker_min if((Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) <= time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()) || ($r['subscribe_from'] == '0000-00-00 00:00:00' && $r['subscribe_until'] == '0000-00-00 00:00:00')) { if (($end - time()) >= $timepicker_min) { $days[$weekday_pointer] .= $this->get_bar(($end - time()) / $day_scale, $color, $link.$start_pointer, date('H:i', time()).' » '.date('H:i', $end), $itemid, $cat); } else { $days[$weekday_pointer] .= $this->get_bar(($end - time()) / $day_scale, $tosmallchunkcolor, null, date('H:i', time()).' » '.date('H:i', $end)); } } else { $days[$weekday_pointer] .= $this->get_bar(($end - time()) / $day_scale, 'orange', null, date('H:i', time()).' » '.date('H:i', $end)); } } else { //volledig oranje blok $days[$weekday_pointer] .= $this->get_bar(($end - $start) / $day_scale, 'orange', null, date('H:i', $start).' » '.date('H:i', $end)); } } } else { $i = 0; foreach ($s as $key => $sub) { $start = Rsys :: mysql_datetime_to_timestamp($sub['start_at']); $einde = Rsys :: mysql_datetime_to_timestamp($sub['end_at']); if (Rsys :: mysql_datetime_to_timestamp($sub['start_at']) - $start_pointer <= 0) { //start onmiddelijk met een rood stuk $start_tijd = date('H:i',$start_pointer); $eind_tijd = date('H:i',$einde); $days[$weekday_pointer] .= $this->get_bar(($einde - $start_pointer) / $day_scale, $pickedcolor, null, $start_tijd.' » '.$eind_tijd); } else { //start met een blauw of oranje stuk //kijken of dat de start_tijd al buiten de huidige tijd ligt -> if ($start_pointer > time()) { $start_tijd = date('H:i',$start_pointer); $eind_tijd = date('H:i',$start); if((Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) <= time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()) || ($r['subscribe_from'] == '0000-00-00 00:00:00' && $r['subscribe_until'] == '0000-00-00 00:00:00')) { //niet buiten tijd! //blauw stuk maken indien groter dan timepicker_min anders geel if (($start - $start_pointer) >= $timepicker_min) { $days[$weekday_pointer] .= $this->get_bar(($start - $start_pointer) / $day_scale, $color, $link.$start_pointer, $start_tijd.' » '.$eind_tijd, $itemid, $cat); } else { $days[$weekday_pointer] .= $this->get_bar(($start - $start_pointer) / $day_scale, $tosmallchunkcolor, null, $start_tijd.' » '.$eind_tijd); } } else { $days[$weekday_pointer] .= $this->get_bar(($start - $start_pointer) / $day_scale, 'orange', null, $start_tijd.' » '.$eind_tijd); } } else { //controleren of dat tijd nu groter is dan de start van het gereserveerde stuk //Ja -> stuk voor de start oranje maken //Neen -> stuk voor de start oranje maken en wat er nog overblijft vr de $start blauw maken if (time() >= $start) { $days[$weekday_pointer] .= $this->get_bar(($start - $start_pointer) / $day_scale, 'orange', null, date('H:i', $start_pointer).' » '.date('H:i', $start)); } else { //buiten tijd! -> stuk opdelen in een gedeelte buiten tijd en een gedeelte timepicker //oranje stuk $days[$weekday_pointer] .= $this->get_bar((time() - $start_pointer) / $day_scale, 'orange', null, date('H:i', $start_pointer).' » '.date('H:i', time())); if((Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) <= time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()) || ($r['subscribe_from'] == '0000-00-00 00:00:00' && $r['subscribe_until'] == '0000-00-00 00:00:00')) { //blauw stuk maken indien groter dan timepicker_min anders geel if (($start - time()) >= $timepicker_min) { $days[$weekday_pointer] .= $this->get_bar(($start - time()) / $day_scale, $color, $link.time(), date('H:i', time()).' » '.date('H:i', $start), $itemid, $cat); } else { $days[$weekday_pointer] .= $this->get_bar(($start - time()) / $day_scale, $tosmallchunkcolor, null, date('H:i', time()).' » '.date('H:i', $start), $itemid, $cat); } } else { $days[$weekday_pointer] .= $this->get_bar(($start - time()) / $day_scale, 'orange', null, date('H:i', time()).' » '.date('H:i', $start)); } } } $start_tijd = date('H:i',$start); $eind_tijd = date('H:i',$einde); $days[$weekday_pointer] .= $this->get_bar(($einde - $start) / $day_scale, $pickedcolor, null, $start_tijd.' » '.$eind_tijd); } //print_r($days); $start_pointer = $einde;// + 1; } //indien er nog een stuk blauw moet gemaakt worden op het einde vd reservering if ($start_pointer < $end) { //controleren of dat tijd nu groter is dan de start van het gereserveerde stuk //Ja -> stuk voor de start oranje maken //Neen -> stuk voor de start oranje maken en wat er nog overblijft vr de $start blauw maken if (time() >= $end) { $days[$weekday_pointer] .= $this->get_bar(($end - $start_pointer) / $day_scale, 'orange', null, date('H:i', $start_pointer).' » '.date('H:i', $end)); } else { if (time() >= $start_pointer) { //buiten tijd! -> stuk opdelen in een gedeelte buiten tijd en een gedeelte timepicker //oranje stuk $days[$weekday_pointer] .= $this->get_bar((time() - $start_pointer) / $day_scale, 'orange', null, date('H:i', $start_pointer).' » '.date('H:i', time())); if((Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) <= time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()) || ($r['subscribe_from'] == '0000-00-00 00:00:00' && $r['subscribe_until'] == '0000-00-00 00:00:00')) { //blauw stuk maken indien groter dan timepicker_min anders geel if (($end - time()) >= $timepicker_min) { //blauwe stuk $days[$weekday_pointer] .= $this->get_bar(($end - time()) / $day_scale, $color, $link.time(), date('H:i', time()).' » '.date('H:i', $end), $itemid, $cat); } else { //geel stuk $days[$weekday_pointer] .= $this->get_bar(($end - time()) / $day_scale, $tosmallchunkcolor, null, date('H:i', time()).' » '.date('H:i', $end)); } } else { $days[$weekday_pointer] .= $this->get_bar(($end - time()) / $day_scale, 'orange', null, date('H:i', time()).' » '.date('H:i', $end)); } } else { if((Rsys :: mysql_datetime_to_timestamp($r['subscribe_from']) <= time() && Rsys :: mysql_datetime_to_timestamp($r['subscribe_until']) > time()) || ($r['subscribe_from'] == '0000-00-00 00:00:00' && $r['subscribe_until'] == '0000-00-00 00:00:00')) { //blauw stuk maken indien groter dan timepicker_min anders geel if (($end - $start_pointer) >= $timepicker_min) { //blauwe stuk $days[$weekday_pointer] .= $this->get_bar(($end - $start_pointer) / $day_scale, $color, $link.$start_pointer, date('H:i', $start_pointer).' » '.date('H:i', $end), $itemid, $cat); } else { //gele stuk $days[$weekday_pointer] .= $this->get_bar(($end - $start_pointer) / $day_scale, $tosmallchunkcolor, null, date('H:i', $start_pointer).' » '.date('H:i', $end)); } } else { $days[$weekday_pointer] .= $this->get_bar(($end - $start_pointer) / $day_scale, 'orange', null, date('H:i', $start_pointer).' » '.date('H:i', $end)); } } } } } } // 6.5) Zet de $last_end pointer op de eindtijd van de huidige reservatie periode $last_end = $end; }// end if } // 7) loop through all days of the week and fill them with the contents of $days $firstcol = 120; // Width of first col (in pixels) $x=0; $borderstyle = "border-bottom: 1px solid #003;"; echo ''; for ($i = 1; $i <= 7; $i ++) { echo ''."\n"; } echo '
 '; $vast = (3600 * 2) / $day_scale; $lasttotal=0; for ($i = 0; $i < 22; $i = $i +2) { $w=$vast; $total+=$w; $rounded_total=round($total); $w=$rounded_total-$lasttotal; echo '
'.$i.'
'; $lasttotal=$rounded_total; } echo '
22
0'; echo '
'.$this->get_long_day($i == 7 ? 0 : $i).''; if (is_array($days) && array_key_exists($i, $days)) echo $days[$i]; else echo ' '; echo '
'; $GLOBALS['weekstart']=date('d/m/Y',$day_start_dates[1]); $GLOBALS['weekend']=date('d/m/Y',$day_start_dates[7]); } } ?>