From fd6b69d7a8cdda14d346c1d64835f1bd9c93d7e3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 7 Oct 2004 22:11:18 +0000 Subject: [PATCH] added freetime search --- calendar/inc/class.bocal.inc.php | 2 +- calendar/inc/class.uicalendar.inc.php | 38 +++- calendar/inc/class.uiforms.inc.php | 286 ++++++++++++++++++++++++++ calendar/setup/etemplates.inc.php | 9 + calendar/setup/phpgw_de.lang | 22 +- calendar/setup/phpgw_en.lang | 22 +- calendar/setup/setup.inc.php | 4 + 7 files changed, 379 insertions(+), 4 deletions(-) create mode 100644 calendar/inc/class.uiforms.inc.php create mode 100644 calendar/setup/etemplates.inc.php diff --git a/calendar/inc/class.bocal.inc.php b/calendar/inc/class.bocal.inc.php index 53137b4629..49894a38f6 100644 --- a/calendar/inc/class.bocal.inc.php +++ b/calendar/inc/class.bocal.inc.php @@ -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) { diff --git a/calendar/inc/class.uicalendar.inc.php b/calendar/inc/class.uicalendar.inc.php index cdcb5f5dae..20eff16324 100755 --- a/calendar/inc/class.uicalendar.inc.php +++ b/calendar/inc/class.uicalendar.inc.php @@ -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']).' + + '.$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 diff --git a/calendar/inc/class.uiforms.inc.php b/calendar/inc/class.uiforms.inc.php new file mode 100644 index 0000000000..49374836af --- /dev/null +++ b/calendar/inc/class.uiforms.inc.php @@ -0,0 +1,286 @@ + * +* -------------------------------------------- * +* 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 "
".print_r($_GET,true)."
"; + + 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 " + +\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 "
".print_r($content,true)."
\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 "

ft_start=".date('D d.m.Y H:i',$ft_start)."
\n"; + echo "event[title]=$event[title]
\n"; + echo "event[start]=".date('D d.m.Y H:i',$event['start']['raw'])."
\n"; + echo "event[end]=".date('D d.m.Y H:i',$event['end']['raw'])."
\n"; + } + // $events ends before our actual position ==> ignore it + if ($event['end']['raw'] < $ft_start) + { + //echo "==> event ends before ft_start ==> continue
\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
\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 "

freetime: ".date('D d.m.Y H:i',$ft_start)." - ".date('D d.m.Y H:i',$ft_end)."

\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; + } +} diff --git a/calendar/setup/etemplates.inc.php b/calendar/setup/etemplates.inc.php new file mode 100644 index 0000000000..5f13bb0538 --- /dev/null +++ b/calendar/setup/etemplates.inc.php @@ -0,0 +1,9 @@ + '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',); + diff --git a/calendar/setup/phpgw_de.lang b/calendar/setup/phpgw_de.lang index a8ce8e2ea9..16d2417c8e 100644 --- a/calendar/setup/phpgw_de.lang +++ b/calendar/setup/phpgw_de.lang @@ -93,6 +93,7 @@ do you want to receive a regulary summary of your appointsments via email?
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 diff --git a/calendar/setup/phpgw_en.lang b/calendar/setup/phpgw_en.lang index 15f0f5c128..25422e50c9 100644 --- a/calendar/setup/phpgw_en.lang +++ b/calendar/setup/phpgw_en.lang @@ -85,6 +85,7 @@ do you want to receive a regulary summary of your appointsments via email?
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 diff --git a/calendar/setup/setup.inc.php b/calendar/setup/setup.inc.php index 8c621aa1da..7f456c778c 100755 --- a/calendar/setup/setup.inc.php +++ b/calendar/setup/setup.inc.php @@ -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') + );