added freetime search

This commit is contained in:
Ralf Becker 2004-10-07 22:11:18 +00:00
parent 930db9f0c0
commit fd6b69d7a8
7 changed files with 379 additions and 4 deletions

View File

@ -719,7 +719,7 @@ class bocal
*
* @param $date mixed date to convert
* @param $server2user_time boolean conversation between user- and server-time default False == Off
* @return array with keys 'second', 'minute', 'hour', 'day', 'month', 'year', 'ras' (timestamp) and 'full' (Ymd-string)
* @return array with keys 'second', 'minute', 'hour', 'day', 'month', 'year', 'raw' (timestamp) and 'full' (Ymd-string)
*/
function date2array($date,$server2user=False)
{

View File

@ -153,6 +153,9 @@
$GLOBALS['phpgw']->preferences->add('calendar','interval',30);
$GLOBALS['phpgw']->preferences->save_repository();
}
// calendar does not work with hidden sidebox atm.
unset($GLOBALS['phpgw_info']['user']['preferences']['common']['auto_hide_sidebox']);
}
/* Public functions */
@ -4206,9 +4209,42 @@ return;
{
$GLOBALS['phpgw']->uiaccountsel = CreateObject('phpgwapi.uiaccountsel');
}
$fts_link = $GLOBALS['phpgw']->link('/index.php',array('menuaction'=>'calendar.uiforms.freetimesearch'));
$fields = array('start[str]','start[hour]','start[min]','end[str]','end[hour]','end[min]');
if ($this->bo->prefs['common']['timeformat'] == '12')
{
$fields[] = 'start[ampm]';
$fields[] = 'end[ampm]';
}
$var['participants'] = array(
'field' => lang('Participants'),
'data' => "\n ".$GLOBALS['phpgw']->uiaccountsel->selection('participants[]','uicalendar_select_participants',$event['participants'],'calendar+',7,$event['owner']),
'data' => "\n ".$GLOBALS['phpgw']->uiaccountsel->selection('participants[]','uicalendar_select_participants',$event['participants'],'calendar+',7,$event['owner']).'
<script>
function call_freetimesearch(link,form) {
fields = Array("'.implode('","',$fields).'");
for (i=0; i < fields.length; ++i) {
link += "&"+fields[i]+"="+form[fields[i]].value;
}
participants = "";
for(n=0; n < form.length; ++n) {
with(form.elements[n]) {
if (name == "participants[]") {
if (form.elements[n].options) {
for(i=0; i < options.length; ++i) {
if (options[i].selected) participants += ":"+options[i].value;
}
} else if (checked) {
participants += ":"+value;
}
}
}
}
link += "&participants="+participants.slice(1);
window.open(link,"ft_search","width=700,height=500,scrollbars=yes,resizable=yes,status=yes");
}
</script>
'.$this->html->submit_button('freetimesearch',/*lang(*/'freetime search'/*)*/,"call_freetimesearch('".$fts_link."',this.form); return false;",0,' title="'.$this->html->htmlspecialchars(lang('Find free timeslots where the marked participants are availible for the given timespan')).'"')
);
/*
// External Participants

View File

@ -0,0 +1,286 @@
<?php
/**************************************************************************\
* eGroupWare - Calendar - forms of the UserInterface *
* http://www.egroupware.org *
* Written and (c) 2004 by Ralf Becker <RalfBecker@outdoor-training.de> *
* -------------------------------------------- *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU General Public License as published by the *
* Free Software Foundation; either version 2 of the License, or (at your *
* option) any later version. *
\**************************************************************************/
/* $Id$ */
include_once(PHPGW_INCLUDE_ROOT . '/calendar/inc/class.uical.inc.php');
/**
* calendar UserInterface forms
*
* @package calendar
* @author RalfBecker@outdoor-training.de
* @license GPL
*/
class uiforms extends uical
{
var $public_functions = array(
'freetimesearch' => True,
);
/**
* Constructor
*/
function uiforms()
{
$this->uical(); // call the parent's constructor
}
/**
* Freetime search
*
* As the function is called in a popup via javascript, parametes get initialy transfered via the url
* @param $content array/boolean array with parameters or false (default) to use the get-params
* @param start[str] string start-date
* @param start[hour] string start-hour
* @param start[min] string start-minutes
* @param end[str] string end-date
* @param end[hour] string end-hour
* @param end[min] string end-minutes
* @param participants string ':' delimited string of user-id's
*/
function freetimesearch($content = false)
{
if (!is_array($content))
{
if ($this->debug) echo "<pre>".print_r($_GET,true)."</pre>";
foreach(array('start','end') as $name)
{
$arr = $this->jscal->input2date($_GET[$name]['str'],false);
$arr += $_GET[$name];
$content[$name] = $this->bo->date2ts($arr);
}
$duration = $content['end'] - $content['start'];
if ($duration <= 12*HOUR_s)
{
$content['duration_h'] = (int) ($duration / HOUR_s);
$content['duration_min'] = ($duration/60) % 60;
$content['end'] = 0;
}
else
{
$content['duration_h'] = $content['duration_min'] = 0;
}
foreach(explode(':',$_GET['participants']) as $uid)
{
if ((int) $uid) $content['participants'][] = (int) $uid;
}
// default search parameters
$content['start_time'] = $this->cal_prefs['workdaystarts'];
$content['end_time'] = $this->cal_prefs['workdayends'];
if ($this->cal_prefs['workdayends']*HOUR_s < $this->cal_prefs['workdaystarts']*HOUR_s+$duration)
{
$content['end_time'] = 0; // no end-time limit, as duration would never fit
}
$content['weekdays'] = MCAL_M_WEEKDAYS;
$content['search_window'] = 7 * DAY_s;
}
else
{
$duration = $content['end'] ? $content['end']-$content['start'] : 60*(60*$content['duration_h']+$content['duration_min']);
if (is_array($content['freetime']['select']))
{
list($selected) = each($content['freetime']['select']);
echo "$selected = ".date('D d.m.Y H:i',$content['freetime'][$selected]['start']);
$start = (int) $content['freetime'][$selected]['start'];
$end = $start + $duration;
$fields_to_set = array(
'start[str]' => date($this->common_prefs['dateformat'],$start),
'start[min]' => date('i',$start),
'end[str]' => date($this->common_prefs['dateformat'],$end),
'end[min]' => date('i',$end),
);
if ($this->common_prefs['timeformat'] == 12)
{
$fields_to_set += array(
'start[hour]' => date('h',$start),
'start[ampm]' => date('a',$start),
'end[hour]' => date('h',$end),
'end[ampm]' => date('a',$end),
);
}
else
{
$fields_to_set += array(
'start[hour]' => date('H',$start),
'end[hour]' => date('H',$end),
);
}
echo "<html>
<script>
var fields = Array('".implode("','",array_keys($fields_to_set))."');
var values = Array('".implode("','",$fields_to_set)."');
for (i=0; i < fields.length; ++i) {
elements = opener.document.getElementsByName(fields[i]);
if (elements) {
if (elements.length == 1)
elements[0].value = values[i];
else
for (n=0; n < elements.length; ++n) {
if (elements[n].value == values[i]) elements[n].checked = true;
}
}
}
window.close();
</script>
</html>\n";
exit;
}
}
$content['freetime'] = $this->freetime($content['participants'],$content['start'],$content['start']+$content['search_window'],$duration);
$content['freetime'] = $this->split_freetime_daywise($content['freetime'],$duration,$content['weekdays'],$content['start_time'],$content['end_time'],$sel_options);
$sel_options['search_window'] = array(
7*DAY_s => lang('one week'),
14*DAY_s => lang('two weeks'),
31*DAY_s => lang('one month'),
92*DAY_s => lang('three month'),
365*DAY_s => lang('one year'),
);
$etpl = CreateObject('etemplate.etemplate','calendar.freetimesearch');
//echo "<pre>".print_r($content,true)."</pre>\n";
$GLOBALS['phpgw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('freetime search');
$etpl->exec('calendar.uiforms.freetimesearch',$content,$sel_options,'',array(
'participants' => $content['participants'],
),2);
}
/**
* calculate the freetime of given $participants in a certain time-span
*
* @param $start int start-time timestamp in user-time
* @param $end int end-time timestamp in user-time
* @param $participants array of user-id's
* @param $duration int min. duration in sec, default 1
* @return array of free time-slots: array with start and end values
*/
function freetime($participants,$start,$end,$duration=1)
{
$busy = $this->bo->search(array(
'start' => $start,
'end' => $end,
'users' => $participants,
));
$busy[] = array( // add end-of-search-date as event, to cope with empty search and get freetime til that date
'start' => array('raw'=>$end),
'end' => array('raw'=>$end),
);
$ft_start = $start;
$freetime = array();
$n = 0;
foreach($busy as $event)
{
if ($this->debug)
{
echo "<p>ft_start=".date('D d.m.Y H:i',$ft_start)."<br>\n";
echo "event[title]=$event[title]<br>\n";
echo "event[start]=".date('D d.m.Y H:i',$event['start']['raw'])."<br>\n";
echo "event[end]=".date('D d.m.Y H:i',$event['end']['raw'])."<br>\n";
}
// $events ends before our actual position ==> ignore it
if ($event['end']['raw'] < $ft_start)
{
//echo "==> event ends before ft_start ==> continue<br>\n";
continue;
}
// $events starts before our actual position ==> set start to it's end and go to next event
if ($event['start']['raw'] < $ft_start)
{
//echo "==> event starts before ft_start ==> set ft_start to it's end & continue<br>\n";
$ft_start = $event['end']['raw'];
continue;
}
$ft_end = $event['start']['raw'];
// only show slots equal or bigger to min_length
if ($ft_end - $ft_start >= $duration)
{
$freetime[++$n] = array(
'start' => $ft_start,
'end' => $ft_end,
);
if ($this->debug) echo "<p>freetime: ".date('D d.m.Y H:i',$ft_start)." - ".date('D d.m.Y H:i',$ft_end)."</p>\n";
}
$ft_start = $event['end']['raw'];
}
return $freetime;
}
/**
* split the freetime in daywise slot, taking into account weekdays, start- and stop-times
*
* @param $freetime array of free time-slots: array with start and end values
* @param $duration int min. duration in sec
* @param $weekdays int allowed weekdays, bitfield of MCAL_M_...
* @param $start_time int minimum start-hour 0-23
* @param $end_time int maximum end-hour 0-23, or 0 for none
* @param $sel_options array on return options for start-time selectbox
* @return array of free time-slots: array with start and end values
*/
function split_freetime_daywise($freetime,$duration,$weekdays,$start_time,$end_time,&$sel_options)
{
$freetime_daywise = $sel_options = array();
$time_format = $this->common_prefs['timeformat'] == 12 ? 'h:i a' : 'H:i';
$n = 0;
foreach($freetime as $ft)
{
$daybegin = $this->bo->date2array($ft['start']);
$daybegin['hour'] = $daybegin['minute'] = $daybegin['second'] = 0;
unset($daybegin['raw']);
$daybegin = $this->bo->date2ts($daybegin);
for($t = $daybegin; $t < $ft['end']; $t += DAY_s,$daybegin += DAY_s)
{
$dow = date('w',$daybegin+DAY_s/2); // 0=Sun, .., 6=Sat
$mcal_dow = pow(2,$dow);
if (!($weekdays & $mcal_dow))
{
continue; // wrong day of week
}
$start = $t < $ft['start'] ? $ft['start'] : $t;
if ($start-$daybegin < $start_time*HOUR_s) // start earlier then start_time
{
$start = $daybegin + $start_time*HOUR_s;
}
// if end_time given use it, else the original slot's end
$end = $end_time ? $daybegin + $end_time*HOUR_s : $ft['end'];
if ($end > $ft['end']) $end = $ft['end'];
// slot to small for duration
if ($end - $start < $duration)
{
continue;
}
$freetime_daywise[++$n] = array(
'start' => $start,
'end' => $end,
);
$times = array();
for ($s = $start; $s+$duration <= $end; $s += 60*$this->cal_prefs['interval'])
{
$e = $s + $duration;
$end_date = $e-$daybegin > DAY_s ? lang(date('l',$e)).' '.date($this->common_prefs['dateformat'],$e).' ' : '';
$times[$s] = date($time_format,$s).' - '.$end_date.date($time_format,$e);
}
$sel_options[$n.'[start]'] = $times;
}
}
return $freetime_daywise;
}
}

View File

@ -0,0 +1,9 @@
<?php
// eTemplates for Application 'calendar', generated by etemplate.dump() 2004-10-07 23:23
/* $Id$ */
$templ_data[] = array('name' => 'calendar.freetimesearch','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:7:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:12:"all,size120b";s:5:"label";s:15:"Freetime Search";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:17:"Startdate / -time";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:5:"start";s:4:"help";s:33:"Startdate and -time of the search";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"Duration";}s:1:"B";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:4:"type";s:13:"select-number";s:4:"size";s:5:",0,12";s:4:"name";s:10:"duration_h";s:4:"help";s:23:"Duration of the meeting";}i:2;a:5:{s:4:"type";s:13:"select-number";s:4:"size";s:8:",0,59,05";s:5:"label";s:1:":";s:4:"name";s:12:"duration_min";s:4:"help";s:19:"Timeframe to search";}i:3;a:2:{s:4:"type";s:5:"label";s:5:"label";s:18:"or Enddate / -time";}i:4;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:3:"end";s:4:"help";s:57:"Enddate / -time of the meeting, eg. for more then one day";}}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:9:"Timeframe";}s:1:"B";a:7:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"5";i:1;a:3:{s:4:"type";s:13:"date-houronly";s:4:"name";s:10:"start_time";s:4:"help";s:19:"Timeframe to search";}i:2;a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"til";}i:3;a:3:{s:4:"type";s:13:"date-houronly";s:4:"name";s:8:"end_time";s:4:"help";s:19:"Timeframe to search";}i:4;a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"Weekdays";}i:5;a:4:{s:4:"type";s:10:"select-dow";s:4:"size";s:1:"3";s:4:"name";s:8:"weekdays";s:4:"help";s:25:"Weekdays to use in search";}}}i:5;a:2:{s:1:"A";a:4:{s:4:"type";s:6:"button";s:5:"label";s:10:"New search";s:4:"name";s:6:"search";s:4:"help";s:36:"new search with the above parameters";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:7:"no_lang";s:1:"1";s:4:"name";s:13:"search_window";s:4:"help";s:34:"how far to search (from startdate)";}}i:6;a:2:{s:1:"A";a:4:{s:4:"type";s:8:"template";s:4:"size";s:8:"freetime";s:4:"span";s:3:"all";s:4:"name";s:4:"rows";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}','size' => '','style' => '.size120b { text-size: 120%; font-weight: bold;}','modified' => '1097184234',);
$templ_data[] = array('name' => 'calendar.freetimesearch.rows','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";}i:1;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Date";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Time";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Select";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Enddate";}}i:2;a:4:{s:1:"A";a:4:{s:4:"type";s:4:"date";s:4:"size";s:3:",16";s:4:"name";s:13:"${row}[start]";s:8:"readonly";s:1:"1";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:7:"no_lang";s:1:"1";s:4:"name";s:13:"${row}[start]";s:4:"help";s:13:"select a time";}s:1:"C";a:4:{s:4:"type";s:6:"button";s:5:"label";s:6:"Select";s:4:"name";s:12:"select[$row]";s:4:"help";s:41:"use the selected time and close the popup";}s:1:"D";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"${row}[end]";s:8:"readonly";s:1:"1";}}}','size' => '','style' => '','modified' => '1097183756',);

View File

@ -93,6 +93,7 @@ do you want to receive a regulary summary of your appointsments via email?<br>th
do you wish to autoload calendar holidays files dynamically? admin de Sollen die Feiertage automatisch geladen werden?
download calendar de Herunterladen
duration calendar de Dauer
duration of the meeting calendar de Dauer des Termins
edit series calendar de Serie bearbeiten
edit single calendar de Einzel bearbeiten
email notification calendar de Benachrichtigung per Email
@ -102,6 +103,7 @@ enable calendar de Einschalten
enabled calendar de eingeschaltet
end date/time calendar de Enddatum/-zeit
enddate calendar de Enddatum
enddate / -time of the meeting, eg. for more then one day calendar de Enddatum und -zeit des Termins, zB. für mehr als einen Tag
ends calendar de endet
enter output filename: ( .vcs appended ) calendar de Namen der Ausgabedatei (.vcs angehangen)
event details follow calendar de Details zum Termin folgen
@ -118,6 +120,7 @@ format of event updates calendar de Format der Benachrichtigungen
fr calendar de Fr
free/busy calendar de frei/belegt
freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar de Belegtzeiten: Unbekannter Benutzername '%1', falsches Passwort oder nicht verfügbar für nicht angemeldete Benutzer !!!
freetime search calendar de Terminsuche
frequency calendar de Häufigkeit
fri calendar de Fr
full description calendar de vollständige Beschreibung
@ -138,10 +141,11 @@ holiday management calendar de Feitertagsverwaltung
holiday-management calendar de Feitertagsverwaltung
holidays calendar de Feiertage
hours calendar de Stunden
how far to search (from startdate) calendar de wie weit suchen (vom Startdatum)
i participate calendar de Ich nehme teil
ical / rfc2445 calendar de iCal / RFC2445
if checked holidays falling on a weekend, are taken on the monday after. calendar de Wenn ausgewählt werden Feiertage die auf ein Wochenende fallen, am drauffolgenden Montag nachgeholt.
if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar de Wenn Sie hier kein Passwort angeben, ist die Information für jeden verfügbar, der die Adresse (URL) kennt!!!
if you dont set a password here, the information is available to everyone, who knows the url!!! calendar de Wenn Sie hier kein Passwort angeben, ist die Information für jeden verfügbar, der die Adresse (URL) kennt!!!
ignore conflict calendar de Konflikt ignorieren
import calendar de Importieren
import csv-file common de CSV-Datei importieren
@ -175,6 +179,7 @@ monthview calendar de Monatsansicht
needs javascript to be enabled !!! calendar de Dafür muss Javascript aktiviert sein !!!
new entry calendar de Neuer Eintrag
new name must not exist and not be empty!!! calendar de Neuer Name darf nicht exisitieren und nicht leer sein!!!
new search with the above parameters calendar de neue Suche mit den obigen Parametern
next day calendar de nächster Tag
no filter calendar de Kein Filter
no matches found calendar de Keine Treffer gefunden
@ -203,7 +208,11 @@ on invitation / cancelation only calendar de nur bei Einladungen/Absagen
on participant responses too calendar de auch bei Antworten der Teilnehmer
on time change of more than 4 hours too calendar de bei zeitlichen Änderungen größer als 4 Stunden
on time change of time of more than 4 hours (and above options) calendar de wenn der Termin sich um mehr als 4 Stunde verschiebt (und obige Optionen)
one month calendar de ein Monat
one week calendar de eine Woche
one year calendar de ein Jahr
open todo's: calendar de unerledigte Aufgaben:
or enddate / -time calendar de oder Enddatum / -zeit
order calendar de Reihenfolge
overlap holiday calendar de überlappender Feiertag
participant calendar de Teilnehmer
@ -252,6 +261,7 @@ sat calendar de Sa
scheduling conflict calendar de Terminüberschneidung
search results calendar de Suchergebnisse
select a %1 calendar de %1 auswählen
select a time calendar de eine Zeit auswählen
selected contacts (%1) calendar de Ausgewählte Kontakte (%1)
send updates via email common de Updates via E-Mail senden
send/receive updates via email calendar de Senden/Empfangen von Aktualisierungen via EMail
@ -282,6 +292,8 @@ specifies the the number of intervals shown in the planner view. calendar de Leg
start date/time calendar de Startdatum/-zeit
start- and enddates calendar de Start- und Enddatum/-zeit
startdate calendar de Startdatum
startdate / -time calendar de Startdatum / -zeit
startdate and -time of the search calendar de Startdatum und -zeit der Suche
startrecord calendar de Startdatensatz
su calendar de So
submit to repository calendar de Übertragen zu eGroupWare.org
@ -308,7 +320,11 @@ this message is sent when you set an alarm for a certain event. include all info
this month calendar de Dieser Monat
this week calendar de Diese Woche
this year calendar de Dieses Jahr
three month calendar de drei Monate
thu calendar de Do
til calendar de bis
timeframe calendar de Zeitrahmen
timeframe to search calendar de Zeitrahmen für die Suche
title calendar de Titel
title of the event calendar de Titel des Termin
title-row calendar de Titelzeile
@ -321,14 +337,18 @@ translation calendar de
tu calendar de Di
tue calendar de Di
two dayview calendar de Zweitagesansicht
two weeks calendar de zwei Wochen
update a single entry by passing the fields. calendar de Einen einzelnen Termin über seine Felder updaten.
updated calendar de Aktualisiert
use end date calendar de Enddatum benutzen
use the selected time and close the popup calendar de benutzt die ausgewählte Zeit und schließt das Popup
view this entry calendar de Diesen Eintrag anzeigen
we calendar de Mi
wed calendar de Mi
week calendar de Woche
weekday starts on calendar de Arbeitswoche beginnt am
weekdays calendar de Werktags
weekdays to use in search calendar de Wochentage für die Suche
weekly calendar de Wöchentlich
weekview calendar de Wochenansicht
weekview including weekend calendar de Wochenansicht mit Wochenende

View File

@ -85,6 +85,7 @@ do you want to receive a regulary summary of your appointsments via email?<br>th
do you wish to autoload calendar holidays files dynamically? admin en Do you wish to autoload calendar holidays files dynamically?
download calendar en Download
duration calendar en Duration
duration of the meeting calendar en Duration of the meeting
edit series calendar en Edit Series
edit single calendar en Edit Single
email notification calendar en Email Notification
@ -94,6 +95,7 @@ enable calendar en Enable
enabled calendar en enabled
end date/time calendar en End Date/Time
enddate calendar en Enddate
enddate / -time of the meeting, eg. for more then one day calendar en Enddate / -time of the meeting, eg. for more then one day
ends calendar en ends
enter output filename: ( .vcs appended ) calendar en Enter Output Filename: ( .vcs appended )
event details follow calendar en Event Details Follow
@ -110,6 +112,7 @@ format of event updates calendar en Format of event updates
fr calendar en F
free/busy calendar en Free/Busy
freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar en freebusy: Unknow user '%1', wrong password or not availible to not loged in users !!!
freetime search calendar en Freetime Search
frequency calendar en Frequency
fri calendar en Fri
full description calendar en Full Description
@ -129,10 +132,11 @@ holiday management calendar en Holiday Management
holiday-management calendar en Holiday-Management
holidays calendar en Holidays
hours calendar en hours
how far to search (from startdate) calendar en how far to search (from startdate)
i participate calendar en I Participate
ical / rfc2445 calendar en iCal / rfc2445
if checked holidays falling on a weekend, are taken on the monday after. calendar en If checked holidays falling on a weekend, are taken on the monday after.
if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar en If you dont set a password here, the information is availible to everyone, who knows the URL!!!
if you dont set a password here, the information is available to everyone, who knows the url!!! calendar en If you dont set a password here, the information is available to everyone, who knows the URL!!!
ignore conflict calendar en Ignore Conflict
import calendar en Import
import csv-file common en Import CSV-File
@ -165,6 +169,7 @@ monthview calendar en Month View
needs javascript to be enabled !!! calendar en Needs javascript to be enabled !!!
new entry calendar en New Entry
new name must not exist and not be empty!!! calendar en New name must not exist and not be empty!!!
new search with the above parameters calendar en new search with the above parameters
next day calendar en next day
no filter calendar en No filter
no matches found calendar en No matches found
@ -188,7 +193,11 @@ on any time change too calendar en on any time change too
on invitation / cancelation only calendar en on invitation / cancelation only
on participant responses too calendar en on participant responses too
on time change of more than 4 hours too calendar en on time change of more than 4 hours too
one month calendar en one month
one week calendar en one week
one year calendar en one year
open todo's: calendar en Open To Do Items:
or enddate / -time calendar en or Enddate / -time
order calendar en Order
overlap holiday calendar en overlap holiday
participant calendar en Participant
@ -235,6 +244,7 @@ sat calendar en Sat
scheduling conflict calendar en Scheduling Conflict
search results calendar en Search Results
select a %1 calendar en Select a %1
select a time calendar en select a time
selected contacts (%1) calendar en Selected contacts (%1)
send updates via email common en Send updates via EMail
send/receive updates via email calendar en Send/Receive updates via EMail
@ -265,6 +275,8 @@ specifies the the number of intervals shown in the planner view. calendar en Spe
start date/time calendar en Start Date/Time
start- and enddates calendar en Start- and Enddates
startdate calendar en Startdate
startdate / -time calendar en Startdate / -time
startdate and -time of the search calendar en Startdate and -time of the search
startrecord calendar en Startrecord
su calendar en Su
submit to repository calendar en Submit to Repository
@ -289,7 +301,11 @@ this message is sent when you set an alarm for a certain event. include all info
this month calendar en This Month
this week calendar en This Week
this year calendar en This Year
three month calendar en three month
thu calendar en Thu
til calendar en til
timeframe calendar en Timeframe
timeframe to search calendar en Timeframe to search
title calendar en Title
title of the event calendar en Title of the event
title-row calendar en Title-row
@ -302,14 +318,18 @@ translation calendar en Translation
tu calendar en T
tue calendar en Tue
two dayview calendar en two dayview
two weeks calendar en two weeks
update a single entry by passing the fields. calendar en Update a single entry by passing the fields.
updated calendar en Updated
use end date calendar en Use End date
use the selected time and close the popup calendar en use the selected time and close the popup
view this entry calendar en View this entry
we calendar en W
wed calendar en Wed
week calendar en Week
weekday starts on calendar en Weekday starts on
weekdays calendar en Weekdays
weekdays to use in search calendar en Weekdays to use in search
weekly calendar en Weekly
weekview calendar en Week View
weekview including weekend calendar en Weekview including weekend

View File

@ -53,6 +53,10 @@
'appname' => 'phpgwapi',
'versions' => Array('0.9.14','0.9.15','0.9.16','1.0.0','1.0.1')
);
$setup_info['calendar']['depends'][] = array(
'appname' => 'etemplate',
'versions' => Array('1.0.0','1.0.1')
);