sintonia/livesupport/modules/htmlUI/var/ui_scheduler.class.php
2005-04-27 16:34:33 +00:00

518 lines
21 KiB
PHP
Executable file

<?php
class uiScheduler extends uiCalendar
{
function uiScheduler(&$uiBase)
{
$this->curr =& $_SESSION[UI_CALENDAR_SESSNAME]['current'];
$this->scheduleAt =& $_SESSION[UI_CALENDAR_SESSNAME]['scheduleAt'];
$this->schedulePrev =& $_SESSION[UI_CALENDAR_SESSNAME]['schedulePrev'];
$this->scheduleNext =& $_SESSION[UI_CALENDAR_SESSNAME]['scheduleNext'];
if (!is_array($this->curr)) {
$this->curr['view'] = 'month';
$this->curr['year'] = strftime("%Y");
$this->curr['month'] = strftime("%m");
$this->curr['week'] = strftime("%V");
$this->curr['day'] = strftime("%d");
$this->curr['hour'] = strftime("%H");
$this->curr['dayname'] = strftime("%A");
$this->curr['monthname'] = strftime("%B");
$this->curr['isToday'] = TRUE;
}
$this->Base =& $uiBase;
$this->reloadUrl = UI_BROWSER.'?popup[]=_reload_parent&popup[]=_close';
$this->closeUrl = UI_BROWSER.'?popup[]=_close';
$this->uiCalendar();
$this->initXmlRpc();
}
function setReload()
{
$this->Base->redirUrl = $this->reloadUrl;
}
function setClose()
{
$this->Base->redirUrl = $this->closeUrl;
}
function set($arr)
{
extract($arr);
#print_r($arr);
if (isset($view)) $this->curr['view'] = $view;
if (is_numeric($year)) $this->curr['year'] = $year;
if (is_numeric($month)) $this->curr['month'] = sprintf('%02d', $month);
if (is_numeric($day)) $this->curr['day'] = sprintf('%02d', $day);
if (is_numeric($hour)) $this->curr['hour'] = sprintf('%02d', $hour);
$stampNow = $this->_datetime2timestamp($this->curr['year'].$this->curr['month'].$this->curr['day'].'T'.$this->curr['hour'].':00:00');
$stampTarget = $stampNow;
if ($month==='++')
$stampTarget = strtotime("+1 month", $stampNow);
if ($month==='--')
$stampTarget = strtotime("-1 month", $stampNow);
if ($week==='++')
$stampTarget = strtotime("+1 week", $stampNow);
if ($week==='--')
$stampTarget = strtotime("-1 week", $stampNow);
if ($day==='++')
$stampTarget = strtotime("+1 day", $stampNow);
if ($day==='--')
$stampTarget = strtotime("-1 day", $stampNow);
if ($today)
$stampTarget = time();
$this->curr['year'] = strftime("%Y", $stampTarget);
$this->curr['month'] = strftime("%m", $stampTarget);
$this->curr['week'] = strftime("%V", $stampTarget);
$this->curr['day'] = strftime("%d", $stampTarget);
$this->curr['hour'] = strftime("%H", $stampTarget);
$this->curr['dayname'] = strftime("%A", $stampTarget);
$this->curr['monthname'] = strftime("%B", $stampTarget);
if ($this->curr['year'] === strftime("%Y") && $this->curr['month'] === strftime("%m") && $this->curr['day'] === strftime("%d"))
$this->curr['isToday'] = TRUE;
else
$this->curr['isToday'] = FALSE;
#print_r($this->curr);
}
function setScheduleAt($arr)
{
extract($arr);
#print_r($arr);
if (is_numeric($year)) $this->scheduleAt['year'] = $year;
if (is_numeric($month)) $this->scheduleAt['month'] = sprintf('%02d', $month);
if (is_numeric($day)) $this->scheduleAt['day'] = sprintf('%02d', $day);
if (is_numeric($hour)) $this->scheduleAt['hour'] = sprintf('%02d', $hour);
if (is_numeric($minute)) $this->scheduleAt['minute'] = sprintf('%02d', $minute);
if (is_numeric($second)) $this->scheduleAt['second'] = sprintf('%02d', $second);
$week = $this->getWeekEntrys();
## search for next entry
if (count($week[$this->scheduleAt['day']]) >= 1) {
foreach ($week[$this->scheduleAt['day']] as $entry) {
if (strtotime($entry[0]['start']) >= strtotime($this->scheduleAt['hour'].':'.$this->scheduleAt['minute'].':'.$this->scheduleAt['second'])) {
list($this->scheduleNext['hour'], $this->scheduleNext['minute'], $this->scheduleNext['second']) = explode(':', strftime('%H:%M:%S', strtotime($entry[0]['start'])-1));
break;
}
}
} else {
## start at midnight
$this->scheduleNext['hour'] = 0;
$this->scheduleNext['minute'] = 0;
$this->scheduleNext['second'] = 0;
}
reset ($week);
## search for previous entry
if (count($week[$this->scheduleAt['day']]) >= 1) {
foreach (array_reverse($week[$this->scheduleAt['day']]) as $entry) {
if (strtotime($entry[0]['end']) <= strtotime($this->scheduleAt['hour'].':'.$this->scheduleAt['minute'].':'.$this->scheduleAt['second'])) {
list($this->schedulePrev['hour'], $this->schedulePrev['minute'], $this->schedulePrev['second']) = explode(':', strftime('%H:%M:%S', strtotime($entry[0]['end'])+1));
break;
}
}
} else {
## start at midnight
$this->schedulePrev['hour'] = 0;
$this->schedulePrev['minute'] = 0;
$this->schedulePrev['second'] = 0;
}
#print_r($this->schedulePrev);
#print_r($this->scheduleNext);
}
function getWeekEntrys()
{
## build array within all entrys of current week ##
$this->buildWeek();
$weekStart = strftime("%Y%m%d", $this->Week[0]['timestamp']);
$weekEnd = strftime("%Y%m%d", $this->Week[6]['timestamp']);
$arr = $this->displayScheduleMethod($weekStart.'T00:00:00', $weekEnd.'T23:59:59.999999');
#print_r($arr);
if (!count($arr))
return FALSE;
foreach ($arr as $key => $val) {
$items[strftime('%d', $this->_datetime2timestamp($val['start']))][number_format(strftime('%H', $this->_datetime2timestamp($val['start'])))][]= array (
'id' => $this->Base->gb->_idFromGunid($val['playlistId']),
'scheduleid'=> $val['id'],
'start' => substr($val['start'], strpos($val['start'], 'T')+1),
'end' => substr($val['end'], strpos($val['end'], 'T') + 1),
'title' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_TITLE),
'creator' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_CREATOR),
'type' => 'Playlist'
);
}
#print_r($items);
return $items;
}
function getDayEntrys()
{
## build array within all entrys of current day ##
$this->buildDay();
$day = strftime("%Y%m%d", $this->Day[0]['timestamp']);
$arr = $this->displayScheduleMethod($day.'T00:00:00', $day.'T23:59:59.999999');
#print_r($arr);
if (!count($arr))
return FALSE;
foreach ($arr as $key => $val) {
$items[number_format(strftime('%H', $this->_datetime2timestamp($val['start'])))][]= array (
'id' => $this->Base->gb->_idFromGunid($val['playlistId']),
'scheduleid'=> $val['id'],
'start' => substr($val['start'], strpos($val['start'], 'T')+1),
'end' => substr($val['end'], strpos($val['end'], 'T') + 1),
'title' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_TITLE),
'creator' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_CREATOR),
'type' => 'Playlist'
);
}
#print_r($items);
return $items;
}
function getDayHourlyEntrys($year, $month, $day)
{
$date = $year.$month.$day;
$arr = $this->displayScheduleMethod($date.'T00:00:00', $date.'T23:59:59.999999');
if (!count($arr))
return FALSE;
foreach ($arr as $key => $val) {
$items[date('H', $this->_datetime2timestamp($val['start']))][]= array (
'start' => substr($val['start'], strpos($val['start'], 'T')+1),
'end' => substr($val['end'], strpos($val['end'], 'T') + 1),
'title' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_TITLE),
'creator' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_CREATOR),
);
}
#print_r($items);
return $items;
}
function getDayUsage($year, $month, $day)
{
$date = $year.$month.$day;
$arr = $this->displayScheduleMethod($date.'T00:00:00', $date.'T23:59:59.999999');
if (!count($arr))
return FALSE;
foreach ($arr as $key=>$val) {
$arr[$key]['title'] = $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_TITLE);
$arr[$key]['creator'] = $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($val['playlistId']), UI_MDATA_KEY_CREATOR);
$arr[$key]['pos'] = $this->_datetime2timestamp($val['start']);
$arr[$key]['span'] = date('H', $this->_datetime2timestamp($val['end'])) - date('H', $this->_datetime2timestamp($val['start'])) +1;
}
#print_r($arr);
return $arr;
}
function getDayUsagePercentage($year, $month, $day)
{
if (!$arr = $this->getDayUsage($year, $month, $day))
return false;
foreach ($arr as $val) {
$duration += ($this->_datetime2timestamp($val['end'])-$this->_datetime2timestamp($val['start']))/86400*100;
}
return $duration;
}
function getDayTiming($year, $month, $day)
{
#echo $year.$month.$day;
$day_start = $this->_datetime2timestamp($year.$month.$day.'T00:00:00');
$day_end = $this->_datetime2timestamp($year.$month.$day.'T23:59:59');
if (!$arr = $this->getDayUsage($year, $month, $day))
return array(array( ## empty day
'type' => 'gap',
'length' => $day_end - $day_start
));
$curr = current($arr);
if ($this->_strtotime($curr['start']) > $day_start) ## insert gap if first entry start after 00:00:00
$list[] = array(
'type' => 'gap',
#'pos' => 0,
'length' => $this->_strtotime($curr['start']) - $day_start
);
while ($curr = current($arr)) {
$list[] = array(
'type' => 'entry',
#'pos' => $this->_strtotime($curr['start']) - $day_start,
'length' => $this->_strtotime($curr['end']) - $this->_strtotime($curr['start']),
'entry' => $curr
);
if ($next = next($arr)) {
if ($this->_strtotime($next['start']) > $this->_strtotime($curr['end'])+1) ## insert gap between entrys
$list[] = array(
'type' => 'gap',
#'pos' => $this->_strtotime($curr['start'])-$day_start,
'length' => $this->_strtotime($next['start']) - $this->_strtotime($curr['end']),
);
}
else {
if ($this->_strtotime($curr['end']) < $day_end) ## insert gap if prev entry was not until midnight
$list[] = array(
'type' => 'gap',
#'pos' => $this->_strtotime($curr['end']) - $day_start,
'length' => $day_end - $this->_strtotime($curr['end']),
);
}
}
#print_r($list);
return $list;
}
function getDayTimingScale()
{
for ($n = 0; $n <= 23; $n++) {
$scale[] = $n;
}
#print_r($scale);
return $scale;
}
function getScheduleForm()
{
global $ui_fmask;
#print_r($this->availablePlaylists);
foreach ($this->availablePlaylists as $val) {
$ui_fmask['schedule']['gunid_duration']['options'][$val['gunid'].'|'.$val['duration']] = $val['title'];
}
#print_r($ui_fmask['schedule']);
$form = new HTML_QuickForm('schedule', UI_STANDARD_FORM_METHOD, UI_HANDLER);
$this->Base->_parseArr2Form($form, $ui_fmask['schedule']);
$settime = array('H' => $this->scheduleAt['hour'],
'i' => $this->scheduleAt['minute'],
's' => $this->scheduleAt['second']
);
$setdate = array('Y' => $this->scheduleAt['year'],
'm' => $this->scheduleAt['month'],
'd' => $this->scheduleAt['day']
);
$form->setDefaults(array('time' => $settime,
'date' => $setdate,
));
$renderer =& new HTML_QuickForm_Renderer_Array(true, true);
$form->accept($renderer);
$output = $renderer->toArray();
#print_r($output);
return $output;
}
function copyPlFromSP()
{
foreach ($this->Base->SCRATCHPAD->get() as $val) {
if ($val['type'] === 'playlist' && $this->Base->gb->playlistIsAvailable($val['id'], $this->Base->sessid) === TRUE && $val['id'] != $this->Base->PLAYLIST->activeId)
$this->availablePlaylists[] = $val;
}
if (!count($this->availablePlaylists))
return FALSE;
return TRUE;
}
function getNowNextClip($distance=0)
{
$datetime = strftime('%Y-%m-%dT%H:%M:%S');
$xmldatetime = str_replace('-', '', $datetime);
$pl = $this->displayScheduleMethod($xmldatetime, $xmldatetime);
if(!is_array($pl) || !count($pl))
return FALSE;
$pl = current($pl);
$offset = strftime('%H:%M:%S', $this->_strtotime($datetime) - $this->_datetime2timestamp($pl['start']) - UI_TIMEZONEOFFSET);
$clip = $this->Base->gb->displayPlaylistClipAtOffset($this->Base->sessid, $pl['playlistId'], $offset, $distance);
if(!$clip['gunid'])
return FALSE;
return array(
'title' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($clip['gunid']), UI_MDATA_KEY_TITLE),
'duration' => $this->Base->_getMDataValue($this->Base->gb->_idFromGunid($clip['gunid']), UI_MDATA_KEY_DURATION),
'elapsed' => $clip['elapsed'],
'remaining' => $clip['remaining'],
'percentage'=> 100 * $this->Base->gb->_plTimeToSecs($clip['elapsed']) / ( $this->Base->gb->_plTimeToSecs($clip['elapsed']) + $this->Base->gb->_plTimeToSecs($clip['remaining']))
);
}
function _datetime2timestamp($i)
{
$i = str_replace('T', ' ', $i);
$formatted = $i[0].$i[1].$i[2].$i[3].'-'.$i[4].$i[5].'-'.$i[6].$i[7].strrchr($i, ' ');
#echo "input: $i formatted:".$formatted;
return $this->_strtotime($formatted);
}
function _strtotime($input)
{
## !! bug in strtotime, does not rightly support datetime-format using T chatracter
return strtotime(str_replace('T', ' ', $input));
}
function _oneOrMore($in)
{
return $id < 1 ? ceil($in) : round($in);
}
function _scheduledDays($period)
{
if ($period==='month') {
require_once 'Calendar/Month/Weekdays.php';
$Period = new Calendar_Month_Weekdays($this->curr['year'], $this->curr['month'], $this->firstDayOfWeek);
$Period->build();
} elseif ($period==='week') {
require_once 'Calendar/Week.php';
$Period = new Calendar_Week ($this->curr['year'], $this->curr['month'], $this->curr['day'], $this->firstDayOfWeek);
$Period->build();
} else {
return array();
}
$d = $Period->fetch();
$corrMonth = $d->thisMonth()<=12 ? sprintf('%02d', $d->thisMonth()) : '01'; ## due to bug in
$corrYear = $d->thisMonth()<=12 ? $d->thisYear() : $d->thisYear()+1; ## Calendar_Month_Weekdays
$first = array('day' => sprintf('%02d', $d->thisDay()),
'month' => $corrMonth,
'year' => $corrYear
);
while ($l = $Period->fetch()) {
$d = $l;
}
$corrMonth = $d->thisMonth()<=12 ? sprintf('%02d', $d->thisMonth()) : '01'; ## due to bug in
$corrYear = $d->thisMonth()<=12 ? $d->thisYear() : $d->thisYear()+1; ## Calendar_Month_Weekdays
$last = array('day' => sprintf('%02d', $d->thisDay()),
'month' => $corrMonth,
'year' => $corrYear
);
#echo "F:".$first['year'].$first['month'].$first['day']." L:".$last['year'].$last['month'].$last['day'];
$days = $this->_reciveScheduledDays($first['year'].$first['month'].$first['day'], $last['year'].$last['month'].$last['day']);
foreach ($days as $val) {
$selections[] = new Calendar_Day($val['year'], $val['month'], $val['day']);
}
return $selections;
}
function _reciveScheduledDays($dfrom, $dto)
{
$dfrom = $dfrom.'T00:00:00';
$dto = $dto.'T23:59:59';
if (($pArr = $this->displayScheduleMethod($dfrom, $dto)) === FALSE)
return array(FALSE);;
foreach ($pArr as $val) {
#print_r($val);
$pStampArr[] = array('start' => $this->_datetime2timestamp($val['start']),
'end' => $this->_datetime2timestamp($val['end']));
}
if (is_array($pStampArr)) {
#print_r($pStampArr);
for ($n=$this->_datetime2timestamp($dfrom); $n<=$this->_datetime2timestamp($dto); $n+=86400) {
foreach ($pStampArr as $val) {
if ($val['start'] < $n+86400 && $val['end'] >= $n) {
$days[date('Ymd', $n)] = array('year' => date('Y', $n),
'month' => date('m', $n),
'day' => date('d', $n));
}
}
}
return $days;
}
return array(FALSE);
}
function _isError($r)
{
if (is_array($r['error'])) {
$this->Base->_retMsg('Error: $1', str_replace("\n", "\\n", addslashes($r['error']['message'])));
return TRUE;
}
return FALSE;
}
## XML-RPC wrapper methods ############################################################################################
function initXmlRpc()
{
include_once dirname(__FILE__).'/SchedulerPhpClient.class.php';
$this->spc =& SchedulerPhpClient::factory($this->Base->dbc, $mdefs, $this->Base->config, FALSE, FALSE);
}
function uploadPlaylistMethod(&$formdata)
{
#$gunid = $formdata['gunid'];
#$datetime = $this->curr['year'].$this->curr['month'].$this->curr['day'].'T'.$formdata['time'];
$gunid = $formdata['playlist'];
$datetime = $formdata['date']['Y'].sprintf('%02d', $formdata['date']['m']).sprintf('%02d', $formdata['date']['d']).'T'.sprintf('%02d', $formdata['time']['H']).':'.sprintf('%02d', $formdata['time']['i']).':'.sprintf('%02d', $formdata['time']['s']);
#echo "Schedule Gunid: $gunid At: ".$datetime;
$r = $this->spc->UploadPlaylistMethod($this->Base->sessid, $gunid, $datetime);
#print_r($r);
if ($this->_isError($r))
return FALSE;
if (isset($r['scheduleEntryId']))
$this->Base->_retMsg('Entry added at $1 with ScheduleId: $2', $datetime, $r['scheduleEntryId']);
}
function removeFromScheduleMethod($id)
{
#echo "Unschedule Gunid: $gunid";
$r = $this->spc->removeFromScheduleMethod($this->Base->sessid, $id);
#print_r($r);
if ($this->_isError($r))
return FALSE;
if (UI_VERBOSE) $this->Base->_retMsg('Entry with ScheduleId $1 removed', $id);
}
function displayScheduleMethod($from, $to)
{
#echo $from.$to;
$r = $this->spc->displayScheduleMethod($this->Base->sessid, $from, $to);
if ($this->_isError($r))
return FALSE;
return $r;
}
}
?>