forked from extern/egroupware
added freetime search
This commit is contained in:
parent
930db9f0c0
commit
fd6b69d7a8
@ -719,7 +719,7 @@ class bocal
|
|||||||
*
|
*
|
||||||
* @param $date mixed date to convert
|
* @param $date mixed date to convert
|
||||||
* @param $server2user_time boolean conversation between user- and server-time default False == Off
|
* @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)
|
function date2array($date,$server2user=False)
|
||||||
{
|
{
|
||||||
|
@ -153,6 +153,9 @@
|
|||||||
$GLOBALS['phpgw']->preferences->add('calendar','interval',30);
|
$GLOBALS['phpgw']->preferences->add('calendar','interval',30);
|
||||||
$GLOBALS['phpgw']->preferences->save_repository();
|
$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 */
|
/* Public functions */
|
||||||
@ -4206,9 +4209,42 @@ return;
|
|||||||
{
|
{
|
||||||
$GLOBALS['phpgw']->uiaccountsel = CreateObject('phpgwapi.uiaccountsel');
|
$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(
|
$var['participants'] = array(
|
||||||
'field' => lang('Participants'),
|
'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
|
// External Participants
|
||||||
|
286
calendar/inc/class.uiforms.inc.php
Normal file
286
calendar/inc/class.uiforms.inc.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
9
calendar/setup/etemplates.inc.php
Normal file
9
calendar/setup/etemplates.inc.php
Normal 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',);
|
||||||
|
|
@ -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?
|
do you wish to autoload calendar holidays files dynamically? admin de Sollen die Feiertage automatisch geladen werden?
|
||||||
download calendar de Herunterladen
|
download calendar de Herunterladen
|
||||||
duration calendar de Dauer
|
duration calendar de Dauer
|
||||||
|
duration of the meeting calendar de Dauer des Termins
|
||||||
edit series calendar de Serie bearbeiten
|
edit series calendar de Serie bearbeiten
|
||||||
edit single calendar de Einzel bearbeiten
|
edit single calendar de Einzel bearbeiten
|
||||||
email notification calendar de Benachrichtigung per Email
|
email notification calendar de Benachrichtigung per Email
|
||||||
@ -102,6 +103,7 @@ enable calendar de Einschalten
|
|||||||
enabled calendar de eingeschaltet
|
enabled calendar de eingeschaltet
|
||||||
end date/time calendar de Enddatum/-zeit
|
end date/time calendar de Enddatum/-zeit
|
||||||
enddate calendar de Enddatum
|
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
|
ends calendar de endet
|
||||||
enter output filename: ( .vcs appended ) calendar de Namen der Ausgabedatei (.vcs angehangen)
|
enter output filename: ( .vcs appended ) calendar de Namen der Ausgabedatei (.vcs angehangen)
|
||||||
event details follow calendar de Details zum Termin folgen
|
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
|
fr calendar de Fr
|
||||||
free/busy calendar de frei/belegt
|
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 !!!
|
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
|
frequency calendar de Häufigkeit
|
||||||
fri calendar de Fr
|
fri calendar de Fr
|
||||||
full description calendar de vollständige Beschreibung
|
full description calendar de vollständige Beschreibung
|
||||||
@ -138,10 +141,11 @@ holiday management calendar de Feitertagsverwaltung
|
|||||||
holiday-management calendar de Feitertagsverwaltung
|
holiday-management calendar de Feitertagsverwaltung
|
||||||
holidays calendar de Feiertage
|
holidays calendar de Feiertage
|
||||||
hours calendar de Stunden
|
hours calendar de Stunden
|
||||||
|
how far to search (from startdate) calendar de wie weit suchen (vom Startdatum)
|
||||||
i participate calendar de Ich nehme teil
|
i participate calendar de Ich nehme teil
|
||||||
ical / rfc2445 calendar de iCal / RFC2445
|
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 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
|
ignore conflict calendar de Konflikt ignorieren
|
||||||
import calendar de Importieren
|
import calendar de Importieren
|
||||||
import csv-file common de CSV-Datei 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 !!!
|
needs javascript to be enabled !!! calendar de Dafür muss Javascript aktiviert sein !!!
|
||||||
new entry calendar de Neuer Eintrag
|
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 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
|
next day calendar de nächster Tag
|
||||||
no filter calendar de Kein Filter
|
no filter calendar de Kein Filter
|
||||||
no matches found calendar de Keine Treffer gefunden
|
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 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 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)
|
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:
|
open todo's: calendar de unerledigte Aufgaben:
|
||||||
|
or enddate / -time calendar de oder Enddatum / -zeit
|
||||||
order calendar de Reihenfolge
|
order calendar de Reihenfolge
|
||||||
overlap holiday calendar de überlappender Feiertag
|
overlap holiday calendar de überlappender Feiertag
|
||||||
participant calendar de Teilnehmer
|
participant calendar de Teilnehmer
|
||||||
@ -252,6 +261,7 @@ sat calendar de Sa
|
|||||||
scheduling conflict calendar de Terminüberschneidung
|
scheduling conflict calendar de Terminüberschneidung
|
||||||
search results calendar de Suchergebnisse
|
search results calendar de Suchergebnisse
|
||||||
select a %1 calendar de %1 auswählen
|
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)
|
selected contacts (%1) calendar de Ausgewählte Kontakte (%1)
|
||||||
send updates via email common de Updates via E-Mail senden
|
send updates via email common de Updates via E-Mail senden
|
||||||
send/receive updates via email calendar de Senden/Empfangen von Aktualisierungen via EMail
|
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 date/time calendar de Startdatum/-zeit
|
||||||
start- and enddates calendar de Start- und Enddatum/-zeit
|
start- and enddates calendar de Start- und Enddatum/-zeit
|
||||||
startdate calendar de Startdatum
|
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
|
startrecord calendar de Startdatensatz
|
||||||
su calendar de So
|
su calendar de So
|
||||||
submit to repository calendar de Übertragen zu eGroupWare.org
|
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 month calendar de Dieser Monat
|
||||||
this week calendar de Diese Woche
|
this week calendar de Diese Woche
|
||||||
this year calendar de Dieses Jahr
|
this year calendar de Dieses Jahr
|
||||||
|
three month calendar de drei Monate
|
||||||
thu calendar de Do
|
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 calendar de Titel
|
||||||
title of the event calendar de Titel des Termin
|
title of the event calendar de Titel des Termin
|
||||||
title-row calendar de Titelzeile
|
title-row calendar de Titelzeile
|
||||||
@ -321,14 +337,18 @@ translation calendar de
|
|||||||
tu calendar de Di
|
tu calendar de Di
|
||||||
tue calendar de Di
|
tue calendar de Di
|
||||||
two dayview calendar de Zweitagesansicht
|
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.
|
update a single entry by passing the fields. calendar de Einen einzelnen Termin über seine Felder updaten.
|
||||||
updated calendar de Aktualisiert
|
updated calendar de Aktualisiert
|
||||||
use end date calendar de Enddatum benutzen
|
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
|
view this entry calendar de Diesen Eintrag anzeigen
|
||||||
we calendar de Mi
|
we calendar de Mi
|
||||||
wed calendar de Mi
|
wed calendar de Mi
|
||||||
week calendar de Woche
|
week calendar de Woche
|
||||||
weekday starts on calendar de Arbeitswoche beginnt am
|
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
|
weekly calendar de Wöchentlich
|
||||||
weekview calendar de Wochenansicht
|
weekview calendar de Wochenansicht
|
||||||
weekview including weekend calendar de Wochenansicht mit Wochenende
|
weekview including weekend calendar de Wochenansicht mit Wochenende
|
||||||
|
@ -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?
|
do you wish to autoload calendar holidays files dynamically? admin en Do you wish to autoload calendar holidays files dynamically?
|
||||||
download calendar en Download
|
download calendar en Download
|
||||||
duration calendar en Duration
|
duration calendar en Duration
|
||||||
|
duration of the meeting calendar en Duration of the meeting
|
||||||
edit series calendar en Edit Series
|
edit series calendar en Edit Series
|
||||||
edit single calendar en Edit Single
|
edit single calendar en Edit Single
|
||||||
email notification calendar en Email Notification
|
email notification calendar en Email Notification
|
||||||
@ -94,6 +95,7 @@ enable calendar en Enable
|
|||||||
enabled calendar en enabled
|
enabled calendar en enabled
|
||||||
end date/time calendar en End Date/Time
|
end date/time calendar en End Date/Time
|
||||||
enddate calendar en Enddate
|
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
|
ends calendar en ends
|
||||||
enter output filename: ( .vcs appended ) calendar en Enter Output Filename: ( .vcs appended )
|
enter output filename: ( .vcs appended ) calendar en Enter Output Filename: ( .vcs appended )
|
||||||
event details follow calendar en Event Details Follow
|
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
|
fr calendar en F
|
||||||
free/busy calendar en Free/Busy
|
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 !!!
|
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
|
frequency calendar en Frequency
|
||||||
fri calendar en Fri
|
fri calendar en Fri
|
||||||
full description calendar en Full Description
|
full description calendar en Full Description
|
||||||
@ -129,10 +132,11 @@ holiday management calendar en Holiday Management
|
|||||||
holiday-management calendar en Holiday-Management
|
holiday-management calendar en Holiday-Management
|
||||||
holidays calendar en Holidays
|
holidays calendar en Holidays
|
||||||
hours calendar en hours
|
hours calendar en hours
|
||||||
|
how far to search (from startdate) calendar en how far to search (from startdate)
|
||||||
i participate calendar en I Participate
|
i participate calendar en I Participate
|
||||||
ical / rfc2445 calendar en iCal / rfc2445
|
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 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
|
ignore conflict calendar en Ignore Conflict
|
||||||
import calendar en Import
|
import calendar en Import
|
||||||
import csv-file common en Import CSV-File
|
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 !!!
|
needs javascript to be enabled !!! calendar en Needs javascript to be enabled !!!
|
||||||
new entry calendar en New Entry
|
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 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
|
next day calendar en next day
|
||||||
no filter calendar en No filter
|
no filter calendar en No filter
|
||||||
no matches found calendar en No matches found
|
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 invitation / cancelation only calendar en on invitation / cancelation only
|
||||||
on participant responses too calendar en on participant responses too
|
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
|
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:
|
open todo's: calendar en Open To Do Items:
|
||||||
|
or enddate / -time calendar en or Enddate / -time
|
||||||
order calendar en Order
|
order calendar en Order
|
||||||
overlap holiday calendar en overlap holiday
|
overlap holiday calendar en overlap holiday
|
||||||
participant calendar en Participant
|
participant calendar en Participant
|
||||||
@ -235,6 +244,7 @@ sat calendar en Sat
|
|||||||
scheduling conflict calendar en Scheduling Conflict
|
scheduling conflict calendar en Scheduling Conflict
|
||||||
search results calendar en Search Results
|
search results calendar en Search Results
|
||||||
select a %1 calendar en Select a %1
|
select a %1 calendar en Select a %1
|
||||||
|
select a time calendar en select a time
|
||||||
selected contacts (%1) calendar en Selected contacts (%1)
|
selected contacts (%1) calendar en Selected contacts (%1)
|
||||||
send updates via email common en Send updates via EMail
|
send updates via email common en Send updates via EMail
|
||||||
send/receive updates via email calendar en Send/Receive 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 date/time calendar en Start Date/Time
|
||||||
start- and enddates calendar en Start- and Enddates
|
start- and enddates calendar en Start- and Enddates
|
||||||
startdate calendar en Startdate
|
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
|
startrecord calendar en Startrecord
|
||||||
su calendar en Su
|
su calendar en Su
|
||||||
submit to repository calendar en Submit to Repository
|
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 month calendar en This Month
|
||||||
this week calendar en This Week
|
this week calendar en This Week
|
||||||
this year calendar en This Year
|
this year calendar en This Year
|
||||||
|
three month calendar en three month
|
||||||
thu calendar en Thu
|
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 calendar en Title
|
||||||
title of the event calendar en Title of the event
|
title of the event calendar en Title of the event
|
||||||
title-row calendar en Title-row
|
title-row calendar en Title-row
|
||||||
@ -302,14 +318,18 @@ translation calendar en Translation
|
|||||||
tu calendar en T
|
tu calendar en T
|
||||||
tue calendar en Tue
|
tue calendar en Tue
|
||||||
two dayview calendar en two dayview
|
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.
|
update a single entry by passing the fields. calendar en Update a single entry by passing the fields.
|
||||||
updated calendar en Updated
|
updated calendar en Updated
|
||||||
use end date calendar en Use End date
|
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
|
view this entry calendar en View this entry
|
||||||
we calendar en W
|
we calendar en W
|
||||||
wed calendar en Wed
|
wed calendar en Wed
|
||||||
week calendar en Week
|
week calendar en Week
|
||||||
weekday starts on calendar en Weekday starts on
|
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
|
weekly calendar en Weekly
|
||||||
weekview calendar en Week View
|
weekview calendar en Week View
|
||||||
weekview including weekend calendar en Weekview including weekend
|
weekview including weekend calendar en Weekview including weekend
|
||||||
|
@ -53,6 +53,10 @@
|
|||||||
'appname' => 'phpgwapi',
|
'appname' => 'phpgwapi',
|
||||||
'versions' => Array('0.9.14','0.9.15','0.9.16','1.0.0','1.0.1')
|
'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')
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user