diff --git a/calendar/csv_import.php b/calendar/csv_import.php index e77d19f1e4..d90eccee6a 100644 --- a/calendar/csv_import.php +++ b/calendar/csv_import.php @@ -1,60 +1,58 @@ * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ + /**************************************************************************\ + * eGroupWare - Calendar: CSV - Import * + * http://www.egroupware.org * + * Written by Ralf Becker * + * -------------------------------------------- * + * 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$ */ + /* $Id$ */ - $GLOBALS['phpgw_info']['flags'] = array( + $GLOBALS['egw_info']['flags'] = array( 'currentapp' => 'calendar', 'noheader' => True ); include('../header.inc.php'); - if (!isset($GLOBALS['phpgw_info']['user']['apps']['admin']) || - !$GLOBALS['phpgw_info']['user']['apps']['admin']) // no admin - { - $GLOBALS['phpgw']->redirect_link('/home.php'); - } + $is_admin = isset($GLOBALS['egw_info']['user']['apps']['admin']) && $GLOBALS['egw_info']['user']['apps']['admin']; + if (isset($_FILES['csvfile']['tmp_name'])) { - $csvfile = tempnam($GLOBALS['phpgw_info']['server']['temp_dir'],$GLOBALS['phpgw_info']['flags']['currentapp']."_"); - $GLOBALS['phpgw']->session->appsession('csvfile','',$csvfile); + $csvfile = tempnam($GLOBALS['egw_info']['server']['temp_dir'],$GLOBALS['egw_info']['flags']['currentapp']."_"); + $GLOBALS['egw']->session->appsession('csvfile','',$csvfile); $_POST['action'] = move_uploaded_file($_FILES['csvfile']['tmp_name'],$csvfile) ? 'download' : ''; } else { - $csvfile = $GLOBALS['phpgw']->session->appsession('csvfile'); + $csvfile = $GLOBALS['egw']->session->appsession('csvfile'); } if ($_POST['cancel']) { @unlink($csvfile); - $GLOBALS['phpgw']->redirect_link('/admin/index.php'); + $GLOBALS['egw']->redirect_link('/admin/index.php'); } - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Import CSV-File'); - $GLOBALS['phpgw']->common->phpgw_header(); + $GLOBALS['egw_info']['flags']['app_header'] = $GLOBALS['egw_info']['apps']['calendar']['title'].' - '.lang('Import CSV-File'); + $uical =& CreateObject('calendar.uical',true); + $GLOBALS['egw']->common->egw_header(); - $GLOBALS['phpgw']->template->set_file(array('import_t' => 'csv_import.tpl')); - $GLOBALS['phpgw']->template->set_block('import_t','filename','filenamehandle'); - $GLOBALS['phpgw']->template->set_block('import_t','fheader','fheaderhandle'); - $GLOBALS['phpgw']->template->set_block('import_t','fields','fieldshandle'); - $GLOBALS['phpgw']->template->set_block('import_t','ffooter','ffooterhandle'); - $GLOBALS['phpgw']->template->set_block('import_t','imported','importedhandle'); - $GLOBALS['phpgw']->template->set_block('import_t','import','importhandle'); + $GLOBALS['egw']->template->set_file(array('import_t' => 'csv_import.tpl')); + $GLOBALS['egw']->template->set_block('import_t','filename','filenamehandle'); + $GLOBALS['egw']->template->set_block('import_t','fheader','fheaderhandle'); + $GLOBALS['egw']->template->set_block('import_t','fields','fieldshandle'); + $GLOBALS['egw']->template->set_block('import_t','ffooter','ffooterhandle'); + $GLOBALS['egw']->template->set_block('import_t','imported','importedhandle'); + $GLOBALS['egw']->template->set_block('import_t','import','importhandle'); if(($_POST['action'] == 'download' || $_POST['action'] == 'continue') && (!$_POST['fieldsep'] || !$csvfile || !($fp=fopen($csvfile,'rb')))) { $_POST['action'] = ''; } - $GLOBALS['phpgw']->template->set_var("action_url",$GLOBALS['phpgw']->link("/calendar/csv_import.php")); + $GLOBALS['egw']->template->set_var("action_url",$GLOBALS['egw']->link("/calendar/csv_import.php")); $PSep = '||'; // Pattern-Separator, separats the pattern-replacement-pairs in trans $ASep = '|>'; // Assignment-Separator, separats pattern and replacesment @@ -64,7 +62,7 @@ function addr_id( $n_family,$n_given,$org_name ) { // find in Addressbook, at least n_family AND (n_given OR org_name) have to match - $contacts = createobject('phpgwapi.contacts'); + $contacts =& CreateObject('phpgwapi.contacts'); $addrs = $contacts->read(0,0,array('id'),'',"n_family=$n_family,n_given=$n_given,org_name=$org_name"); if(!count($addrs)) @@ -101,73 +99,68 @@ } else { - if (!is_object($GLOBALS['phpgw']->categories)) + if (!is_object($GLOBALS['egw']->categories)) { - $GLOBALS['phpgw']->categories = createobject('phpgwapi.categories'); + $GLOBALS['egw']->categories =& CreateObject('phpgwapi.categories','','calendar'); } - if (is_numeric($cat) && $GLOBALS['phpgw']->categories->id2name($cat) != '--') + if (is_numeric($cat) && $GLOBALS['egw']->categories->id2name($cat) != '--') { $cat2id[$cat] = $ids[$cat] = $cat; } - elseif ($id = $GLOBALS['phpgw']->categories->name2id( addslashes($cat) )) + elseif ($id = $GLOBALS['egw']->categories->name2id( addslashes($cat) )) { // cat exists $cat2id[$cat] = $ids[$cat] = $id; } else { // create new cat - $GLOBALS['phpgw']->categories->add( array('name' => $cat,'descr' => $cat )); - $cat2id[$cat] = $ids[$cat] = $GLOBALS['phpgw']->categories->name2id( addslashes($cat) ); + $GLOBALS['egw']->categories->add( array('name' => $cat,'descr' => $cat )); + $cat2id[$cat] = $ids[$cat] = $GLOBALS['egw']->categories->name2id( addslashes($cat) ); } } } - $id_str = implode( ',',$ids ); - - if (count($ids) > 1) // multiple cats need to be in ',' - { - $id_str = ",$id_str,"; - } - return $id_str; + return implode( ',',$ids ); } - if (!is_object($GLOBALS['phpgw']->html)) + if (!is_object($GLOBALS['egw']->html)) { - $GLOBALS['phpgw']->html = CreateObject('phpgwapi.html'); + $GLOBALS['egw']->html =& CreateObject('phpgwapi.html'); } if ($_POST['next']) $_POST['action'] = 'next'; switch ($_POST['action']) { case '': // Start, ask Filename - $GLOBALS['phpgw']->template->set_var('lang_csvfile',lang('CSV-Filename')); - $GLOBALS['phpgw']->template->set_var('lang_fieldsep',lang('Fieldseparator')); - $GLOBALS['phpgw']->template->set_var('lang_charset',lang('Charset of file')); - $GLOBALS['phpgw']->template->set_var('select_charset', - $GLOBALS['phpgw']->html->select('charset','', - $GLOBALS['phpgw']->translation->get_installed_charsets()+ + $GLOBALS['egw']->template->set_var('lang_csvfile',lang('CSV-Filename')); + $GLOBALS['egw']->template->set_var('lang_fieldsep',lang('Fieldseparator')); + $GLOBALS['egw']->template->set_var('lang_charset',lang('Charset of file')); + $GLOBALS['egw']->template->set_var('lang_help',lang('Please note: You can configure the field assignments AFTER you uploaded the file.')); + $GLOBALS['egw']->template->set_var('select_charset', + $GLOBALS['egw']->html->select('charset','', + $GLOBALS['egw']->translation->get_installed_charsets()+ array('utf-8' => 'utf-8 (Unicode)'),True)); - $GLOBALS['phpgw']->template->set_var('fieldsep',$_POST['fieldsep'] ? $_POST['fieldsep'] : ','); - $GLOBALS['phpgw']->template->set_var('submit',lang('Import')); - $GLOBALS['phpgw']->template->set_var('enctype','ENCTYPE="multipart/form-data"'); + $GLOBALS['egw']->template->set_var('fieldsep',$_POST['fieldsep'] ? $_POST['fieldsep'] : ';'); + $GLOBALS['egw']->template->set_var('submit',lang('Import')); + $GLOBALS['egw']->template->set_var('enctype','ENCTYPE="multipart/form-data"'); - $GLOBALS['phpgw']->template->parse('rows','filename'); + $GLOBALS['egw']->template->parse('rows','filename'); break; case 'continue': case 'download': - $GLOBALS['phpgw']->preferences->read_repository(); - $defaults = $GLOBALS['phpgw_info']['user']['preferences']['calendar']['cvs_import']; + $GLOBALS['egw']->preferences->read_repository(); + $defaults = $GLOBALS['egw_info']['user']['preferences']['calendar']['cvs_import']; if (!is_array($defaults)) { $defaults = array(); } - $GLOBALS['phpgw']->template->set_var('lang_csv_fieldname',lang('CSV-Fieldname')); - $GLOBALS['phpgw']->template->set_var('lang_info_fieldname',lang('calendar-Fieldname')); - $GLOBALS['phpgw']->template->set_var('lang_translation',lang("Translation").' '.lang('help').''); - $GLOBALS['phpgw']->template->set_var('submit', - $GLOBALS['phpgw']->html->submit_button('convert','Import') . ' '. - $GLOBALS['phpgw']->html->submit_button('cancel','Cancel')); - $GLOBALS['phpgw']->template->set_var('lang_debug',lang('Test Import (show importable records only in browser)')); - $GLOBALS['phpgw']->template->parse('rows','fheader'); + $GLOBALS['egw']->template->set_var('lang_csv_fieldname',lang('CSV-Fieldname')); + $GLOBALS['egw']->template->set_var('lang_info_fieldname',lang('calendar-Fieldname')); + $GLOBALS['egw']->template->set_var('lang_translation',lang("Translation").' '.lang('help').''); + $GLOBALS['egw']->template->set_var('submit', + $GLOBALS['egw']->html->submit_button('convert','Import') . ' '. + $GLOBALS['egw']->html->submit_button('cancel','Cancel')); + $GLOBALS['egw']->template->set_var('lang_debug',lang('Test Import (show importable records only in browser)')); + $GLOBALS['egw']->template->parse('rows','fheader'); $cal_names = array( 'title' => 'Title varchar(80)', @@ -180,18 +173,18 @@ 'priority' => 'Priority: 1=Low, 2=Normal, 3=High', 'public' => 'Access: 1=public, 0=private', 'owner' => 'Owner: int(11) user-id/-name', - 'modtime' => 'Modification date', -// 'groups' => 'Groups (dont know what this field is for)', -// 'cal_type' => 'cal_type: single_event=E (default) else M', + 'modified' => 'Modification date', + 'non_blocking' => '0=Event blocks time, 1=Event creates no conflicts', + 'uid' => 'Unique Id, allows multiple import to update identical entries', +// 'recur_type'=> 'Type of recuring event', ); - $custom_fields = CreateObject('calendar.bocustom_fields'); + $config =& CreateObject('phpgwapi.config','calendar'); + $custom_fields = $config->read_repository(); + unset($config); //echo "custom-fields=
".print_r($custom_fields,True)."
"; - foreach ($custom_fields->fields as $name => $data) + foreach ($custom_fields as $name => $data) { - if ($name[0] == '#') // a custom field ? - { - $cal_names[$name] = $data['name'].': Custom field, varchar('.$data['length'].')'; - } + $cal_names['#'.$name] = $data['label'].': Custom field ('.$data['type'].')'; } // the next line is used in the help-text too @@ -200,41 +193,41 @@ $cal_name_options = "'."\n"; - } - $this->output_template_array($p,'row','list',array( - 'field' => lang('Exceptions'), - 'data' => '' - )); - - $var = Array( - 'action_url_button' => $this->page('reinstate','&cal_id='.$cal_id), - 'action_text_button' => lang('Reinstate'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $p->set_var($var); - $button_left = ''.$p->fp('out','form_button').''; - - $var = Array( - 'action_url_button' => $this->bo->return_to ? $GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to) : $this->page(''), - 'action_text_button' => lang('Cancel'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $p->set_var($var); - $button_left .= ''.$p->fp('out','form_button').''; - - $p->set_var('button_left',$button_left); - $p->pfp('phpgw_body','view_event'); - } - - function reinstate($params='') - { - if(!$this->bo->check_perms(PHPGW_ACL_EDIT)) - { - $this->no_edit(); - } - elseif(!$this->bo->check_perms(PHPGW_ACL_ADD)) - { - $this->index(); - } - $cal_id = (isset($params['cal_id']) ? (int)$params['cal_id'] : ''); - $cal_id = ($cal_id == '' ? (int)$_GET['cal_id'] : $cal_id); - - $reinstate_index = (isset($params['reinstate_index']) ? (int)$params['reinstate_index'] : ''); - $reinstate_index = ($reinstate_index == '' ? (int)$_POST['reinstate_index'] : $reinstate_index); - if($this->debug) - { - echo ''."\n"; - } - $cd = $this->bo->reinstate( - Array( - 'cal_id' => $cal_id, - 'reinstate_index' => $reinstate_index - ) - ); - if($this->debug) - { - echo ''."\n"; - } - if ($this->bo->return_to) - { - Header('Location: '.$GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to)); - } - else - { - Header('Location: '.$this->page('',($cd?'&cd='.$cd:''))); - } - $GLOBALS['phpgw']->common->phpgw_exit(); - } - - function add($cd=0,$readsess=0) - { - if(!$this->bo->check_perms(PHPGW_ACL_ADD)) - { - $this->index(); - } - - if($readsess) - { - $event = $this->bo->restore_from_appsession; - if(!$event['owner']) - { - $this->bo->add_attribute('owner',$this->bo->owner); - } - $can_edit = True; - } - else - { - $this->bo->event_init(); - $this->bo->add_attribute('id',0); - - $can_edit = True; - $participants = (string)(get_var('participants',array('GET'),FALSE)); - $matrix_mode = (int)(get_var('matrix',array('GET', 'POST'),FALSE)); - $starthour = (int)(get_var('hour',array('GET'),$this->bo->prefs['calendar']['workdaystarts'])); - $startmin = (int)(get_var('minute',array('GET'),0)); - $endmin = $startmin + (int)$this->bo->prefs['calendar']['defaultlength']; - $endhour = $starthour + $this->bo->normalizeminutes($endmin); - ; - $this->bo->set_start($this->bo->year,$this->bo->month,$this->bo->day,$starthour,$startmin,0); - $this->bo->set_end($this->bo->year,$this->bo->month,$this->bo->day,$endhour,$endmin,0); - $this->bo->set_title(''); - $this->bo->set_description(''); - $this->bo->add_attribute('location',''); - $this->bo->add_attribute('uid',''); - $this->bo->add_attribute('priority',2); - if(@$this->bo->prefs['calendar']['default_private']) - { - $this->bo->set_class(False); - } - else - { - $this->bo->set_class(True); - } - - // Construct Participants stack - $_stack_participants = $GLOBALS['phpgw']->session->appsession("participants"); - if($matrix_mode == 1) // You come from matrix, ok - { - // protection - if($_stack_participants) - $_stack_participants .= ";"; - - $_stack_participants .= $GLOBALS['phpgw']->session->appsession("participants_matrix"); - } - if( get_var('owner',array('GET'),FALSE) ) - { - // protection - if($_stack_participants) - $_stack_participants .= ";"; - - $_stack_participants .= str_replace(",", ";", get_var('owner', array('GET'), FALSE)); - } - - // Read each participant - foreach(explode(";", $_stack_participants) as $part) - { - // Skip Owner - if( !$part OR ($part == $this->bo->owner) ) - continue; - - // Add into stack - $this->bo->add_attribute('participants', 'U',$part); - } - unset($_stack_participants); - - - /* --- OLD CODE --- - // Add participants from matrixview - if($matrix_mode == 1) - { - foreach(explode(';', $GLOBALS['phpgw']->session->appsession("participants_matrix")) as $part) - { - // Skip owner - if( !$part OR ( $part == $this->bo->owner) ) - continue; - - $this->bo->add_attribute('participants', 'U',$part); - } - } - // Add participants from outer space - foreach(explode(';',$GLOBALS['phpgw']->session->appsession("participants")) as $part) - { - // Skip owner - if( !$part OR ( $part == $this->bo->owner) ) - continue; - - $this->bo->add_attribute('participants','U',$part); - } - // --- END OLD CODE */ - - - // Add misc - $this->bo->add_attribute('participants','A',$this->bo->owner); - $this->bo->set_recur_none(); - $event = $this->bo->get_cached_event(); - } - $this->edit_form( - Array( - 'event' => $event, - 'cd' => $cd - ) - ); - } - - function delete() - { - if(!isset($_GET['cal_id'])) - { - Header('Location: '.$this->page('','&date='.sprintf("%04d%02d%02d",$this->bo->year,$this->bo->month,$this->bo->day))); - $GLOBALS['phpgw']->common->phpgw_exit(); - } - - $date = sprintf("%04d%02d%02d",$this->bo->year,$this->bo->month,$this->bo->day); - if($this->bo->check_perms(PHPGW_ACL_DELETE,$cal_id = (int)$_GET['cal_id'])) - { - if(isset($_POST['delete_type']) && $_POST['delete_type'] == 'single') - { - $date = $_POST['date']; - $cd = $this->bo->delete_single( - Array( - 'id' => $cal_id, - 'year' => substr($date,0,4), - 'month' => substr($date,4,2), - 'day' => substr($date,6,2) - ) - ); - } - elseif((isset($_POST['delete_type']) && $_POST['delete_type'] == 'series') || !isset($_POST['delete_type'])) - { - $cd = $this->bo->delete_entry($cal_id); - $this->bo->expunge(); - } - } - else - { - $cd = ''; - } - if ($this->bo->return_to) - { - Header('Location: '.$GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to)); - } - else - { - Header('Location: '.$this->page('','&date='.$date.($cd?'&cd='.$cd:''))); - } - $GLOBALS['phpgw']->common->phpgw_exit(); - } - - function day() - { - $this->bo->read_holidays(); - - if (!$this->bo->printer_friendly || ($this->bo->printer_friendly && @$this->bo->prefs['calendar']['display_minicals'])) - { - $minical = $this->mini_calendar( - Array( - 'day' => $this->bo->day, - 'month' => $this->bo->month, - 'year' => $this->bo->year, - 'link' => 'day' - ) - ); - } - else - { - -//NDEE: printer-friendly (what?) - $minical = ''; - } - - if (!$this->bo->printer_friendly) - { - $printer = ''; - $param = '&date='.sprintf("%04d%02d%02d",$this->bo->year,$this->bo->month,$this->bo->day).'&friendly=1'; - $print = '[".lang('Printer Friendly').']'; - } - else - { - -//NDEE: printer-friendly (daily-view) - $GLOBALS['phpgw_info']['flags']['nofooter'] = True; - $printer = ''; - $print = ''; - } - - $now = $GLOBALS['phpgw']->datetime->makegmttime(0, 0, 0, $this->bo->month, $this->bo->day, $this->bo->year); - $now['raw'] += $GLOBALS['phpgw']->datetime->tz_offset; - - $p = $GLOBALS['phpgw']->template; - $p->set_file( - Array( - 'day_t' => 'day.tpl' - ) - ); - $p->set_block('day_t','day','day'); - $p->set_block('day_t','day_event','day_event'); - - $todos = $this->get_todos($todo_label); - $var = Array( - 'printer_friendly' => $printer, - 'bg_text' => $this->theme['bg_text'], - 'daily_events' => $this->print_day( - Array( - 'year' => $this->bo->year, - 'month' => $this->bo->month, - 'day' => $this->bo->day - ) - ), - 'small_calendar' => $minical, - 'date' => $this->bo->long_date($now), - 'username' => $GLOBALS['phpgw']->common->grab_owner_name($this->bo->owner), - 'print' => $print, - 'lang_todos' => $todo_label, - 'todos' => $this->bo->printer_friendly ? $todos : - -//NDEE: todo's layout - "
\n$todos
\n" - ); - - $p->set_var($var); - $p->parse('day_events','day_event'); - echo $this->printer_friendly($p->fp('out','day'),lang('Dayview')); - } - - function get_todos(&$todo_label) - { - $todos_from_hook = $GLOBALS['phpgw']->hooks->process(array( - 'location' => 'calendar_include_todos', - 'year' => $this->bo->year, - 'month' => $this->bo->month, - 'day' => $this->bo->day, - 'owner' => $this->bo->owner // num. id of the user, not necessary current user - )); - - if(is_array($todo_label)) - { - list($label,$showall)=$todo_label; - } - else - { - $label=$todo_label; - $showall=true; - } - $maxshow = (int)$GLOBALS['phpgw_info']['user']['preferences']['infolog']['mainscreen_maxshow']; - if($maxshow<=0) - { - $maxshow=10; - } - //print_debug("get_todos(): label=$label; showall=$showall; max=$maxshow"); - - $content = $todo_label = ''; - if (is_array($todos_from_hook) && count($todos_from_hook)) - { - $todo_label = !empty($label)?$label:lang("open ToDo's:"); - - foreach($todos_from_hook as $todos) - { - $i = 0; - if (is_array($todos) && count($todos)) - { - foreach($todos as $todo) - { - if(!$showall && ($i++>=$maxshow)) - { - break; - } - $icons = ''; - foreach($todo['icons'] as $name => $app) - { - $icons .= ($icons?' ':'').$GLOBALS['phpgw']->html->image($app,$name,lang($name),'border="0" width="15" height="15"'); - } - $class = $class == 'row_on' ? 'row_off' : 'row_on'; - -//NDEE \n ". - ($this->bo->printer_friendly?$icons:$GLOBALS['phpgw']->html->a_href($icons,$todo['view'])). - "\n ".($this->bo->printer_friendly?$todo['title']: - $GLOBALS['phpgw']->html->a_href($todo['title'],$todo['view']))."\n \n"; - } - } - } - } - if (!empty($content)) - { - return "\n$content
\n"; - } - return False; - } - - function edit_status() - { - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappheader'] = True; - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Change Status'); - $GLOBALS['phpgw']->common->phpgw_header(); - - $event = $this->bo->read_entry($_GET['cal_id']); - - reset($event['participants']); - - if(!$event['participants'][$this->bo->owner]) - { - echo '
'.lang('The user %1 is not participating in this event!',$GLOBALS['phpgw']->common->grab_owner_name($this->bo->owner)).'
'; - return; - } - - if(!$this->bo->check_perms(PHPGW_ACL_EDIT)) - { - $this->no_edit(); - return; - } - - $freetime = $GLOBALS['phpgw']->datetime->localdates(mktime(0,0,0,$event['start']['month'],$event['start']['mday'],$event['start']['year']) - $GLOBALS['phpgw']->datetime->tz_offset); - echo $this->timematrix( - Array( - 'date' => $freetime, - 'starttime' => $this->bo->splittime('000000',False), - 'endtime' => 0, - 'participants' => $event['participants'] - ) - ).'
'; - - $event = $this->bo->read_entry($_GET['cal_id']); - $this->view_event($event); - $GLOBALS['phpgw']->template->pfp('phpgw_body','view_event'); - - echo $this->get_response($event['id']); - } - - function set_action() - { - if(!$this->bo->check_perms(PHPGW_ACL_EDIT)) - { - $this->no_edit(); - return; - } - - $this->bo->set_status((int)$_GET['cal_id'],(int)$_GET['action']); - - if ($this->bo->return_to) - { - Header('Location: '.$GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to)); - } - else - { - Header('Location: '.$this->page('','')); - } - $GLOBALS['phpgw']->common->phpgw_exit(); - } - - - function planner() - { - if(floor(phpversion()) < 4) - { - return; - } - $home = strstr($_SERVER['PHP_SELF'],'home') !== False; - // generate header and set global/member variables - // - $this->planner_prepare($home); - - // process events within selected interval - // - $this->planner_process_interval(); - - // generate the planner view - // - if (!$home) - { - echo '

'.$this->planner_print_rows(); - } - else - { - return $this->planner_print_rows(); - } - } - - function set_planner_group_members() - { - $type = $GLOBALS['phpgw']->accounts->get_type($this->bo->owner); - - if ($type == 'g') // display schedule of all group members - { - $members = array(); - $ids = $GLOBALS['phpgw']->acl->get_ids_for_location($this->bo->owner, 1, 'phpgw_group'); - while (list(,$id) = each($ids)) - { - if ($this->bo->check_perms(PHPGW_ACL_READ,0,$id)) - { - $members[$GLOBALS['phpgw']->common->grab_owner_name($id)] = $id; - } - } - ksort($members); - $this->planner_group_members = $members; - } - else - { - $this->planner_group_members = array( - $GLOBALS['phpgw']->common->grab_owner_name($this->bo->owner) => $this->bo->owner - ); - } - } - - /** - * planner_prepare - prepare the planner view - * - * - sets global environment variables - * - initializes class member variables used in multiple planner related functions - * - generates header lines for the planner view (month, calendar week, days) - */ - function planner_prepare($no_header = False) - { - // set some globals - // - if (!$no_header) - { - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - if ($this->always_app_header) $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Group Planner'); - $GLOBALS['phpgw']->common->phpgw_header(); - } - - // intervals_per_day can be configured in preferences now :-) - // - if (! $this->bo->prefs['calendar']['planner_intervals_per_day']) - { - $GLOBALS['phpgw']->preferences->add('calendar','planner_intervals_per_day',3); - $GLOBALS['phpgw']->preferences->save_repository(); - $this->bo->prefs['calendar']['planner_intervals_per_day'] = 3; - } - $intervals_per_day = $this->bo->prefs['calendar']['planner_intervals_per_day']; - $this->bo->save_sessiondata(); // need to save $this->bo->save_owner - - // set title for table and rows of planner view - // - if ($this->bo->sortby == 'category') - { - $title = lang('Category'); - } - else - { - $title = lang('User'); - - $this->set_planner_group_members(); - } - - // create/initialize variables directly used for HTML code generation - // - $this->planner_header = array(); - $this->planner_rows = array(); - - // generate header lines with days and associated months - // - $hdr = &$this->planner_header; - $hdr[0]['0'] = $title; - $hdr[0]['.0'] = 'rowspan="3"'; - - $this->planner_days = 0; // reset - - $m = $this->bo->month; - $y = $this->bo->year; - $this->bo->read_holidays($y); - for ($i=1; $i<=$this->bo->num_months; $i++,$m++) - { - if ($m == 13) - { - $m = 1; $y++; // "wrap-around" into new year - $this->bo->read_holidays($y); - } - $days = $GLOBALS['phpgw']->datetime->days_in_month($m,$y); - - $d = mktime(0,0,0,$m,1,$y); - $month = lang(date('F', $d)).strftime(' %Y', $d); - $color = $this->theme[$m % 2 || $this->bo->num_months == 1 ? 'th_bg' : 'row_on']; - $cols = $days * $intervals_per_day; - - $hdr[0]['.'.$i] = 'bgcolor="'.$color.'" colspan="'.$cols.'" align="center"'; - $prev_month = sprintf('%04d%02d01',$y-($m==1),$m > 1?$m-1:12); - $next_month = sprintf('%04d%02d01',$y+($m==12),$m < 12?$m+1:1); - $prev_link = $GLOBALS['phpgw']->link('/index.php',"menuaction=calendar.uicalendar.planner&date=$prev_month"); - $next_link = $GLOBALS['phpgw']->link('/index.php',"menuaction=calendar.uicalendar.planner&date=$next_month"); - $hdr[0][$i] = "<<   $month   >>"; - - $add_owner = array(); // if no add-rights on the showed cal use own cal - if (!$this->bo->save_owner && !$this->bo->check_perms(PHPGW_ACL_ADD) || - !$this->bo->check_perms(PHPGW_ACL_ADD,0,$this->bo->save_owner)) - { - $add_owner = array( - 'owner' => $GLOBALS['phpgw_info']['user']['account_id'] - ); - } - for ($d=1; $d<=$days; $d++) - { - $dayname = substr(lang(date('D',mktime(0,0,0,$m,$d,$y))),0,2); - $index = $d + $this->planner_days; - - $hdr[2]['.'.$index] = 'colspan="'.$intervals_per_day.'" align="center"'; - - // highlight today, saturday, sunday and holidays - // - $color = $this->theme['row_off']; - $dow = $GLOBALS['phpgw']->datetime->day_of_week($y,$m,$d); - $date = sprintf("%04d%02d%02d",$y,$m,$d); - if ($date == date('Ymd')) - { - $color = $GLOBALS['phpgw_info']['theme']['cal_today']; - } - elseif ($this->bo->cached_holidays[$date]) - { - $color = $this->bo->holiday_color; - $hdr[2]['.'.$index] .= ' title="'.$this->bo->cached_holidays[$date][0]['name'].'"'; - } - elseif ($dow == 0 || $dow == 6) - { - $color = $this->bo->theme['th_bg']; - } - - $hdr[2]['.'.$index] .= " bgcolor=\"$color\""; - - $hdr[2][$index] = ''.$dayname.'
'.$d.'
'; - } - $this->planner_days += $days; - } - - // create/initialize member variables describing the time interval to be displayed - // - $this->planner_end_month = $m - 1; - $this->planner_end_year = $y; - $this->planner_days_in_end_month = $GLOBALS['phpgw']->datetime->days_in_month($this->planner_end_month,$this->planner_end_year); - $this->planner_firstday = (int)(date('Ymd',mktime(0,0,0,$this->bo->month,1,$this->bo->year))); - $this->planner_lastday = (int)(date('Ymd',mktime(0,0,0,$this->planner_end_month,$this->planner_days_in_end_month,$this->planner_end_year))); - - // generate line with calendar weeks in observed interval - // - $d = mktime(0,0,0,$this->bo->month,1,$this->bo->year); - $w = date('W', $d); - if ($w == 'W') // php < 4.1 - { - $w = 1 + (int)(date('z',$d) / 7); // a bit simplistic - } - $offset = (7-date('w', $d)+1)%7; - $offset = $offset == 0 ? 7 : $offset; - $color = $this->theme[$w % 2 ? 'th_bg' : 'row_on']; - - $hdr[1]['.'.$w] = 'bgcolor="'.$color.'" colspan="'.$intervals_per_day * $offset.'" align="left"'; - $hdr[1][$w] = ''; - if ($offset >= 3) - { - -//NDEE: style! (groupplanner) - $hdr[1][$w] .= ' '.lang('week').' '.$w.' '; - } - $days_left = $this->planner_days - $offset; - - $colspan = 7 * $intervals_per_day; - while ($days_left > 0) - { - $colspan = ($days_left < 7) ? $days_left*$intervals_per_day : $colspan; - $d += 604800; // 7 days whith 24 hours (1h == 3600 seconds) each - $w = date('W', $d); - if ($w == 'W') // php < 4.1 - { - $w = 1 + (int)(date('z',$d) / 7); // a bit simplistic - } - $w += (isset($hdr[1][$w]))?1:0; // bug in "date('W')" ? - - $color = $this->theme[$w % 2 ? 'th_bg' : 'row_on']; - $hdr[1]['.'.$w] = 'bgcolor="'.$color.'" colspan="'.$colspan.'" align="left"'; - $hdr[1][$w] = ''; - if ($days_left >= 3) - { - -//NDEE: style! (groupplanner) - $hdr[1][$w] .= ' '.lang('week').' '.$w.' '; - } - - $days_left -= 7; - } - return $hdr; - } - - /** - * tooltip for all calendar views - * - * displays title, time, description, location and participants, should be composed via a template in the next version - * - * @param $event array containing the event - * @return the onmouseover attribute (incl. onmouseover=) to be included in an html-element, eg. div or table-cell - */ - function event_tooltip($event,$always_show_time=False) - { - $start = $GLOBALS['phpgw']->common->show_date($this->bo->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset); - $end = $GLOBALS['phpgw']->common->show_date($this->bo->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset); - $multiday = substr($start,0,10) != substr($end,0,10); // start and end on same day? - - return $this->html->tooltip( - ($always_show_time || $multiday ? '

'.$start.(!$multiday ? substr($end,10) : ' -- '.$end).'

' : ''). - '

'.$event['description'].'

'. - ($event['location']?'

'.$event['location'].'

':''). - (count($event['participants']) > 1 || !isset($event['participants'][$this->bo->owner]) ? '

'.$this->planner_participants($event['participants']).'

':''), - False,array( - 'TITLE' => $event['title'], - 'WIDTH' => 250, - )); - } - - /** - * planner_update_row - update a row of the planner view - * - * parameters are: - * - index (e.g. user id, category id, ...) of the row - * - name/title of the row (e.g. user name, category name) - * - the event to be integrated - * - list of categories associated with the event - * - first and last cell of the row - */ - function planner_update_row($index,$name,$event,$cat,$start_cell,$end_cell) - { - $rows = &$this->planner_rows; - $intervals_per_day = $this->bo->prefs['calendar']['planner_intervals_per_day']; - $is_private = !$this->bo->check_perms(PHPGW_ACL_READ,$event); - - $view = $this->html->link('/index.php', - array( - 'menuaction' => 'calendar.uicalendar.view', - 'cal_id' => $event['id'], - 'date' => date('Ymd',$this->bo->maketime($event['start'])) - ) - ); - - // check how many lines are needed for this "row" (currently: user or category) - $i = 0; - do { - ++$i; - - $k = $index.'_'.$i; - $ka = '.nr_'.$k; - - if (!isset($rows[$k])) - { - if ($i > 1) // further line - no name - { - $rows[$k] = array(); - $rows[$index.'_1']['._name'] = 'rowspan="'.$i.'"'; - } - else - { - $rows[$k]['_name'] = $name; - } - $rows[$ka] = 0; - } - $rows[$index.'_1']['._name'] .= ' nowrap'; // title must be one row - - $row = &$rows[$k]; - $akt_cell = &$rows[$ka]; - } while ($akt_cell > $start_cell); - - $id = $event['id'].'-'.date('Ymd',$this->bo->maketime($event['start'])); - if ($akt_cell < $start_cell) - { - $row[$id.'_1'] = ' '; - $row['.'.$id.'_1'] = 'colspan="'.($start_cell-$akt_cell).'"'; - } - $opt = &$row['.'.$id.'_2']; - $cel = &$row[$id.'_2']; - - // if possible, display information about event within cells representing it - // - if ($start_cell < $end_cell) - { - $colspan = $end_cell - $start_cell; - $opt .= "colspan=".(1 + $colspan); - - if (!$is_private) - { - $max_chars = (int)(3*$colspan/$intervals_per_day-2); - - $min_chars = 3; // minimum for max_chars to display -> this should be configurable - if ($max_chars >= $min_chars) - { - $len_title = strlen($event['title']); - - if ($len_title <= $max_chars) - { - $title = $event['title']; - $max_chars -= $len_title + 3; // 3 chars for separator: " - " - $len_descr = strlen($event['description']); - - if ($len_descr > 0 && $len_descr <= $max_chars) - { - $event['print_description'] = 'yes'; - } - } - else - { - $has_amp = strpos($event['title'],'&'); - -//NDEE: event title gets cut here - $title = substr($event['title'], 0 , $max_chars-1+($has_amp!==False&&$has_amp<$max_chars?4:0)).'...'; - } - $event['print_title'] = 'yes'; - } - } - } - - if ($bgcolor=$cat['color']) - { - $opt .= ' bgcolor="'.$bgcolor.'"'; - } - - if (!$is_private) - { - $opt .= $this->event_tooltip($event,True); - $opt .= ' onClick="location=\''.$view.'\'"'; - $cel = ''; - } - else - { - $opt .= ' title="'.lang('You do not have permission to read this record!').'"'; - $cel = ''; - } - $opt .= ' class="planner-cell"'; - - if ($event['priority'] == 3) - { - $cel .= $this->html->image('calendar','high.gif','','border="0"'); - } - if ($event['recur_type']) - { - $cel .= $this->html->image('calendar','recur.gif','','border="0"'); - } - $cel .= $this->html->image('calendar',count($event['participants'])>1?'multi_3.gif':'single.gif', - $is_private?$this->planner_participants($event['participants']):'','border="0"'); - $cel .= ''; - - if (isset($event['print_title']) && $event['print_title'] == 'yes') - { - -//NDEE: style! where? - $cel .= ' '.$title.' '; - } - if (isset($event['print_description']) && $event['print_description'] == 'yes') - { - -//NDEE: style! where ? - $cel .= ' - '.$event['description'].' '; - } - - $akt_cell = $end_cell + 1; - - return $rows; - } - - function planner_process_event($event) - { - $intervals_per_day = $this->bo->prefs['calendar']['planner_intervals_per_day']; - $interval = $this->planner_intervals[$intervals_per_day]; - $last_cell = $intervals_per_day * $this->planner_days - 1; - - $rows = &$this->planner_rows; - - // caluculate start and end of event - // - $event_start = (int)(date('Ymd',mktime( - 0,0,0, - $event['start']['month'], - $event['start']['mday'], - $event['start']['year'] - ))); - $event_end = (int)(date('Ymd',mktime( - 0,0,0, - $event['end']['month'], - $event['end']['mday'], - $event['end']['year'] - ))); - - // calculate first cell of event within observed interval - // - if ($event_start >= $this->planner_firstday) - { - $days_between = $GLOBALS['phpgw']->datetime->days_between($this->bo->month,1,$this->bo->year,$event['start']['month'],$event['start']['mday'],$event['start']['year']); - - $start_cell = $intervals_per_day * $days_between + $interval[$event['start']['hour']]; - } - else - { - $start_cell = 0; - } - - // calculate last cell of event within observed interval - // - if ($event_end <= $this->planner_lastday) - { - $days_between = $GLOBALS['phpgw']->datetime->days_between($this->bo->month,1,$this->bo->year,$event['end']['month'],$event['end']['mday'],$event['end']['year']); - $end_cell = $intervals_per_day * $days_between + $interval[$event['end']['hour']]; - if ($end_cell == $start_cell && $end_cell < $last_cell) - { - $end_cell++; // min. width 1 interval - } - } - else - { - $end_cell = $last_cell; - } - // get the categories associated with event - // - if ($c = $event['category']) - { - list($cat) = $this->planner_category($event['category']); - if ($cat['parent']) - { - list($pcat) = $this->planner_category($c = $cat['parent']); - } - else - { - $pcat = $cat; - } - } - else - { - $cat = $pcat = array( 'name' => lang('none')); - } - - // add the event to it`s associated row(s) - // - if ($this->bo->sortby == 'category') - { - // event needs to show up in it`s category`s row - // - $this->planner_update_row($c,$pcat['name'],$event,$cat,$start_cell,$end_cell); - } - elseif ($this->bo->sortby == 'user') - { - // event needs to show up in rows of all participants that are also owners - // - reset($this->planner_group_members); - while(list($user_name,$id) = each($this->planner_group_members)) - { - $status = $event['participants'][$id]; - - if (isset($status) && $status != 'R') - { - $this->planner_update_row($user_name,$user_name,$event,$cat,$start_cell,$end_cell); - } - } - } - } - - function planner_pad_rows() - { - $rows = &$this->planner_rows; - - if ($this->bo->sortby == 'user') - { - // add empty rows for users that do not participante in any event - // - reset($this->planner_group_members); - while(list($user_name,$id) = each($this->planner_group_members)) - { - $k = $user_name.'_1'; - $ka = '.nr_'.$k; - - if (!isset($rows[$k])) - { - $rows[$k]['_name'] = $user_name; - $rows[$k]['._name'] .= ' nowrap'; - $rows[$ka] = 0; - } - } - } - - // fill the remaining cols - // - $last_cell = $this->bo->prefs['calendar']['planner_intervals_per_day'] * $this->planner_days - 1; - - ksort($rows); - while (list($k,$r) = each($rows)) - { - if (is_array($r)) - { - $rows['.'.$k] = 'bgcolor="'.$GLOBALS['phpgw']->nextmatchs->alternate_row_color().'"'; - $row = &$rows[$k]; - $akt_cell = &$rows['.nr_'.$k]; - if ($akt_cell < $last_cell) - { - $row['3'] = ' '; - $row['.3'] = 'colspan="'.(1+$last_cell-$akt_cell).'"'; - } - } - } - } - - function planner_print_rows() - { - $bgcolor = 'bgcolor="'.$this->theme['th_bg'].'"'; - $intervals_per_day = $this->bo->prefs['calendar']['planner_intervals_per_day']; - - if ($this->debug) - { - _debug_array($this->planner_rows); - reset($this->planner_rows); - } - return $this->html->table( - array( - '_hdr0' => $this->planner_header[0], - '._hdr0' => $bgcolor, - '_hdr1' => $this->planner_header[1], - '._hdr1' => $bgcolor, - '_hdr2' => $this->planner_header[2], - '._hdr2' => $bgcolor - )+$this->planner_rows, - 'width="100%" cols="'.(1+$this->planner_days_in_end_month*$intervals_per_day).'"'); - } - - function planner_process_interval() - { - // generate duplicate free list of events within observed interval - // - /* - $this->bo->store_to_cache( - Array( - 'syear' => $this->bo->year, - 'smonth' => $this->bo->month, - 'sday' => 1, - 'eyear' => $this->planner_end_year, - 'emonth' => $this->planner_end_month, - 'eday' => $this->planner_days_in_end_month - ) - ); - $this->bo->remove_doubles_in_cache($this->planner_firstday,$this->planner_lastday); - */ - // hack to get the planner working again - $this->bo->cached_events = $GLOBALS['uical']->bo->search(array( - 'start' => array( - 'year' => $GLOBALS['uical']->year, - 'month' => $GLOBALS['uical']->month, - 'day' => 1, - ), - 'end' => array( - 'year' => $GLOBALS['uical']->year, - 'month' => 1+$GLOBALS['uical']->month, - 'day' => 0, - ), - 'cat_id' => $GLOBALS['uical']->cat_id, - 'users' => $GLOBALS['uical']->is_group ? $GLOBALS['uical']->g_owner : explode(',',$GLOBALS['uical']->owner), - 'filter' => $GLOBALS['uical']->filter, - 'daywise' => True, - )); - // process all events within observed interval - // - for($v=$this->planner_firstday;$v<=$this->planner_lastday;$v++) - { - $daily = $this->bo->cached_events[$v]; - - print_debug('For Date',$v); - print_debug('Count of items',count($daily)); - - // process all events on day $v - // - if (is_array($daily)) foreach($daily as $event) - { - if ($event['recur_type']) // calculate start- + end-datetime for recuring events - { - $this->bo->set_recur_date($event,$v); - } - if (!$this->bo->rejected_no_show($event)) - { - $this->planner_process_event($event); - } - } - } - $this->planner_pad_rows(); - } - - function matrixselect() - { - $datetime = mktime(0,0,0,$this->bo->month,$this->bo->day,$this->bo->year) - $GLOBALS['phpgw']->datetime->tz_offset; - - $sb = CreateObject('phpgwapi.sbox'); - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - if ($this->always_app_header) $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Matrixview'); - $GLOBALS['phpgw']->common->phpgw_header(); - - $p = &$GLOBALS['phpgw']->template; - $p->set_file( - Array( - 'mq' => 'matrix_query.tpl', - 'form_button' => 'form_button_script.tpl' - ) - ); - $p->set_block('mq','matrix_query','matrix_query'); - $p->set_block('mq','list','list'); - - $p->set_var(array( - 'delete_participants' => lang('Delete selected participants'), - 'title' => lang('Daily Matrix View'), - 'th_bg' => $this->theme['th_bg'], - 'action_url' => $this->page('viewmatrix') - )); - -// Date - $var[] = Array( - 'field' => lang('Date'), - 'data' => $GLOBALS['phpgw']->common->dateformatorder( - $sb->getYears('year',(int)$GLOBALS['phpgw']->common->show_date($datetime,'Y'),(int)$GLOBALS['phpgw']->common->show_date($datetime,'Y')), - $sb->getMonthText('month',(int)$GLOBALS['phpgw']->common->show_date($datetime,'n')), - $sb->getDays('day',(int)$GLOBALS['phpgw']->common->show_date($datetime,'d')) - ) - ); - -// View type - $var[] = Array( - 'field' => lang('View'), - 'data' => ''."\n" - ); - -// Participants - if (!is_object($GLOBALS['phpgw']->uiaccountsel)) - { - $GLOBALS['phpgw']->uiaccountsel = CreateObject('phpgwapi.uiaccountsel'); - } - - $accounts = $GLOBALS['phpgw']->acl->get_ids_for_location('run',1,'calendar'); - - $users = Array(); - for($i=0;$icommon->grab_owner_name($user); - if($GLOBALS['phpgw']->accounts->get_type($user) == 'g') - { - $group_members = $GLOBALS['phpgw']->acl->get_ids_for_location($user,1,'phpgw_group'); - if($group_members != False) - { - for($j=0;$jcommon->grab_owner_name($group_members[$j]); - } - } - } - } - } - } - - $num_users = count($users); - - if ($num_users > 50) - { - $size = 15; - } - elseif ($num_users > 5) - { - $size = 5; - } - else - { - $size = $num_users; - } - $select=array(); - @uasort($users,'strcasecmp'); - foreach($users as $id => $name) - { - if(!($GLOBALS['phpgw']->accounts->exists($id) && $this->bo->check_perms(PHPGW_ACL_READ,0,$id) || $GLOBALS['phpgw']->accounts->get_type($id) == 'g')) - { - unset($users[$id]); - } - } - $var[] = Array( - 'field' => lang('Participants'), - 'data' => "\n ".$GLOBALS['phpgw']->uiaccountsel->selection('participants[]','uicalendar_matrix_users',array(),'calendar+',$size,False,'','',$users) - ); - - for($i=0;$ioutput_template_array($p,'rows','list',$var[$i]); - } - - $vars = Array( - 'submit_button' => lang('View'), - 'action_url_button' => $this->bo->return_to ? $GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to) : $this->page(''), - 'action_text_button' => lang('Cancel'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - - $p->set_var($vars); - $p->parse('cancel_button','form_button'); - $p->pparse('out','matrix_query'); - } - - function viewmatrix() - { - if ($_POST['cancel']) - { - $this->index(); - } - - - // Fetch participants - if( get_var("matrix", array("GET", "POST")) == 1 ) - { - // fetch participants from session - $participants = explode(";", $GLOBALS['phpgw']->session->appsession("participants_matrix")); - } else { - // fetch participatns from get and post var - $participants = get_var("participants", array("GET", "POST")); - // Defined - into session - who participates - $GLOBALS['phpgw']->session->appsession("participants_matrix", "calendar", @implode(";", $participants)); - } - - // No type ... return to the select page - if (!get_var("matrixtype", array("GET", "POST")) OR !$participants ) - { - header('Location: ?menuaction=calendar.uicalendar.matrixselect'); - } - - $date["year"] = get_var("year", array("GET", "POST")); - $date["month"] = get_var("month", array("GET", "POST")); - $date["day"] = get_var("day", array("GET", "POST")); - - $parts = Array(); - $acct = CreateObject('phpgwapi.accounts',$this->bo->owner); - - if (is_array($participants)) - { - foreach($participants as $participant) - { - switch ($GLOBALS['phpgw']->accounts->get_type($participant)) - { - case 'g': - if ($members = $acct->member((int)$participant)) - { - foreach($members as $member) - { - if($this->bo->check_perms(PHPGW_ACL_READ,0,$member['account_id'])) - { - $parts[$member['account_id']] = True; - } - } - } - break; - case 'u': - if($this->bo->check_perms(PHPGW_ACL_READ,0,$participant)) - { - $parts[$participant] = 1; - } - break; - } - } - unset($acct); - } - # $participants = array_keys($parts); // get id's as values and a numeric index - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - if ($this->always_app_header) $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Matrixview'); - $GLOBALS['phpgw']->common->phpgw_header(); - - switch( get_var("matrixtype", array("GET", "POST")) ) - { - case 'free/busy': - if( get_var("sevendays", array("GET", "POST")) ) - { - $_f_daysend=7; - } - - for($_f_days=0; $_f_days<=$_f_daysend; $_f_days++) - { - $freetime = $GLOBALS['phpgw']->datetime->gmtdate(mktime(0,0,0,$date["month"],( $date["day"] + $_f_days ),$date["year"])); - echo '
'.$this->timematrix( - Array( - 'date' => $freetime, - 'starttime' => $this->bo->splittime('000000',False), - 'endtime' => 0, - 'participants' => $parts - ) - ); - } - break; - case 'weekly': - echo '
'.$this->display_weekly( - Array( - 'date' => sprintf("%04d%02d%02d",$this->bo->year,$this->bo->month,$this->bo->day), - 'showyear' => true, - 'owners' => $participants - ) - ); - break; - } - echo "\n
\n".'
'."\n"; - echo '
'."\n"; - echo ' '.$this->html->input_hidden('year',$this->bo->year); - echo ' '.$this->html->input_hidden('month',$this->bo->month); - echo ' '.$this->html->input_hidden('day',$this->bo->day); - echo ' '.$this->html->input_hidden('matrixtype',$_REQUEST['matrixtype']); - echo ' '.$this->html->input_hidden('matrix', 1); - echo ' '."\n"; - echo ' '."\n"; - echo ' '."\n"; - echo ' '."\n"; - - // Seven days - if( get_var("matrixtype", array("GET", "POST")) == "free/busy" ) - { - if( !get_var("sevendays", array("GET", "POST")) ) - echo ' '."\n"; - else - echo ' '."\n"; - } - - echo '
'."\n"; - echo '
'."\n"; - } - - function search() - { - if (empty($_POST['keywords'])) - { - // If we reach this, it is because they didn't search for anything - // or they used one of the selectboxes (year, month, week) in the search-result - // attempt to send them back to where they came from. - - $vars['menuaction'] = isset($_POST['from']) && $_POST['from'] != 'calendar.uicalendar.search' ? - $_POST['from'] : 'calendar.uicalendar.index'; - - foreach(array('date','year','month','day') as $field) - { - if (isset($_POST[$field])) - { - $vars[$field] = $_POST[$field]; - } - } - $GLOBALS['phpgw']->redirect_link('/index.php',$vars); - } - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Search Results'); - $GLOBALS['phpgw']->common->phpgw_header(); - - $error = ''; - - $matches = 0; - - // There is currently a problem searching in with repeated events. - // It spits back out the date it was entered. I would like to to say that - // it is a repeated event. - - // This has been solved by the little icon indicator for recurring events. - - $event_ids = $this->bo->search_keywords($_POST['keywords']); - foreach($event_ids as $key => $id) - { - $event = $this->bo->read_entry($id); - - if(!$this->bo->check_perms(PHPGW_ACL_READ,$event)) - { - continue; - } - - $datetime = $this->bo->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset; - - $info[strval($event['id'])] = array( - 'tr_color' => $GLOBALS['phpgw']->nextmatchs->alternate_row_color(), - 'date' => $GLOBALS['phpgw']->common->show_date($datetime), - 'link' => $this->link_to_entry($event,$event['start']['month'],$event['start']['mday'],$event['start']['year']) - ); - - } - $matches = count($event_ids); - - if ($matches == 1) - { - $quantity = lang('1 match found').'.'; - } - elseif ($matches > 0) - { - $quantity = lang('%1 matches found',$matches).'.'; - } - else - { - echo ''.lang('Error').':'.lang('no matches found'); - return; - } - - $p = $GLOBALS['phpgw']->template; - $p->set_file( - Array( - 'search_form' => 'search.tpl' - ) - ); - $p->set_block('search_form','search','search'); - $p->set_block('search_form','search_list_header','search_list_header'); - $p->set_block('search_form','search_list','search_list'); - $p->set_block('search_form','search_list_footer','search_list_footer'); - - $var = Array( - 'th_bg' => $this->theme['th_bg'], - 'search_text' => lang('Search Results'), - 'quantity' => $quantity - ); - $p->set_var($var); - - if($matches > 0) - { - $p->parse('rows','search_list_header',True); - } - foreach($info as $id => $data) - { - $p->set_var($data); - $p->parse('rows','search_list',True); - } - - if($matches > 0) - { - $p->parse('rows','search_list_footer',True); - } - - $p->pparse('out','search'); - } - - /* Private functions */ - function _debug_sqsof() - { - $data = array( - 'filter' => $this->bo->filter, - 'cat_id' => $this->bo->cat_id, - 'owner' => $this->bo->owner, - 'year' => $this->bo->year, - 'month' => $this->bo->month, - 'day' => $this->bo->day, - 'sortby' => $this->bo->sortby, - 'num_months' => $this->bo->num_months - ); - Return _debug_array($data,False); - } - - function output_template_array(&$p,$row,$list,$var) - { - if (!isset($var['hidden_vars'])) - { - $var['hidden_vars'] = ''; - } - if (!isset($var['tr_color'])) - { - $var['tr_color'] = $GLOBALS['phpgw']->nextmatchs->alternate_row_color(); - } - $p->set_var($var); - $p->parse($row,$list,True); - } - - function page($_page='',$params='') - { - if($_page == '') - { - $page_ = explode('.',$this->bo->prefs['calendar']['defaultcalendar']); - $_page = $page_[0]; - - if ($_page=='planner_cat' || $_page=='planner_user') - { - $_page = 'planner'; - } - elseif ($_page=='index' || ($_page != 'day' && $_page != 'week' && $_page != 'month' && $_page != 'year' && $_page != 'planner')) - { - $_page = 'month'; - $GLOBALS['phpgw']->preferences->add('calendar','defaultcalendar','month'); - $GLOBALS['phpgw']->preferences->save_repository(); - } - } - if($GLOBALS['phpgw_info']['flags']['currentapp'] == 'home' || - strstr($GLOBALS['phpgw_info']['flags']['currentapp'],'mail')) // email, felamimail, ... - { - $page_app = 'calendar'; - } - else - { - $page_app = $GLOBALS['phpgw_info']['flags']['currentapp']; - } - $page_class = $_page == 'day' || $_page == 'week' || $_page == 'month' ? 'uiviews' : 'uicalendar'; - - if (is_array($params)) - { - $params['menuaction'] = $page_app.'.'.$page_class.'.'.$_page; - } - else - { - $params = 'menuaction='.$page_app.'.'.$page_class.'.'.$_page.$params; - } - return $GLOBALS['phpgw']->link('/index.php',$params); - } - - function header() - { -return; - $cols = 8; - if($this->bo->check_perms(PHPGW_ACL_PRIVATE) == True) - { - $cols++; - } - - $tpl = $GLOBALS['phpgw']->template; - $tpl->set_unknowns('remove'); - - if (!file_exists($file = $this->template_dir.'/header.inc.php')) - { - $file = PHPGW_SERVER_ROOT . '/calendar/templates/default/header.inc.php'; - } - include($file); - $header = $tpl->fp('out','head'); - unset($tpl); - echo $header; - } - - function footer() - { -return; - $menuaction = $_GET['menuaction']; - list(,,$method) = explode('.',$menuaction); - - if (@$this->bo->printer_friendly) - { - return; - } - - $p = $GLOBALS['phpgw']->template; - - $p->set_file( - Array( - 'footer' => 'footer.tpl', - 'form_button' => 'form_button_script.tpl' - ) - ); - $p->set_block('footer','footer_table','footer_table'); - $p->set_block('footer','footer_row','footer_row'); - $p->set_block('footer','blank_row','blank_row'); - - $m = $this->bo->month; - $y = $this->bo->year; - - $thisdate = date('Ymd',mktime(0,0,0,$m,1,$y)); - $y--; - - $str = ''; - for ($i = 0; $i < 25; $i++) - { - $m++; - if ($m > 12) - { - $m = 1; - $y++; - } - $d = mktime(0,0,0,$m,1,$y); - $d_ymd = date('Ymd',$d); - $str .= ''."\n"; - } - - $var = Array( - 'action_url' => $this->page($method,''), - 'form_name' => 'SelectMonth', - 'label' => lang('Month'), - 'form_label' => 'date', - 'form_onchange' => 'document.SelectMonth.submit()', - 'row' => $str, - 'go' => lang('Go!') - ); - $this->output_template_array($p,'table_row','footer_row',$var); - - if($menuaction == 'calendar.uicalendar.week') - { - unset($thisdate); - $thisdate = mktime(0,0,0,$this->bo->month,$this->bo->day,$this->bo->year) - $GLOBALS['phpgw']->datetime->tz_offset; - $sun = $GLOBALS['phpgw']->datetime->get_weekday_start($this->bo->year,$this->bo->month,$this->bo->day) - $GLOBALS['phpgw']->datetime->tz_offset; - - $str = ''; - for ($i = -7; $i <= 7; $i++) - { - $begin = $sun + (7*24*60*60 * $i) + 12*60*60; // we use midday, that changes in daylight-saveing does not effect us - $end = $begin + 6*24*60*60; -// echo "
$i: ".date('d.m.Y H:i',$begin).' - '.date('d.m.Y H:i',$end); - $str .= '' . "\n"; - } - - $var = Array( - 'action_url' => $this->page($method,''), - 'form_name' => 'SelectWeek', - 'label' => lang('Week'), - 'form_label' => 'date', - 'form_onchange' => 'document.SelectWeek.submit()', - 'row' => $str, - 'go' => lang('Go!') - ); - - $this->output_template_array($p,'table_row','footer_row',$var); - } - - $str = ''; - for ($i = ($this->bo->year - 3); $i < ($this->bo->year + 3); $i++) - { - $str .= ''."\n"; - } - - $var = Array( - 'action_url' => $this->page($method,''), - 'form_name' => 'SelectYear', - 'label' => lang('Year'), - 'form_label' => 'year', - 'form_onchange' => 'document.SelectYear.submit()', - 'row' => $str, - 'go' => lang('Go!') - ); - $this->output_template_array($p,'table_row','footer_row',$var); - - if($menuaction == 'calendar.uicalendar.planner') - { - $str = ''; - $date_str = ''; - - if($this->bo->date) - { - $date_str .= ' '.$this->html->input_hidden('date',$this->bo->date); - } - $date_str .= ' '.$this->html->input_hidden('month',$this->bo->month); - $date_str .= ' '.$this->html->input_hidden('day',$this->bo->day); - $date_str .= ' '.$this->html->input_hidden('year',$this->bo->year); - - for($i=1; $i<=6; $i++) - { - $str .= ''."\n"; - } - - $var = Array( - 'action_url' => $this->page($method,''), - 'form_name' => 'SelectNumberOfMonths', - 'label' => lang('Number of Months'), - 'hidden_vars' => $date_str, - 'form_label' => 'num_months', - 'form_onchange' => 'document.SelectNumberOfMonths.submit()', - 'action_extra_field' => $date_str, - 'row' => $str, - 'go' => lang('Go!') - ); - $this->output_template_array($p,'table_row','footer_row',$var); - } - - $var = Array( - 'submit_button' => lang('Submit'), - 'action_url_button' => $GLOBALS['phpgw']->link('/index.php','menuaction=calendar.uiicalendar.import'), - 'action_text_button' => lang('Import'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $this->output_template_array($p,'b_row','form_button',$var); - $p->parse('table_row','blank_row',True); - - if($menuaction != 'calendar.uicalendar.view') - { - switch($menuaction) - { - case 'calendar.uicalendar.year': - $start_string = mktime(0,0,0,1,1,$this->bo->year); - $stop_string = mktime(0,0,0,12,31,$this->bo->year); - break; - case 'calendar.uicalendar.month': - $start_string = mktime(0,0,0,$this->bo->month,1,$this->bo->year); - $stop_string = mktime(0,0,0,$this->bo->month+1,0,$this->bo->year); - break; - case 'calendar.uicalendar.week': - $stop_string = $start_string = mktime(0,0,0,$this->bo->month,$this->bo->day,$this->bo->year); - $stop_string += 7*24*60*60-1; - break; - case 'calendar.uicalendar.day': - $stop_string = $start_string = mktime(0,0,0,$this->bo->month,$this->bo->day,$this->bo->year); - break; - } - - $extra_field = Array( - 'custom_start' => $GLOBALS['phpgw']->common->show_date($start_string,$GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']), - 'custom_stop' => $GLOBALS['phpgw']->common->show_date($stop_string,$GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']), - ); - $var = Array( - 'submit_button' => lang('Submit'), - 'action_url_button' => $GLOBALS['phpgw']->link('/index.php','menuaction=calendar.uicalendar.export'), - 'action_text_button' => lang('Export'), - 'action_confirm_button' => '', - 'action_extra_field' => $this->html->input_hidden($extra_field) - ); - $p->set_var('b_row',''); - $this->output_template_array($p,'b_row','form_button',$var); - $p->parse('table_row','blank_row',True); - } - $p->pparse('out','footer_table'); - unset($p); - } - - function css() - { - $GLOBALS['phpgw']->browser->browser(); - if($GLOBALS['phpgw']->browser->get_agent() == 'MOZILLA') - { - $time_width = ((int)($this->bo->prefs['common']['time_format']) == 12?12:8); - } - else - { - $time_width = ((int)($this->bo->prefs['common']['time_format']) == 12?10:7); - } - -// moved to app.css in templates/default for future separation of code and style [NDEE 10.03.04] -/* - return 'A.minicalendar { color: #000000; font-size: 72%; font-family: '.$this->theme['font'].' }'."\n" - . ' A.bminicalendar { color: #336699; font: italic bold x-small '.$this->theme['font'].' }'."\n" - . ' A.minicalendargrey { color: #999999; font-size: 8px; font-family: '.$this->theme['font'].' }'."\n" - . ' A.bminicalendargrey { color: #336699; font-style: italic; font-size:8px; font-family '.$this->theme['font'].' }'."\n" - . ' A.minicalhol { padding-left:3px; padding-right:3px; background: '.$this->holiday_color.'; color: #000000; font: x-small '.$this->theme['font'].' }'."\n" - . ' A.bminicalhol { padding-left:3px; padding-right:3px; background: '.$this->holiday_color.'; color: #336699; font: italic bold x-small '.$this->theme['font'].' }'."\n" - . ' A.minicalgreyhol { padding-left:3px; padding-right:3px; background: '.$this->holiday_color.'; color: #999999; font: x-small '.$this->theme['font'].' }'."\n" - . ' A.bminicalgreyhol { padding-left:3px; padding-right:3px; background: '.$this->holiday_color.'; color: #999999; font: italic bold x-small '.$this->theme['font'].' }'."\n" - . ' .event-on { background: '.$this->theme['row_on'].'; color: '.$this->theme['bg_text'].'; font: 100% '.$this->theme['font'].'; vertical-align: middle }'."\n" - . ' .event-off { background: '.$this->theme['row_off'].'; color: '.$this->theme['bg_text'].'; font: 100% '.$this->theme['font'].'; vertical-align: middle }'."\n" - . ' .event-holiday { background: '.$this->theme['bg04'].'; color: '.$this->theme['bg_text'].'; font: 100% '.$this->theme['font'].'; vertical-align: middle }'."\n" - . ' .time { background: '.$this->theme['th_bg'].'; color: '.$this->theme['bg_text'].'; font: bold 100% '.$this->theme['font'].'; width: '.$time_width.'%; vertical-align: middle; text-align: right; }'."\n" - . ' .tablecell { width: 80px; height: 80px }'."\n" - . ' .planner-cell { cursor:pointer; cursor:hand; border: thin solid black; }'; -*/ - } - - function no_edit() - { - if(!isset($GLOBALS['phpgw_info']['flags']['noheader'])) - { - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappheader'] = True; - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Permission denied'); - $GLOBALS['phpgw']->common->phpgw_header(); - } - echo '
You do not have permission to edit this appointment!
'; - return; - } - - function link_to_entry($event,$month,$day,$year) - { - $str = ''; - $is_private = !$event['public'] && !$this->bo->check_perms(PHPGW_ACL_READ,$event); - $viewable = !$this->bo->printer_friendly && $this->bo->check_perms(PHPGW_ACL_READ,$event); - - $starttime = $this->bo->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset; - $endtime = $this->bo->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset; - $rawdate = mktime(0,0,0,$month,$day,$year); - $rawdate_offset = $rawdate - $GLOBALS['phpgw']->datetime->tz_offset; - $nextday = mktime(0,0,0,$month,$day + 1,$year) - $GLOBALS['phpgw']->datetime->tz_offset; - if ((int)$GLOBALS['phpgw']->common->show_date($starttime,'Hi') && $starttime == $endtime) - { - $time = $GLOBALS['phpgw']->common->show_date($starttime,$this->bo->users_timeformat); - } - elseif ($starttime <= $rawdate_offset && $endtime >= $nextday - 60) - { - $time = '[ '.lang('All Day').' ]'; - } - elseif ((int)$GLOBALS['phpgw']->common->show_date($starttime,'Hi') || $starttime != $endtime) - { - if($starttime < $rawdate_offset && $event['recur_type'] == MCAL_RECUR_NONE) - { - $start_time = $GLOBALS['phpgw']->common->show_date($rawdate_offset,$this->bo->users_timeformat); - } - else - { - $start_time = $GLOBALS['phpgw']->common->show_date($starttime,$this->bo->users_timeformat); - } - - if($endtime >= ($rawdate_offset + 86400)) - { - $end_time = $GLOBALS['phpgw']->common->show_date(mktime(23,59,59,$month,$day,$year) - $GLOBALS['phpgw']->datetime->tz_offset,$this->bo->users_timeformat); - } - else - { - $end_time = $GLOBALS['phpgw']->common->show_date($endtime,$this->bo->users_timeformat); - } - $time = $start_time.'-'.$end_time; - } - else - { - $time = ''; - } - - $texttitle = $texttime = $textdesc = $textlocation = $textstatus = ''; - - - - if(!$is_private) - { - //$text .= $this->bo->display_status($event['users_status']); - - // split text for better display by templates, also see $texttime $texttitle $textdesc $textlocation - $textstatus=$this->bo->display_status($event['users_status']); - - } - - /* - $text = ' '.$time.'  '.$this->bo->get_short_field($event,$is_private,'title').$text. - (!$is_private && $event['description'] ? ': '.$this->bo->get_short_field($event,$is_private,'description').'':''). - $GLOBALS['phpgw']->browser->br; - */ - - $texttime=$time; - $texttitle=$this->bo->get_short_field($event,$is_private,'title'); - $textdesc=(!$is_private && $event['description'] ? $this->bo->get_short_field($event,$is_private,'description'):''); - // added $textlocation but this must be activated in the actual pict_link.tpl file of the used template set - $textlocation=$this->bo->get_short_field($event,$is_private,'location'); - - if ($viewable) - { - $date = sprintf('%04d%02d%02d',$year,$month,$day); - $this->link_tpl->set_var('link_link',$this->page('view','&cal_id='.$event['id'].'&date='.$date)); - $this->link_tpl->set_var('lang_view',lang('View this entry')); - $this->link_tpl->set_var('tooltip',$this->event_tooltip($event)); - // quoting title, describtion and location for wz_tooltips - $this->link_tpl->parse('picture','link_open',True); - } - if (!$is_private) - { - if($event['priority'] == 3) - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','high'), - 'width' => 16, - 'height'=> 16, - 'title' => lang('high priority') - ); - } - if($event['recur_type'] == MCAL_RECUR_NONE) - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','circle'), - 'width' => 9, - 'height'=> 9, - 'title' => lang('single event') - ); - } - else - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','recur'), - 'width' => 12, - 'height'=> 12, - 'title' => lang('recurring event') - ); - } - } - $participants = $this->planner_participants($event['participants']); - if(count($event['participants']) > 1) - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','multi_3'), - 'width' => 14, - 'height'=> 14, - 'title' => $participants - ); - } - else - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','single'), - 'width' => 14, - 'height'=> 14, - 'title' => $participants - ); - } - if($event['public'] == 0) - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','private'), - 'width' => 13, - 'height'=> 13, - 'title' => lang('private') - ); - } - if(@isset($event['alarm']) && count($event['alarm']) >= 1 && !$is_private) - { - // if the alarm is to go off the day before the event - // the icon does not show up because of 'alarm_today' - // - TOM - if($this->bo->alarm_today($event,$rawdate_offset,$starttime)) - { - $picture[] = Array( - 'pict' => $GLOBALS['phpgw']->common->image('calendar','alarm'), - 'width' => 13, - 'height'=> 13, - 'title' => lang('alarm') - ); - } - } - - $description = $this->bo->get_short_field($event,$is_private,'description'); - for($i=0;$i $picture[$i]['pict'], - 'width' => $picture[$i]['width'], - 'height' => $picture[$i]['height'], - 'title' => $picture[$i]['title'] - ); - $this->output_template_array($this->link_tpl,'picture','pict',$var); - } - if ($texttitle) - { - $var = Array( - // 'text' => $text, - 'time'=> $texttime, - 'title'=> $texttitle, - 'users_status'=>$textstatus, - 'desc'=> $textdesc, - 'location'=> $textlocation - ); - $this->output_template_array($this->link_tpl,'picture','link_text',$var); - } - - if ($viewable) - { - $this->link_tpl->parse('picture','link_close',True); - } - - //NDEE(160704) for event tooltips - $this->link_tpl->set_var('loctitle',lang('location')); - $str = $this->link_tpl->fp('out','link_pict'); - $this->link_tpl->set_var('picture',''); - $this->link_tpl->set_var('out',''); -// unset($p); - return $str; - } - - function overlap($params) - { - if(!is_array($params)) - { - } - else - { - $overlapping_events = $params['o_events']; - $event = $params['this_event']; - } - - $month = $event['start']['month']; - $mday = $event['start']['mday']; - $year = $event['start']['year']; - - $start = mktime($event['start']['hour'],$event['start']['min'],$event['start']['sec'],$month,$mday,$year) - $GLOBALS['phpgw']->datetime->tz_offset; - $end = $this->bo->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset; - - $overlap = ''; - for($i=0;$ibo->read_entry($overlapping_events[$i],True); - $overlap .= '
  • '.$this->link_to_entry($overlapped_event,$month,$mday,$year); - $overlap .= '
      '; - foreach($overlapped_event['participants'] as $id => $status) - { - // Check if user can be view others participants - if($GLOBALS["phpgw"]->acl->get_rights($id, "calendar") < PHPGW_ACL_READ) - continue; - - $conflict = isset($event['participants'][$id]); - $overlap .= '
    • '.($conflict?'':''). - $GLOBALS['phpgw']->common->grab_owner_name($id). - ($conflict?' - '.lang('Scheduling conflict'):'')."
    • \n"; - } - $overlap .= "
    \n"; - } - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappheader'] = True; - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Scheduling Conflict'); - $GLOBALS['phpgw']->common->phpgw_header(); - - $p = $GLOBALS['phpgw']->template; - $p->set_file( - Array( - 'overlap' => 'overlap.tpl', - 'form_button' => 'form_button_script.tpl' - ) - ); - - $var = Array( - 'color' => $this->theme['bg_text'], - 'overlap_title' => lang('Scheduling Conflict'), - 'overlap_text' => lang('Your suggested time of %1 - %2 conflicts with the following existing calendar entries:',$GLOBALS['phpgw']->common->show_date($start),$GLOBALS['phpgw']->common->show_date($end)), - 'overlap_list' => $overlap - ); - $p->set_var($var); - - $date = sprintf("%04d%02d%02d",$this->bo->year,$this->bo->month,$this->bo->mday); - $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link('/index.php',Array('menuaction'=>'calendar.bocalendar.update','readsess'=>1)), - 'action_text_button' => lang('Ignore Conflict'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $this->output_template_array($p,'resubmit_button','form_button',$var); - - $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link('/index.php',Array('menuaction'=>'calendar.uicalendar.edit','readsess'=>1,'date'=>$date)), - 'action_text_button' => lang('Re-Edit Event'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $this->output_template_array($p,'reedit_button','form_button',$var); - $p->pparse('out','overlap'); - } - - function planner_participants($parts) - { - static $id2lid; - - $names = ''; - while (list($id,$status) = each($parts)) - { - $status = substr($this->bo->get_long_status($status),0,1); - - if (!isset($id2lid[$id])) - { - $id2lid[$id] = $GLOBALS['phpgw']->common->grab_owner_name($id); - } - if (strlen($names)) - { - $names .= ",\n"; - } - $names .= $id2lid[$id]." ($status)"; - } - if($this->debug) - { - echo ''."\n"; - } - return $names; - } - - function planner_category($ids) - { - static $cats; - if(!is_array($ids)) - { - if (strpos($ids,',')) - { - $id_array = explode(',',$ids); - } - else - { - $id_array[0] = $ids; - } - } - $ret_val = Array(); - foreach($id_array as $id) - { - if (!isset($cats[$id])) - { - list($cat) = $this->cat->return_single( $id ); - $cat['data'] = unserialize($cat['data']); - $cat['color'] = $cat['data']['color'] ? $cat['data']['color'] : strstr($cat['description'],'#'); - $cats[$id] = $cat; - } - $ret_val[] = $cats[$id]; - } - return $ret_val; - } - - function week_header($month,$year,$display_name = False) - { - $this->weekstarttime = $GLOBALS['phpgw']->datetime->get_weekday_start($year,$month,1); - - $p = CreateObject('phpgwapi.Template',$this->template_dir); - $p->set_unknowns('remove'); - $p->set_file( - Array ( - 'month_header' => 'month_header.tpl' - ) - ); - $p->set_block('month_header','monthly_header','monthly_header'); - $p->set_block('month_header','column_title','column_title'); - - $var = Array( - 'bgcolor' => $this->theme['th_bg'], - 'font_color' => $this->theme['th_text'] - ); - if($this->bo->printer_friendly && @$this->bo->prefs['calendar']['print_black_white']) - { - $var = Array( - 'bgcolor' => '', - 'font_color' => '' - ); - } - $p->set_var($var); - - $p->set_var('col_width','14'); - if($display_name == True) - { - $p->set_var('col_title',lang('name')); - $p->parse('column_header','column_title',True); - $p->set_var('col_width','12'); - } - - for($i=0;$i<7;$i++) - { - $p->set_var('col_title',lang($GLOBALS['phpgw']->datetime->days[$i])); - $p->parse('column_header','column_title',True); - } - return $p->fp('out','monthly_header'); - } - - function display_week($startdate,$weekly,$cellcolor,$display_name = False,$owner=0,$monthstart=0,$monthend=0) - { - if($owner == 0) - { - $owner = $GLOBALS['phpgw_info']['user']['account_id']; - } - - $temp_owner = $this->bo->owner; - - $str = ''; - $p = CreateObject('phpgwapi.Template',$this->template_dir); - $p->set_unknowns('keep'); - - $p->set_file( - Array( - 'month_header' => 'month_header.tpl', - 'month_day' => 'month_day.tpl' - ) - ); - $p->set_block('month_header','monthly_row','monthly_row'); - $p->set_block('month_header','month_column','month_column'); - $p->set_block('month_header','column_title','column_title'); - $p->set_block('month_day','month_daily','month_daily'); - $p->set_block('month_day','day_event','day_event'); - $p->set_block('month_day','event','event'); - - $p->set_var('extra',''); - $p->set_var('col_width','14'); - if($display_name) - { - $p->set_var('col_title',$GLOBALS['phpgw']->common->grab_owner_name($owner)); - $p->parse('column_row','column_title',True); - $p->set_var('col_width','12'); - } - $today = date('Ymd',$GLOBALS['phpgw']->datetime->users_localtime); - $daily = $this->set_week_array($startdate - $GLOBALS['phpgw']->datetime->tz_offset,$cellcolor,$weekly); - foreach($daily as $date => $day_params) - { - $year = (int)substr($date,0,4); - $month = (int)substr($date,4,2); - $day = (int)substr($date,6,2); - $var = Array( - 'column_data' => '', - 'extra' => '' - ); - $p->set_var($var); - if ($weekly || ($date >= $monthstart && $date <= $monthend)) - { - if ($day_params['new_event']) - { - $new_event_link = ' ' - . '' - . ''; - $day_number = ''.$day.''; - } - else - { - $new_event_link = ''; - $day_number = $day; - } - - $var = Array( - 'extra' => $day_params['extra'], - 'new_event_link'=> $new_event_link, - 'day_number' => $day_number - ); - if($day_params['week']) - { - -//NDEE: style! m_w_table in month_day.tpl -// week-hilite - //$var['new_event_link'] .= '   '. - $var['new_event_link'] .= '   '. - (!$this->bo->printer_friendly?'' .$day_params['week'].'' : ''.$day_params['week'].''); - } - - $p->set_var($var); - - if(@$day_params['holidays']) - { - foreach($day_params['holidays'] as $key => $value) - { - $var = Array( - 'day_events' => ''.$value.''.$GLOBALS['phpgw']->browser->br - ); - $this->output_template_array($p,'daily_events','event',$var); - } - } - - if($day_params['appts']) - { - $var = Array( - 'week_day_font_size' => '2', - 'events' => '' - ); - $p->set_var($var); - $events = $this->bo->cached_events[$date]; - foreach($events as $event) - { - if ($this->bo->rejected_no_show($event)) - { - continue; // user does not want to see rejected events - } - $p->set_var('day_events',$this->link_to_entry($event,$month,$day,$year)); - $p->parse('events','event',True); - $p->set_var('day_events',''); - } - } - $p->parse('daily_events','day_event',True); - $p->parse('column_data','month_daily',True); - $p->set_var('daily_events',''); - $p->set_var('events',''); -/* if($day_params['week']) - { - $var = Array( - 'week_day_font_size' => '-2', - 'events' => (!$this->bo->printer_friendly?'' .$day_params['week'].'':$day_params['week']) - ); - $this->output_template_array($p,'column_data','day_event',$var); - $p->set_var('events',''); - } */ - } - $p->parse('column_row','month_column',True); - $p->set_var('column_data',''); - } - $this->bo->owner = $temp_owner; - return $p->fp('out','monthly_row'); - } - - function display_month($month,$year,$showyear,$owner=0) - { - if($this->debug) - { - echo ''."\n"; - } - - $this->bo->store_to_cache( - Array( - 'syear' => $year, - 'smonth'=> $month, - 'sday' => 1 - ) - ); - - $monthstart = (int)(date('Ymd',mktime(0,0,0,$month ,1,$year))); - $monthend = (int)(date('Ymd',mktime(0,0,0,$month + 1,0,$year))); - - $start = $GLOBALS['phpgw']->datetime->get_weekday_start($year, $month, 1); - - if($this->debug) - { - echo ''."\n"; - echo ''."\n"; - } - - $p = CreateObject('phpgwapi.Template',$this->template_dir); - $p->set_unknowns('keep'); - - $p->set_file( - Array( - 'week' => 'month_day.tpl' - ) - ); - $p->set_block('week','m_w_table','m_w_table'); - $p->set_block('week','event','event'); - - $var = Array( - 'cols' => 7, - 'day_events'=> $this->week_header($month,$year,False) - ); - $this->output_template_array($p,'row','event',$var); - - $cellcolor = $this->theme['row_on']; - - for($i = (int)($start + $GLOBALS['phpgw']->datetime->tz_offset);(int)(date('Ymd',$i)) <= $monthend;$i += 604800) - { - $cellcolor = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($cellcolor); - $var = Array( - 'day_events' => $this->display_week($i,False,$cellcolor,False,$owner,$monthstart,$monthend) - ); - $this->output_template_array($p,'row','event',$var); - } - return $p->fp('out','m_w_table'); - } - - function display_weekly($params) - { - if(!is_array($params)) - { - $this->index(); - } - - $year = substr($params['date'],0,4); - $month = substr($params['date'],4,2); - $day = substr($params['date'],6,2); - $showyear = $params['showyear']; - $owners = $params['owners']; - - $p = CreateObject('phpgwapi.Template',$this->template_dir); - $p->set_unknowns('keep'); - - $p->set_file( - Array( - 'week' => 'month_day.tpl' - ) - ); - $p->set_block('week','m_w_table','m_w_table'); - $p->set_block('week','event','event'); - - $start = $GLOBALS['phpgw']->datetime->get_weekday_start($year, $month, $day) + $GLOBALS['phpgw']->datetime->tz_offset; - - $cellcolor = $this->theme['row_off']; - - $true_printer_friendly = $this->bo->printer_friendly; - - if(is_array($owners)) - { - $display_name = True; - $counter = count($owners); - $owners_array = $owners; - $cols = 8; - } - else - { - $display_name = False; - $counter = 1; - $owners_array[0] = $owners; - $cols = 7; - } - $var = Array( - 'cols' => $cols, - 'day_events' => $this->week_header($month,$year,$display_name) - ); - $this->output_template_array($p,'row','event',$var); - - $tstart = $start - $GLOBALS['phpgw']->datetime->tz_offset; - $tstop = $tstart + 604800; - $original_owner = $this->bo->so->owner; - for($i=0;$i<$counter;$i++) - { - $this->bo->so->owner = $owners_array[$i]; - $this->bo->so->open_box($owners_array[$i]); - $this->bo->store_to_cache( - Array( - 'syear' => date('Y',$tstart), - 'smonth' => date('m',$tstart), - 'sday' => date('d',$tstart), - 'eyear' => date('Y',$tstop), - 'emonth' => date('m',$tstop), - 'eday' => date('d',$tstop) - ) - ); - $p->set_var('day_events',$this->display_week($start,True,$cellcolor,$display_name,$owners_array[$i])); - $p->parse('row','event',True); - } - $this->bo->so->owner = $original_owner; - $this->bo->printer_friendly = $true_printer_friendly; - return $p->fp('out','m_w_table'); - } - - function view_event($event,$alarms=False) - { - if((!$event['participants'][$this->bo->owner] && !$this->bo->check_perms(PHPGW_ACL_READ,$event))) - { - return False; - } - - $p = &$GLOBALS['phpgw']->template; - - $p->set_file( - Array( - 'view' => 'view.tpl' - ) - ); - $p->set_block('view','view_event','view_event'); - $p->set_block('view','list','list'); - $p->set_block('view','hr','hr'); - - $vars = $this->bo->event2array($event); - - $vars['title']['tr_color'] = $this->theme['th_bg']; - - if (isset($vars['participants']['data']) && is_array($vars['participants']['data'])) - { - foreach($vars['participants']['data'] as $user => $str) - { - if ($this->bo->check_perms(PHPGW_ACL_EDIT,0,$user) && ereg('^(.*) \((.*)\)$',$str,$parts)) - { - $vars['participants']['data'][$user] = $parts[1].' ('.$parts[2].')'; - } - } - $vars['participants']['data'] = implode("
    \n",$vars['participants']['data']); - } - - foreach($vars as $var) - { - if (strlen($var['data'])) - { - $this->output_template_array($p,'row','list',$var); - } - } - - if($alarms && count($event['alarm'])) - { - $p->set_var('th_bg',$this->theme['th_bg']); - $p->set_var('hr_text',lang('Alarms')); - $p->parse('row','hr',True); - - foreach($event['alarm'] as $key => $alarm) - { - $icon = ''; - $var = Array( - 'field' => $icon.$GLOBALS['phpgw']->common->show_date($alarm['time']), - 'data' => lang('Email Notification for %1',$GLOBALS['phpgw']->common->grab_owner_name($alarm['owner'])) - ); - $this->output_template_array($p,'row','list',$var); - } - } - return True; - } - - function nm_on_off() - { - if($GLOBALS['phpgw']->nextmatchs->alternate_row_color() == $this->theme['row_on']) - { - return '_on'; - } - return '_off'; - } - - function slot_num($time,$set_day_start=0,$set_day_end=0) - { - static $day_start, $day_end, $interval=0; - - if ($set_day_start) $day_start = $set_day_start; - if ($set_day_end) $day_end = $set_day_end; - if (!$interval) $interval = 60*$this->bo->prefs['calendar']['interval']; - - if ($time > $day_end) - { - $time = $day_end; - } - $slot = (int)(($time - $day_start) / $interval); - - return $slot < 0 ? 0 : 1+$slot; - } - - function print_day($params) - { - if(!is_array($params)) - { - $this->index(); - } - - print_debug('in print_day()'); - - $this->bo->store_to_cache( - Array( - 'syear' => $params['year'], - 'smonth' => $params['month'], - 'sday' => $params['day'], - 'eyear' => $params['year'], - 'emonth' => $params['month'], - 'eday' => $params['day'] - ) - ); - - $p = CreateObject('phpgwapi.Template',$this->template_dir); - $p->set_unknowns('keep'); - - $tpl = 'day_cal.tpl'; - if((int)($GLOBALS['phpgw_info']['user']['preferences']['calendar']['mainscreen_showevents'])==2 && - $GLOBALS['phpgw_info']['flags']['currentapp'] == 'home') - { - $tpl = 'day_list.tpl'; - } - $templates = Array( - 'day_cal' => $tpl - ); - - $p->set_file($templates); - $p->set_block('day_cal','day','day'); - $p->set_block('day_cal','day_row','day_row'); - $p->set_block('day_cal','day_event_on','day_event_on'); - $p->set_block('day_cal','day_event_off','day_event_off'); - $p->set_block('day_cal','day_event_holiday','day_event_holiday'); - $p->set_block('day_cal','day_time','day_time'); - - $date_to_eval = sprintf("%04d%02d%02d",$params['year'],$params['month'],$params['day']); - - $day_start = mktime((int)($this->bo->prefs['calendar']['workdaystarts']),0,0,$params['month'],$params['day'],$params['year']); - $day_end = mktime((int)($this->bo->prefs['calendar']['workdayends']),0,1,$params['month'],$params['day'],$params['year']); - $daily = $this->set_week_array($GLOBALS['phpgw']->datetime->get_weekday_start($params['year'],$params['month'],$params['day']),$this->theme['row_on'],True); - print_debug('Date to Eval',$date_to_eval); - $events_to_show = array(); - if($daily[$date_to_eval]['appts']) - { - $events = $this->bo->cached_events[$date_to_eval]; - print_debug('Date',$date_to_eval); - print_debug('Count',count($events)); - foreach($events as $event) - { - if ($this->bo->rejected_no_show($event)) - { - continue; // user does not want to see rejected events - } - if ($event['recur_type']) // calculate start- + end-datetime for recuring events - { - $this->bo->set_recur_date($event,$date_to_eval); - } - $events_to_show[] = array( - 'starttime' => $this->bo->maketime($event['start']), - 'endtime' => $this->bo->maketime($event['end']), - 'content' => $this->link_to_entry($event,$params['month'],$params['day'],$params['year']) - ); - } - } - //echo "events_to_show=
    "; print_r($events_to_show); echo "
    \n"; - $other = $GLOBALS['phpgw']->hooks->process(array( - 'location' => 'calendar_include_events', - 'year' => $params['year'], - 'month' => $params['month'], - 'day' => $params['day'], - 'owner' => $this->bo->owner // num. id of the user, not necessary current user - )); - - if (is_array($other)) - { - foreach($other as $evts) - { - if (is_array($evts)) - { - $events_to_show = array_merge($events_to_show,$evts); - } - } - usort($events_to_show,create_function('$a,$b','return $a[\'starttime\']-$b[\'starttime\'];')); - //echo "events_to_show=
    "; print_r($events_to_show); echo "
    \n"; - } - - if (count($events_to_show)) - { - $last_slot_end = -1; - foreach($events_to_show as $event) - { - $slot = $this->slot_num($event['starttime'],$day_start,$day_end); - $slot_end = isset($event['endtime']) ? $this->slot_num($event['endtime']-1) : $slot; // -1 to not occupy eg. the 18.00 slot for a 17-18h date - - if ($slot <= $last_slot_end) - { - $slot = $last_slot; - $slot_end = max($last_slot_end,$slot_end); - } - $rows[$slot] .= $event['content']; - - print_debug('slot',$slot); - print_debug('row',$rows[$slot]); - - $row_span[$slot] = 1 + $slot_end - $slot; - - $last_slot = $slot; - $last_slot_end = $slot_end; - print_debug('Time',$GLOBALS['phpgw']->common->show_date($this->bo->maketime($events[$i]['start']) - $GLOBALS['phpgw']->datetime->tz_offset).' - '.$GLOBALS['phpgw']->common->show_date($this->bo->maketime($events[$i]['end']) - $GLOBALS['phpgw']->datetime->tz_offset)); - print_debug('Slot',$slot); - } - //echo "rows=
    "; print_r($rows); echo "
    row_span="; print_r($row_span); echo "
    \n"; - } - $holiday_names = $daily[$date_to_eval]['holidays']; - if(!$holiday_names) - { - $row_to_print = $this->nm_on_off(); - } - else - { - $row_to_print = '_holiday'; - foreach($holiday_names as $name) - { - $rows[0] = '
    '.$name.'
    ' . $rows[0]; - } - } - $last_slot = $this->slot_num($day_end,$day_start,$day_end); - $rowspan = 0; - for ($slot = 0; $slot <= $last_slot; ++$slot) - { - $p->set_var('extras',''); - if ($rowspan > 1) - { - $p->set_var('event',''); - $rowspan--; - } - elseif (!isset($rows[$slot])) - { - if((int)($GLOBALS['phpgw_info']['user']['preferences']['calendar']['mainscreen_showevents'])==2 && - $GLOBALS['phpgw_info']['flags']['currentapp'] == 'home') - { - $p->set_var('event', ''); - } - else - { - $p->set_var('event',' '); - $row_to_print = $this->nm_on_off(); - $p->parse('event','day_event'.$row_to_print); - } - } - else - { - $rowspan = (int)$row_span[$slot]; - if ($rowspan > 1) - { - $p->set_var('extras',' rowspan="'.$rowspan.'"'); - } - $p->set_var('event',$rows[$slot]); - $row_to_print = $this->nm_on_off(); - $p->parse('event','day_event'.$row_to_print); - } - $open_link = $close_link = ''; - $time = ' '; - - if (0 < $slot && $slot < $last_slot) // normal time-slot not before or after day_start/end - { - $time = $day_start + ($slot-1) * 60 * $this->bo->prefs['calendar']['interval']; - $hour = date('H',$time); - $min = date('i',$time); - $time = $GLOBALS['phpgw']->common->formattime($hour,$min); - - if(!$this->bo->printer_friendly && $this->bo->check_perms(PHPGW_ACL_ADD)) - { - $open_link = ' '; - $close_link = ' '; - } - } - $p->set_var(Array( - 'open_link' => $open_link, - 'time' => $time, - 'close_link' => $close_link, - 'tr_color' => '' // dummy to stop output_template_array to set it - )); - $p->parse('time','day_time'); - - $p->parse('row','day_row',True); - } - return $p->fp('out','day'); - } // end function - - function timematrix($param) - { - if(!is_array($param)) - { - $this->index(); - } - - $date = $param['date']; - $starttime = $param['starttime']; - $endtime = $param['endtime']; - $participants = $param['participants']; - foreach($participants as $part => $nul) - { - $participants[$part] = $GLOBALS['phpgw']->common->grab_owner_name($part); - // Much better for processor :) - $participants_id[] = $part; - } - uasort($participants,'strnatcasecmp'); // sort them after their fullname - - $increment = $this->bo->prefs['calendar']['interval']; - $interval = (int)(60 / $increment); - $colspan = $this->bo->prefs['calendar']['workdayends'] - $this->bo->prefs['calendar']['workdaystarts']; - - $pix = $GLOBALS['phpgw']->common->image('calendar','pix'); - - /* Make link */ - if( get_var("sevendays", array("GET", "POST") ) ) - $sevendays = "&sevendays=yes"; - - $_f_date = $GLOBALS['phpgw']->datetime->makegmttime(0,0,0, $date["month"], ( $date["day"] - 1 ),$date["year"]); - $url_prevday = $GLOBALS['phpgw']->link('/index.php', - "menuaction=calendar.uicalendar.viewmatrix" - . "&matrix=1" - . "&year=" . $_f_date["year"] - . "&month=" . $_f_date["month"] - . "&day=" . $_f_date["day"] - . "&matrixtype=" . get_var("matrixtype", array("POST", "GET")) - . $sevendays - ); - $_f_date = $GLOBALS['phpgw']->datetime->makegmttime(0,0,0, $date["month"], ( $date["day"] + 1 ),$date["year"]); - $url_nextday = $GLOBALS['phpgw']->link('/index.php', - "menuaction=calendar.uicalendar.viewmatrix" - . "&matrix=1" - . "&year=" . $_f_date["year"] - . "&month=" . $_f_date["month"] - . "&day=" . $_f_date["day"] - . "&matrixtype=" . get_var("matrixtype", array("POST", "GET")) - . $sevendays - ); - $str = '' - . '' - . ' ' - . ' ' - . ' ' - . '' - . '
    << ' . lang('previous day') . '' . lang($GLOBALS['phpgw']->common->show_date($date['raw'],'l')) - . ', '.$this->bo->long_date($date) - . ' ' . lang('next day') . ' >>
    ' - . '' - . '' - . ''; - - // Destroy old variable - unset($_f_date); - unset($url_parts); - unset($url_prevday); - unset($url_nextday); - - - // Show TimeMatrix - for( $i=$this->bo->prefs['calendar']['workdaystarts']; - $i<$this->bo->prefs['calendar']['workdayends']; - $i++ ) - { - for($j=0;$j<$interval;$j++) - { - $k = ($j == 0 ? sprintf('%02d',$i).'
    ':'').sprintf('%02d',$j*$increment); - - $str .= '\n"; - } - } - $str .= '' - . ''; - if(!$endtime) - { - $endtime = $starttime; - } - $owner = $this->bo->owner; - foreach($participants as $part => $fullname) - { - $str .= '' - . ''; - - $this->bo->cached_events = Array(); - $this->bo->so->owner = $part; - $this->bo->so->open_box($part); - $this->bo->store_to_cache( - Array( - 'syear' => $date['year'], - 'smonth'=> $date['month'], - 'sday' => $date['day'], - 'eyear' => 0, - 'emonth'=> 0, - 'eday' => $date['day'] + 1 - ) - ); - - if(!$this->bo->cached_events[$date['full']]) - { - for( $j=$this->bo->prefs['calendar']['workdaystarts']; - $j<$this->bo->prefs['calendar']['workdayends']; - $j++ ) - { - for($k=0;$k<$interval;$k++) - { - $str .= ''; - } - $str .= "\n"; - } - } - else - { - $time_slice = $this->bo->prepare_matrix($interval,$increment,$part,$date['full']); - for( $h=$this->bo->prefs['calendar']['workdaystarts']; - $h<$this->bo->prefs['calendar']['workdayends']; - $h++ ) - { - $hour = $h * 10000; - for($m=0;$m<$interval;$m++) - { - $index = ($hour + (($m * $increment) * 100)); - switch($time_slice[$index]['marker']) - { - case ' ': - $time_slice[$index]['color'] = $this->theme['bg_color']; - $extra = ''; - break; - case '-': - $time_slice[$index]['color'] = $this->theme['bg01']; - $link = $this->page('view','&cal_id='.$time_slice[$index]['id'].'&date='.$date['full']); - $extra =' title="'.$time_slice[$index]['description'].'" onClick="location.href=\''.$link.'\';" style="cursor:pointer; cursor:hand;"'; - break; - } - $str .= ''; - } - $str .= "\n"; - } - } - $str .= '' - . ''; - } - $this->bo->owner = $owner; - $this->bo->so->owner = $owner; - $this->bo->so->open_box($owner); - return $str.'

    ' - . '' - . lang('Participant').'' - . '' - . '" - . $k." 

    '.$fullname.' '.$time_slice[$index]['marker'].'

    '."\n"; - } - - function get_response($cal_id) - { - $p = &$GLOBALS['phpgw']->template; - $p->set_file( - Array( - 'form_button' => 'form_button_script.tpl' - ) - ); - - $ev = $this->bo->get_cached_event(); - $response_choices = Array( - ACCEPTED => lang('Accept'), - REJECTED => lang('Reject'), - TENTATIVE => lang('Tentative'), - NO_RESPONSE => lang('No Response') - ); - $str = ''; - while(list($param,$text) = each($response_choices)) - { - $var = Array( - 'action_url_button' => $this->page('set_action','&cal_id='.$cal_id.'&action='.$param), - 'action_text_button' => ' '.$text.' ', - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $p->set_var($var); - $str .= ''.$p->fp('out','form_button').''."\n"; - } - if ($this->bo->return_to) - { - $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to), - 'action_text_button' => lang('cancel'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $p->set_var($var); - $str .= ''.$p->fp('out','form_button').''."\n"; - } - $str = ''.$GLOBALS['phpgw']->common->grab_owner_name($this->bo->owner).":\n".$str; - - return ''."\n".$str.'
    '."\n"; - } - - function edit_form($param) - { - if(!is_array($param)) - { - $this->index(); - } - - if(isset($param['event'])) - { - $event = $param['event']; - } - - $hourformat = substr($this->bo->users_timeformat,0,1); - - // $sb = CreateObject('phpgwapi.sbox'); - $sb = CreateObject('phpgwapi.sbox2'); - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappheader'] = True; - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw_info']['flags']['app_header'] = $event['id'] ? lang('Calendar - Edit') : lang('Calendar - Add'); - $GLOBALS['phpgw']->common->phpgw_header(); - - $ownerApps = $GLOBALS['phpgw']->acl->get_user_applications($event['owner']); - - $p = &$GLOBALS['phpgw']->template; - $p->set_file( - Array( - 'edit' => 'edit.tpl', - 'form_button' => 'form_button_script.tpl' - ) - ); - $p->set_block('edit','edit_entry','edit_entry'); - $p->set_block('edit','list','list'); - $p->set_block('edit','hr','hr'); - - $vars = Array( - 'font' => $this->theme['font'], - 'bg_color' => $this->theme['bg_text'], - 'action_url' => $GLOBALS['phpgw']->link('/index.php',Array('menuaction'=>'calendar.bocalendar.update')), - 'common_hidden' => $this->html->input_hidden('cal[id]',$event['id']) - . $this->html->input_hidden('cal[owner]',$event['owner']) - . $this->html->input_hidden('cal[uid]',$event['uid']) - . ($_GET['cal_id'] && $event['id'] == 0?$this->html->input_hidden(array( - 'cal[reference]' => $_GET['cal_id'], - 'cal[new_exception]' => $event['start']['raw'])) : - (@isset($event['reference'])?$this->html->input_hidden('cal[reference]',$event['reference']):'')) - . (@isset($GLOBALS['phpgw_info']['server']['deny_user_grants_access']) && $GLOBALS['phpgw_info']['server']['deny_user_grants_access']? - $this->html->input_hidden('participants[]',$this->bo->owner):''), - 'errormsg' => ($param['cd']?$GLOBALS['phpgw']->common->check_code($param['cd']):'') - ); - $p->set_var($vars); - -// Brief Description - $var['title'] = Array( - 'tr_color' => $this->theme['th_bg'], - 'field' => lang('Title'), - 'data' => '' - ); - -// Full Description - $var['description'] = Array( - 'field' => lang('Full Description'), - 'data' => '' - ); - -// Display Categories - if(strpos($event['category'],',')) - { - $temp_cats = explode(',',$event['category']); - @reset($temp_cats); - while(list($key,$value) = each($temp_cats)) - { - $check_cats[] = (int)$value; - } - } - elseif($event['category']) - { - $check_cats[] = (int)$event['category']; - } - else - { - $check_cats[] = 0; - } - $var['category'] = Array( - 'field' => lang('Category'), - 'data' => '' - ); - -// Location - $var['location'] = Array( - 'field' => lang('Location'), - 'data' => '' - ); - -// Project - if($ownerApps['projects']) - { - $boprojects = createObject('projects.boprojects'); - $projects = $boprojects->list_projects( array('limit'=>FALSE) ); - $projectOptions = $boprojects->select_project_list - ( - array - ( - 'action' => 'all', - 'status' => 'active', - 'selected' => $event['projectID'] - ) - ); - if(is_array($projects)) - { - $projectData = ''; - } - $var['project'] = Array( - 'field' => lang('Project'), - 'data' => $projectData - ); - } - -// Date - - $start = $this->bo->maketime($event['start']) - $GLOBALS['phpgw']->datetime->tz_offset; - $var['startdate'] = Array( - 'field' => lang('Start Date'), - 'data' => $this->jscal->input('start[str]',$start) - ); - -// Time - if ($this->bo->prefs['common']['timeformat'] == '12') - { - $str .= '= 12?'':' checked').'>am'."\n" - . '= 12?' checked':'').'>pm'."\n"; - } - $var['starttime'] = Array( - 'field' => lang('Start Time'), - 'data' => ':'."\n".$str - ); - -// End Date - $end = $this->bo->maketime($event['end']) - $GLOBALS['phpgw']->datetime->tz_offset; - $var['enddate'] = Array( - 'field' => lang('End Date'), - 'data' => $this->jscal->input('end[str]',$end) - ); - -// End Time - if ($this->bo->prefs['common']['timeformat'] == '12') - { - $str = '= 12?'':' checked').'>am'."\n" - . '= 12?' checked':'').'>pm'."\n"; - } - $var['endtime'] = Array( - 'field' => lang('End Time'), - 'data' => ':'."\n".$str - ); - -// Priority - $var['priority'] = Array( - 'field' => lang('Priority'), - 'data' => $sb->getPriority('cal[priority]',$event['priority']) - ); - -// Access - $var['access'] = Array( - 'field' => lang('Private'), - 'data' => '' - ); - -// Participants - if(!isset($GLOBALS['phpgw_info']['server']['deny_user_grants_access']) || !$GLOBALS['phpgw_info']['server']['deny_user_grants_access']) - { - if (!is_object($GLOBALS['phpgw']->uiaccountsel)) - { - $GLOBALS['phpgw']->uiaccountsel = CreateObject('phpgwapi.uiaccountsel'); - } - $get_args = array('menuaction'=>'calendar.uiforms.freetimesearch'); - if ($event['id']) $get_args['cal_id'] = $event['id']; - $fts_link = $GLOBALS['phpgw']->link('/index.php',$get_args); - - $fields = array('start[str]','start[hour]','start[min]','end[str]','end[hour]','end[min]','cal[recur_type]'); - 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']).' - - '.$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 - - // FIXME: where does the list of external participants come from? - // - $id = '1_h'; - $test_contact[$id] = array(); - $test_contact[$id]['name'] = "Stephan Cremer"; - $id = '3_b'; - $test_contact[$id] = array(); - $test_contact[$id]['name'] = "Stephan_Uni Cremer_Uni"; - - $part = ""; - $ext_disp = ''."\n".'
    '; - - $url = $GLOBALS['phpgw']->link('/index.php', array('menuaction' => 'calendar.uiextpartlist.modify')); - // $url = $GLOBALS['phpgw']->link('/index.php', array('menuaction' => 'calendar.uicalendar.modify_ext_partlist')); - $mod_ext = '\n".$ext_disp."\n" -// DEBUG START -. ''."\n" -// DEBUG END - . ''."\n" - . $this->html->input_hidden('ext_part_id" value="'.$part.'">'."\n"; - - $var[] = Array( - 'field' => "\n".lang('External Participants'), - 'data' => "\n".$mod_ext."\n" - ); -*/ -// I Participate - if((($event['id'] > 0) && isset($event['participants'][$event['owner']])) || !$event['id']) - { - $checked = ' checked'; - } - else - { - $checked = ''; - } - $var['owner'] = Array( - 'field' => $GLOBALS['phpgw']->common->grab_owner_name($event['owner']).' '.lang('Participates'), - 'data' => '' - ); - } - -// Reminder - // The user must use "Alarm Management" to change/modify an alarm - // so only display the email reminder fields if this is a new event - // i.e. not editing an existing event - - if ($event['id'] == 0) { - // get defaults - $days = $this->bo->prefs['calendar']['default_email_days']; - $hours = $this->bo->prefs['calendar']['default_email_hours']; - $min = $this->bo->prefs['calendar']['default_email_min']; - if (count($event['alarm']) > 1) - { - // this should not happen because when creating a new event - // only 1 alarm is displayed on the screen - // if the user wants more than 1 alarm they should - // use "Alarm Management" - echo ''."\n"; - } - // if there was an error pick up what the user entered - if (@isset($event['alarm'])) - { - @reset($event['alarm']); - // just get the first one see above!!! - list($key,$alarm) = @each($event['alarm']); - $diff = $start - $alarm['time']; - $days = (int)($diff / (24*3600)); - $hours = (int)(($diff - ($days * 24 * 3600))/3600); - $min = (int)(($diff - ($days * 24 * 3600) - ($hours * 3600))/60); - } - - // days - $dout = ''."\n".' '.lang('days').' '; - // hours - $hout = ''."\n".' '.lang('hours').' '; - // minutes - $mout = ''."\n".' '.lang('minutes').' '; - - $var['alarm'] = Array( - 'field' => lang('Alarm'), - 'data' => $dout.$hout.$mout.lang('before the event') - ); - - } - -// Repeat Type - $str = ''; - foreach($this->bo->rpt_type as $type => $label) - { - $str .= ''; - } - $var['recur_type'] = Array( - 'field' => lang('Repeat Type'), - 'data' => ''."\n" - ); - - if($event['recur_enddate']['year'] != 0 && $event['recur_enddate']['month'] != 0 && $event['recur_enddate']['mday'] != 0) - { - $checked = ' checked'; - $recur_end = $this->bo->maketime($event['recur_enddate']) - $GLOBALS['phpgw']->datetime->tz_offset; - } - else - { - $checked = ''; - $recur_end = $this->bo->maketime($event['start']) + 86400 - $GLOBALS['phpgw']->datetime->tz_offset; - } - - $var['recur_enddate'] = Array( - 'field' => lang('Repeat End Date'), - 'data' => ''.lang('Use End Date').' '. -/* - $GLOBALS['phpgw']->common->dateformatorder( - $sb->getYears('recur_enddate[year]',(int)$GLOBALS['phpgw']->common->show_date($recur_end,'Y')), - $sb->getMonthText('recur_enddate[month]',(int)$GLOBALS['phpgw']->common->show_date($recur_end,'n')), - $sb->getDays('recur_enddate[mday]',(int)$GLOBALS['phpgw']->common->show_date($recur_end,'d')) - ) -*/ - $this->jscal->input('recur_enddate[str]',$recur_end) - ); - - $i = 0; $boxes = ''; - foreach ($this->bo->rpt_day as $mask => $name) - { - $boxes .= ' '.lang($name)."\n"; - if (++$i == 5) $boxes .= '
    '; - } - $var['recur_day'] = Array( - 'field' => lang('Repeat Day').'
    '.lang('(for weekly)'), - 'data' => $boxes - ); - - $var['recur_interval'] = Array( - 'field' => lang('Interval'), - 'data' => '' - ); - - if (!isset($this->fields)) - { - $this->custom_fields = CreateObject('calendar.bocustom_fields'); - $this->fields = &$this->custom_fields->fields; - $this->stock_fields = &$this->custom_fields->stock_fields; - } - $ownerApps = $GLOBALS['phpgw']->acl->get_user_applications($event['owner']); - if($ownerApps['projects']) - { - // enable project app - $this->fields['project']['disabled'] = false; - } - $preserved = False; - foreach($this->fields as $field => $data) - { - if (!$data['disabled']) - { - if (isset($var[$field])) - { - switch($field) - { - case 'startdate': - $this->output_template_array($p,'row','list',$var['startdate']); - $this->output_template_array($p,'row','list',$var['starttime']); - break; - case 'enddate': - $this->output_template_array($p,'row','list',$var['enddate']); - $this->output_template_array($p,'row','list',$var['endtime']); - break; - case 'recur_type': - $p->set_var('tr_color',$this->theme['th_bg']); - $p->set_var('hr_text','
    '.lang('Repeating Event Information').'
    '); - $p->parse('row','hr',True); - $this->output_template_array($p,'row','list',$var['recur_type']); - $this->output_template_array($p,'row','list',$var['recur_enddate']); - $this->output_template_array($p,'row','list',$var['recur_day']); - $this->output_template_array($p,'row','list',$var['recur_interval']); - break; - default: - $this->output_template_array($p,'row','list',$var[$field]); - } - } - elseif (!isset($this->stock_fields[$field])) // Custom field - { - $lang = lang($name = substr($field,1)); - $size = 'SIZE='.($data['shown'] ? $data['shown'] : ($data['length'] ? $data['length'] : 30)). - ' MAXLENGTH='.($data['length'] ? $data['length'] : 255); - $v = array( - 'field' => $lang == $name.'*' ? $name : $lang, - 'data' => '' - ); - if ($data['title']) - { - $v['tr_color'] = $this->theme['th_bg']; - } - if (!$data['length'] && $data['title']) - { - $p->set_var('tr_color',$this->theme['th_bg']); - $p->set_var('hr_text','
    '.$v['field'].'
    '); - $p->parse('row','hr',True); - } - else - { - $this->output_template_array($p,'row','list',$v); - } - } - } - else // preserve disabled fields - { - switch ($field) - { - case 'owner': - $preserved[$field] = $event['id'] ? $event['participants'][$event['owner']] : 'A'; - break; - case 'recur_type': - foreach(array('recur_type','recur_enddate','recur_data','recur_interval') as $field) - { - $preserved[$field] = $event[$field]; - } - break; - case 'startdate': - case 'enddate': - $field = substr($field,0,-4); - default: - $preserved[$field] = $event[$field]; - } - } - } - unset($var); - if (is_array($preserved)) - { - //echo "preserving
    "; print_r($preserved); echo "
    \n"; - $p->set_var('common_hidden',$p->get_var('common_hidden').$this->html->input_hidden('preserved',serialize($preserved))); - } - $p->set_var('submit_button',lang('Save')); - - $delete_button = $cancel_button = ''; - if ($event['id'] > 0) - { - $var = Array( - 'action_url_button' => $this->page('delete','&cal_id='.$event['id']), - 'action_text_button' => lang('Delete'), - 'action_confirm_button' => "onClick=\"return confirm('".lang("Are you sure\\nyou want to\\ndelete this entry ?\\n\\nThis will delete\\nthis entry for all users.")."')\"", - 'action_extra_field' => '' - ); - $p->set_var($var); - $delete_button = $p->fp('out','form_button'); - } - $p->set_var('delete_button',$delete_button); - - if ($this->bo->return_to) - { - $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link('/index.php','menuaction='.$this->bo->return_to), - 'action_text_button' => lang('Cancel'), - 'action_confirm_button' => '', - 'action_extra_field' => '' - ); - $p->set_var($var); - $cancel_button = $p->fp('out','form_button'); - } - $p->set_var('cancel_button',$cancel_button); - $p->pparse('out','edit_entry'); - } - - // modify list of an event's external participants (i.e. non pgpgw users) - // - function modify_ext_partlist() - { - $GLOBALS['phpgw_info']['flags']['noheader'] = True; - $GLOBALS['phpgw_info']['flags']['nonavbar'] = True; - $GLOBALS['phpgw_info']['flags']['noappheader'] = True; - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - - $total_contacts = 0; - $participant = array(); - $control_data= array(); - - $control_data['action'] = ''; - $control_data['delete'] = array(); - $control_data['part'] = array(); - - $p = CreateObject('phpgwapi.Template',$this->template_dir); - $p->set_file( - Array( - 'T_edit_partlist' => 'edit_partlist.tpl', - 'T_edit_partlist_blocks' => 'edit_partlist_blocks.tpl' - ) - ); - - $p->set_block('T_edit_partlist_blocks','B_alert_msg','V_alert_msg'); - $p->set_block('T_edit_partlist_blocks','B_partlist','V_partlist'); - $p->set_block('T_edit_partlist_blocks','B_participants_none','V_participants_none'); - $p->set_block('T_edit_partlist_blocks','B_delete_btn','V_delete_btn'); - - global $query_addr; - $sb = CreateObject('phpgwapi.sbox2'); - $addy = $sb->getAddress('addr','',$query_addr); - - $add_ext = $addy['doSearchFkt']; - $add_ext .= $addy['addr_title']!=lang('Address Book')?$addy['addr_title']:''; - $add_ext .= " ".$addy['addr'].$addy['addr_nojs']; - - $p->set_var('text_add_name',$add_ext); - - if(isset($_GET['part']) && $_GET['part']) - { - $control_data['part'] = split(",", $_GET['part']); - } - else - { - $control_data['part'] = $_POST['participant']; - $control_data['action'] = $_POST['action']; - $control_data['delete'] = $_POST['delete']; - } - - for ($i=0; $iread_contact($id); - - $participant[$id] = array(); - $participant[$id]['name'] = $contact['n_given'].' '.$contact['n_family']; - } - - if ($control_data['action'] == lang('Delete selected contacts')) - { - for ($i=0; $iread_contact($id); - $participant[$id] = array(); - $participant[$id]['name'] = $contact['n_given'].' '.$contact['n_family']; - } - } - - // create list of currently selected contacts - // - while(list($id,$contact) = each($participant)) - { - $p->set_var('hidden_delete_name','participant[]'); - $p->set_var('hidden_delete_value',$id); - $p->set_var('ckbox_delete_name','delete[]'); - $p->set_var('ckbox_delete_value',$id); - $p->set_var('ckbox_delete_participant',$contact['name']); - $p->parse('V_partlist','B_partlist',True); - $total_contacts++; - } - - if ($total_contacts == 0) - { - // no contacts have been selected - // => clear the delete form, remove delete button and show the none block - // - $p->set_var('V_partlist',''); - $p->set_var('V_delete_btn',''); - $p->set_var('text_none',lang('None')); - $p->parse('V_participants_none','B_participants_none'); - } - else - { - // at least one contact has been selected - // => clear the none block, fill the delete form and add delete button - // - $p->set_var('V_participants_none',''); - $p->set_var('btn_delete_name','action'); - $p->set_var('btn_delete_value',lang('Delete selected contacts')); - $p->parse('V_delete_btn','B_delete_btn'); - } - - $body_tags = 'bgcolor="'.$GLOBALS['phpgw_info']['theme']['bg_color'] - . '" alink="'.$GLOBALS['phpgw_info']['theme']['alink'] - . '" link="'.$GLOBALS['phpgw_info']['theme']['link'] - .'" vlink="'.$GLOBALS['phpgw_info']['theme']['vlink'].'"'; - - $form_action = $GLOBALS['phpgw']->link('/index.php', array('menuaction' => 'calendar.uicalendar.modify')); - - $charset = lang('charset'); - $p->set_var('charset',$charset); - $p->set_var('page_title',$GLOBALS['phpgw_flags']['currentapp'] - . ' - ' .lang('External Participants')); - $p->set_var('font_family',$GLOBALS['phpgw_info']['theme']['font']); - $p->set_var('body_tags',$body_tags); - $p->set_var('form_method','POST'); - $p->set_var('form_action',$form_action); - $p->set_var('text_add_contact',lang('External Participants')); - $p->set_var('text_contacts_selected',lang('Selected contacts (%1)',$total_contacts)); - $p->set_var('btn_add_name','action'); - $p->set_var('btn_add_value',lang('Add Contact')); - $p->set_var('btn_done_name','done'); - $p->set_var('btn_done_value',lang('Done')); - $p->set_var('btn_done_js','copyback()'); - $p->set_var('form1_name','ext_form'); - - $p->pfp('out','T_edit_partlist'); - } - - function read_contact($id) - { - $query_fields = Array( - 'n_given' => 'n_given', - 'n_family' => 'n_family', - 'email' => 'email', - 'email_home' => 'email_home' - ); - - /* - if ($this->rights & PHPGW_ACL_READ) - { - return $this->contacts->read_single_entry($id,$fields); - } - else - { - $rtrn = array(0 => array('No access' => 'No access')); - return $rtrn; - } - */ - - $contacts = CreateObject('phpgwapi.contacts', False); - return $contacts->read_single_entry($id,$query_fields); - } - - function build_part_list(&$users,$accounts,$owner) - { - if(!is_array($accounts)) - { - return; - } - foreach($accounts as $id) - { - $id = (int)$id; - if($id == $owner) - { - continue; - } - elseif(!isset($users[$id])) - { - if($GLOBALS['phpgw']->accounts->exists($id) == True) - { - $users[$id] = Array( - 'name' => $GLOBALS['phpgw']->common->grab_owner_name($id), - 'type' => $GLOBALS['phpgw']->accounts->get_type($id) - ); - } - if($GLOBALS['phpgw']->accounts->get_type($id) == 'g') - { - $this->build_part_list($users,$GLOBALS['phpgw']->acl->get_ids_for_location($id,1,'phpgw_group'),$owner); - } - } - } - if (!function_exists('strcmp_name')) - { - function strcmp_name($arr1,$arr2) - { - if ($diff = strcmp($arr1['type'],$arr2['type'])) - { - return $diff; // groups before users - } - return strnatcasecmp($arr1['name'],$arr2['name']); - } - } - uasort($users,'strcmp_name'); - } - - function set_week_array($startdate,$cellcolor,$weekly) - { - for ($j=0,$datetime=$startdate;$j<7;$j++,$datetime += 86400) - { - $date = date('Ymd',$datetime + (60 * 60 * 2)); // +2h to be save when switching to and from dst, $datetime is alreay + TZ-Offset - print_debug('set_week_array : Date ',$date); - - if($events = $this->bo->cached_events[$date]) - { - print_debug('Date',$date); - print_debug('Appointments Found',count($events)); - - if (!$this->bo->prefs['calendar']['show_rejected']) - { - $appts = False; - foreach($events as $event) // check for a not-rejected event - { - if (!$this->bo->rejected_no_show($event)) - { - $appts = True; - break; - } - } - } - else - { - $appts = True; - } - } - else - { - $appts = False; - } - - $holidays = $this->bo->cached_holidays[$date]; - if($weekly) - { - $cellcolor = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($cellcolor); - } - - $day_image = ''; - if($holidays) - { - $extra = ' bgcolor="'.$this->bo->holiday_color.'"'; - $class = ($appts?'b':'').'minicalhol'; - if ($date == $this->bo->today) - { - $day_image = ' background="'.$GLOBALS['phpgw']->common->image('calendar','mini_day_block').'"'; - } - } - elseif ($date != $this->bo->today) - { - $extra = ' bgcolor="'.$cellcolor.'"'; - $class = ($appts?'b':'').'minicalendar'; - } - else - { - $extra = ' bgcolor="'.$GLOBALS['phpgw_info']['theme']['cal_today'].'"'; - $class = ($appts?'b':'').'minicalendar'; - $day_image = ' background="'.$GLOBALS['phpgw']->common->image('calendar','mini_day_block').'"'; - } - - if($this->bo->printer_friendly && @$this->bo->prefs['calendar']['print_black_white']) - { - $extra = ''; - } - - if(!$this->bo->printer_friendly && $this->bo->check_perms(PHPGW_ACL_ADD)) - { - $new_event = True; - } - else - { - $new_event = False; - } - $holiday_name = Array(); - if($holidays) - { - for($k=0;$k $extra, - 'new_event' => $new_event, - 'holidays' => $holiday_name, - 'appts' => $appts, - 'week' => $week, - 'day_image' => $day_image, - 'class' => $class - ); - } - - if($this->debug) - { - _debug_array($daily); - } - - return $daily; - } - } -?> diff --git a/calendar/inc/class.uicustom_fields.inc.php b/calendar/inc/class.uicustom_fields.inc.php deleted file mode 100644 index 55adb0307a..0000000000 --- a/calendar/inc/class.uicustom_fields.inc.php +++ /dev/null @@ -1,212 +0,0 @@ - * - * -------------------------------------------- * - * 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$ */ - - require_once(PHPGW_INCLUDE_ROOT.'/calendar/inc/class.bocustom_fields.inc.php'); - $GLOBALS['phpgw_info']['flags']['included_classes']['bocustom_fields'] = True; // for 0.9.14 - - class uicustom_fields extends bocustom_fields - { - var $public_functions = array( - 'index' => True, - 'submited' => True - ); - - function uicustom_fields() - { - $this->bocustom_fields(); // call constructor of extended class - - $this->tpl = $GLOBALS['phpgw']->template; - if (!is_object($GLOBALS['phpgw']->nextmatchs)) - { - $GLOBALS['phpgw']->nextmatchs = CreateObject('phpgwapi.nextmatchs'); - } - if (!is_object($GLOBALS['phpgw']->html)) - { - $GLOBALS['phpgw']->html = CreateObject('phpgwapi.html'); - } - $this->html = &$GLOBALS['phpgw']->html; - - // jscalendar is needed by the new navigation-menu AND it need to be loaded befor the header !!! - if (!is_object($GLOBALS['phpgw']->jscalendar)) - { - $GLOBALS['phpgw']->jscalendar = CreateObject('phpgwapi.jscalendar'); - } - } - - function index($error='') - { - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Custom fields and sorting'); - $GLOBALS['phpgw']->common->phpgw_header(); - - $this->tpl = $GLOBALS['phpgw']->template; - - $this->tpl->set_unknowns('remove'); - $this->tpl->set_file(array( - 'custom_fields_tpl' => 'custom_fields.tpl' - )); - $this->tpl->set_block('custom_fields_tpl','custom_fields','custom_fields'); - $this->tpl->set_block('custom_fields_tpl','row','row'); - - $n = 0; - foreach($this->fields as $field => $data) - { - $data['order'] = ($n += 10); - if (isset($this->stock_fields[$field])) - { - $this->set_row($data,$field); - } - else - { - $this->set_row($data,$field,'delete','Delete'); - } - } - $this->tpl->set_var(array( - 'hidden_vars' => '', - 'lang_error' => $error, - 'lang_name' => lang('Name'), - 'lang_length' => lang('Length
    (<= 255)'), - 'lang_shown' => lang('Length shown
    (emtpy for full length)'), - 'lang_order' => lang('Order'), - 'lang_title' => lang('Title-row'), - 'lang_disabled'=> lang('Disabled'), - 'action_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=calendar.uicustom_fields.submited'), - 'save_button' => $this->html->submit_button('save','Save'), - 'cancel_button'=> $this->html->submit_button('cancel','Cancel'), - )); - - $this->set_row(array('order' => $n+10),'***new***','add','Add'); - - $this->tpl->pfp('out','custom_fields'); - } - - function set_row($values,$id='',$name='',$label='') - { - if ($id !== '') - { - $id = '['.htmlspecialchars($id).']'; - } - $this->tpl->set_var(array( - 'name' => $values['label'] ? lang($values['label']) : $this->html->input('name'.$id,$values['name'],'','SIZE="40" MAXLENGTH="40"'), - 'length' => $values['label'] ? ' ' : $this->html->input('length'.$id,$values['length'],'','SIZE="3"'), - 'shown' => $values['label'] ? ' ' : $this->html->input('shown'.$id,$values['shown'],'','SIZE="3"'), - 'order' => $this->html->input('order'.$id,$values['order'],'','SIZE="3"'), - 'title' => $this->html->checkbox('title'.$id,$values['title']), - 'disabled'=> $this->html->checkbox('disabled'.$id,$values['disabled']), - 'button' => $name ? $this->html->submit_button($name.$id,$label) : ' ' - )); - if ($name !== 'add') - { - $this->tpl->set_var('tr_color',$values['title'] ? $GLOBALS['phpgw_info']['theme']['th_bg'] : $GLOBALS['phpgw']->nextmatchs->alternate_row_color()); - $this->tpl->parse('rows','row',True); - } - } - - function submited() - { - if ($_POST['cancel']) - { - $GLOBALS['phpgw']->redirect_link('/admin/'); - } - //echo "
    "; print_r($_POST); echo "
    "; - - foreach ($_POST['order'] as $field => $order) - { - if (isset($_POST['delete'][$field]) || $field == '***new***') - { - continue; - } - while(isset($ordered[$order])) - { - ++$order; - } - $ordered[$order] = array( - 'field' => $field, - 'name' => stripslashes($_POST['name'][$field]), - 'length' => (int)$_POST['length'][$field], - 'shown' => (int)$_POST['shown'][$field], - 'title' => !!$_POST['title'][$field], - 'disabled' => !!$_POST['disabled'][$field] - ); - if (isset($this->stock_fields[$field])) - { - $ordered[$order]['name'] = $this->fields[$field]['name']; - $ordered[$order]['label'] = $this->fields[$field]['label']; - } - } - if (isset($_POST['add']) || strlen($_POST['name']['***new***'])) - { - $name = stripslashes($_POST['name']['***new***']); - - if (!strlen($name) || array_search($name,$_POST['name']) != '***new***') - { - $error .= lang('New name must not exist and not be empty!!!'); - } - else - { - $order = $_POST['order']['***new***']; - while(isset($_POST['order'][$order])) - { - ++$order; - } - $ordered[$order] = array( - 'field' => '#'.$name, - 'name' => $name, - 'length' => (int)$_POST['length']['***new***'], - 'shown' => (int)$_POST['shown']['***new***'], - 'title' => !!$_POST['title']['***new***'], - 'disabled' => !!$_POST['disabled']['***new***'] - ); - } - } - //echo "
    "; print_r($ordered); echo "
    \n"; - ksort($ordered,SORT_NUMERIC); - - $this->fields = array(); - foreach($ordered as $order => $data) - { - if ($data['length'] > 255) - { - $data['length'] = 255; - } - if ($data['length'] <= 0) - { - unset($data['length']); - } - if ($data['shown'] >= $data['length'] || $data['shown'] <= 0) - { - unset($data['shown']); - } - if (!$data['title']) - { - unset($data['title']); - } - if (!$data['disabled']) - { - unset($data['disabled']); - } - $field = $data['field']; - unset($data['field']); - $this->fields[$field] = $data; - } - if (!$error && isset($_POST['save'])) - { - $this->save(); - $GLOBALS['phpgw']->redirect_link('/admin/'); - } - $this->index($error); - } - } -?> diff --git a/calendar/inc/class.uiforms.inc.php b/calendar/inc/class.uiforms.inc.php index 0bdf71e998..a820362bef 100644 --- a/calendar/inc/class.uiforms.inc.php +++ b/calendar/inc/class.uiforms.inc.php @@ -2,7 +2,7 @@ /**************************************************************************\ * eGroupWare - Calendar - forms of the UserInterface * * http://www.egroupware.org * -* Written and (c) 2004 by Ralf Becker * +* Written and (c) 2004/5 by Ralf Becker * * -------------------------------------------- * * 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 * @@ -12,19 +12,33 @@ /* $Id$ */ -include_once(PHPGW_INCLUDE_ROOT . '/calendar/inc/class.uical.inc.php'); +include_once(EGW_INCLUDE_ROOT . '/calendar/inc/class.uical.inc.php'); /** - * calendar UserInterface forms + * calendar UserInterface forms: view and edit events, freetime search + * + * The new UI, BO and SO classes have a strikt definition, in which time-zone they operate: + * UI only operates in user-time, so there have to be no conversation at all !!! + * BO's functions take and return user-time only (!), they convert internaly everything to servertime, because + * SO operates only on server-time + * + * The state of the UI elements is managed in the uical class, which all UI classes extend. + * + * All permanent debug messages of the calendar-code should done via the debug-message method of the bocal class !!! * * @package calendar - * @author RalfBecker@outdoor-training.de - * @license GPL + * @author Ralf Becker + * @copyright (c) 2004/5 by RalfBecker-At-outdoor-training.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License */ class uiforms extends uical { var $public_functions = array( 'freetimesearch' => True, + 'edit' => true, + 'view' => true, + 'export' => true, + 'import' => true, ); /** @@ -32,24 +46,713 @@ class uiforms extends uical */ function uiforms() { - $this->uical(); // call the parent's constructor + $this->uical(true); // call the parent's constructor + + $this->link =& $this->bo->link; + } + + /** + * View a calendar event + */ + function view() + { + return $this->edit(null,array('view' => true)); + } + + /** + * Create a default event (adding a new event) by evaluating certain _GET vars + * + * @return array event-array + */ + function &default_add_event() + { + $owner = (int) (isset($_GET['owner']) ? $_GET['owner'] : $this->owner); + if (!$owner || !$this->bo->check_perms(EGW_ACL_ADD,0,$owner)) $owner = $this->user; + //echo "

    this->owner=$this->owner, _GET[owner]=$_GET[owner], user=$this->user => owner=$owner

    \n"; + + $start = $this->bo->date2ts(array( + 'full' => isset($_GET['date']) && (int) $_GET['date'] ? (int) $_GET['date'] : $this->date, + 'hour' => (int) (isset($_GET['hour']) && (int) $_GET['hour'] ? $_GET['hour'] : $this->bo->cal_prefs['workdaystarts']), + 'minute' => (int) $_GET['minute'], + )); + //echo "

    _GET[date]=$_GET[date], _GET[hour]=$_GET[hour], _GET[minute]=$_GET[minute], this->date=$this->date ==> start=$start=".date('Y-m-d H:i',$start)."

    \n"; + + $participant_types = array('u' => array($owner => $owner == $this->user ? 'A' : 'U')); + $participants = array($owner => $owner == $this->user ? 'A' : 'U'); + if ($_GET['participants']) + { + foreach(explode(',',$_GET['participants']) as $uid) + { + if (is_numeric($uid)) + { + $participants[$uid] = $participant_types['u'][$uid] = $uid == $this->user ? 'A' : 'U'; + } + elseif (is_array($this->bo->resources[$uid{0}])) + { + $res_data = $this->bo->resources[$uid{0}]; + list($id,$quantity) = explode(':',substr($uid,1)); + $participants[$uid] = $participant_types[$uid{0}][$id] = ($res_data['new_status'] ? ExecMethod($res_data['new_status'],$id) : 'U'). + ((int) $quantity > 1 ? (int)$quantity : ''); + // if new_status == 'x', resource is not bookable + if(strstr($participant_types[$uid{0}][$id],'x')) + { + unset($participant_types[$uid{0}][$id]); + unset($participants[$uid]); + } + } + } + } + return array( + 'participant_types' => $participant_types, + 'participants' => $participants, + 'owner' => $owner, + 'start' => $start, + 'end' => $start + (int) $this->bo->cal_prefs['defaultlength']*60, + 'priority' => 2, // normal + 'public'=> $this->cal_prefs['default_private'] ? 0 : 1, + 'alarm' => array(), + ); + } + + /** + * Process the edited event and evtl. call edit to redisplay it + * + * @param array $content posted eTemplate content + */ + function process_edit($content) + { + //echo "content submitted="; _debug_array($content); + list($button) = @each($content['button']); + unset($content['button']); + + $view = $content['view'] && $button != 'edit' && $button != 'edit_series'; + // if we edit a single recurrance, we need to remember it for save and need to reset the recur information + if ($button == 'edit' && $content['recur_type'] != MCAL_RECUR_NONE) + { + $content['edit_single'] = $content['start']; + $content['recur_type'] = MCAL_RECUR_NONE; + foreach(array('recur_enddate','recur_interval','recur_exception','recur_data') as $name) + { + unset($content[$name]); + } + } + if ($view && $button == 'vcal') + { + $msg = $this->export($content['id'],true); + } + // delete a recur-exception + if ($content['recur_exception']['delete_exception']) + { + list($date) = each($content['recur_exception']['delete_exception']); + unset($content['recur_exception']['delete_exception']); + if (($key = array_search($date,$content['recur_exception'])) !== false) + { + unset($content['recur_exception'][$key]); + $content['recur_exception'] = array_values($content['recur_exception']); + } + } + // delete an alarm + if ($content['alarm']['delete_alarm']) + { + list($id) = each($content['alarm']['delete_alarm']); + //echo "delete alarm $id"; _debug_array($content['alarm']['delete_alarm']); + + if ($content['id']) + { + if ($this->bo->delete_alarm($id)) + { + $msg = lang('Alarm deleted'); + unset($content['alarm'][$id]); + } + else + { + $msg = lang('Permission denied'); + } + } + else + { + unset($content['alarm'][$id]); + } + } + $event = $content; + unset($event['new_alarm']); + unset($event['alarm']['delete_alarm']); + + if (isset($content['participants']['accounts']) && !(isset($content['view']) && $content['view'])) // convert content => event + { + //echo "participants-data"; _debug_array($content['participants']); + $event['participants'] = $event['participant_types'] = array(); + foreach($content['participants'] as $app => $participants) + { + if (!$participants) continue; + + $type = 'u'; + foreach($this->bo->resources as $t => $data) + { + if ($data['app'] == $app) + { + $type = $t; + break; + } + } + foreach(is_array($participants) ? $participants : explode(',',$participants) as $id) + { + if (is_array($id)) continue; // ignore the status + list($id,$quantity) = explode(':',$id); + $event['participants'][$type == 'u' ? (int) $id : $type.$id] = $event['participant_types'][$type][$id] = + // for existing participants use their old status (dont change it) + (isset($content['participant_types'][$type][$id]) ? $content['participant_types'][$type][$id]{0} : + // for new participants check if they have a 'new_status' resource-methode to determine the status + (isset($this->bo->resources[$type]['new_status']) ? ExecMethod($this->bo->resources[$type]['new_status'],$id) : + // if not use 'A'=accepted for the current user and 'U' otherwise + ($type == 'u' && $id == $this->bo->user ? 'A' : 'U'))).((int) $quantity > 1 ? (int)$quantity : ''); + // ToDo: move this logic into bocal + } + } + if ($event['start'] > $event['end']) // end need to be after start, otherwise swap them + { + $event['start'] = $content['end']; + $event['end'] = $content['start']; + } + if ($content['whole_day']) + { + $event['start'] = $this->bo->date2array($event['start']); + $event['start']['hour'] = $event['start']['minute'] = 0; unset($event['start']['raw']); + $event['start'] = $this->bo->date2ts($event['start']); + $event['end'] = $this->bo->date2array($event['end']); + $event['end']['hour'] = 23; $event['end']['minute'] = $event['end']['second'] = 59; unset($event['end']['raw']); + $event['end'] = $this->bo->date2ts($event['end']); + } + // some checks for recurances, if you give a date, make it a weekly repeating event and visa versa + if ($event['recur_type'] == MCAL_RECUR_NONE && $event['recur_data']) $event['recur_type'] = MCAL_RECUR_WEEKLY; + if ($event['recur_type'] == MCAL_RECUR_WEEKLY && !$event['recur_data']) + { + $event['recur_data'] = 1 << (int)date('w',$event['start']); + } + } + else // status change view + { + foreach($event['participants'] as $name => $data) + { + if (!is_array($data)) continue; + + $type = 'u'; + foreach($this->bo->resources as $t => $d) + { + if ($d['app'] == $name) + { + $type = $t; + break; + } + } + // checking for status changes + foreach($data[$name.'_status'] as $uid => $status) + { + list($uid,$quantity) = explode(':',$uid); + //echo "checking $type: $uid $status against old ".$event['participant_types'][$type][$uid]."
    \n"; + if ($event['participant_types'][$type][$uid]{0} != $status{0}) // status changed by user + { + if ($this->bo->set_status($event['id'],$type,$uid,$status,$event['recur_type'] != MCAL_RECUR_NONE ? $event['start'] : 0)) + { + $event['participants'][$type == 'u' ? (int) $uid : $type.$uid] = + $event['participant_types'][$type][$uid] = $status.$quantity; + // refreshing the calendar-view with the changed participant-status + $msg = lang('Status changed'); + if (!$preserv['no_popup']) + { + $js = 'opener.location.href=\''.addslashes($GLOBALS['egw']->link('/index.php',array( + 'menuaction' => $content['referer'], + 'msg' => $msg, + ))).'\';'; + } + } + } + } + unset($event['participants'][$name]); // unset the status-changes from the event + } + } + $preserv = array( + 'view' => $view, + 'edit_single' => $content['edit_single'], + 'referer' => $content['referer'], + 'no_popup' => $content['no_popup'], + ); + switch($button) + { + case 'edit_series': + if ($content['recur_type'] != MCAL_RECUR_NONE) + { + // need to reload start and end of the serie + $event = $this->bo->read($event['id'],0); + } + break; + + case 'copy': // create new event with copied content, some content need to be unset to make a "new" event + unset($event['id']); + unset($event['uid']); + unset($event['alarm']); + unset($event['reference']); + unset($event['recur_exception']); + unset($event['edit_single']); // in case it has been set + unset($event['modified']); + unset($event['modifier']); + $event['owner'] = !(int)$this->owner || !$this->bo->check_perms(EGW_ACL_ADD,0,$this->owner) ? $this->user : $this->owner; + $preserv['view'] = $preserv['edit_single'] = false; + $msg = lang('Event copied - the copy can now be edited'); + $event['title'] = lang('Copy of:').' '.$event['title']; + break; + + case 'ignore': + $ignore_conflicts = true; + $button = $event['button_was']; // save or apply + unset($event['button_was']); + // fall through + case 'save': + case 'apply': + if ($event['id'] && !$this->bo->check_perms(EGW_ACL_EDIT,$event)) + { + $msg = lang('Permission denied'); + break; + } + if ($content['edit_single']) // we edited a single event from a series + { + $event['reference'] = $event['id']; + unset($event['id']); + unset($event['uid']); + $conflicts = $this->bo->update($event,$ignore_conflicts); + if (!is_array($conflicts) && $conflicts) + { + // now we need to add the original start as recur-execption to the series + $recur_event = $this->bo->read($event['reference']); + $recur_event['recur_exception'][] = $content['edit_single']; + $this->bo->update($recur_event,true); // no conflict check here + unset($recur_event); + unset($event['edit_single']); // if we further edit it, it's just a single event + } + else // conflict or error, we need to reset everything to the state befor we tried to save it + { + $event['id'] = $event['reference']; + unset($event['reference']); + $event['uid'] = $content['uid']; + } + } + else // we edited a non-reccuring event or the whole series + { + $conflicts = $this->bo->update($event,$ignore_conflicts); + unset($event['ignore']); + } + if (is_array($conflicts)) + { + $event['button_was'] = $button; // remember for ignore + return $this->conflicts($event,$conflicts,$preserv); + } + elseif($conflicts) // true and non-array means Ok ;-) + { + $msg .= ($msg ? ', ' : '') . lang('Event saved'); + + // writing links for new entry, existing ones are handled by the widget itself + if (!$content['id'] && is_array($content['link_to']['to_id'])) + { + $this->link->link('calendar',$event['id'],$content['link_to']['to_id']); + } + $js = 'opener.location.href=\''.addslashes($GLOBALS['egw']->link('/index.php',array( + 'menuaction' => $content['referer'], + 'msg' => $msg, + ))).'\';'; + + if ($content['custom_mail']) + { + $js = $this->custom_mail($event,!$content['id'])."\n".$js; // first open the new window and then update the view + unset($event['custom_mail']); + } + } + else + { + $msg = lang('Error: saving the event !!!'); + } + break; + + case 'delete': + case 'delete_series': + if (!$this->bo->check_perms(EGW_ACL_DELETE,$event)) break; + if (!$content['edit_series'] && $button == 'delete' && $event['recur_type'] != MCAL_RECUR_NONE) // delete a single event from a recuring event + { + $this->bo->delete($event['id'],$event['start']); + } + else + { + $this->bo->delete($event['id']); + } + $msg = lang('Event deleted'); + $js = 'opener.location.href=\''.addslashes($GLOBALS['egw']->link('/index.php',array( + 'menuaction' => $content['referer'], + 'msg' => $msg, + ))).'\';'; + break; + + case 'freetime': + if (!is_object($GLOBALS['egw']->js)) + { + $GLOBALS['egw']->js =& CreateObject('phpgwapi.javascript'); + } + // the "click" has to be in onload, to make sure the button is already created + $GLOBALS['egw']->js->set_onload("document.getElementsByName('exec[freetime]')[0].click();"); + break; + + case 'add_alarm': + if ($this->bo->check_perms(EGW_ACL_EDIT,!$content['new_alarm']['owner'] ? $event : 0,$content['new_alarm']['owner'])) + { + $offset = DAY_s * $content['new_alarm']['days'] + HOUR_s * $content['new_alarm']['hours'] + 60 * $content['new_alarm']['mins']; + $alarm = array( + 'offset' => $offset, + 'time' => $content['start'] - $offset, + 'all' => !$content['new_alarm']['owner'], + 'owner' => $content['new_alarm']['owner'] ? $content['new_alarm']['owner'] : $this->user, + ); + if ($alarm['time'] < $this->bo->now_su) + { + $msg = lang("Can't add alarms in the past !!!"); + } + elseif ($event['id']) // save the alarm immediatly + { + if(($alarm_id = $this->bo->save_alarm($event['id'],$alarm))) + { + $alarm['id'] = $alarm_id; + $event['alarm'][$alarm_id] = $alarm; + + $msg = lang('Alarm added'); + } + else + { + $msg = lang('Error adding the alarm'); + } + } + else + { + for($alarm['id']=1; isset($event['alarm'][$alarm['id']]); $alarm['id']++); // get a temporary non-conflicting, numeric id + $event['alarm'][$alarm['id']] = $alarm; + } + } + else + { + $msg = lang('Permission denied'); + } + break; + } + if (in_array($button,array('cancel','save','delete','delete_series'))) + { + if ($content['no_popup']) + { + $GLOBALS['egw']->redirect_link('/index.php',array( + 'menuaction' => $content['referer'], + 'msg' => $msg, + )); + } + $js .= 'window.close();'; + echo "\n"; + $GLOBALS['egw']->common->egw_exit(); + } + return $this->edit($event,$preserv,$msg,$js,$content['link_to']['to_id']); + } + + /** + * return javascript to open felamimail compose window with preset content to mail all participants + * + * @param array $event + * @param boolean $added + * @return string javascript window.open command + */ + function custom_mail($event,$added) + { + $to = array(); + foreach($event['participants'] as $uid => $status) + { + if (is_numeric($uid) && $uid != $this->user && $status != 'R' && $GLOBALS['egw']->accounts->get_type($uid) == 'u') + { + $GLOBALS['egw']->accounts->get_account_name($uid,$lid,$firstname,$lastname); + + $to[] = $GLOBALS['egw']->common->display_fullname('',$firstname,$lastname). + ' <'.$GLOBALS['egw']->accounts->id2name($uid,'account_email').'>'; + } + } + list($subject,$body) = $this->bo->get_update_message($event,$added ? MSG_ADDED : MSG_MODIFIED); // update-message is in TZ of the user + + /*$ics = ExecMethod('calendar.boicalendar.export',array( + 'l_event_id' => array($event), + 'method' => 'request', + 'chunk_split' => False + ));*/ + $boical =& CreateObject('calendar.boical'); + $ics = $boical->exportVCal(array($event),'request'); + + $ics_file = tempnam($GLOBALS['egw_info']['server']['temp_dir'],'ics'); + if(($f = fopen($ics_file,'w'))) + { + fwrite($f,$ics); + fclose($f); + } + $send->AddStringAttachment($ics, 'cal.ics', '8bit', 'text/calendar; method=request'); + + $vars = array( + 'menuaction' => 'felamimail.uicompose.compose', + 'preset[to]' => implode(', ',$to), + 'preset[subject]' => $subject, + 'preset[body]' => $body, + 'preset[name]' => 'event.ics', + 'preset[file]' => $ics_file, + 'preset[type]' => 'text/calendar; method=request', + 'preset[size]' => filesize($ics_file), + ); + return "window.open('".addslashes($GLOBALS['egw']->link('/index.php',$vars))."','_blank','width=700,height=700,scrollbars=yes,status=no');"; + } + + /** + * Edit a calendar event + * + * @param array $event=null Event to edit, if not $_GET['cal_id'] contains the event-id + * @param array $perserv=null following keys: + * view boolean view-mode, if no edit-access we automatic fallback to view-mode + * referer string menuaction of the referer + * no_popup boolean use a popup or not + * edit_single int timestamp of single event edited, unset/null otherwise + * @param string $msg='' msg to display + * @param string $js='window.focus();' javascript to include in the page + * @param mixed $link_to_id='' $content from or for the link-widget + */ + function edit($event=null,$preserv=null,$msg='',$js = 'window.focus();',$link_to_id='') + { + $etpl =& CreateObject('etemplate.etemplate','calendar.edit'); + + if (!is_array($event)) + { + $preserv = array( + 'no_popup' => isset($_GET['no_popup']), + 'referer' => preg_match('/menuaction=([^&]+)/',$_SERVER['HTTP_REFERER'],$matches) ? $matches[1] : $this->view_menuaction, + 'view' => $preserv['view'], + ); + $cal_id = (int) $_GET['cal_id']; + + if (!$cal_id || $cal_id && !($event = $this->bo->read($cal_id,$_GET['date'])) || !$this->bo->check_perms(EGW_ACL_READ,$event)) + { + if ($cal_id) + { + if (!$preserv['no_popup']) + { + $js = "alert('".lang('Permission denied')."'); window.close();"; + } + else + { + $GLOBALS['egw']->common->egw_header(); + parse_navbar(); + echo '

    '.lang('Permission denied')."

    \n"; + $GLOBALS['egw']->common->egw_exit(); + } + } + $event =& $this->default_add_event(); + } + // check if the event is the whole day + $start = $this->bo->date2array($event['start']); + $end = $this->bo->date2array($event['end']); + $event['whole_day'] = !$start['hour'] && !$start['minute'] && $end['hour'] == 23 && $end['minute'] == 59; + + $link_to_id = $event['id']; + if (!$add_link && !$event['id'] && isset($_GET['link_app']) && isset($_GET['link_id']) && + preg_match('/^[a-z_0-9-]+:[:a-z_0-9-]+$/i',$_GET['link_app'].':'.$_GET['link_id'])) // gard against XSS + { + $this->link->link('calendar',$link_to_id,$_GET['link_app'],$_GET['link_id']); + } + } + $view = $preserv['view'] = $preserv['view'] || $event['id'] && !$this->bo->check_perms(EGW_ACL_EDIT,$event); + //echo "view=$view, event="; _debug_array($event); + $content = array_merge($event,array( + 'link_to' => array( + 'to_id' => $link_to_id, + 'to_app' => 'calendar', + ), + 'edit_single' => $preserv['edit_single'], // need to be in content too, as it is used in the template + 'view' => $view, + )); + $content['participants'] = array(); + foreach($event['participant_types'] as $type => $participants) + { + $name = 'accounts'; + if (isset($this->bo->resources[$type])) + { + $name = $this->bo->resources[$type]['app']; + } +// _debug_array($participants); + foreach($participants as $id => $status) + { + $content['participants'][$name][] = $id . (substr($status,1) > 1 ? (':'.substr($status,1)) : ''); + } + + if ($view) + { + $content['participants'][$name][$name.'_status'] = $participants; + foreach($participants as $id => $status) + { + $readonlys[$name.'_status['.$id.']'] = !$this->bo->check_perms(EGW_ACL_EDIT,0,($type != 'u' ? $type : '').$id); + } + } + } +// echo '$content[participants]'; _debug_array($content['participants']); +// echo '$content[participant_types]'; _debug_array($content['participant_types']); +// _debug_array($sel_options); + $preserv = array_merge($preserv,$view ? $event : $content); + + if ($event['alarm']) + { + // makes keys of the alarm-array starting with 1 + $content['alarm'] = array(false); + foreach(array_values($event['alarm']) as $id => $alarm) + { + if (!$alarm['all'] && !$this->bo->check_perms(EGW_ACL_READALARM,0,$alarm['owner'])) + { + continue; // no read rights to the calendar of the alarm-owner, dont show the alarm + } + $alarm['all'] = (int) $alarm['all']; + $days = (int) ($alarm['offset'] / DAY_s); + $hours = (int) (($alarm['offset'] % DAY_s) / HOUR_s); + $minutes = (int) (($alarm['offset'] % HOUR_s) / 60); + $label = array(); + if ($days) $label[] = $days.' '.lang('days'); + if ($hours) $label[] = $hours.' '.lang('hours'); + if ($minutes) $label[] = $minutes.' '.lang('Minutes'); + $alarm['offset'] = implode(', ',$label); + $content['alarm'][] = $alarm; + + $readonlys['delete_alarm['.$id.']'] = !$this->bo->check_perms(EGW_ACL_EDIT,$alarm['all'] ? $event : 0,$alarm['owner']); + } + } + else + { + $content['alarm'] = false; + } + $content['msg'] = $msg; + + if ($view) + { + foreach($event as $key => $val) + { + if ($key != 'alarm') $readonlys[$key] = true; + } + // we need to unset the tab itself, as this would make all content (incl. the change-status selects) readonly + unset($readonlys['general|description|participants|recurrence|custom|links|alarms']); + + $readonlys['button[save]'] = $readonlys['button[apply]'] = $readonlys['freetime'] = true; + $readonlys['link'] = $readonlys['link_to'] = $readonlys['customfields'] = true; + } + else + { + $readonlys['button[copy]'] = $readonlys['button[vcal]'] = true; + unset($preserv['participants']); // otherwise deleted participants are still reported + $readonlys['recur_exception'] = !count($content['recur_exception']); // otherwise we get a delete button + } + // disabling the custom fields tab, if there are none + $readonlys['general|description|participants|recurrence|custom|links|alarms'] = array( + 'custom' => !count($this->bo->config['customfields']) + ); + if ($view || !isset($GLOBALS['egw_info']['user']['apps']['felamimail'])) + { + $etpl->disable_cells('custom_mail'); + } + if (!($readonlys['button[edit_series]'] = $readonlys['button[edit]'] = !$view || !$this->bo->check_perms(EGW_ACL_EDIT,$event))) + { + $readonlys['button[edit_series]'] = $event['recur_type'] == MCAL_RECUR_NONE; + } + if (!($readonlys['button[delete_series]'] = $readonlys['button[delete]'] = !$event['id'] || !$this->bo->check_perms(EGW_ACL_DELETE,$event))) + { + $readonlys['button[delete_series]'] = !$view || $event['recur_type'] == MCAL_RECUR_NONE; + } + $sel_options = array( + 'recur_type' => &$this->bo->recur_types, + 'accounts_status' => &$this->bo->verbose_status, + 'owner' => array(), + ); + if ($event['id'] || $this->bo->check_perms(EGW_ACL_EDIT,$event)) // new event or edit rights to the event ==> allow to add alarm for all users + { + $sel_options['owner'][0] = lang('All participants'); + } + foreach((array) $event['participant_types']['u'] as $uid => $status) + { + if ($status != 'R' && $this->bo->check_perms(EGW_ACL_EDIT,0,$uid)) + { + $sel_options['owner'][$uid] = $this->bo->participant_name($uid); + } + } + $content['no_add_alarm'] = !count($sel_options['owner']); // no rights to set any alarm + if (!$event['id']) + { + $etpl->set_cell_attribute('button[new_alarm]','type','checkbox'); + } + foreach($this->bo->resources as $res_data) + { + $sel_options[$res_data['app'].'_status'] =& $this->bo->verbose_status; + } + if ($preserv['no_popup']) + { + $etpl->set_cell_attribute('button[cancel]','onclick',''); + } + //echo "content="; _debug_array($content); + //echo "preserv="; _debug_array($preserv); + //echo "readonlys="; _debug_array($readonlys); + //echo "sel_options="; _debug_array($sel_options); + $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . ($event['id'] ? ($view ? lang('View') : lang('Edit')) : lang('Add')); + $GLOBALS['egw_info']['flags']['java_script'] .= "\n"; + $etpl->exec('calendar.uiforms.process_edit',$content,$sel_options,$readonlys,$preserv,$preserv['no_popup'] ? 0 : 2); + } + + /** + * displays a sheduling conflict + * + * @param array $event + * @param array $conflicts array with conflicting events, the events are not garantied to be readable by the user! + * @param array $preserv data to preserv + */ + function conflicts($event,$conflicts,$preserv) + { + $etpl =& CreateObject('etemplate.etemplate','calendar.conflicts'); + + foreach($conflicts as $k => $conflict) + { + $is_readable = $this->bo->check_perms(EGW_ACL_READ,$conflict); + + $conflicts[$k] += array( + 'icon_participants' => $is_readable ? (count($conflict['participants']) > 1 ? 'users' : 'single') : 'private', + 'tooltip_participants' => $is_readable ? implode(', ',$this->bo->participants($conflict)) : '', + 'time' => $this->bo->long_date($conflict['start'],$conflict['end'],true), + 'conflicting_participants' => implode(",\n",$this->bo->participants(array( + 'participants' => array_intersect_key($conflict['participants'],$event['participants']), + ))), + 'icon_recur' => $conflict['recur_type'] != MCAL_RECUR_NONE ? 'recur' : '', + 'text_recur' => $conflict['recur_type'] != MCAL_RECUR_NONE ? lang('Recurring event') : ' ', + ); + } + $content = $event + array( + 'conflicts' => array_values($conflicts), // conflicts have id-start as key + ); + $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('Scheduling conflict'); + + $etpl->exec('calendar.uiforms.process_edit',$content,false,false,array_merge($event,$preserv),$preserv['no_popup'] ? 0 : 2); } /** * 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 + * @param array $content=null array with parameters or false (default) to use the get-params + * @param string start[str] start-date + * @param string start[hour] start-hour + * @param string start[min] start-minutes + * @param string end[str] end-date + * @param string end[hour] end-hour + * @param string end[min] end-minutes + * @param string participants ':' delimited string of user-id's */ - function freetimesearch($content = false) + function freetimesearch($content = null) { + $etpl =& CreateObject('etemplate.etemplate','calendar.freetimesearch'); + $sel_options['search_window'] = array( 7*DAY_s => lang('one week'), 14*DAY_s => lang('two weeks'), @@ -59,25 +762,45 @@ class uiforms extends uical ); 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); - } - $content['duration'] = $content['end'] - $content['start']; + $edit_content = $etpl->process_values2url(); - foreach(explode(':',$_GET['participants']) as $uid) + if ($edit_content['whole_day']) { - if ((int) $uid) $content['participants'][] = (int) $uid; + $arr = $this->bo->date2array($edit_content['start']); + $arr['hour'] = $arr['minute'] = $arr['second'] = 0; unset($arr['raw']); + $edit_content['start'] = $this->bo->date2ts($arr); + $arr = $this->bo->date2array($edit_content['end']); + $arr['hour'] = 23; $arr['minute'] = $arr['second'] = 59; unset($arr['raw']); + $edit_content['end'] = $this->bo->date2ts($arr); + } + $content = array( + 'start' => $edit_content['start'], + 'duration' => $edit_content['end'] - $edit_content['start'], + 'end' => $edit_content['end'], + 'cal_id' => $edit_content['id'], + 'recur_type' => $edit_content['recur_type'], + 'participants' => array(), + ); + foreach($edit_content['participants'] as $app => $ids) + { + if ($app == 'accounts') + { + $content['participants'] += $ids; + } + elseif ($ids) + { + foreach($this->bo->resources as $type => $data) + { + if ($data['app'] == $app) break; + } + foreach($ids as $id) + { + $content['participants'][] = $type . $id; + } + } } - $content['cal_id'] = $_GET['cal_id']; - $content['recur_type'] = $_GET['cal']['recur_type']; - // default search parameters - $content['start_time'] = $this->cal_prefs['workdaystarts']; + $content['start_time'] = $edit_content['whole_day'] ? 0 : $this->cal_prefs['workdaystarts']; $content['end_time'] = $this->cal_prefs['workdayends']; if ($this->cal_prefs['workdayends']*HOUR_s < $this->cal_prefs['workdaystarts']*HOUR_s+$content['duration']) { @@ -106,26 +829,29 @@ class uiforms extends uical //echo "$selected = ".date('D d.m.Y H:i',$content['freetime'][$selected]['start']); $start = (int) $content['freetime'][$selected]['start']; $end = $start + $content['duration']; + /** + * ToDo: make this an eTemplate function to transmit content back to the opener + */ $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), + 'exec[start][str]' => date($this->common_prefs['dateformat'],$start), + 'exec[start][i]' => (int) date('i',$start), + 'exec[end][str]' => date($this->common_prefs['dateformat'],$end), + 'exec[end][i]' => (int) 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), + 'exec[start][H]' => date('h',$start), + 'exec[start][a]' => date('a',$start), + 'exec[end][H]' => date('h',$end), + 'exec[end][a]' => date('a',$end), ); } else { $fields_to_set += array( - 'start[hour]' => date('H',$start), - 'end[hour]' => date('H',$end), + 'exec[start][H]' => (int) date('H',$start), + 'exec[end][H]' => (int) date('H',$end), ); } echo " @@ -160,12 +886,21 @@ class uiforms extends uical { $sel_options['duration'][$n*60] = sprintf('%d:%02d',$n/60,$n%60); } - $etpl = CreateObject('etemplate.etemplate','calendar.freetimesearch'); + if ($content['duration'] <= 8*HOUR_s) $content['end'] = ''; //echo "
    ".print_r($content,true)."
    \n"; - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('freetime search'); + $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('freetime search'); // let the window popup, if its already there - $GLOBALS['phpgw_info']['flags']['java_script'] .= "\n"; + $GLOBALS['egw_info']['flags']['java_script'] .= "\n"; + + if (!is_object($GLOBALS['egw']->js)) + { + $GLOBALS['egw']->js = CreateObject('phpgwapi.javascript'); + } + // We hide the enddate if one of our predefined durations fits + // the call to set_style_by_class has to be in onload, to make sure the function and the element is already created + $GLOBALS['egw']->js->set_onload("set_style_by_class('*','end_hide','visibility','".($content['duration'] && isset($sel_options['duration'][$content['duration']]) ? 'hidden' : 'visible')."');"); + $etpl->set_cell_attribute('duration','onchange',"set_style_by_class('*','end_hide','visibility',this.value == 0 ? 'visible' : 'hidden');"); $etpl->exec('calendar.uiforms.freetimesearch',$content,$sel_options,'',array( 'participants' => $content['participants'], @@ -177,11 +912,11 @@ class uiforms extends uical /** * calculate the freetime of given $participants in a certain time-span * - * @param $participants array of user-id's - * @param $start int start-time timestamp in user-time - * @param $end int end-time timestamp in user-time - * @param $duration int min. duration in sec, default 1 - * @param $cal_id int own id for existing events, to exclude them from being busy-time, default 0 + * @param array $participants user-id's + * @param int $start start-time timestamp in user-time + * @param int $end end-time timestamp in user-time + * @param int $duration min. duration in sec, default 1 + * @param int $cal_id own id for existing events, to exclude them from being busy-time, default 0 * @return array of free time-slots: array with start and end values */ function freetime($participants,$start,$end,$duration=1,$cal_id=0) @@ -194,8 +929,8 @@ class uiforms extends uical '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), + 'start' => $end, + 'end' => $end, ); $ft_start = $start; $freetime = array(); @@ -212,19 +947,19 @@ class uiforms extends uical 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) + if ($event['end'] < $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) + if ($event['start'] < $ft_start) { //echo "==> event starts before ft_start ==> set ft_start to it's end & continue
    \n"; - $ft_start = $event['end']['raw']; + $ft_start = $event['end']; continue; } - $ft_end = $event['start']['raw']; + $ft_end = $event['start']; // only show slots equal or bigger to min_length if ($ft_end - $ft_start >= $duration) @@ -235,7 +970,7 @@ class uiforms extends uical ); if ($this->debug > 1) 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']; + $ft_start = $event['end']; } if ($this->debug > 0) $this->bo->debug_message('uiforms::freetime(participants=%1, start=%2, end=%3, duration=%4, cal_id=%5) freetime=%6',true,$participants,$start,$end,$duration,$cal_id,$freetime); @@ -247,12 +982,12 @@ class uiforms extends uical * * If the duration is bigger then the difference of start- and end_time, the end_time is ignored * - * @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 + * @param array $freetime free time-slots: array with start and end values + * @param int $duration min. duration in sec + * @param int $weekdays allowed weekdays, bitfield of MCAL_M_... + * @param int $start_time minimum start-hour 0-23 + * @param int $end_time maximum end-hour 0-23, or 0 for none + * @param array $sel_options 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) @@ -321,4 +1056,105 @@ class uiforms extends uical } return $freetime_daywise; } + + /** + * Export events as vCalendar version 2.0 files (iCal) + * + * @param int/array $content=0 numeric cal_id or submitted content from etempalte::exec + * @param boolean $return_error=false should an error-msg be returned or a regular page with it generated (default) + * @return string error-msg if $return_error + */ + function export($content=0,$return_error=false) + { + if (is_numeric($cal_id = $content ? $content : $_REQUEST['cal_id'])) + { + if (!($ical =& ExecMethod('calendar.boical.exportVCal',$cal_id))) + { + $msg = lang('Permission denied'); + + if ($return_error) return $msg; + } + else + { + $GLOBALS['egw']->browser =& CreateObject('phpgwapi.browser'); + $GLOBALS['egw']->browser->content_header('event.ics','text/calendar',strlen($ical)); + echo $ical; + $GLOBALS['egw']->common->egw_exit(); + } + } + if (is_array($content)) + { + $events =& $this->bo->search(array( + 'start' => $content['start'], + 'end' => $content['end'], + 'enum_recuring' => false, + 'daywise' => false, + 'owner' => $this->owner, + 'date_format' => 'server', // timestamp in server time for boical class + )); + if (!$events) + { + $msg = lang('No events found'); + } + else + { + $ical =& ExecMethod('calendar.boical.exportVCal',$events/*,$content['version']*/); + $GLOBALS['egw']->browser =& CreateObject('phpgwapi.browser'); + $GLOBALS['egw']->browser->content_header($content['file'] ? $content['file'] : 'event.ics','text/calendar',strlen($ical)); + echo $ical; + $GLOBALS['egw']->common->egw_exit(); + } + } + if (!is_array($content)) + { + $view = $GLOBALS['egw']->session->appsession('view','calendar'); + + $content = array( + 'start' => $this->bo->date2ts($_REQUEST['start'] ? $_REQUEST['start'] : $this->date), + 'end' => $this->bo->date2ts($_REQUEST['end'] ? $_REQUEST['end'] : $this->date), + 'file' => 'event.ics', + 'version' => '2.0', + ); + } + $content['msg'] = $msg; + + $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Export'); + $etpl =& CreateObject('etemplate.etemplate','calendar.export'); + + $etpl->exec('calendar.uiforms.export',$content); + } + + /** + * Import events as vCalendar version 2.0 files (iCal) + * + * @param array $content=null submitted content from etempalte::exec + */ + function import($content=null) + { + if (is_array($content)) + { + if (is_array($content['ical_file']) && is_uploaded_file($content['ical_file']['tmp_name'])) + { + if (!ExecMethod('calendar.boical.importVCal',file_get_contents($content['ical_file']['tmp_name']))) + { + $msg = lang('Error: importing the iCal'); + } + else + { + $msg = lang('iCal successful imported'); + } + } + else + { + $msg = lang('You need to select an iCal file first'); + } + } + $content = array( + 'msg' => $msg, + ); + $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Import'); + $etpl =& CreateObject('etemplate.etemplate','calendar.import'); + + $etpl->exec('calendar.uiforms.import',$content); + } } diff --git a/calendar/inc/class.uiholiday.inc.php b/calendar/inc/class.uiholiday.inc.php index f875f0bc1f..da39374f5b 100755 --- a/calendar/inc/class.uiholiday.inc.php +++ b/calendar/inc/class.uiholiday.inc.php @@ -1,19 +1,26 @@ * - * http://www.radix.net/~cknudsen * - * Modified by Mark Peters * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ + /**************************************************************************\ + * eGroupWare - Calendar * + * http://www.egroupware.org * + * Based on Webcalendar by Craig Knudsen * + * http://www.radix.net/~cknudsen * + * Modified by Mark Peters * + * -------------------------------------------- * + * 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$ */ + /** + * User interface for calendar holidays + * + * @package calendar + * @author Mark Peters + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + */ class uiholiday { var $debug = False; @@ -35,30 +42,42 @@ function uiholiday() { - $GLOBALS['phpgw']->nextmatchs = CreateObject('phpgwapi.nextmatchs'); + $GLOBALS['egw']->nextmatchs =& CreateObject('phpgwapi.nextmatchs'); - $this->bo = CreateObject('calendar.boholiday'); + $this->bo =& CreateObject('calendar.boholiday'); $this->bo->check_admin(); $this->base_url = $this->bo->base_url; - $this->template_dir = $GLOBALS['phpgw']->common->get_tpl_dir('calendar'); - $this->sb = CreateObject('phpgwapi.sbox'); + $this->template_dir = $GLOBALS['egw']->common->get_tpl_dir('calendar'); + $this->sb =& CreateObject('phpgwapi.sbox'); // jscalendar is needed by the new navigation-menu AND it need to be loaded befor the header !!! - if (!is_object($GLOBALS['phpgw']->jscalendar)) + if (!is_object($GLOBALS['egw']->jscalendar)) { - $GLOBALS['phpgw']->jscalendar = CreateObject('phpgwapi.jscalendar'); + $GLOBALS['egw']->jscalendar =& CreateObject('phpgwapi.jscalendar'); } - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.lang('Holiday Management'); + $GLOBALS['egw_info']['flags']['app_header'] = $GLOBALS['egw_info']['apps']['calendar']['title'].' - '.lang('Holiday Management'); + + $GLOBALS['egw']->template->set_var('help_msg',lang('Please note: The calendar use the holidays of your country, which is set to %1. You can change it in your %2.
    Holidays are %3 automatic installed from %4. You can changed it in %5.', + ''.$GLOBALS['egw_info']['user']['preferences']['common']['country'].'',''.lang('common preferences').'',$GLOBALS['egw_info']['server']['auto_load_holidays'] ? '' : ''.lang('not').'', + ''.$GLOBALS['egw_info']['server']['holidays_url_path'].'', + ''.lang('admin').' >> '.lang('calendar').' >> '.lang('site configuration').'')); + $GLOBALS['egw']->template->set_var('total',''); } function admin() { - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw']->common->phpgw_header(); + unset($GLOBALS['egw_info']['flags']['noheader']); + unset($GLOBALS['egw_info']['flags']['nonavbar']); + $GLOBALS['egw_info']['flags']['noappfooter'] = True; + $GLOBALS['egw']->common->egw_header(); - $p = &$GLOBALS['phpgw']->template; + $p = &$GLOBALS['egw']->template; $p->set_file(Array('locales'=>'locales.tpl')); $p->set_block('locales','list','list'); $p->set_block('locales','row','row'); @@ -66,11 +85,11 @@ $p->set_block('locales','submit_column','submit_column'); $var = Array( - 'th_bg' => $GLOBALS['phpgw_info']['theme']['th_bg'], - 'left_next_matchs' => $GLOBALS['phpgw']->nextmatchs->left('/index.php?menuaction=calendar.uiholiday.admin',$this->bo->start,$this->bo->total), - 'right_next_matchs' => $GLOBALS['phpgw']->nextmatchs->right('/index.php?menuaction=calendar.uiholiday.admin',$this->bo->start,$this->bo->total), + 'th_bg' => $GLOBALS['egw_info']['theme']['th_bg'], + 'left_next_matchs' => $GLOBALS['egw']->nextmatchs->left('/index.php?menuaction=calendar.uiholiday.admin',$this->bo->start,$this->bo->total), + 'right_next_matchs' => $GLOBALS['egw']->nextmatchs->right('/index.php?menuaction=calendar.uiholiday.admin',$this->bo->start,$this->bo->total), 'center' => ''.lang('Countries').'', - 'sort_name' => $GLOBALS['phpgw']->nextmatchs->show_sort_order($this->bo->sort,'locale',$this->bo->order,'/calendar/'.basename($SCRIPT_FILENAME),lang('Country')), + 'sort_name' => $GLOBALS['egw']->nextmatchs->show_sort_order($this->bo->sort,'locale',$this->bo->order,'/calendar/'.basename($SCRIPT_FILENAME),lang('Country')), 'header_edit' => lang('Edit'), 'header_delete' => lang('Delete'), 'header_extra' => lang('Submit to Repository'), @@ -94,16 +113,16 @@ $p->set_var('submit_extra',' width="5%"'); while (list(,$value) = each($locales)) { - $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); + $tr_color = $GLOBALS['egw']->nextmatchs->alternate_row_color($tr_color); if (! $value) $value = ' '; $var = Array( 'tr_color' => $tr_color, 'group_name' => $value, - 'edit_link' => ' '.lang('Edit').' ', - 'delete_link' => ' '.lang('Delete').' ', - 'extra_link' => ' '.lang('Submit').' '. - '     '.lang('Download').' ' + 'edit_link' => ' '.lang('Edit').' ', + 'delete_link' => ' '.lang('Delete').' ', + 'extra_link' => ' '.lang('Submit').' '. + '     '.lang('Download').' ' ); $p->set_var($var); $p->parse('rows','row',True); @@ -111,9 +130,9 @@ } $var = Array( - 'new_action' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_holiday','id'=>0)), + 'new_action' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_holiday','id'=>0)), 'lang_add' => lang('add'), - 'search_action' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), + 'search_action' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), 'lang_search' => lang('search') ); @@ -137,24 +156,24 @@ $link_params = Array( 'menuaction' => 'calendar.uiholiday.admin' ); - $GLOBALS['phpgw']->redirect_link($this->base_url,$link_params); + $GLOBALS['egw']->redirect_link($this->base_url,$link_params); } - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw']->common->phpgw_header(); - $p = CreateObject('phpgwapi.Template',$this->template_dir); + unset($GLOBALS['egw_info']['flags']['noheader']); + unset($GLOBALS['egw_info']['flags']['nonavbar']); + $GLOBALS['egw_info']['flags']['noappfooter'] = True; + $GLOBALS['egw']->common->egw_header(); + $p =& $GLOBALS['egw']->template; $p->set_file(Array('locale'=>'locales.tpl')); $p->set_block('locale','list','list'); $p->set_block('locale','row','row'); $p->set_block('locale','row_empty','row_empty'); $p->set_block('locale','back_button_form','back_button_form'); - if (!is_object($GLOBALS['phpgw']->html)) + if (!is_object($GLOBALS['egw']->html)) { - $GLOBALS['phpgw']->html = CreateObject('phpgwapi.html'); + $GLOBALS['egw']->html =& CreateObject('phpgwapi.html'); } - $html = &$GLOBALS['phpgw']->html; + $html = &$GLOBALS['egw']->html; $year_form = str_replace('','',$html->form($html->sbox_submit($this->sb->getYears('year',$this->bo->year),true),array(), $this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_locale','locale'=>$this->bo->locales[0]))); unset($html); @@ -163,14 +182,14 @@ $total = count($holidays); $var = Array( - 'th_bg' => $GLOBALS['phpgw_info']['theme']['th_bg'], - 'left_next_matchs' => $GLOBALS['phpgw']->nextmatchs->left('/index.php',$this->bo->start,$total,'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year), - 'right_next_matchs' => $GLOBALS['phpgw']->nextmatchs->right('/index.php',$this->bo->start,$total,'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year), + 'th_bg' => $GLOBALS['egw_info']['theme']['th_bg'], + 'left_next_matchs' => $GLOBALS['egw']->nextmatchs->left('/index.php',$this->bo->start,$total,'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year), + 'right_next_matchs' => $GLOBALS['egw']->nextmatchs->right('/index.php',$this->bo->start,$total,'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year), 'center' => ''.lang('Holidays').' ('.$this->bo->locales[0].')'.$year_form.'', - 'sort_name' => $GLOBALS['phpgw']->nextmatchs->show_sort_order($this->bo->sort,'name',$this->bo->order,'/index.php',lang('Holiday'),'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year), + 'sort_name' => $GLOBALS['egw']->nextmatchs->show_sort_order($this->bo->sort,'name',$this->bo->order,'/index.php',lang('Holiday'),'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year), 'header_edit' => lang('Edit'), 'header_delete' => lang('Delete'), - 'header_rule' => ''.$GLOBALS['phpgw']->nextmatchs->show_sort_order($this->bo->sort,'month_num,mday',$this->bo->order,'/index.php',lang('Rule'),'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year).'', + 'header_rule' => ''.$GLOBALS['egw']->nextmatchs->show_sort_order($this->bo->sort,'month_num,mday',$this->bo->order,'/index.php',lang('Rule'),'&menuaction=calendar.uiholiday.edit_locale&locale='.$this->bo->locales[0].'&year='.$this->bo->year).'', 'header_extra' => lang('Copy'), 'extra_width' => 'width="5%"' ); @@ -179,17 +198,18 @@ if (!count($holidays)) { - $p->set_var('message',lang('no matches found')); - $p->parse('rows','row_empty',True); + $p->set_var('total',lang('no matches found')); + //$p->parse('rows','row_empty',True); } else { - $maxmatchs = $GLOBALS['phpgw_info']['user']['preferences']['common']['maxmatchs']; + $maxmatchs = $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs']; $end = min($total,$this->bo->start+$maxmatchs); - $p->set_var('rows',lang('showing %1 - %2 of %3',1+$this->bo->start,$end,$total)); + $p->set_var('total',lang('showing %1 - %2 of %3',1+$this->bo->start,$end,$total)); + //$p->parse('rows','row_empty',True); for($i=$this->bo->start; $i < $end; $i++) { - $tr_color = $GLOBALS['phpgw']->nextmatchs->alternate_row_color($tr_color); + $tr_color = $GLOBALS['egw']->nextmatchs->alternate_row_color($tr_color); if (!$holidays[$i]['name']) { $holidays[$i]['name'] = ' '; @@ -200,9 +220,9 @@ 'header_delete'=> lang('Delete'), 'group_name' => $holidays[$i]['name'], 'rule' => ''.$this->bo->rule_string($holidays[$i]).'', - 'edit_link' => ' '.lang('Edit').' ', - 'extra_link' => ' '.lang('Copy').' ', - 'delete_link' => ' '.lang('Delete').' ' + 'edit_link' => ' '.lang('Edit').' ', + 'extra_link' => ' '.lang('Copy').' ', + 'delete_link' => ' '.lang('Delete').' ' ); $p->set_var($var); @@ -211,11 +231,11 @@ } $var = Array( - 'new_action' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_holiday','locale'=>$this->bo->locales[0],'id'=>0,'year'=>$this->bo->year)), + 'new_action' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_holiday','locale'=>$this->bo->locales[0],'id'=>0,'year'=>$this->bo->year)), 'lang_add' => lang('add'), - 'back_action' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), + 'back_action' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), 'lang_back' => lang('Back'), - 'search_action'=> $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_locale','locale'=>$this->bo->locales[0],'year'=>$this->bo->year)), + 'search_action'=> $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_locale','locale'=>$this->bo->locales[0],'year'=>$this->bo->year)), 'lang_search' => lang('search') ); $p->set_var($var); @@ -248,20 +268,20 @@ { $holiday['locale'] = $this->locale; } - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title'].' - '.($this->bo->id ? lang('Edit') : lang('Add')).' '.lang('Holiday'); - $GLOBALS['phpgw']->common->phpgw_header(); + unset($GLOBALS['egw_info']['flags']['noheader']); + unset($GLOBALS['egw_info']['flags']['nonavbar']); + $GLOBALS['egw_info']['flags']['noappfooter'] = True; + $GLOBALS['egw_info']['flags']['app_header'] = $GLOBALS['egw_info']['apps']['calendar']['title'].' - '.($this->bo->id ? lang('Edit') : lang('Add')).' '.lang('Holiday'); + $GLOBALS['egw']->common->egw_header(); - $t = &$GLOBALS['phpgw']->template; + $t = &$GLOBALS['egw']->template; $t->set_file(Array('holiday'=>'holiday.tpl','form_button'=>'form_button_script.tpl')); $t->set_block('holiday','form','form'); $t->set_block('holiday','list','list'); if (@count($error)) { - $message = $GLOBALS['phpgw']->common->error_list($error); + $message = $GLOBALS['egw']->common->error_list($error); } else { @@ -271,7 +291,7 @@ $var = Array( 'title_holiday' => ($this->bo->id ? lang('Edit') : lang('Add')).' '.lang('Holiday'), 'message' => $message, - 'actionurl' => $GLOBALS['phpgw']->link($this->base_url,'menuaction=calendar.boholiday.add&year='.$this->bo->year), + 'actionurl' => $GLOBALS['egw']->link($this->base_url,'menuaction=calendar.boholiday.add&year='.$this->bo->year), 'hidden_vars' => ''."\n" . ''."\n" ); @@ -284,7 +304,7 @@ $this->display_item($t,lang('title'),''); // Date - $this->display_item($t,lang('Date'),$GLOBALS['phpgw']->common->dateformatorder($this->sb->getYears('holiday[year]',$holiday['occurence']>1900?$holiday['occurence']:0),$this->sb->getMonthText('holiday[month_num]',$holiday['month']),$this->sb->getDays('holiday[mday]',$holiday['day'])). + $this->display_item($t,lang('Date'),$GLOBALS['egw']->common->dateformatorder($this->sb->getYears('holiday[year]',$holiday['occurence']>1900?$holiday['occurence']:0),$this->sb->getMonthText('holiday[month_num]',$holiday['month']),$this->sb->getDays('holiday[mday]',$holiday['day'])). ' '.lang('Set a Year only for one-time / non-regular holidays.')); // Occurence @@ -343,7 +363,7 @@ } $t->set_var(Array( - 'action_url_button' => $GLOBALS['phpgw']->link($this->base_url,$link_params), + 'action_url_button' => $GLOBALS['egw']->link($this->base_url,$link_params), 'action_text_button' => lang('Cancel'), 'action_confirm_button' => '', 'action_extra_field' => '' @@ -359,7 +379,7 @@ 'id' => $this->bo->id ); $t->set_var(Array( - 'action_url_button' => $GLOBALS['phpgw']->link($this->base_url,$link_params), + 'action_url_button' => $GLOBALS['egw']->link($this->base_url,$link_params), 'action_text_button' => lang('Delete'), 'action_confirm_button' => '', 'action_extra_field' => '' @@ -381,18 +401,18 @@ $this->admin(); } - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw']->common->phpgw_header(); + unset($GLOBALS['egw_info']['flags']['noheader']); + unset($GLOBALS['egw_info']['flags']['nonavbar']); + $GLOBALS['egw_info']['flags']['noappfooter'] = True; + $GLOBALS['egw']->common->egw_header(); - $p = CreateObject('phpgwapi.Template',$this->template_dir); + $p =& CreateObject('phpgwapi.Template',$this->template_dir); $p->set_file(Array('form'=>'delete_common.tpl','form_button'=>'form_button_script.tpl')); $p->set_var('messages',lang('Are you sure you want to delete this Country ?')."
    ".$this->bo->locales[0]); $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), + 'action_url_button' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), 'action_text_button' => lang('No'), 'action_confirm_button' => '', 'action_extra_field' => '' @@ -401,7 +421,7 @@ $p->parse('no','form_button'); $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.boholiday.delete_locale','locale'=>$this->bo->locales[0])), + 'action_url_button' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.boholiday.delete_locale','locale'=>$this->bo->locales[0])), 'action_text_button' => lang('Yes'), 'action_confirm_button' => '', 'action_extra_field' => '' @@ -421,18 +441,18 @@ $this->edit_locale(); } - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw']->common->phpgw_header(); + unset($GLOBALS['egw_info']['flags']['noheader']); + unset($GLOBALS['egw_info']['flags']['nonavbar']); + $GLOBALS['egw_info']['flags']['noappfooter'] = True; + $GLOBALS['egw']->common->egw_header(); - $p = CreateObject('phpgwapi.Template',$this->template_dir); + $p =& CreateObject('phpgwapi.Template',$this->template_dir); $p->set_file(Array('form'=>'delete_common.tpl','form_button'=>'form_button_script.tpl')); $p->set_var('messages',lang('Are you sure you want to delete this holiday ?')."
    ".$holiday['name'].' ('.$this->bo->locales[0].') '.$this->bo->rule_string($holiday)); $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_locale','locale'=>$this->bo->locales[0],'year'=>$this->bo->year)), + 'action_url_button' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_locale','locale'=>$this->bo->locales[0],'year'=>$this->bo->year)), 'action_text_button' => lang('No'), 'action_confirm_button' => '', 'action_extra_field' => '' @@ -441,7 +461,7 @@ $p->parse('no','form_button'); $var = Array( - 'action_url_button' => $GLOBALS['phpgw']->link($this->base_url,Array('menuaction'=>'calendar.boholiday.delete_holiday','locale'=>$this->bo->locales[0],'id'=>$this->bo->id,'year'=>$this->bo->year)), + 'action_url_button' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.boholiday.delete_holiday','locale'=>$this->bo->locales[0],'id'=>$this->bo->id,'year'=>$this->bo->year)), 'action_text_button' => lang('Yes'), 'action_confirm_button' => '', 'action_extra_field' => '' @@ -460,46 +480,61 @@ } $this->bo->year = 0; // for a complete list with all years $holidays = $this->bo->get_holiday_list(); + + if (!is_array($holidays) || !count($holidays)) + { + $this->admin(); + } + // sort holidays by year / occurence: + usort($holidays,'_holiday_cmp'); if (isset($_GET['download'])) { $locale = $this->bo->locales[0]; - $browser = CreateObject('phpgwapi.browser'); + $browser =& CreateObject('phpgwapi.browser'); $browser->content_header("holidays.$locale.csv",'text/text'); unset($browser); - while (list(,$holiday) = @each($holidays)) + echo "charset\t".$GLOBALS['egw']->translation->charset()."\n"; + $last_year = -1; + foreach($holidays as $holiday) { + $year = $holiday['occurence'] <= 0 ? 0 : $holiday['occurence']; + if ($year != $last_year) + { + echo "\n".($year ? $year : 'regular (year=0)').":\n"; + $last_year = $year; + } echo "$locale\t$holiday[name]\t$holiday[day]\t$holiday[month]\t$holiday[occurence]\t$holiday[dow]\t$holiday[observance_rule]\n"; } - $GLOBALS['phpgw']->common->phpgw_exit(); + $GLOBALS['egw']->common->egw_exit(); } - elseif($this->debug) + if($this->debug) { - $action = $GLOBALS['phpgw']->link('/calendar/phpgroupware.org/accept_holiday.php'); + $action = $GLOBALS['egw']->link('/calendar/egroupware.org/accept_holiday.php'); } else { $action = 'http://www.egroupware.org/cal/accept_holiday.php'; } - $GLOBALS['phpgw_info']['flags']['noappheader'] = True; - $GLOBALS['phpgw_info']['flags']['noappfooter'] = True; - $GLOBALS['phpgw_info']['flags']['nofooter'] = True; - $GLOBALS['phpgw']->common->phpgw_header(); + $GLOBALS['egw_info']['flags']['noappheader'] = True; + $GLOBALS['egw_info']['flags']['noappfooter'] = True; + $GLOBALS['egw_info']['flags']['nofooter'] = True; + $GLOBALS['egw']->common->egw_header(); echo ''."\n"; echo '
    '."\n"; - $c_holidays = count($holidays); echo ''."\n"; - for($i=0;$i<$c_holidays;$i++) + echo ''."\n"; + foreach($holidays as $holiday) { - echo ''."\n" - . ''."\n" - . ''."\n" - . ''."\n" - . ''."\n" - . ''."\n"; + echo ''."\n" + . ''."\n" + . ''."\n" + . ''."\n" + . ''."\n" + . ''."\n\n"; } echo "
    \n\n"; } @@ -508,7 +543,7 @@ function display_item(&$p,$field,$data) { $var = Array( - 'tr_color' => $GLOBALS['phpgw']->nextmatchs->alternate_row_color(), + 'tr_color' => $GLOBALS['egw']->nextmatchs->alternate_row_color(), 'field' => $field, 'data' => $data ); diff --git a/calendar/inc/class.uiicalendar.inc.php b/calendar/inc/class.uiicalendar.inc.php deleted file mode 100755 index 6fb733aca4..0000000000 --- a/calendar/inc/class.uiicalendar.inc.php +++ /dev/null @@ -1,213 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Modified by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - class uiicalendar - { - var $bo; - var $template; - - var $public_functions = array( - 'test' => True, - 'import' => True - ); - - - - function uiicalendar() - { - $this->bo = CreateObject('calendar.boicalendar'); - $this->template = $GLOBALS['phpgw']->template; - $GLOBALS['phpgw_info']['flags']['app_header'] = lang('Calendar - [iv]Cal Importer'); - - // jscalendar is needed by the new navigation-menu AND it need to be loaded befor the header !!! - if (!is_object($GLOBALS['phpgw']->jscalendar)) - { - $GLOBALS['phpgw']->jscalendar = CreateObject('phpgwapi.jscalendar'); - } - } - - function print_test($val,$title,$x_pre='') - { -// echo 'VAL = '._debug_array($val,False)."
    \n"; - if(is_array($val)) - { - @reset($val); - while(list($key,$value) = each($val)) - { - if(is_array($key)) - { - $this->print_test($key,$title,$x_pre); - } - elseif(is_array($value)) - { - $this->print_test($value,$title,$x_pre); - } - else - { - if($x_pre && $key == 'name') - { - $x_key = $x_pre.$value; - list($key,$value) = each($val); - $key=$x_key; - } - if($this->bo->parameter[$key]['type'] == 'function') - { - $function = $this->bo->parameter[$key]['function']; - $v_value = $this->bo->$function($value); - } - else - { - $v_value = $value; - } - echo $title.' ('.$key.') = '.$v_value."
    \n"; - } - } - } - elseif($val != '') - { - echo $title.' = '.$val."
    \n"; - } - } - - function test() - { - $print_events = True; - - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw']->common->phpgw_header(); - - echo "Start Time : ".$GLOBALS['phpgw']->common->show_date()."
    \n"; - @set_time_limit(0); - - $icsfile=PHPGW_APP_INC.'/events.ics'; - $fp=fopen($icsfile,'rt'); - $contents = explode("\n",fread($fp, filesize($icsfile))); - fclose($fp); - - $vcalendar = $this->bo->parse($contents); - - if($print_events) - { - $this->print_test($vcalendar['prodid'],'Product ID'); - $this->print_test($vcalendar['method'],'Method'); - $this->print_test($vcalendar['version'],'Version'); - - for($i=0;$i\nEVENT
    \n"; -// echo 'TEST Debug : '._debug_array($event,False)."
    \n"; - $this->print_test($event['uid'],'UID','X-'); - $this->print_test($event['valscale'],'Calscale','X-'); - $this->print_test($event['description'],'Description','X-'); - $this->print_test($event['summary'],'Summary','X-'); - $this->print_test($event['comment'],'Comment','X-'); - $this->print_test($event['location'],'Location','X-'); - $this->print_test($event['sequence'],'Sequence','X-'); - $this->print_test($event['priority'],'Priority','X-'); - $this->print_test($event['categories'],'Categories','X-'); - $this->print_test($event['dtstart'],'Date Start','X-'); - $this->print_test($event['dtstamp'],'Date Stamp','X-'); - $this->print_test($event['rrule'],'Recurrence','X-'); - - echo "Class = ".$this->bo->switch_class($event['class'])."
    \n"; - - $this->print_test($event['organizer'],'Organizer','X-'); - $this->print_test($event['attendee'],'Attendee','X-'); - $this->print_test($event['x_type'],'X-Type','X-'); - $this->print_test($event['alarm'],'Alarm','X-'); - } - } - -/* - for($i=0;$itodo);$i++) - { - echo "
    \nTODO
    \n"; - if($vcalendar['todo'][$i]['summary']['value']) - { - echo "Summary = ".$vcalendar['todo'][$i]['summary']['value']."
    \n"; - } - if($vcalendar['todo'][$i]['description']['value']) - { - echo "Description (Value) = ".$vcalendar['todo'][$i]['description']['value']."
    \n"; - } - if($vcalendar['todo'][$i]['description']['altrep']) - { - echo "Description (Alt Rep) = ".$vcalendar['todo'][$i]['description']['altrep']."
    \n"; - } - if($vcalendar['todo'][$i]['location']['value']) - { - echo "Location = ".$vcalendar['todo'][$i]['location']['value']."
    \n"; - } - echo "Sequence = ".$vcalendar['todo'][$i]['sequence']."
    \n"; - echo "Date Start : ".$GLOBALS['phpgw']->common->show_date(mktime($vcalendar['todo'][$i]['dtstart']['hour'],$vcalendar['todo'][$i]['dtstart']['min'],$vcalendar['todo'][$i]['dtstart']['sec'],$vcalendar['todo'][$i]['dtstart']['month'],$vcalendar['todo'][$i]['dtstart']['mday'],$vcalendar['todo'][$i]['dtstart']['year']) - $this->datatime->tz_offset)."
    \n"; - echo "Class = ".$vcalendar['todo'][$i]['class']['value']."
    \n"; - } - -*/ - include(PHPGW_APP_INC.'/../setup/setup.inc.php'); - - $this->bo->set_var($vcalendar['prodid'],'value','-//phpGroupWare//phpGroupWare '.$setup_info['calendar']['version'].' MIMEDIR//'.strtoupper($GLOBALS['phpgw_info']['user']['preferences']['common']['lang'])); - $this->bo->set_var($vcalendar['version'],'value','2.0'); - $this->bo->set_var($vcalendar['method'],'value',strtoupper('publish')); - echo "


    \n"; - echo nl2br($this->bo->build_ical($vcalendar)); - echo "End Time : ".$GLOBALS['phpgw']->common->show_date()."
    \n"; - } - - function import() - { - unset($GLOBALS['phpgw_info']['flags']['noheader']); - unset($GLOBALS['phpgw_info']['flags']['nonavbar']); - $GLOBALS['phpgw_info']['flags']['nonappheader'] = True; - $GLOBALS['phpgw_info']['flags']['nonappfooter'] = True; - $GLOBALS['phpgw']->common->phpgw_header(); - - if(!@is_dir($GLOBALS['phpgw_info']['server']['temp_dir'])) - { - mkdir($GLOBALS['phpgw_info']['server']['temp_dir'],0700); - } - - echo ''; - - if ($GLOBALS['HTTP_GET_VARS']['action'] == 'GetFile') - { - echo '
    ' . lang('You must select a [iv]Cal. (*.[iv]cs)') . '


    '; - } - - $this->template->set_file( - Array( - 'vcalimport' => 'vcal_import.tpl' - ) - ); - - $var = Array( - 'vcal_header' => '

    ', - 'ical_lang' => lang('(i/v)Cal'), - 'action_url' => $GLOBALS['phpgw']->link('/index.php','menuaction=calendar.boicalendar.import'), - 'lang_access' => lang('Access'), - 'lang_groups' => lang('Which groups'), - 'access_option'=> $access_option, - 'group_option' => $group_option, - 'load_vcal' => lang('Load [iv]Cal') - ); - $this->template->set_var($var); - $this->template->pparse('out','vcalimport'); - } - } -?> diff --git a/calendar/inc/class.uilist.inc.php b/calendar/inc/class.uilist.inc.php new file mode 100644 index 0000000000..f6f356ce16 --- /dev/null +++ b/calendar/inc/class.uilist.inc.php @@ -0,0 +1,204 @@ + * +* -------------------------------------------- * +* 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(EGW_INCLUDE_ROOT . '/calendar/inc/class.uical.inc.php'); + +/** + * Class to generate the calendar listview and the search + * + * The new UI, BO and SO classes have a strikt definition, in which time-zone they operate: + * UI only operates in user-time, so there have to be no conversation at all !!! + * BO's functions take and return user-time only (!), they convert internaly everything to servertime, because + * SO operates only on server-time + * + * The state of the UI elements is managed in the uical class, which all UI classes extend. + * + * All permanent debug messages of the calendar-code should done via the debug-message method of the bocal class !!! + * + * @package calendar + * @author Ralf Becker + * @copyright (c) 2004/5 by RalfBecker-At-outdoor-training.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + */ +class uilist extends uical +{ + var $public_functions = array( + 'listview' => True, + ); + /** + * @var $debug mixed integer level or string function- or widget-name + */ + var $debug=false; + + /** + * Constructor + * + * @param array $set_states=null to manualy set / change one of the states, default NULL = use $_REQUEST + */ + function uilist($set_states=null) + { + $this->uical(false,$set_states); // call the parent's constructor + + $GLOBALS['egw_info']['flags']['app_header'] = $GLOBALS['egw_info']['apps']['calendar']['title'].' - '.lang('Listview'); + + $this->date_filters = array( + 'after' => lang('After current date'), + 'before' => lang('Before current date'), + 'all' => lang('All events'), + ); + } + + /** + * Show the calendar on the home page + * + * @return string with content + */ + function &home() + { + // set the defaults for the home-page + $this->uilist(array( + 'date' => $this->bo->date2string($this->bo->now_su), + 'cat_id' => 0, + 'filter' => 'all', + 'owner' => $this->user, + 'multiple' => 0, + 'view' => $this->bo->cal_prefs['defaultcalendar'], + )); + $GLOBALS['egw']->session->appsession('calendar_list','calendar',''); // in case there's already something set + + return $this->listview(null,'',true); + } + + /** + * Show the listview + */ + function listview($content=null,$msg='',$home=false) + { + if ($_GET['msg']) $msg = $_GET['msg']; + + $etpl =& CreateObject('etemplate.etemplate','calendar.list'); + + $content = array( + 'nm' => $GLOBALS['egw']->session->appsession('calendar_list','calendar'), + 'msg' => $msg, + ); + if (!is_array($content['nm'])) + { + $content['nm'] = array( + 'get_rows' => 'calendar.uilist.get_rows', + 'filter_no_lang' => True, // I set no_lang for filter (=dont translate the options) + 'no_filter2' => True, // I disable the 2. filter (params are the same as for filter) + 'no_cat' => True, // I disable the cat-selectbox +// 'bottom_too' => True,// I show the nextmatch-line (arrows, filters, search, ...) again after the rows + 'filter' => 'after', + 'order' => 'cal_start',// IO name of the column to sort after (optional for the sortheaders) + 'sort' => 'ASC',// IO direction of the sort: 'ASC' or 'DESC' + ); + } + if (isset($_REQUEST['keywords'])) // new search => set filters so every match is shown + { + $this->adjust_for_search($_REQUEST['keywords'],$content['nm']); + } + return $etpl->exec('calendar.uilist.listview',$content,array( + 'filter' => &$this->date_filters, + ),$readonlys,'',$home ? -1 : 0); + } + + /** + * set filter for search, so that everything is shown + */ + function adjust_for_search($keywords,&$params) + { + $params['search'] = $keywords; + $params['start'] = 0; + $params['order'] = 'cal_start'; + if ($keywords) + { + $params['filter'] = 'all'; + $params['sort'] = 'DESC'; + unset($params['col_filter']['participant']); + } + else + { + $params['filter'] = 'after'; + $params['sort'] = 'ASC'; + } + } + + /** + * query calendar for nextmatch in the listview + * + * @internal + * @param array &$params parameters + * @param array &$rows returned rows/events + * @param array &$readonlys eg. to disable buttons based on acl + */ + function get_rows(&$params,&$rows,&$readonlys) + { + //echo "uilist::get_rows() params="; _debug_array($params); + $old_params = $GLOBALS['egw']->session->appsession('calendar_list','calendar'); + if ($old_params['filter'] && $old_params['filter'] != $params['filter']) // filter changed => order accordingly + { + $params['order'] = 'cal_start'; + $params['sort'] = $params['filter'] == 'after' ? 'ASC' : 'DESC'; + } + if ($old_params['search'] != $params['search']) + { + $this->adjust_for_search($params['search'],$params); + } + $GLOBALS['egw']->session->appsession('calendar_list','calendar',$params); + + $search_params = array( + 'cat_id' => $this->cat_id, + 'filter' => $this->filter, + 'query' => $params['search'], + 'offset' => (int) $params['start'], + 'order' => $params['order'] ? $params['order'].' '.$params['sort'] : 'cal_start', + ); + switch($params['filter']) + { + case 'all': + break; + case 'before': + $search_params['end'] = $this->date; + break; + case 'after': + default: + $search_params['start'] = $this->date; + break; + } + if ((int) $params['col_filter']['participant']) + { + $search_params['users'] = (int) $params['col_filter']['participant']; + } + elseif(empty($params['search'])) // active search displays entries from all users + { + $search_params['users'] = $this->is_group ? $this->g_owner : explode(',',$this->owner); + } + $rows = array(); + foreach((array) $this->bo->search($search_params) as $event) + { + $readonlys['edit['.$event['id'].']'] = !$this->bo->check_perms(EGW_ACL_EDIT,$event); + $readonlys['delete['.$event['id'].']'] = !$this->bo->check_perms(EGW_ACL_DELETE,$event); + $readonlys['view['.$event['id'].']'] = !$this->bo->check_perms(EGW_ACL_READ,$event); + + $event['parts'] = implode(",\n",$this->bo->participants($event)); + if (empty($event['description'])) $event['description'] = ' '; // no description screws the titles horz. alignment + if (empty($event['location'])) $event['location'] = ' '; // no location screws the owner horz. alignment + $rows[] = $event; + } + //_debug_array($rows); + return $this->bo->total; + } +} diff --git a/calendar/inc/class.uiviews.inc.php b/calendar/inc/class.uiviews.inc.php index c216bc8cc9..79facf84d8 100644 --- a/calendar/inc/class.uiviews.inc.php +++ b/calendar/inc/class.uiviews.inc.php @@ -2,7 +2,7 @@ /**************************************************************************\ * eGroupWare - Calendar - Views and Widgets * * http://www.egroupware.org * -* Written and (c) 2004 by Ralf Becker * +* Written and (c) 2004/5 by Ralf Becker * * -------------------------------------------- * * 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 * @@ -12,14 +12,15 @@ /* $Id$ */ -include_once(PHPGW_INCLUDE_ROOT . '/calendar/inc/class.uical.inc.php'); +include_once(EGW_INCLUDE_ROOT . '/calendar/inc/class.uical.inc.php'); /** * Class to generate the calendar views and the necesary widgets * * @package calendar - * @author RalfBecker@outdoor-training.de - * @license GPL + * @author Ralf Becker + * @copyright (c) 2004/5 by RalfBecker-At-outdoor-training.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License */ class uiviews extends uical { @@ -27,35 +28,57 @@ class uiviews extends uical 'day' => True, 'week' => True, 'month' => True, + 'planner' => True, ); /** * @var $debug mixed integer level or string function- or widget-name */ - var $debug=False; + var $debug=false; /** * @var minimum width for an event */ var $eventCol_min_width = 80; + + /** + * @var int $extraRows extra rows above and below the workday + */ + var $extraRows = 1; var $timeRow_width = 40; /** - * Constructor + * @var int $rowsToDisplay how many rows per day get displayed, gets set be the timeGridWidget */ - function uiviews() + var $rowsToDisplay; + + /** + * @var int $rowHeight height in percent of one row, gets set be the timeGridWidget + */ + var $rowHeigth; + + /** + * @var array $search_params standard params for calling bocal::search for all views, set by the constructor + */ + var $search_params; + + /** + * Constructor + * + * @param array $set_states=null to manualy set / change one of the states, default NULL = use $_REQUEST + */ + function uiviews($set_states=null) { - $this->width = $this->establish_width(); + $this->uical(false,$set_states); // call the parent's constructor - $this->uical(); // call the parent's constructor - - $GLOBALS['phpgw_info']['flags']['nonavbar'] = False; + $GLOBALS['egw_info']['flags']['nonavbar'] = False; $app_header = array( - 'calendar.uiviews.day' => lang('Dayview'), - 'calendar.uiviews.week' => lang('Weekview'), + 'calendar.uiviews.day' => lang('Dayview'), + 'calendar.uiviews.week' => lang('Weekview'), 'calendar.uiviews.month' => lang('Monthview'), + 'calendar.uiviews.planner' => lang('Group planner'), ); - $GLOBALS['phpgw_info']['flags']['app_header'] = $GLOBALS['phpgw_info']['apps']['calendar']['title']. + $GLOBALS['egw_info']['flags']['app_header'] = $GLOBALS['egw_info']['apps']['calendar']['title']. (isset($app_header[$_GET['menuaction']]) ? ' - '.$app_header[$_GET['menuaction']] : ''); // standard params for calling bocal::search for all views @@ -66,41 +89,156 @@ class uiviews extends uical 'filter' => $this->filter, 'daywise' => True, ); - $this->holidays = $this->bo->read_holidays($this->year); } + + /** + * Show the last view or the default one, if no last + */ + function index() + { + if (!$this->view) $this->view = 'week'; + + // handle views in other files + if (!isset($this->public_functions[$this->view])) + { + $GLOBALS['egw']->redirect_link('/index.php',array('menuaction'=>$this->view_menuaction)); + } + // get manual to load the right page + $GLOBALS['egw_info']['flags']['params']['manual'] = array('page' => 'ManualCalendar'.ucfirst($this->view)); + + $this->{$this->view}(); + } + + /** + * Show the calendar on the home page + * + * @return string with content + */ + function &home() + { + // set some stuff for the home-page + $this->uiviews(array( + 'date' => $this->bo->date2string($this->bo->now_su), + 'cat_id' => 0, + 'filter' => 'all', + 'owner' => substr($this->cal_prefs['defaultcalendar'],0,7) == 'planner' && $this->cal_prefs['planner_start_with_group'] ? + $this->cal_prefs['planner_start_with_group'] : $this->user, + 'multiple' => 0, + 'view' => $this->bo->cal_prefs['defaultcalendar'], + )); + switch($this->cal_prefs['defaultcalendar']) + { + case 'planner_user': + case 'planner_cat': + case 'planner': + return $this->planner(true); + + case 'month': + return $this->month(0,true); + + default: + case 'week': + return $this->week(0,true); + + case 'day': + return $this->day(true); + } + } + + /** + * Displays the planner view + * + * @param boolean $home=false if true return content suitable for home-page + */ + function &planner($home=false) + { + if (!$this->planner_days) // planner monthview + { + if ($this->day < 15) // show one complete month + { + $this->_week_align_month($this->first,$this->last); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.lang(adodb_date('F',$this->bo->date2ts($this->date))).' '.$this->year; + } + else // show 2 half month + { + $this->_week_align_month($this->first,$this->last,15); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.lang(adodb_date('F',$this->first)).' / '.lang(adodb_date('F',$this->last)).' '.$this->year; + } + } + elseif ($this->planner_days >= 5) // weeekview + { + $this->first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day); + $this->last = $this->bo->date2array($this->first); + $this->last['day'] += (int) $this->planner_days - 1; + $this->last['hour'] = 23; $this->last['minute'] = $this->last['sec'] = 59; + unset($this->last['raw']); + $this->last = $this->bo->date2ts($this->last); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.lang('Week').' '.adodb_date('W',$this->first).': '.$this->bo->long_date($this->first,$this->last); + } + else // dayview + { + $this->first = $this->bo->date2ts($this->date); + $this->last = $this->bo->date2array($this->first); + $this->last['day'] += (int) $this->planner_days - 1; + $this->last['hour'] = 23; $this->last['minute'] = $this->last['sec'] = 59; + unset($this->last['raw']); + $this->last = $this->bo->date2ts($this->last); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.($this->planner_days == 1 ? lang(date('l',$this->first)).', ' : ''). + $this->bo->long_date($this->first,$this->planner_days > 1 ? $this->last : 0); + } + + $search_params = $this->search_params; + $search_params['daywise'] = false; + $search_params['start'] = $this->first; + $search_params['end'] = $this->last; + $events = $this->bo->search($search_params); + + if ($this->debug > 0) $this->bo->debug_message('uiviews::planner() date=%1: first=%2, last=%3',False,$this->date,$this->bo->date2string($this->first),$this->bo->date2string($this->last)); + + $content =& $this->plannerWidget($events,$this->first,$this->last,$this->sortby == 'user' ? false : (int) $this->cat_id); + + if (!$home) + { + $GLOBALS['egw']->common->egw_header(); + if ($_GET['msg']) echo '

    '.$this->html->htmlspecialchars($_GET['msg'])."

    \n"; + + echo $content; + } + return $content; + } /** * Displays the monthview or a multiple week-view + * + * @param int $weeks=0 number of weeks to show, if 0 (default) all weeks of one month are shows + * @param boolean $home=false if true return content suitable for home-page */ - function month($weeks=0) + function &month($weeks=0,$home=false) { if ($this->debug > 0) $this->bo->debug_message('uiviews::month(weeks=%1) date=%2',True,$weeks,$this->date); - $first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day=1); if ($weeks) { - $last = $first + $weeks * 7 * DAY_s - 1; + $this->first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day=1); + $this->last = $this->first + $weeks * 7 * DAY_s - 1; } else { - $last = $this->datetime->get_weekday_start($this->year,$this->month, - $days_in_month=$this->datetime->days_in_month($this->month,$this->year)); - $last += WEEK_s - 1; + $this->_week_align_month($this->first,$this->last); } - if ($this->debug > 0)$this->bo->debug_message('uiviews::month(%1) date=%2: first=%3, last=%4',False,$weeks,$this->date,$this->bo->date2string($first),$this->bo->date2string($last)); + if ($this->debug > 0) $this->bo->debug_message('uiviews::month(%1) date=%2: first=%3, last=%4',False,$weeks,$this->date,$this->bo->date2string($this->first),$this->bo->date2string($this->last)); - $GLOBALS['phpgw_info']['flags']['app_header'] .= ': '.lang(date('F',$this->bo->date2ts($this->date))).' '.$this->year; - $GLOBALS['phpgw']->common->phpgw_header(); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.lang(adodb_date('F',$this->bo->date2ts($this->date))).' '.$this->year; - $search_params = $this->search_params; - - $days = $this->bo->search(array( - 'start' => $first, - 'end' => $last, + $days =& $this->bo->search(array( + 'start' => $this->first, + 'end' => $this->last, )+$this->search_params); - for ($week_start = $first; $week_start < $last; $week_start += WEEK_s) + $content = ''; + // we add DAY_s/2 to $this->first (using 12h), to deal with daylight saving changes + for ($week_start = $this->first+DAY_s/2; $week_start < $this->last; $week_start += WEEK_s) { $week = array(); for ($i = 0; $i < 7; ++$i) @@ -112,19 +250,57 @@ class uiviews extends uical 'menuaction' => 'calendar.uiviews.week', 'date' => $this->bo->date2string($week_start), ); - $title = lang('Wk').' '.date('W',$week_start); + $title = lang('Wk').' '.adodb_date('W',$week_start); $title = $this->html->a_href($title,$week_view,'',' title="'.lang('Weekview').'"'); - echo $this->timeGridWidget($week,max($this->width,7*$this->eventCol_min_width+$this->timeRow_width),60,5,'',$title); + $content .= $this->timeGridWidget($week,60,200,'',$title); } + if (!$home) + { + $GLOBALS['egw']->common->egw_header(); + if ($_GET['msg']) echo '

    '.$this->html->htmlspecialchars($_GET['msg'])."

    \n"; + + echo $content; + } + return $content; + } + + /** + * get start and end of a month aligned to full weeks + * + * @param int &$first timestamp 0h of first day of week containing the first of the current month + * @param int &$last timestamp 23:59:59 of last day of week containg the last day of the current month + * @param int $day=1 should the alignment be based on the 1. of the month or an other date, eg. the 15. + */ + function _week_align_month(&$first,&$last,$day=1) + { + $first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day=$day); + if ($day == 1) + { + $last = $this->datetime->get_weekday_start($this->year,$this->month, + $this->datetime->days_in_month($this->month,$this->year)); + } + else + { + $last = $this->datetime->get_weekday_start($this->year,$this->month+1,$day); + } + // now we need to calculate the end of the last day of that week + // as simple $last += WEEK_s - 1; does NOT work, if daylight saving changes in that week!!! + $last = $this->bo->date2array($last); + $last['day'] += 6; + $last['hour'] = 23; + $last['min'] = $last['sec'] = 59; + unset($last['raw']); // otherwise date2ts does not calc raw new, but uses it + $last = $this->bo->date2ts($last); } /** * Displays the weekview, with 5 or 7 days * * @param int $days=0 number of days to show, if 0 (default) the value from the URL or the prefs is used + * @param boolean $home=false if true return content suitable for home-page */ - function week($days=0) + function week($days=0,$home=false) { if (!$days) { @@ -132,71 +308,136 @@ class uiviews extends uical if ($days != 5) $days = 7; if ($days != $this->cal_prefs['days_in_weekview']) // save the preference { - $GLOBALS['phpgw']->preferences->add('calendar','days_in_weekview',$days); - $GLOBALS['phpgw']->preferences->save_repository(); + $GLOBALS['egw']->preferences->add('calendar','days_in_weekview',$days); + $GLOBALS['egw']->preferences->save_repository(); $this->cal_prefs['days_in_weekview'] = $days; } } if ($this->debug > 0) $this->bo->debug_message('uiviews::week(days=%1) date=%2',True,$days,$this->date); - $wd_start = $first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day); + $wd_start = $this->first = $this->datetime->get_weekday_start($this->year,$this->month,$this->day); if ($days == 5) // no weekend-days { switch($this->cal_prefs['weekdaystarts']) { case 'Saturday': - $first += DAY_s; + $this->first += DAY_s; // fall through case 'Sunday': - $first += DAY_s; + $this->first += DAY_s; break; } } - //echo "

    weekdaystarts='".$this->cal_prefs['weekdaystarts']."', get_weekday_start($this->year,$this->month,$this->day)=".date('l Y-m-d',$wd_start).", first=".date('l Y-m-d',$first)."

    \n"; - $last = $first + $days * DAY_s - 1; + //echo "

    weekdaystarts='".$this->cal_prefs['weekdaystarts']."', get_weekday_start($this->year,$this->month,$this->day)=".date('l Y-m-d',$wd_start).", first=".date('l Y-m-d',$this->first)."

    \n"; + $this->last = $this->first + $days * DAY_s - 1; - $GLOBALS['phpgw_info']['flags']['app_header'] .= ': '.lang('Wk').' '.date('W',$first). - ': '.$this->bo->long_date($first,$last); - $GLOBALS['phpgw']->common->phpgw_header(); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.lang('Week').' '.adodb_date('W',$this->first).': '.$this->bo->long_date($this->first,$this->last); $search_params = array( - 'start' => $first, - 'end' => $last, + 'start' => $this->first, + 'end' => $this->last, ) + $this->search_params; $users = $this->search_params['users']; if (!is_array($users)) $users = array($users); + // for more then 3 users, show all in one row + if (count($users) > 3) $users = array($users); + + $content = ''; foreach($users as $user) { $search_params['users'] = $user; - echo $this->timeGridWidget($this->bo->search($search_params), - max($this->width,$days*$this->eventCol_min_width+$this->timeRow_width), - count($users) * $this->cal_prefs['interval'],count($users) * 1.7,'', - count($users) > 1 ? $GLOBALS['phpgw']->common->grab_owner_name($user) : ''); + if (count($users) > 1) + { + $content .= ''.$this->bo->participant_name($user)."\n"; + } + $content .= $this->timeGridWidget($this->bo->search($search_params), + count($users) * $this->cal_prefs['interval'],400 / count($users),'','',count($users) > 1 ? $user : 0); } + if (!$home) + { + $GLOBALS['egw']->common->egw_header(); + if ($_GET['msg']) echo '

    '.$this->html->htmlspecialchars($_GET['msg'])."

    \n"; + + echo $content; + } + return $content; } /** * Displays the dayview + * + * @param boolean $home=false if true return content suitable for home-page */ - function day() + function &day($home=false) { if ($this->debug > 0) $this->bo->debug_message('uiviews::day() date=%1',True,$this->date); - $ts = $this->bo->date2ts((string)$this->date); - $GLOBALS['phpgw_info']['flags']['app_header'] .= ': '.lang(date('l',$ts)).', '.$this->bo->long_date($ts); - $GLOBALS['phpgw']->common->phpgw_header(); + $this->last = $this->first = $this->bo->date2ts((string)$this->date); + $GLOBALS['egw_info']['flags']['app_header'] .= ': '.lang(adodb_date('l',$this->first)).', '.$this->bo->long_date($this->first); + + $this->search_params['end'] = $this->last = $this->first+DAY_s-1; + + if (!$home) + { + $GLOBALS['egw']->common->egw_header(); + if ($_GET['msg']) echo '

    '.$this->html->htmlspecialchars($_GET['msg'])."

    \n"; + + $users = $this->search_params['users']; + if (!is_array($users)) $users = array($users); - $todos = $this->get_todos($todo_label); + // for more then 3 users, show all in one row + if (count($users) == 1 || count($users) > 3) + { + $dayEvents =& $this->bo->search($this->search_params); + $owner = 0; + } + else + { + $dayEvents = array(); + $search_params = $this->search_params; + foreach($users as $user) + { + $title = ''.$this->bo->participant_name($user).''; + $search_params['users'] = $user; + list(,$dayEvents[$title]) = each($this->bo->search($search_params)); + } + $owner = $users; + } + $cols = array(); + $cols[0] =& $this->timeGridWidget($dayEvents,$this->cal_prefs['interval'],450,'','',$owner); - echo $this->html->table(array(0 => array( - $this->timeGridWidget($this->bo->search($this->search_params),$this->width-250,$this->cal_prefs['interval'],1.7), - $this->html->div( - $this->html->div($todo_label,'','calDayTodosHeader th')."\n". - $this->html->div($todos,'','calDayTodosTable'), - '','calDayTodos') - ),'.0' => 'valign="top"'),'width="100%"'); + if (($todos = $this->get_todos($todo_label)) !== false) + { + if ($GLOBALS['egw_info']['user']['apps']['infolog']) + { + foreach(array('task','phone','note') as $type) + { + $todo_label .= ' '.$this->html->a_href( $this->html->image('infolog',$type,lang('Add')),'infolog.uiinfolog.edit',array( + 'type' => $type, + 'start_time' => $ts, + )); + } + } + $cols[1] = $this->html->div( + $this->html->div($todo_label,'','calDayTodosHeader th')."\n". + $this->html->div($todos,'','calDayTodosTable'),'','calDayTodos'); + $cols['.1'] = 'width=30%'; + echo $this->html->table(array( + 0 => $cols, + '.0' => 'valign="top"' + ),'class="calDayView"'); + } + else + { + echo $cols[0]; + } + } + else + { + return $this->timeGridWidget($this->bo->search($this->search_params),$this->cal_prefs['interval'],300); + } } /** @@ -204,11 +445,11 @@ class uiviews extends uical * * @param array/string $todo_label label for the todo-box or array with 2 values: the label and a boolean show_all * On return $todo_label contains the label for the todo-box - * @return string html with a table of open todo's + * @return string/boolean html with a table of open todo's or false if no hook availible */ function get_todos(&$todo_label) { - $todos_from_hook = $GLOBALS['phpgw']->hooks->process(array( + $todos_from_hook = $GLOBALS['egw']->hooks->process(array( 'location' => 'calendar_include_todos', 'year' => $this->year, 'month' => $this->month, @@ -225,7 +466,7 @@ class uiviews extends uical $label=$todo_label; $showall=true; } - $maxshow = (int)$GLOBALS['phpgw_info']['user']['preferences']['infolog']['mainscreen_maxshow']; + $maxshow = (int)$GLOBALS['egw_info']['user']['preferences']['infolog']['mainscreen_maxshow']; if($maxshow <= 0) { $maxshow=10; @@ -235,13 +476,13 @@ class uiviews extends uical $content = $todo_label = ''; if (is_array($todos_from_hook) && count($todos_from_hook)) { - $todo_label = !empty($label) ? $label : lang("open ToDo's:"); - foreach($todos_from_hook as $todos) { $i = 0; - if (is_array($todos) && count($todos)) + if (is_array($todos)) { + $todo_label = !empty($label) ? $label : lang("open ToDo's:"); + foreach($todos as $todo) { if(!$showall && ($i++ > $maxshow)) @@ -251,14 +492,17 @@ class uiviews extends uical $icons = ''; foreach($todo['icons'] as $name => $app) { - $icons .= ($icons?' ':'').$GLOBALS['phpgw']->html->image($app,$name,lang($name),'border="0" width="15" height="15"'); + $icons .= ($icons?' ':'').$GLOBALS['egw']->html->image($app,$name,lang($name),'border="0" width="15" height="15"'); } $class = $class == 'row_on' ? 'row_off' : 'row_on'; $content .= " \n ". - ($this->bo->printer_friendly?$icons:$GLOBALS['phpgw']->html->a_href($icons,$todo['view'])). + ($this->bo->printer_friendly?$icons:$GLOBALS['egw']->html->a_href($icons,$todo['view'])). "\n ".($this->printer_friendly?$todo['title']: - $GLOBALS['phpgw']->html->a_href($todo['title'],$todo['view']))."\n \n"; + $GLOBALS['egw']->html->a_href($todo['title'],$todo['view']))."\n \n"; + /** + * ToDo: add delete and closing action + */ } } } @@ -267,35 +511,36 @@ class uiviews extends uical { return "\n$content
    \n"; } - return False; + return $todo_label ? '' : false; } /** * Calculates the vertical position based on the time * * workday start- and end-time, is taken into account, as well as timeGrids px_m - minutes per pixel param + * * @param int $time in minutes - * @return int position in pixels + * @return float position in percent */ function time2pos($time) { - // time before workday => condensed in the first row + // time before workday => condensed in the first $this->extraRows rows if ($this->wd_start > 0 && $time < $this->wd_start) { - $pos = round($time / $this->px_m / $this->wd_start); + $pos = (1 + $this->extraRows * $time / $this->wd_start) * $this->rowHeight; // 1 for the header } // time after workday => condensed in the last row - elseif ($this->wd_end < 24*60 && $time > $this->wd_end+2*$this->granularity_m) + elseif ($this->wd_end < 24*60 && $time > $this->wd_end+1*$this->granularity_m) { - $pos = $this->time2pos($this->wd_end+2*$this->granularity_m) + - @round(($time - ($this->wd_end+2*$this->granularity_m)) / $this->px_m / - (24*60 - ($this->wd_end+2*$this->granularity_m))); + $pos = 100 - ($this->extraRows * $this->rowHeight * (1 - ($time - $this->wd_end) / (24*60 - $this->wd_end))); } // time during the workday => 2. row on (= + granularity) else { - $pos = round(($time - $this->wd_start + $this->granularity_m) / $this->px_m); + $pos = $this->rowHeight * (1+$this->extraRows+($time-$this->wd_start)/$this->granularity_m); } + $pos = round($pos,1); + if ($this->debug > 3) $this->bo->debug_message('uiviews::time2pos(%1)=%2',False,$time,$pos); return $pos; @@ -305,13 +550,15 @@ class uiviews extends uical * Calculates the height of a differenc between 2 times * * workday start- and end-time, is taken into account, as well as timeGrids px_m - minutes per pixel param + * * @param int $start time in minutes * @param int $end time in minutes * @param int $minimum=0 minimum height - * @return int height in pixel + * @return float height in percent */ function times2height($start,$end,$minimum=0) { + $minimum = $this->rowHeigth; $height = $this->time2pos($end) - $this->time2pos($start); if ($this->debug > 3) $this->bo->debug_message('uiviews::times2height(%1,%2,min=%3)=%4',False,$start,$end,$minimum,$height); @@ -325,74 +572,78 @@ class uiviews extends uical * Uses the dayColWidget to display each day. * * @param $daysEvents array with subarrays of events for each day to show, day as YYYYMMDD as key - * @param int $width width of the widget - * @param int $granularity_m granularity in minutes of the rows - * @param int/float $px_m minutes per pixel - pixel in minutes ;-) - * @param string $indent string for correct indention - * @param string $title title of the time-grid + * @param int $granularity_m=30 granularity in minutes of the rows + * @param int $height=400 height of the widget + * @param string $indent='' string for correct indention + * @param string $title='' title of the time-grid + * @param int/array $owner=0 owner of the calendar (default 0 = $this->owner) or array with owner for each column */ - function timeGridWidget($daysEvents,$width,$granularity_m=30,$px_m=1.7,$indent='',$title='') + function &timeGridWidget($daysEvents,$granularity_m=30,$height=400,$indent='',$title='',$owner=0) { - if ($this->debug > 1 || $this->debug==='timeGridWidget') $this->bo->debug_message('uiviews::timeGridWidget(events=%1,width=%2,granularity_m=%3,px_m=%4,)',True,$daysEvents,$width,$granularity_m,$px_m); + if ($this->debug > 1 || $this->debug==='timeGridWidget') $this->bo->debug_message('uiviews::timeGridWidget(events=%1,granularity_m=%2,height=%3,,title=%4)',True,$daysEvents,$granularity_m,$height,$title); - $this->px_m = $px_m; // for time2pos() $this->granularity_m = $granularity_m; + $this->display_start = $this->wd_start - ($this->extraRows * $this->granularity_m); + $this->display_end = $this->wd_end + ($this->extraRows * $this->granularity_m); - $html = $indent.'
    '."\n"; + $wd_end = ($this->wd_end === 0 ? 1440 : $this->wd_end); + $totalDisplayMinutes = $wd_end - $this->wd_start; + $this->rowsToDisplay = ($totalDisplayMinutes/$granularity_m)+2+2*$this->extraRows; + $this->rowHeight = round(100/$this->rowsToDisplay,1); - if ($title) + $html = $indent.'
    '."\n"; + + $html .= $indent."\t".'
    '.$title."
    \n"; + + $off = false; // Off-row means a different bgcolor + $add_links = count($daysEvents) == 1; + + // the hour rows + for($i=1; $i < $this->rowsToDisplay; $i++) { - $html .= $indent."\t".'
    '.$title."
    \n"; - } - $off = True; // Off-row means a different bgcolor - for ($t = 0; $t < 24*60; $t += $inc) - { - $inc = $granularity_m; - if (!$t && $this->wd_start) + $currentTime = $this->display_start + (($i-1) * $this->granularity_m); + if($this->wd_start <= $currentTime && $this->wd_end >= $currentTime) { - $inc = $this->wd_start; - } - elseif ($t > $this->wd_end) - { - $inc = 24*60 - $this->wd_end; - } - $html .= $indent."\t".'
    '."\n"; - - $add_links = count($daysEvents) == 1 && $this->bo->check_perms(PHPGW_ACL_ADD,0,$this->owner); - $add = array( - 'menuaction' => 'calendar.uicalendar.add', - 'date' => $this->date, - 'owner' => $this->owner, - ); - if ($t >= $this->wd_start && $t <= $this->wd_end) - { - $time = $GLOBALS['phpgw']->common->formattime(sprintf('%02d',$t/60),sprintf('%02d',$t%60)); - if ($add_links) - { - $add['hour'] = (int) ($t/60); - $add['minute'] = $t%60; - $time = $this->html->a_href($time,$add,'',' title="'.lang('Add').'"'); - } + $html .= $indent."\t".'
    '."\n"; + $time = $GLOBALS['egw']->common->formattime(sprintf('%02d',$currentTime/60),sprintf('%02d',$currentTime%60)); + if ($add_links) $time = $this->add_link($time,$this->date,(int) ($currentTime/60),$currentTime%60); $html .= $indent."\t\t".'
    '.$time."
    \n"; + $html .= $indent."\t
    \n"; // calTimeRow + $off = !$off; } - $html .= $indent."\t
    \n"; // calTimeRow - - $off = !$off; } if (is_array($daysEvents) && count($daysEvents)) { + $numberOfDays = count($daysEvents); + $dayColWidth = 100/$numberOfDays; + $dayCols_width = $width - $this->timeRow_width - 1; - $html .= $indent."\t".'
    '."\n"; + + // Lars Kneschke 2005-08-28 + // why do we use a div in a div which has the same height and width??? + // To make IE6 happy!!! Whithout the second div you can't use + // style="left: 50px; right: 0px;" + $html .= $indent."\t".'
    '."\n"; $dayCol_width = $dayCols_width / count($daysEvents); $n = 0; foreach($daysEvents as $day => $events) { - $html .= $this->dayColWidget($day,$events,(int)($n*$dayCol_width),(int)$dayCol_width,$indent."\t\t",count($daysEvents) != 1,++$on_off & 1); + $short_title = count($daysEvents) > 1; + $col_owner = $owner; + if (!is_numeric($day)) + { + $short_title = $day; + $day = $this->date; + $col_owner = $owner[$n]; + } + $html .= $this->dayColWidget($day,$events,$n*$dayColWidth, + $dayColWidth,$indent."\t\t",$short_title,++$on_off & 1,$col_owner); ++$n; } - $html .= $indent."\t
    \n"; // calDayCols + $html .= $indent."\t
    \n"; // calDayCols } $html .= $indent."
    \n"; // calTimeGrid @@ -409,10 +660,11 @@ class uiviews extends uical * @param int $left start of the widget * @param int $width width of the widget * @param string $indent string for correct indention - * @param boolean $short_title should we add a label (weekday, day) with link to the day-view above each day - * @param boolean $on_off start with row_on or row_off, default false=row_off + * @param boolean/string $short_title=True should we add a label (weekday, day) with link to the day-view above each day or string with title + * @param boolean $on_off=false start with row_on or row_off, default false=row_off + * @param int $owner=0 if != 0 owner to add to the add-event link */ - function dayColWidget($day_ymd,$events,$left,$width,$indent,$short_title=True,$on_off=False) + function dayColWidget($day_ymd,$events,$left,$width,$indent,$short_title=True,$on_off=False,$owner=0) { if ($this->debug > 1 || $this->debug==='dayColWidget') $this->bo->debug_message('uiviews::dayColWidget(%1,%2,left=%3,width=%4,)',False,$day_ymd,$events,$left,$width); @@ -423,13 +675,13 @@ class uiviews extends uical foreach($events as $event) { $event['multiday'] = False; - $event['start_m'] = ($this->bo->date2ts($event['start']) - $day_start) / 60; + $event['start_m'] = ($event['start'] - $day_start) / 60; if ($event['start_m'] < 0) { $event['start_m'] = 0; $event['multiday'] = True; } - $event['end_m'] = ($this->bo->date2ts($event['end']) - $day_start) / 60; + $event['end_m'] = ($event['end'] - $day_start) / 60; if ($event['end_m'] >= 24*60) { $event['end_m'] = 24*60-1; @@ -439,8 +691,10 @@ class uiviews extends uical $eventCols[$c][] = $event; $col_ends[$c] = $event['end_m']; } + if (count($eventCols)) { + /* code to overlay the column, not used at the moment $eventCol_dist = $eventCol_width = round($width / count($eventCols)); $eventCol_min_width = 80; if ($eventCol_width < $eventCol_min_width) @@ -450,43 +704,47 @@ class uiviews extends uical { $eventCol_dist = round(($width - $eventCol_min_width) / (count($eventCols)-1)); } - } + }*/ + $eventCol_dist = $eventCol_width = round(100 / count($eventCols)); } - $html = $indent.'
    '."\n"; + $html = $indent.'
    '."\n"; // Creation of the header-column with date, evtl. holiday-names and a matching background-color $ts = $this->bo->date2ts((string)$day_ymd); - $title = lang(date('l',$ts)).', '.($short_title ? date('d.',$ts) : $this->bo->long_date($ts)); + $title = is_bool($short_title) ? (lang(adodb_date('l',$ts)).', '.($short_title ? adodb_date('d.',$ts) : $this->bo->long_date($ts))) : $short_title; $day_view = array( 'menuaction' => 'calendar.uiviews.day', 'date' => $day_ymd, ); - if ($short_title) + if ($short_title === true) { $title = $this->html->a_href($title,$day_view,'', !isset($this->holidays[$day_ymd])?' title="'.lang('Dayview').'"':''); } - if (isset($this->holidays[$day_ymd])) - { - $class = 'calHoliday'; - foreach($this->holidays[$day_ymd] as $holiday) - { - $holidays[] = $holiday['name']; - } - $holidays = implode(', ',$holidays); - } - elseif ($day_ymd == $this->bo->date2string($this->bo->now_su)) - { - $class = 'calToday'; - } - else - { - $class = $on_off ? 'row_on' : 'row_off'; - } - $html .= $indent."\t".'
    '. + $this->_day_class_holiday($day_ymd,$class,$holidays); + // the weekday and date + $html .= $indent."\t".'
    '. $title.(!$short_title && $holidays ? ': '.$holidays : '')."
    \n"; + // adding divs to click on for each row / time-span + for($counter = 1; $counter < $this->rowsToDisplay; $counter++) + { + //print "$counter - ". $counter*$this->rowHeight ."
    "; + $linkData = array( + 'menuaction' =>'calendar.uiforms.edit', + 'date' => $day_ymd, + 'hour' => floor(($this->wd_start + (($counter-$this->extraRows-1)*$this->granularity_m))/60), + 'minute' => floor(($this->wd_start + (($counter-$this->extraRows-1)*$this->granularity_m))%60), + ); + if ($owner) $linkData['owner'] = $owner; + + $html .= $indent."\t".'
    '. + '
    '."\n"; + } + // displaying all event columns of the day foreach($eventCols as $n => $eventCol) { $html .= $this->eventColWidget($eventCol,$n*$eventCol_dist,$eventCol_width,$indent."\t"); @@ -495,6 +753,57 @@ class uiviews extends uical return $html; } + + /** + * get the CSS class and holidays for a given day + * + * @param string $day_ymd date + * @param string &$class class to use + * @param string &$holidays commaseparted holidays or empty if none + * @param boolean $only_weekend=false show only the weekend in header-color, otherwise every second days is shown too + */ + function _day_class_holiday($day_ymd,&$class,&$holidays,$only_weekend=false) + { + $class = $holidays = ''; + $bday = false; + if (isset($this->holidays[$day_ymd])) + { + foreach($this->holidays[$day_ymd] as $holiday) + { + if (isset($holiday['birthyear'])) + { + $bday = true; + } + else + { + $class = 'calHoliday'; + } + $holidays[] = $holiday['name']; + } + $holidays = implode(', ',$holidays); + } + if (!$class) + { + if ($day_ymd == $this->bo->date2string($this->bo->now_su)) + { + $class = 'calToday'; + } + else + { + $day = (int) date('w',$this->bo->date2ts((string) $day_ymd)); + + if ($only_weekend) + { + $class = $day == 0 || $day == 6 ? 'th' : 'row_off'; + } + else + { + $class = $day & 1 ? 'row_on' : 'th'; + } + } + } + if ($bday) $class .= ' calBirthday'; + } /** * Creates colunm for non-overlaping (!) events @@ -510,7 +819,7 @@ class uiviews extends uical { if ($this->debug > 1 || $this->debug==='eventColWidget') $this->bo->debug_message('uiviews::eventColWidget(%1,left=%2,width=%3,)',False,$events,$left,$width); - $html = $indent.'
    '."\n"; + $html = $indent.'
    '."\n"; foreach($events as $event) { $html .= $this->eventWidget($event,$width,$indent."\t"); @@ -528,21 +837,26 @@ class uiviews extends uical * @param $event array with the data of event to show * @param $width int width of the widget * @param string $indent string for correct indention + * @param boolean $return_array=false should an array with keys(tooltip,popup,html) be returned or the complete widget as string + * @param string $block='event_widget' template used the render the widget + * @return string/array */ - function eventWidget($event,$width,$indent) + function eventWidget($event,$width,$indent,$return_array=false,$block='event_widget') { - if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1)',False,$event); + if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1,width=%2)',False,$event,$width); static $tpl = False; if (!$tpl) { - $tpl = $GLOBALS['phpgw']->template; + $tpl = $GLOBALS['egw']->template; + $tpl->set_root($GLOBALS['egw']->common->get_tpl_dir('calendar')); $tpl->set_file('event_widget_t','event_widget.tpl'); $tpl->set_block('event_widget_t','event_widget'); $tpl->set_block('event_widget_t','event_tooltip'); + $tpl->set_block('event_widget_t','planner_event'); } - if ($event['start_m'] == 0 && $event['end_m'] == 24*60-1) + if ($event['start_m'] == 0 && $event['end_m'] >= 24*60-1) { $timespan = lang('all day'); } @@ -550,11 +864,11 @@ class uiviews extends uical { foreach(array($event['start_m'],$event['end_m']) as $minutes) { - $timespan[] = $GLOBALS['phpgw']->common->formattime(sprintf('%02d',$minutes/60),sprintf('%02d',$minutes%60)); + $timespan[] = $GLOBALS['egw']->common->formattime(sprintf('%02d',$minutes/60),sprintf('%02d',$minutes%60)); } $timespan = implode(' - ',$timespan); } - $is_private = !$this->bo->check_perms(PHPGW_ACL_READ,$event); + $is_private = !$this->bo->check_perms(EGW_ACL_READ,$event); $icons = !$is_private ? $this->event_icons($event) : array($this->html->image('calendar','private',lang('private'))); $cats = $this->bo->categories($event['category'],$color); @@ -564,40 +878,61 @@ class uiviews extends uical $corner_radius=$width > $small_trigger_width ? 10 : 5; $header_height=$width > $small_trigger_width ? 19 : 12; // multi_3 icon has a height of 19=16+2*1padding+1border ! $height = $this->times2height($event['start_m'],$event['end_m'],$header_height); - $body_height = max(0,$height - $header_height - $corner_radius); + //$body_height = max(0,$height - $header_height - $corner_radius); $border=1; $headerbgcolor = $color ? $color : '#808080'; // the body-colors (gradient) are calculated from the headercolor, which depends on the cat of an event $bodybgcolor1 = $this->brighter($headerbgcolor,170); $bodybgcolor2 = $this->brighter($headerbgcolor,220); + // seperate each participant types + $part_array = array(); + foreach($this->bo->participants($event) as $part_key => $participant) + { + if(is_numeric($part_key)) + { + $part_array[lang('Participants')][$part_key] = $participant; + } + elseif(isset($this->bo->resources[$part_key{0}])) + { + $part_array[((isset($this->bo->resources[$part_key{0}]['participants_header'])) ? $this->bo->resources[$part_key{0}]['participants_header'] : lang($this->bo->resources[$part_key{0}]['app']))][$part_key] = $participant; + } + } + foreach($part_array as $part_group => $participant) + { + $participants .= $this->add_nonempty($participant,$part_group,True); + } + $tpl->set_var(array( // event-content, some of it displays only if it really has content or is needed 'header_icons' => $width > $small_trigger_width ? implode("",$icons) : '', - 'body_icons' => $width > $small_trigger_width ? '' : implode("\n",$icons).'
    ', + 'body_icons' => $width > $small_trigger_width ? '' : implode("\n",$icons), 'icons' => implode("\n",$icons), - 'header' => $timespan, + 'timespan' => $timespan, + 'header' => !$is_private ? $this->html->htmlspecialchars($event['title']) : lang('private'), // $timespan, 'title' => !$is_private ? $this->html->htmlspecialchars($event['title']) : lang('private'), 'description' => !$is_private ? nl2br($this->html->htmlspecialchars($event['description'])) : '', 'location' => !$is_private ? $this->add_nonempty($event['location'],lang('Location')) : '', - 'participants' => count($event['participants']) == 1 && isset($event['participants'][$this->user]) || $is_private ? '' : - $this->add_nonempty($this->bo->participants($event['participants']),lang('Participants'),True), + 'participants' => $participants, + 'times' => !$event['multiday'] ? $this->add_nonempty($timespan,lang('Time')) : + $this->add_nonempty($GLOBALS['egw']->common->show_date($event['start']),lang('Start')). + $this->add_nonempty($GLOBALS['egw']->common->show_date($event['end']),lang('End')), 'multidaytimes' => !$event['multiday'] ? '' : - $this->add_nonempty($GLOBALS['phpgw']->common->show_date($this->bo->date2ts($event['start'])),lang('Start Date/Time')). - $this->add_nonempty($GLOBALS['phpgw']->common->show_date($this->bo->date2ts($event['end'])),lang('End Date/Time')), + $this->add_nonempty($GLOBALS['egw']->common->show_date($event['start']),lang('Start')). + $this->add_nonempty($GLOBALS['egw']->common->show_date($event['end']),lang('End')), 'category' => !$is_private ? $this->add_nonempty($cats,lang('Category')) : '', // the tooltip is based on the content of the actual widget, this way it takes no extra bandwidth/volum // 'tooltip' => $this->html->tooltip(False,False,array('BorderWidth'=>0,'Padding'=>0)), // various aspects of the geometry or style 'corner_radius' => $corner_radius.'px', 'header_height' => $header_height.'px', - 'body_height' => $body_height.'px', + //'body_height' => $body_height.'px', 'height' => $height, 'width' => ($width-20).'px', 'border' => $border, 'bordercolor' => $headerbgcolor, 'headerbgcolor' => $headerbgcolor, - 'bodybackground' => 'url('.$GLOBALS['phpgw_info']['server']['webserver_url']. + 'bodybackground' => 'url('.$GLOBALS['egw_info']['server']['webserver_url']. '/calendar/inc/gradient.php?color1='.urlencode($bodybgcolor1).'&color2='.urlencode($bodybgcolor2). '&width='.$width.') repeat-y '.$bodybgcolor2, 'Small' => $width > $small_trigger_width ? '' : 'Small', // to use in css class-names @@ -609,7 +944,7 @@ class uiviews extends uical 'lower_right'=>array('width'=>$corner_radius,'height'=>-$corner_radius,'border'=>$border,'color'=>$headerbgcolor,'bgcolor'=>$bodybgcolor2), ) as $name => $data) { - $tpl->set_var($name.'_corner',$GLOBALS['phpgw_info']['server']['webserver_url']. + $tpl->set_var($name.'_corner',$GLOBALS['egw_info']['server']['webserver_url']. '/calendar/inc/round_corners.php?width='.$data['width'].'&height='.$data['height']. '&bgcolor='.urlencode($data['bgcolor']). (isset($data['color']) ? '&color='.urlencode($data['color']) : ''). @@ -617,13 +952,24 @@ class uiviews extends uical } $tooltip = $tpl->fp('tooltip','event_tooltip'); $tpl->set_var('tooltip',$this->html->tooltip($tooltip,False,array('BorderWidth'=>0,'Padding'=>0))); - $html = $tpl->fp('out','event_widget'); + $html = $tpl->fp('out',$block); - $view_link = $GLOBALS['phpgw']->link('/index.php',array('menuaction'=>'calendar.uicalendar.view','cal_id'=>$event['id'],'date'=>$event['start']['full'])); - - return $indent.'
    '."\n". - $html.$indent."
    \n"; + $view_link = $GLOBALS['egw']->link('/index.php',array('menuaction'=>'calendar.uiforms.view','cal_id'=>$event['id'],'date'=>$this->bo->date2string($event['start']))); + $popup = $is_private ? '' : ' onclick="'.$this->popup($view_link).'; return false;"'; + + if ($return_array) + { + return array( + 'tooltip' => $tooltip, + 'popup' => $popup, + 'html' => $html, + 'private' => $is_private, + 'color' => $color, + ); + } + //_debug_array($event); + return $indent.'
    '."\n".$html.$indent."
    \n"; } function add_nonempty($content,$label,$one_per_line=False) @@ -664,115 +1010,543 @@ class uiviews extends uical //echo "brighter($rgb=".print_r($components,True).")=$brighter

    \n"; return $brighter; } + + + /** + * Creates a planner view: grid with columns for the time and rows for categories or users + * + * Uses the plannerRowWidget to display rows + * + * @param array $events events to show + * @param mixed $start start-time of the grid + * @param mixed $end end-time of the grid + * @param boolean/int $by_cat rows by sub-categories of $by_cat (cat_id or 0 for upmost level) or by users (false) + * @param string $indent='' string for correct indention + * @return string with widget + */ + function &plannerWidget($events,$start,$end,$by_cat=0,$indent='') + { + $content = $indent.'
    '."\n"; + + // display the header, containing a headerTitle and multiple headerRows with the scales + $content .= $indent."\t".'
    '."\n"; + // display the headerTitle + $title = $by_cat === false ? lang('User') : lang('Category'); + $content .= $indent."\t\t".'
    '.$title."
    \n"; + + // display the headerRows with the scales + $content .= $indent."\t\t".'
    '."\n"; + // set start & end to timestamp and first & last to timestamp of 12h midday, to avoid trouble with daylight saving + foreach(array('start' => 'first','end' => 'last') as $t => $v) + { + $$t = $this->bo->date2ts($$t); + $$v = $this->bo->date2array($$t); + unset(${$v}['raw']); + ${$v}['hour'] = 12; + ${$v}['minute'] = ${$v}['second'] = 0; + ${$v} = $this->bo->date2ts($$v); + } + $days = 1 + (int) round(($last - $first) / DAY_s); // we have to use round to get the right number if daylight saving changes + if ($days >= 28) // display the month scale + { + $content .= $this->plannerMonthScale($first,$days,$indent."\t\t\t"); + } + if ($days >= 5) // display the week scale + { + $content .= $this->plannerWeekScale($first,$days,$indent."\t\t\t"); + } + $content .= $this->plannerDayScale($first,$days,$indent."\t\t\t"); // day-scale, always displayed + if ($days <= 7) // display the hour scale + { + $content .= $this->plannerHourScale($start,$days,$indent."\t\t\t"); + } + $content .= $indent."\t\t
    \n"; // end of the plannerHeaderRows + $content .= $indent."\t
    \n"; // end of the plannerHeader + + // sort the events after user or category + $rows = $sort2label = array(); + if ($by_cat === false) // planner by user + { + $sort2label = $this->_get_planner_users(); + } + foreach($events as $key => $event) + { + if ($by_cat === false) // planner by user + { + foreach($event['participants'] as $sort => $status) + { + if (isset($sort2label[$sort])) + { + $rows[$sort][] =& $events[$key]; + } + } + } + else // planner by cat + { + foreach($this->_get_planner_cats($event['category'],$sort2label,$sort2color) as $sort) + { + if (!is_array($rows[$sort])) $rows[$sort] = array(); + + $rows[$sort][] =& $events[$key]; + } + } + } + // display a plannerRowWidget for each row (user or category) + foreach($sort2label as $sort => $label) + { + if (!isset($rows[$sort])) continue; // dont show empty categories (user-rows get all initialised + + $class = $class == 'row_on' ? 'row_off' : 'row_on'; + $content .= $this->plannerRowWidget(isset($rows[$sort]) ? $rows[$sort] : array(),$start,$end,$label,$class,$indent."\t"); + } + $content .= $indent."
    \n"; // end of the plannerWidget + + return $content; + } + + /** + * get all users to display in the planner_by_user + * + * @return array with uid => label pairs + */ + function _get_planner_users() + { + $users = array(); + foreach(explode(',',$this->owner) as $user) + { + if (is_numeric($user) && $GLOBALS['egw']->accounts->get_type($user) == 'g') + { + foreach((array) $GLOBALS['egw']->accounts->member($user) as $data) + { + $user = $data['account_id']; + if ($this->bo->check_perms(EGW_ACL_READ,0,$user)) + { + $users[$user] = $this->bo->participant_name($user); + } + } + } + else + { + $users[$user] = $this->bo->participant_name($user); + } + asort($users); + } + return $users; + } + + /** + * get all categories used as sort criteria for the planner by category + * + * the returned cat is as direct sub-category of $this->cat_id or a main (level 1) category if !$this->cat_id + * + * @param string $cats comma-delimited cat_id's or empty for no cat + * @param array &$sort2label labels for the returned cats + * @return array with cat_id's + */ + function _get_planner_cats($cats,&$sort2label) + { + static $cat2sort; + + if (!is_array($cat2sort)) + { + $cat2sort = array(); + foreach((array)$this->cats->return_array('all',0,false,'','','',true) as $data) + { + if ($data['parent'] == $this->cat_id || $data['id'] == $this->cat_id) // cat is a direct sub of $this->cat_id + { + $cat2sort[$data['id']] = $data['id']; + $sort2label[$data['id']] = stripslashes($data['name']); + } + elseif(isset($cat2sort[$data['parent']])) // parent is already in the array => add us with same target + { + $cat2sort[$data['id']] = $cat2sort[$data['parent']]; + } + } + } + $ret = array(); + foreach(!is_array($cats) ? explode(',',$cats) : $cats as $cat) + { + if (isset($cat2sort[$cat]) && !in_array($cat2sort[$cat],$ret)) + { + $ret[] = $cat2sort[$cat]; + } + } + if (!count($ret)) + { + $sort2label[0] = lang('none'); + $ret[] = 0; + } + //echo "

    uiviews::_get_planner_cats($cats=".$this->cats->id2name($cats).") (this->cat_id=$this->cat_id) = ".print_r($ret,true).'='.$this->cats->id2name($ret[0])."

    \n"; + return $ret; + } /** - * trys to figure out the inner window width from the browser and installs an onResize handler + * Creates month scale for the planner * - * If no $_REQUEST[windowInnerWidth] is present, the pages get reloaded with some javascript, which sets - * the width in the URL. If a width could be determined, an onResize handler gets installed, which refreshes - * the page, with the new width set in the URL. - * If we are allowed to set cookies, we additionaly set a cookie with the width, to save the additonal reload. - * An onLoad handler checks if we operate with the correct width, or reloads the page if not. + * @param int $start start-time (12h) of the scale + * @param int $days number of days to display + * @param string $indent='' string for correct indention + * @return string with scale */ - function establish_width() + function plannerMonthScale($start,$days,$indent) { - if (!isset($_REQUEST['windowInnerWidth'])) // we neither have a cookie nor an url-var, get one ... + $day_width = round(100 / $days,2); + + $content .= $indent.'
    '."\n"; + for($t = $start,$left = 0,$i = 0; $i < $days; $t += $days_in_month*DAY_s,$left += $days_in_month*$day_width,$i += $days_in_month) { -?> - - - - - - - - - -common->phpgw_exit(); + $t_arr = $this->bo->date2array($t); + unset($t_arr['raw']); // force recalculation + unset($t_arr['full']); + $days_in_month = $this->datetime->days_in_month($t_arr['month'],$t_arr['year']) - ($t_arr['day']-1); + if ($i + $days_in_month > $days) + { + $days_in_month = $days - $i; + } + if ($days_in_month > 10) + { + $title = lang(date('F',$t)).' '.$t_arr['year']; + // previous links + $prev = $t_arr; + $prev['day'] = 1; + if ($prev['month']-- <= 1) + { + $prev['month'] = 12; + $prev['year']--; + } + if ($this->bo->date2ts($prev) < $start-20*DAY_s) + { + $prev['day'] = $this->day; + $full = $this->bo->date2string($prev); + if ($this->day >= 15) $prev = $t_arr; // we stay in the same month + $prev['day'] = $this->day < 15 ? 15 : 1; + $half = $this->bo->date2string($prev); + $title = $this->html->a_href($this->html->image('phpgwpai','first',lang('back one month'),$options=' alt="<<"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => $full, + )) . '   '. + $this->html->a_href($this->html->image('phpgwpai','left',lang('back half a month'),$options=' alt="<"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => $half, + )) . '   '.$title; + } + // next links + $next = $t_arr; + if ($next['month']++ >= 12) + { + $next['month'] = 1; + $next['year']++; + } + if ($this->bo->date2ts($next) > $start+($days-10)*DAY_s) + { + if ($this->day >= 15) $next = $t_arr; // we stay in the same month + $next['day'] = $this->day; + $full = $this->bo->date2string($next); + if ($this->day < 15) $next = $t_arr; // we stay in the same month + $next['day'] = $this->day < 15 ? 15 : 1; + $half = $this->bo->date2string($next); + $title .= '   '.$this->html->a_href($this->html->image('phpgwpai','right',lang('forward half a month'),$options=' alt=">>"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => $half, + )). '   '. + $this->html->a_href($this->html->image('phpgwpai','last',lang('forward one month'),$options=' alt=">>"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => $full, + )); + } + } + else + { + $title = ' '; + } + $class = $class == 'row_on' ? 'th' : 'row_on'; + $content .= $indent."\t".'
    '. + $title."
    \n"; } + $content .= $indent."
    \n"; // end of plannerScale - $width = (int) $_GET['windowInnerWidth'] ? $_GET['windowInnerWidth'] : $_COOKIE['windowInnerWidth']; - - if ($GLOBALS['phpgw_info']['server']['usecookies']) - { - $GLOBALS['phpgw']->session->phpgw_setcookie('windowInnerWidth',$width); - } - if ($width) - { - $GLOBALS['phpgw_info']['flags']['java_script'] = ' - -'; - if (!is_object($GLOBALS['phpgw']->js)) - { - $GLOBALS['phpgw']->js = CreateObject('phpgwapi.javascript'); - } - $GLOBALS['phpgw']->js->set_onresize('reload_inner_width();'); - - // need to be instanciated here, as the constructor is not yet finished - if (!is_object($GLOBALS['phpgw']->html)) - { - $GLOBALS['phpgw']->html = CreateObject('phpgwapi.html'); - } - $GLOBALS['phpgw']->js->set_onresize('reload_inner_width();'); - // dont check for MS IE the window-width on load, as some versions report constantly changing sizes - if ($GLOBALS['phpgw']->html->user_agent != 'msie') - { - //$GLOBALS['phpgw']->js->set_onload('if ('.$width.'!=(window.innerWidth ? window.innerWidth : document.body.clientWidth)) reload_inner_width();'); - $GLOBALS['phpgw']->js->set_onload('if ('.$width.'!=window.innerWidth) reload_inner_width();'); - } - } - else + /** + * Creates a week scale for the planner + * + * @param int $start start-time (12h) of the scale + * @param int $days number of days to display + * @param string $indent='' string for correct indention + * @return string with scale + */ + function plannerWeekScale($start,$days,$indent) + { + $week_width = round(100 / $days * ($days <= 7 ? $days : 7),2); + + $content .= $indent.'
    '."\n"; + for($t = $start,$left = 0,$i = 0; $i < $days; $t += 7*DAY_s,$left += $week_width,$i += 7) { - $width = 1000; // default, if the browser does not report it + $title = lang('Week').' '.date('W',$t); + if ($days > 7) + { + $title = $this->html->a_href($title,array( + 'menuaction' => 'calendar.uiviews.planner', + 'planner_days' => 7, + 'date' => date('Ymd',$t), + ),false,' title="'.$this->html->htmlspecialchars(lang('Weekview')).'"'); + } + else + { + // prev. week + $title = $this->html->a_href($this->html->image('phpgwpai','first',lang('previous'),$options=' alt="<<"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => date('Ymd',$t-7*DAY_s), + )) . '   '.$title; + // next week + $title .= '   '.$this->html->a_href($this->html->image('phpgwpai','last',lang('next'),$options=' alt=">>"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => date('Ymd',$t+7*DAY_s), + )); + } + $class = $class == 'row_on' ? 'th' : 'row_on'; + $content .= $indent."\t".'
    '.$title."
    \n"; } -// print $width ; - return $width - 250; // 180 for sidebox-menu, TODO: this need to come from the template + $content .= $indent."
    \n"; // end of plannerScale + + return $content; + } + + /** + * Creates day scale for the planner + * + * @param int $start start-time (12h) of the scale + * @param int $days number of days to display + * @param string $indent='' string for correct indention + * @return string with scale + */ + function plannerDayScale($start,$days,$indent) + { + $day_width = round(100 / $days,2); + + $content .= $indent.'
    '."\n"; + for($t = $start,$left = 0,$i = 0; $i < $days; $t += DAY_s,$left += $day_width,++$i) + { + if ($days <= 3) + { + $title = ''.lang(date('l',$t)).', '.date('j',$t).'. '.lang(date('F',$t)).''; + } + elseif ($days <= 7) + { + $title = lang(date('l',$t)).'
    '.date('j',$t).'. '.lang(date('F',$t)); + } + else + { + $title = substr(lang(date('D',$t)),0,2).'
    '.date('j',$t); + } + if ($days > 1) + { + $title = $this->html->a_href($title,array( + 'menuaction' => 'calendar.uiviews.planner', + 'planner_days' => 1, + 'date' => date('Ymd',$t), + ),false,' title="'.$this->html->htmlspecialchars(lang('Dayview')).'"'); + } + if ($days < 5) + { + if (!$i) // prev. day only for the first day + { + $title = $this->html->a_href($this->html->image('phpgwpai','first',lang('previous'),$options=' alt="<<"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => date('Ymd',$start-DAY_s), + )) . '   '.$title; + } + if ($i == $days-1) // next day only for the last day + { + $title .= '   '.$this->html->a_href($this->html->image('phpgwpai','last',lang('next'),$options=' alt=">>"'),array( + 'menuaction' => $this->view_menuaction, + 'date' => date('Ymd',$start+DAY_s), + )); + } + } + $this->_day_class_holiday($this->bo->date2string($t),$class,$holidays,$days > 7); + $content .= $indent."\t".'
    '.$title."
    \n"; + } + $content .= $indent."
    \n"; // end of plannerScale + + return $content; + } + + /** + * Creates hour scale for the planner + * + * @param int $start start-time (12h) of the scale + * @param int $days number of days to display + * @param string $indent='' string for correct indention + * @return string with scale + */ + function plannerHourScale($start,$days,$indent) + { + foreach(array(1,2,3,4,6,8,12) as $d) // numbers dividing 24 without rest + { + if ($d > $days) break; + $decr = $d; + } + $hours = $days * 24; + if ($days == 1) // for a single day we calculate the hours of a days, to take into account daylight saving changes (23 or 25 hours) + { + $t_arr = $this->bo->date2array($start); + unset($t_arr['raw']); + $t_arr['hour'] = $t_arr['minute'] = $t_arr['second'] = 0; + $s = $this->bo->date2ts($t_arr); + $t_arr['hour'] = 23; $t_arr['minute'] = $t_arr['second'] = 59; + $hours = ($this->bo->date2ts($t_arr) - $s) / HOUR_s; + } + $cell_width = round(100 / $hours * $decr,2); + + $content .= $indent.'
    '."\n"; + for($t = $start,$left = 0,$i = 0; $i < $hours; $t += $decr*HOUR_s,$left += $cell_width,$i += $decr) + { + $title = date($this->cal_prefs['timeformat'] == 12 ? 'ha' : 'H',$t); + + $class = $class == 'row_on' ? 'th' : 'row_on'; + $content .= $indent."\t".'
    '.$title."
    \n"; + } + $content .= $indent."
    \n"; // end of plannerScale + + return $content; + } + + /** + * Creates a row for one user or category, with a header (user or category name) and (multiple) rows with non-overlapping events + * + * Uses the eventRowWidget to display a row of non-overlapping events + * + * @param array $events to show + * @param int $start start-time of the row + * @param int $end end-time of the row + * @param string $header user or category name for the row-header + * @param string $class additional css class for the row + * @param string $indent='' string for correct indention + * @return string with widget + */ + function plannerRowWidget($events,$start,$end,$header,$class,$indent='') + { + $content = $indent.'
    '."\n"; + + // display the row-header + $content .= $indent."\t".'
    '.$header."
    \n"; + + // sorting the events in non-overlapping rows + $rows = array(array()); + $row_end = array(); + foreach($events as $n => $event) + { + for($row = 0; (int) $row_end[$row] > $event['start']; ++$row); // find a "free" row (no other event) + $rows[$row][] =& $events[$n]; + $row_end[$row] = $event['end']; + } + //echo $header; _debug_array($rows); + // display the rows + $content .= $indent."\t".'
    '."\n"; + foreach($rows as $row) + { + $content .= $this->eventRowWidget($row,$start,$end,$indent."\t\t"); + } + $content .= $indent."\t
    \n"; // end of the eventRows + + $content .= $indent."
    \n"; // end of the plannerRowWidget + + return $content; + } + + /** + * Creates a row with non-overlapping events + * + * Uses the plannerEventWidget to display the events + * + * @param array $events non-overlapping events to show + * @param int $start start-time of the row + * @param int $end end-time of the row + * @param string $indent='' string for correct indention + * @return string with widget + */ + function eventRowWidget($events,$start,$end,$indent='') + { + $content = $indent.'
    '."\n"; + + foreach($events as $event) + { + $content .= $this->plannerEventWidget($event,$start,$end,$indent."\t"); + } + $content .= $indent."
    \n"; + + return $content; + } + + /** + * Calculate a time-dependent position in the planner + * + * We use a non-linear scale in the planner monthview, which shows the workday start or end + * as start or end of the whole day. This improves the resolution a bit. + * + * @param int $time + * @param int $start start-time of the planner + * @param int $end end-time of the planner + * @return float percentage position between 0-100 + */ + function _planner_pos($time,$start,$end) + { + if ($time <= $start) return 0; // we are left of our scale + if ($time >= $end) return 100; // we are right of our scale + + if ($this->planner_days) + { + $percent = ($time - $start) / ($end - $start); + } + else // monthview + { + $t_arr = $this->bo->date2array($time); + $day_start = $this->bo->date2ts((string)$t_arr['full']); + $percent = ($day_start - $start) / ($end - $start); + + $time_of_day = 60 * $t_arr['hour'] + $t_arr['minute']; + if ($time_of_day >= $this->wd_start) + { + if ($time_of_day > $this->wd_end) + { + $day_percentage = 1; + } + else + { + $day_percentage = ($time_of_day-$this->wd_start) / ($this->wd_end - $this->wd_start); // between 0 and 1 + } + $days = ($end - $start) / DAY_s; + $percent += $day_percentage / $days; + } + } + $percent = round(100 * $percent,2); + + //echo "

    _planner_pos(".date('Y-m-d H:i',$time).', '.date('Y-m-d H:i',$start).', '.date('Y-m-d H:i',$end).") = $percent

    \n"; + return $percent; + } + + /** + * Displays one event for the planner, using the eventWidget of the other views + * + * @param array $event + * @param int $start start-time of the planner + * @param int $end end-time of the planner + * @return string with widget + */ + function plannerEventWidget($event,$start,$end,$indent='') + { + $event['multiday'] = true; // otherwise eventWidgets displays only the time and expects start_m to be set + $data = $this->eventWidget($event,200,$indent,true,'planner_event'); + + $left = $this->_planner_pos($event['start'],$start,$end); + $width = $this->_planner_pos($event['end'],$start,$end) - $left; + $color = $data['color'] ? $data['color'] : 'gray'; + + return $indent.'
    html->tooltip($data['tooltip'],False,array('BorderWidth'=>0,'Padding'=>0)).'>'."\n".$data['html'].$indent."
    \n"; } } diff --git a/calendar/inc/hook_admin.inc.php b/calendar/inc/hook_admin.inc.php index db857b8fad..6980f703a8 100755 --- a/calendar/inc/hook_admin.inc.php +++ b/calendar/inc/hook_admin.inc.php @@ -1,8 +1,7 @@ * * -------------------------------------------- * * 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 * @@ -15,11 +14,10 @@ // Only Modify the $file and $title variables..... $title = $appname; $file = Array( - 'Site Configuration' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname), - 'Custom fields and sorting' => $GLOBALS['phpgw']->link('/index.php','menuaction=calendar.uicustom_fields.index'), - 'Calendar Holiday Management' => $GLOBALS['phpgw']->link('/index.php','menuaction=calendar.uiholiday.admin'), - 'Import CSV-File' => $GLOBALS['phpgw']->link('/calendar/csv_import.php'), - 'Global Categories' => $GLOBALS['phpgw']->link('/index.php','menuaction=admin.uicategories.index&appname=calendar') + 'Site Configuration' => $GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname=calendar'), + 'Custom fields' => $GLOBALS['egw']->link('/index.php','menuaction=admin.customfields.edit&appname=calendar'), + 'Calendar Holiday Management' => $GLOBALS['egw']->link('/index.php','menuaction=calendar.uiholiday.admin'), + 'Global Categories' => $GLOBALS['egw']->link('/index.php','menuaction=admin.uicategories.index&appname=calendar') ); //Do not modify below this line display_section($appname,$title,$file); diff --git a/calendar/inc/hook_deleteaccount.inc.php b/calendar/inc/hook_deleteaccount.inc.php index b656f81af8..a85d01d883 100755 --- a/calendar/inc/hook_deleteaccount.inc.php +++ b/calendar/inc/hook_deleteaccount.inc.php @@ -1,31 +1,15 @@ * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ + /**************************************************************************\ + * eGroupWare * + * http://www.egroupware.org * + * -------------------------------------------- * + * 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$ */ - // Delete all records for a user - if((int)$GLOBALS['hook_values']['account_id'] > 0) - { - if((int)$_POST['new_owner'] == 0) - { - ExecMethod('calendar.bocalendar.delete_calendar',(int)$GLOBALS['hook_values']['account_id']); - } - else - { - ExecMethod('calendar.bocalendar.change_owner', - Array( - 'old_owner' => (int)$GLOBALS['hook_values']['account_id'], - 'new_owner' => (int)$_POST['new_owner'] - ) - ); - } - } -?> + $socal =& CreateObject('calendar.socal'); + $socal->change_delete_user((int)$_POST['account_id'],(int)$_POST['new_owner']); + unset($socal); diff --git a/calendar/inc/hook_email.inc.php b/calendar/inc/hook_email.inc.php deleted file mode 100755 index f2d50fac5d..0000000000 --- a/calendar/inc/hook_email.inc.php +++ /dev/null @@ -1,54 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - global $calendar_id; - - $d1 = strtolower(substr($GLOBALS['phpgw_info']['server']['app_inc'],0,3)); - if($d1 == 'htt' || $d1 == 'ftp') - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $phpgw->common->phpgw_exit(); - } - unset($d1); - - if ($calendar_id) - { - $GLOBALS['phpgw']->translation->add_app('calendar'); - - $cal = CreateObject('calendar.uicalendar'); - //echo "Event ID: $calendar_id
    \n"; - - if ($event = $cal->bo->read_entry($calendar_id)) - { - echo $cal->timematrix( - Array( - 'date' => $GLOBALS['phpgw']->datetime->localdates(mktime(0,0,0,$event['start']['month'],$event['start']['mday'],$event['start']['year']) - $phpgw->calendar->tz_offset), - 'starttime' => $cal->bo->splittime('000000',False), - 'endtime' => 0, - 'participants' => $event['participants']) - ) . - - '' . - - $cal->view_event($event) . - - '' . - - $cal->get_response($calendar_id); - } - unset($cal); unset($event); - } -?> diff --git a/calendar/inc/hook_home.inc.php b/calendar/inc/hook_home.inc.php index 7aeb19fb4f..3dc20782fc 100755 --- a/calendar/inc/hook_home.inc.php +++ b/calendar/inc/hook_home.inc.php @@ -1,100 +1,65 @@ * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ +/**************************************************************************\ +* eGroupWare - Calendar on Homepage * +* http://www.egroupware.org * +* Written and (c) 2004 by Ralf Becker * +* -------------------------------------------- * +* 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$ */ +/* $Id$ */ - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) +if($GLOBALS['egw_info']['user']['preferences']['calendar']['mainscreen_showevents']) +{ + $GLOBALS['egw']->translation->add_app('calendar'); + + $save_app_header = $GLOBALS['egw_info']['flags']['app_header']; + + if ($GLOBALS['egw_info']['user']['preferences']['calendar']['defaultcalendar'] == 'listview') { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); + $content =& ExecMethod('calendar.uilist.home'); } - unset($d1); - - $showevents = (int)$GLOBALS['phpgw_info']['user']['preferences']['calendar']['mainscreen_showevents']; - if($showevents>0) + else { - $GLOBALS['phpgw']->translation->add_app('calendar'); - if(!is_object($GLOBALS['phpgw']->datetime)) - { - $GLOBALS['phpgw']->datetime = CreateObject('phpgwapi.datetime'); - } - - $GLOBALS['date'] = date('Ymd',$GLOBALS['phpgw']->datetime->users_localtime); - $GLOBALS['g_year'] = substr($GLOBALS['date'],0,4); - $GLOBALS['g_month'] = substr($GLOBALS['date'],4,2); - $GLOBALS['g_day'] = substr($GLOBALS['date'],6,2); - $GLOBALS['owner'] = $GLOBALS['phpgw_info']['user']['account_id']; - $GLOBALS['css'] = "\n".''; - - if($showevents==2) - { - $_page = "small"; - } - else - { - $page_ = explode('.',$GLOBALS['phpgw_info']['user']['preferences']['calendar']['defaultcalendar']); - $_page = substr($page_[0],0,7); // makes planner from planner_{user|category} - if ($_page=='index' || ($_page != 'day' && $_page != 'week' && $_page != 'month' && $_page != 'year' && $_page != 'planner')) - { - $_page = 'month'; -// $GLOBALS['phpgw']->preferences->add('calendar','defaultcalendar','month'); -// $GLOBALS['phpgw']->preferences->save_repository(); - } - } - - if(!@file_exists(PHPGW_INCLUDE_ROOT.'/calendar/inc/hook_home_'.$_page.'.inc.php')) - { - $_page = 'day'; - } - include(PHPGW_INCLUDE_ROOT.'/calendar/inc/hook_home_'.$_page.'.inc.php'); - - $title = lang('Calendar'); - - $portalbox = CreateObject('phpgwapi.listbox', - Array( - 'title' => $title, - 'primary' => $GLOBALS['phpgw_info']['theme']['navbar_bg'], - 'secondary' => $GLOBALS['phpgw_info']['theme']['navbar_bg'], - 'tertiary' => $GLOBALS['phpgw_info']['theme']['navbar_bg'], - 'width' => '100%', - 'outerborderwidth' => '0', - 'header_background_image' => $GLOBALS['phpgw']->common->image('phpgwapi/templates/default','bg_filler') - ) - ); - - $app_id = $GLOBALS['phpgw']->applications->name2id('calendar'); - $GLOBALS['portal_order'][] = $app_id; - $var = Array( - 'up' => Array('url' => '/set_box.php', 'app' => $app_id), - 'down' => Array('url' => '/set_box.php', 'app' => $app_id), - 'close' => Array('url' => '/set_box.php', 'app' => $app_id), - 'question' => Array('url' => '/set_box.php', 'app' => $app_id), - 'edit' => Array('url' => '/set_box.php', 'app' => $app_id) - ); - - while(list($key,$value) = each($var)) - { - $portalbox->set_controls($key,$value); - } - - $portalbox->data = Array(); - - echo "\n".''."\n".$portalbox->draw($GLOBALS['extra_data'])."\n".''."\n"; - unset($cal); + $content =& ExecMethod('calendar.uiviews.home'); } - flush(); - unset($showevents); -?> + $portalbox =& CreateObject('phpgwapi.listbox',array( + 'title' => $GLOBALS['egw_info']['flags']['app_header'], + 'primary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'secondary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'tertiary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'width' => '100%', + 'outerborderwidth' => '0', + 'header_background_image' => $GLOBALS['egw']->common->image('phpgwapi/templates/default','bg_filler') + )); + $GLOBALS['egw_info']['flags']['app_header'] = $save_app_header; + unset($save_app_header); + + $GLOBALS['portal_order'][] = $app_id = $GLOBALS['egw']->applications->name2id('calendar'); + foreach(array('up','down','close','question','edit') as $key) + { + $portalbox->set_controls($key,Array('url' => '/set_box.php', 'app' => $app_id)); + } + $portalbox->data = Array(); + + if (!file_exists(EGW_SERVER_ROOT.($css_file ='/calendar/templates/'.$GLOBALS['egw_info']['user']['preferences']['common']['template_set'].'/app.css'))) + { + $css_file = '/calendar/templates/default/app.css'; + } + echo ' + + +'.$portalbox->draw($content)."\n".''."\n"; + + unset($key); + unset($app_id); + unset($content); + unset($portalbox); +} diff --git a/calendar/inc/hook_home_day.inc.php b/calendar/inc/hook_home_day.inc.php deleted file mode 100755 index e033cfa5fb..0000000000 --- a/calendar/inc/hook_home_day.inc.php +++ /dev/null @@ -1,43 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); - } - unset($d1); - - $GLOBALS['extra_data'] = $GLOBALS['css']."\n".''."\n".''."\n".''."\n".'
    ' - . ExecMethod('calendar.uicalendar.mini_calendar', - Array( - 'day' => $GLOBALS['g_day'], - 'month' => $GLOBALS['g_month'], - 'year' => $GLOBALS['g_year'], - 'link' => 'day' - ) - ).'' - . '
    '.ExecMethod('calendar.bocalendar.long_date',time()) - .'
    '.ExecMethod('calendar.uicalendar.print_day', - Array( - 'year' => $GLOBALS['g_year'], - 'month' => $GLOBALS['g_month'], - 'day' => $GLOBALS['g_day'] - ) - ).'
    '."\n".'
    '."\n".''."\n"; -?> diff --git a/calendar/inc/hook_home_month.inc.php b/calendar/inc/hook_home_month.inc.php deleted file mode 100755 index ae7d654069..0000000000 --- a/calendar/inc/hook_home_month.inc.php +++ /dev/null @@ -1,28 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); - } - unset($d1); - - $GLOBALS['extra_data'] = $GLOBALS['css']."\n".''."\n".''."\n".''."\n".'
    ' - . ExecMethod('calendar.uicalendar.get_month') - .'
    '."\n".''."\n"; -?> diff --git a/calendar/inc/hook_home_planner.inc.php b/calendar/inc/hook_home_planner.inc.php deleted file mode 100644 index 26e4f61cb2..0000000000 --- a/calendar/inc/hook_home_planner.inc.php +++ /dev/null @@ -1,27 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); - } - unset($d1); - - $GLOBALS['extra_data'] = '
    '. - ExecMethod('calendar.uicalendar.planner').'
    '; -?> diff --git a/calendar/inc/hook_home_small.inc.php b/calendar/inc/hook_home_small.inc.php deleted file mode 100755 index 9f104f9638..0000000000 --- a/calendar/inc/hook_home_small.inc.php +++ /dev/null @@ -1,59 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); - } - unset($d1); - - $today = $GLOBALS['phpgw']->datetime->users_localtime; - $dates = array($today); - $wday = date('w',$today); - if($wday=='5') // if it's Friday, show the weekend, plus Monday - { - $dates[] = $today + 86400; // Saturday - $dates[] = $today + (2*86400); // Sunday - } - if($wday=='6') // if it's Saturday, show Sunday, plus Monday - { - $dates[] = $today + 86400; // Sunday - } - $dates[] = $dates[count($dates)-1] + 86400; // the next business day - - $extra_data = $GLOBALS['css']."\n" - . '' - . '
    '; - foreach($dates as $id=>$day) - { - $dayprint = ExecMethod('calendar.uicalendar.print_day', - Array( - 'year' => date('Y',$day), - 'month' => date('m',$day), - 'day' => date('d',$day) - )); - $extra_data .= '   '.lang(date('l',$day)) .'
    ' . $dayprint; - } - $extra_data .= '
    '."\n"; - - $GLOBALS['extra_data'] = $extra_data; - - unset($dates); - unset($today); - unset($extra_data); -?> diff --git a/calendar/inc/hook_home_week.inc.php b/calendar/inc/hook_home_week.inc.php deleted file mode 100755 index a659862dcd..0000000000 --- a/calendar/inc/hook_home_week.inc.php +++ /dev/null @@ -1,28 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); - } - unset($d1); - - $GLOBALS['extra_data'] = $GLOBALS['css']."\n".''."\n".''."\n".''."\n".'
    ' - . ExecMethod('calendar.uicalendar.get_week') - .'
    '."\n".''."\n"; -?> diff --git a/calendar/inc/hook_home_year.inc.php b/calendar/inc/hook_home_year.inc.php deleted file mode 100755 index e98a7ace98..0000000000 --- a/calendar/inc/hook_home_year.inc.php +++ /dev/null @@ -1,28 +0,0 @@ - * - * http://www.radix.net/~cknudsen * - * Written by Mark Peters * - * -------------------------------------------- * - * 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$ */ - - $d1 = strtolower(substr(PHPGW_APP_INC,0,3)); - if($d1 == 'htt' || $d1 == 'ftp' ) - { - echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; - $GLOBALS['phpgw']->common->phpgw_exit(); - } - unset($d1); - - $GLOBALS['extra_data'] = $GLOBALS['css']."\n".''."\n".''."\n".''."\n".'
    ' - . ExecMethod('calendar.uicalendar.get_year') - .'
    '."\n".''."\n"; -?> diff --git a/calendar/inc/hook_preferences.inc.php b/calendar/inc/hook_preferences.inc.php index bff76bbb3f..d247439fb2 100644 --- a/calendar/inc/hook_preferences.inc.php +++ b/calendar/inc/hook_preferences.inc.php @@ -1,8 +1,7 @@ * * -------------------------------------------- * * 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 * @@ -16,9 +15,9 @@ $file = array( 'Preferences' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uisettings.index&appname=' . $appname), 'Grant Access' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uiaclprefs.index&acl_app='.$appname), - 'Edit Categories' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uicategories.index&cats_app='.$appname.'&cats_level=True&global_cats=True') + 'Edit Categories' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uicategories.index&cats_app='.$appname.'&cats_level=True&global_cats=True'), + 'Import CSV-File' => $GLOBALS['egw']->link('/calendar/csv_import.php'), ); //Do not modify below this line display_section($appname,$title,$file); } -?> diff --git a/calendar/inc/hook_settings.inc.php b/calendar/inc/hook_settings.inc.php index 87f5cf2ab9..dc204a754d 100644 --- a/calendar/inc/hook_settings.inc.php +++ b/calendar/inc/hook_settings.inc.php @@ -15,25 +15,20 @@ /* $Id$ */ - // jscalendar is needed by the new navigation-menu AND it need to be loaded befor the header !!! - if (!is_object($GLOBALS['egw']->jscalendar)) - { - $GLOBALS['egw']->jscalendar = CreateObject('phpgwapi.jscalendar'); - } - ExecMethod('calendar.bocalendar.check_set_default_prefs'); + ExecMethod('calendar.bocal.check_set_default_prefs'); $default = array( - 'day' => lang('Daily'), - 'week' => lang('Weekly'), - 'month' => lang('Monthly'), - 'year' => lang('Yearly'), + 'day' => lang('Dayview'), + 'week' => lang('Weekview'), + 'month' => lang('Monthview'), 'planner_cat' => lang('Planner by category'), 'planner_user' => lang('Planner by user'), + 'listview' => lang('Listview'), ); /* Select list with number of day by week */ $week_view = array( - '5' => lang('Weekview without weekend'), - '7' => lang('Weekview including weekend'), + '5' => lang('Weekview without weekend'), + '7' => lang('Weekview with weekend'), ); /* Selection of list for home page is different from default calendar, since the decision for the front page is different for the decision @@ -83,6 +78,7 @@ 'repetition' => lang('Repetitiondetails (or empty)'), 'action' => lang('Action that caused the notify: Added, Canceled, Accepted, Rejected, ...'), 'link' => lang('Link to view the event'), + 'disinvited' => lang('Participants disinvited from an event'), ); $weekdaystarts = array( 'Monday' => lang('Monday'), @@ -113,12 +109,6 @@ $options[$group['account_id']] = $GLOBALS['egw']->common->grab_owner_name($group['account_id']); } } - $planner_intervals = array( - 1 => '1', - 2 => '2', - 3 => '3', - 4 => '4', - ); $defaultfilter = array( 'all' => lang('all'), 'private' => lang('private only'), @@ -219,6 +209,19 @@ 'xmlrpc' => True, 'admin' => False ), + 'notifyDisinvited' => array( + 'type' => 'notify', + 'label' => 'Notification messages for disinvited participants ', + 'name' => 'notifyDisinvited', + 'rows' => 5, + 'cols' => 50, + 'help' => 'This message is sent to disinvited participants.', + 'default' => '', + 'values' => $event_details, + 'subst_help' => False, + 'xmlrpc' => True, + 'admin' => False + ), 'notifyResponse' => array( 'type' => 'notify', 'label' => 'Notification messages for your responses ', @@ -314,15 +317,6 @@ 'xmlrpc' => True, 'admin' => False ), - 'planner_intervals_per_day' => array( - 'type' => 'select', - 'label' => 'Intervals per day in planner view', - 'name' => 'planner_intervals_per_day', - 'values' => $planner_intervals, - 'help' => 'Specifies the the number of intervals shown in the planner view.', - 'xmlrpc' => True, - 'admin' => False - ), 'defaultfilter' => array( 'type' => 'select', 'label' => 'Default calendar filter', @@ -340,24 +334,6 @@ 'xmlrpc' => True, 'admin' => False ), -/* not used at the moment - 'display_minicals' => array( - 'type' => 'check', - 'label' => 'Print the mini calendars', - 'name' => 'display_minicals', - 'help' => 'Should the mini calendars by printed / displayed in the printer friendly views ?', - 'xmlrpc' => True, - 'admin' => False - ), - 'print_black_white' => array( - 'type' => 'check', - 'label' => 'Print calendars in black & white', - 'name' => 'print_black_white', - 'help' => 'Should the printer friendly view be in black & white or in color (as in normal view)?', - 'xmlrpc' => True, - 'admin' => False - ), -*/ 'freebusy' => array( 'type' => 'check', 'label' => 'Make freebusy information available to not loged in persons?', diff --git a/calendar/inc/hook_sidebox_menu.inc.php b/calendar/inc/hook_sidebox_menu.inc.php deleted file mode 100644 index 21645a9217..0000000000 --- a/calendar/inc/hook_sidebox_menu.inc.php +++ /dev/null @@ -1,29 +0,0 @@ - * -* -------------------------------------------- * -* 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$ */ - -/** -* File is depricated, the hook moved into the class uical !!! -*/ - -// register the new hooks, if the admin missed it ;-) - -if (!is_object($GLOBALS['phpgw']->hooks)) -{ - $GLOBALS['phpgw']->hooks = CreateObject('phpgwapi.hooks'); -} -include(PHPGW_INCLUDE_ROOT . '/calendar/setup/setup.inc.php'); - -$GLOBALS['phpgw']->hooks->register_hooks('calendar',$setup_info['calendar']['hooks']); - -ExecMethod($setup_info['calendar']['hooks']['sidebox_menu']); diff --git a/calendar/index.php b/calendar/index.php index fa14663891..2b8c7f90b2 100755 --- a/calendar/index.php +++ b/calendar/index.php @@ -1,45 +1,25 @@ * - * http://www.radix.net/~cknudsen * - * Modified by Mark Peters * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ +/**************************************************************************\ +* eGroupWare - Calendar * +* http://www.egroupware.org * +* Written and (c) 2005 by Ralf Becker * +* -------------------------------------------- * +* 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$ */ +/* $Id$ */ - $phpgw_flags = Array( - 'currentapp' => 'calendar', - 'noheader' => True, - 'nonavbar' => True, - 'noappheader' => True, - 'noappfooter' => True, - 'nofooter' => True - ); +$GLOBALS['egw_info'] = array('flags' => array( + 'currentapp'=> 'calendar', + 'noheader' => True, + 'nonavbar' => True, +)); - $GLOBALS['phpgw_info']['flags'] = $phpgw_flags; +include('../header.inc.php'); - include('../header.inc.php'); - if(!is_object($GLOBALS['phpgw']->datetime)) - { - $GLOBALS['phpgw']->datetime = CreateObject('phpgwapi.datetime'); - } +ExecMethod('calendar.uiviews.index'); - $parms = Array( -# 'menuaction'=> 'calendar.uicalendar.index', - 'date' => date('Ymd',$GLOBALS['phpgw']->datetime->users_localtime) - ); - - //echo 'Local DateTime: '.date('Ymd H:i:s',$GLOBALS['phpgw']->datetime->users_localtime).'
    '."\n"; - -# $GLOBALS['phpgw']->redirect_link('/index.php',$parms); - ExecMethod('calendar.uicalendar.index',$parms); - $GLOBALS['phpgw']->common->phpgw_exit(); - -?> +$GLOBALS['egw']->common->egw_footer(); diff --git a/calendar/setup/default_records.inc.php b/calendar/setup/default_records.inc.php index b2a4e8bb75..c35a1b77e5 100644 --- a/calendar/setup/default_records.inc.php +++ b/calendar/setup/default_records.inc.php @@ -12,5 +12,15 @@ /* $Id$ */ // enable auto-loading of holidays from localhost by default - $oProc->query("INSERT INTO phpgw_config (config_app, config_name, config_value) VALUES ('phpgwapi','auto_load_holidays','True')"); - $oProc->query("INSERT INTO phpgw_config (config_app, config_name, config_value) VALUES ('phpgwapi','holidays_url_path','localhost')"); + foreach(array( + 'auto_load_holidays' => 'True', + 'holidays_url_path' => 'localhost', + ) as $name => $value) + { + $oProc->insert($GLOBALS['egw_setup']->config_table,array( + 'config_value' => $value, + ),array( + 'config_app' => 'phpgwapi', + 'config_name' => $name, + ),__FILE__,__LINE__); + } diff --git a/calendar/setup/etemplates.inc.php b/calendar/setup/etemplates.inc.php index 9a07b76b48..a9065c36c1 100644 --- a/calendar/setup/etemplates.inc.php +++ b/calendar/setup/etemplates.inc.php @@ -1,13 +1,52 @@ 'calendar.freetimesearch','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:7:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:9:",size120b";s:5:"label";s:15:"Freetime Search";}s:1:"B";a:4:{s:4:"type";s:5:"label";s:4:"span";s:5:",ired";s:7:"no_lang";s:1:"1";s:4:"name";s:3:"msg";}}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; } +$templ_version=1; + +$templ_data[] = array('name' => 'calendar.conflicts','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:3:{i:0;a:3:{s:4:"type";s:5:"label";s:5:"label";s:20:" Scheduling conflict";s:4:"span";s:9:",size120b";}i:1;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:1:{s:2:"c1";s:4:",top";}i:1;a:4:{s:1:"A";a:4:{s:4:"type";s:5:"image";s:4:"name";s:34:"conflicts[$row][icon_participants]";s:5:"label";s:38:"@conflicts[$row][tooltip_participants]";s:7:"no_lang";s:1:"1";}s:1:"B";a:4:{s:4:"type";s:5:"image";s:4:"name";s:27:"conflicts[$row][icon_recur]";s:5:"label";s:28:"@conflicts[$row][text_recur]";s:7:"no_lang";s:1:"1";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:4:"name";s:21:"conflicts[$row][time]";s:7:"no_lang";s:1:"1";}s:1:"D";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:5:"label";s:4:"name";s:22:"conflicts[$row][title]";s:7:"no_lang";s:1:"1";s:4:"size";s:1:"b";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:41:"conflicts[$row][conflicting_participants]";s:7:"no_lang";s:1:"1";}s:4:"help";s:23:"conflict[$row][tooltip]";}}}s:4:"rows";i:1;s:4:"cols";i:4;}i:2;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:15:"Ignore conflict";s:4:"name";s:14:"button[ignore]";s:4:"help";s:37:"Saves the event ignoring the conflict";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[reedit]";s:5:"label";s:13:"Re-Edit event";s:4:"help";s:30:"Allows to edit the event again";}i:3;a:4:{s:4:"type";s:6:"button";s:5:"label";s:15:"Freetime search";s:4:"name";s:16:"button[freetime]";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";}}}','size' => '','style' => '','modified' => '1119080124',); + +$templ_data[] = array('name' => 'calendar.edit','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:6:{s:2:"h1";s:6:",!@msg";s:2:"c2";s:2:"th";s:1:"A";s:3:"100";s:2:"c4";s:3:"row";s:2:"h4";s:8:",!@owner";s:1:"B";s:3:"300";}i:1;a:3:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:2;a:3:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Title";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"name";s:5:"title";s:4:"span";s:3:"all";s:6:"needed";s:1:"1";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:3;a:3:{s:1:"A";a:5:{s:4:"type";s:3:"tab";s:4:"span";s:3:"all";s:5:"label";s:63:"General|Description|Participants|Recurrence|Custom|Links|Alarms";s:4:"name";s:63:"general|description|participants|recurrence|custom|links|alarms";s:4:"help";s:158:"Location, Start- and Endtimes, ...|Full description|Participants, Resources, ...|Repeating Event Information|Custom fields|Links, Attachments|Alarm management";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:4;a:3:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:5:"owner";s:8:"readonly";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";s:5:"align";s:5:"right";i:1;a:5:{s:4:"type";s:9:"date-time";s:5:"label";s:7:"Updated";s:4:"name";s:8:"modified";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:5:"label";s:2:"by";s:4:"name";s:8:"modifier";s:8:"readonly";s:1:"1";}}}i:5;a:3:{s:1:"A";a:10:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"7";s:4:"span";s:1:"2";i:1;a:4:{s:4:"type";s:6:"button";s:4:"name";s:19:"button[edit_series]";s:5:"label";s:11:"Edit series";s:4:"help";s:35:"Edit this series of recuring events";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[edit]";s:5:"label";s:4:"Edit";s:4:"help";s:15:"Edit this event";}i:3;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[copy]";s:5:"label";s:4:"Copy";s:4:"help";s:15:"Copy this event";}i:4;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:22:"saves the changes made";}i:5;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:17:"apply the changes";}i:6;a:5:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";s:4:"help";s:16:"Close the window";}i:7;a:4:{s:4:"type";s:8:"checkbox";s:4:"name";s:11:"custom_mail";s:5:"label";s:21:"mail all participants";s:4:"help";s:59:"compose a mail to all participants after the event is saved";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:5:{s:4:"type";s:4:"hbox";s:5:"align";s:5:"right";s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:6:"button";s:4:"name";s:21:"button[delete_series]";s:5:"label";s:13:"Delete series";s:4:"help";s:37:"Delete this series of recuring events";s:7:"onclick";s:56:"return confirm(\'Delete this series of recuring events\');";}i:2;a:5:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"Delete this event";s:7:"onclick";s:36:"return confirm(\'Delete this event\');";}}}}s:4:"rows";i:5;s:4:"cols";i:3;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1118477069',); + +$templ_data[] = array('name' => 'calendar.edit','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:6:{s:2:"h1";s:6:",!@msg";s:2:"c2";s:2:"th";s:1:"A";s:3:"100";s:2:"c4";s:3:"row";s:2:"h4";s:8:",!@owner";s:1:"B";s:3:"300";}i:1;a:3:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:2;a:3:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Title";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"name";s:5:"title";s:4:"span";s:3:"all";s:6:"needed";s:1:"1";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:3;a:3:{s:1:"A";a:5:{s:4:"type";s:3:"tab";s:4:"span";s:3:"all";s:5:"label";s:63:"General|Description|Participants|Recurrence|Custom|Links|Alarms";s:4:"name";s:63:"general|description|participants|recurrence|custom|links|alarms";s:4:"help";s:158:"Location, Start- and Endtimes, ...|Full description|Participants, Resources, ...|Repeating Event Information|Custom fields|Links, Attachments|Alarm management";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:4;a:3:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:5:"owner";s:8:"readonly";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";s:5:"align";s:5:"right";i:1;a:5:{s:4:"type";s:9:"date-time";s:5:"label";s:7:"Updated";s:4:"name";s:8:"modified";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:5:"label";s:2:"by";s:4:"name";s:8:"modifier";s:8:"readonly";s:1:"1";}}}i:5;a:3:{s:1:"A";a:11:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"8";s:4:"span";s:1:"2";i:1;a:4:{s:4:"type";s:6:"button";s:4:"name";s:19:"button[edit_series]";s:5:"label";s:11:"Edit series";s:4:"help";s:35:"Edit this series of recuring events";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[edit]";s:5:"label";s:4:"Edit";s:4:"help";s:15:"Edit this event";}i:3;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[copy]";s:5:"label";s:4:"Copy";s:4:"help";s:15:"Copy this event";}i:4;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[vcal]";s:5:"label";s:6:"Export";s:4:"help";s:27:"Download this event as iCal";}i:5;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"help";s:22:"saves the changes made";}i:6;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:17:"apply the changes";}i:7;a:5:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";s:4:"help";s:16:"Close the window";}i:8;a:4:{s:4:"type";s:8:"checkbox";s:4:"name";s:11:"custom_mail";s:5:"label";s:21:"mail all participants";s:4:"help";s:59:"compose a mail to all participants after the event is saved";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:5:{s:4:"type";s:4:"hbox";s:5:"align";s:5:"right";s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:6:"button";s:4:"name";s:21:"button[delete_series]";s:5:"label";s:13:"Delete series";s:4:"help";s:37:"Delete this series of recuring events";s:7:"onclick";s:56:"return confirm(\'Delete this series of recuring events\');";}i:2;a:5:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"Delete this event";s:7:"onclick";s:36:"return confirm(\'Delete this event\');";}}}}s:4:"rows";i:5;s:4:"cols";i:3;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1118477069',); + +$templ_data[] = array('name' => 'calendar.edit.alarms','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:5:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"h1";s:16:"20,@no_add_alarm";s:2:"c2";s:4:",top";s:2:"h2";s:8:",!@alarm";}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"before the event";}s:1:"B";a:10:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"8";i:1;a:3:{s:4:"type";s:13:"select-number";s:4:"size";s:4:",0,7";s:4:"name";s:15:"new_alarm[days]";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,new_alarm[days]";s:5:"label";s:4:"days";}i:3;a:3:{s:4:"type";s:13:"select-number";s:4:"name";s:16:"new_alarm[hours]";s:4:"size";s:5:",0,23";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"size";s:19:",,,new_alarm[hours]";s:5:"label";s:5:"hours";}i:5;a:3:{s:4:"type";s:13:"select-number";s:4:"name";s:15:"new_alarm[mins]";s:4:"size";s:7:",0,55,5";}i:6;a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,new_alarm[mins]";s:5:"label";s:7:"Minutes";}i:7;a:5:{s:4:"type";s:6:"select";s:4:"name";s:16:"new_alarm[owner]";s:7:"no_lang";s:1:"1";s:5:"label";s:3:"for";s:4:"help";s:31:"Select who should get the alarm";}i:8;a:3:{s:4:"type";s:6:"button";s:4:"name";s:17:"button[add_alarm]";s:5:"label";s:9:"Add alarm";}}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Alarms";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";}i:1;a:5:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Time";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"before the event";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"All participants";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Action";}}i:2;a:5:{s:1:"A";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:12:"${row}[time]";s:8:"readonly";s:1:"1";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:4:"name";s:14:"${row}[offset]";s:7:"no_lang";s:1:"1";}s:1:"C";a:4:{s:4:"type";s:8:"checkbox";s:5:"align";s:6:"center";s:4:"name";s:11:"${row}[all]";s:8:"readonly";s:1:"1";}s:1:"D";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"${row}[owner]";s:8:"readonly";s:1:"1";}s:1:"E";a:7:{s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:5:"align";s:6:"center";s:4:"name";s:27:"delete_alarm[$row_cont[id]]";s:4:"help";s:17:"Delete this alarm";s:7:"onclick";s:36:"return confirm(\'Delete this alarm\');";}}}s:4:"rows";i:2;s:4:"cols";i:5;s:4:"name";s:5:"alarm";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:2;s:4:"size";s:17:"100%,200,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,,,,auto','style' => '','modified' => '1118780740',); + +$templ_data[] = array('name' => 'calendar.edit.custom','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:1:{s:2:"c1";s:4:",top";}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:12:"customfields";s:4:"name";s:12:"customfields";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,200,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,,,,auto','style' => '','modified' => '1118737582',); + +$templ_data[] = array('name' => 'calendar.edit.description','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:2:{s:2:"c1";s:7:"row,top";s:1:"A";s:2:"95";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,description";s:5:"label";s:11:"Description";}s:1:"B";a:3:{s:4:"type";s:8:"textarea";s:4:"size";s:5:"12,70";s:4:"name";s:11:"description";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118480337',); + +$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:9:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:2:"c6";s:3:"row";s:2:"c5";s:3:"row";s:2:"c2";s:3:"row";s:2:"h4";s:2:"60";s:1:"B";s:3:"35%";}i:1;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:8:",,,start";s:5:"label";s:5:"Start";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:5:"start";s:6:"needed";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"whole_day";s:5:"label";s:9:"whole day";s:4:"help";s:31:"Event will occupy the whole day";s:4:"size";s:11:",, ,disable";}}i:2;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:6:",,,end";s:5:"label";s:3:"End";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:3:"end";s:6:"needed";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:6:"button";s:5:"label";s:15:"Freetime search";s:4:"name";s:8:"freetime";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";s:7:"onclick";s:239:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.freetimesearch\')+values2url(this.form,\'start,end,participants,recur_type,whole_day\'),\'ft_search\',\'dependent=yes,width=700,height=500,scrollbars=yes,status=yes\'); return false;";}}i:3;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,location";s:5:"label";s:8:"Location";}s:1:"B";a:4:{s:4:"type";s:4:"text";s:4:"size";s:6:"80,255";s:4:"name";s:8:"location";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:4;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,category";s:5:"label";s:8:"Category";}s:1:"B";a:4:{s:4:"type";s:10:"select-cat";s:4:"size";s:1:"3";s:4:"name";s:8:"category";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:5;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,priority";s:5:"label";s:8:"Priority";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}i:2;a:5:{s:4:"type";s:8:"checkbox";s:5:"label";s:12:"non blocking";s:4:"help";s:56:"A non blocking event will not conflict with other events";s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";}s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}i:6;a:3:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,public";s:5:"label";s:7:"Private";}s:1:"B";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:3:"0,1";s:4:"name";s:6:"public";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:6;s:4:"cols";i:3;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118477982',); + +$templ_data[] = array('name' => 'calendar.edit.links','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"h1";s:6:",@view";s:2:"h2";s:6:",@view";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:17:"100%,200,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,,,,auto','style' => '','modified' => '1118758702',); + +$templ_data[] = array('name' => 'calendar.edit.participants','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:2:{s:2:"c1";s:7:"row,top";s:1:"A";s:2:"95";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:15:",,,participants";s:5:"label";s:12:"Participants";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:2:"14";s:4:"name";s:22:"participants[accounts]";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:3:{s:4:"type";s:16:"resources_select";s:4:"size";s:2:"14";s:4:"name";s:23:"participants[resources]";}}}s:4:"rows";i:1;s:4:"cols";i:4;s:4:"size";s:16:"100%,200,,row_on";s:7:"options";a:3:{i:3;s:6:"row_on";i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200,,row_on','style' => '','modified' => '1118481127',); + +$templ_data[] = array('name' => 'calendar.edit.participants','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:5:{s:2:"c1";s:7:"row,top";s:1:"A";s:2:"95";s:2:"h1";s:6:",@view";s:2:"h2";s:7:",!@view";s:2:"c2";s:4:",top";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:15:",,,participants";s:5:"label";s:12:"Participants";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:2:"14";s:4:"name";s:22:"participants[accounts]";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:3:{s:4:"type";s:16:"resources_select";s:4:"size";s:2:"14";s:4:"name";s:23:"participants[resources]";}}i:2;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Participants";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:26:"accounts_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:22:"participants[accounts]";s:7:"options";a:0:{}}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:1:{s:2:"h1";s:19:",!@resources_status";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:16:"resources_select";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:27:"resources_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:23:"participants[resources]";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:4;s:4:"size";s:23:"100%,200,,row_on,,,auto";s:7:"options";a:4:{i:3;s:6:"row_on";i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,row_on,,,auto','style' => '','modified' => '1129665796',); + +$templ_data[] = array('name' => 'calendar.edit.recurrence','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:2:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118737412',); + +$templ_data[] = array('name' => 'calendar.edit.recurrence','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:6:{s:2:"c1";s:2:"th";s:1:"A";s:2:"95";s:2:"c2";s:3:"row";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:1:"D";s:3:"50%";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:27:"Repeating Event Information";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"be back soon ;-)";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,recur_type";s:5:"label";s:11:"Repeat type";}s:1:"B";a:2:{s:4:"type";s:6:"select";s:4:"name";s:10:"recur_type";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:4:"size";s:17:",,,recur_interval";s:5:"label";s:8:"Interval";}s:1:"D";a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:14:"recur_interval";s:4:"help";s:53:"repeating interval, eg. 2 to repeat every second week";s:4:"size";s:9:"None,2,10";}}i:3;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:16:",,,recur_enddate";s:5:"label";s:8:"End date";}s:1:"B";a:3:{s:4:"type";s:4:"date";s:4:"name";s:13:"recur_enddate";s:4:"help";s:57:"repeat the event until which date (empty means unlimited)";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,recur_data";s:5:"label";s:11:"Repeat days";}s:1:"B";a:4:{s:4:"type";s:10:"select-dow";s:4:"size";s:3:"5,1";s:4:"name";s:10:"recur_data";s:4:"help";s:44:"Days of the week for a weekly repeated event";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:4;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118737412',); + +$templ_data[] = array('name' => 'calendar.edit.recurrence','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:9:{s:2:"c1";s:2:"th";s:1:"A";s:2:"95";s:2:"c2";s:3:"row";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:1:"D";s:3:"50%";s:2:"h1";s:2:"12";s:2:"h2";s:2:"12";s:2:"h3";s:2:"12";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:27:"Repeating Event Information";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"be back soon ;-)";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,recur_type";s:5:"label";s:11:"Repeat type";}s:1:"B";a:2:{s:4:"type";s:6:"select";s:4:"name";s:10:"recur_type";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:4:"size";s:17:",,,recur_interval";s:5:"label";s:8:"Interval";}s:1:"D";a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:14:"recur_interval";s:4:"help";s:53:"repeating interval, eg. 2 to repeat every second week";s:4:"size";s:9:"None,2,10";}}i:3;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:16:",,,recur_enddate";s:5:"label";s:8:"End date";}s:1:"B";a:4:{s:4:"type";s:4:"date";s:4:"name";s:13:"recur_enddate";s:4:"help";s:57:"repeat the event until which date (empty means unlimited)";s:4:"span";s:3:"all";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,recur_data";s:5:"label";s:11:"Repeat days";}s:1:"B";a:4:{s:4:"type";s:10:"select-dow";s:4:"size";s:3:"6,1";s:4:"name";s:10:"recur_data";s:4:"help";s:44:"Days of the week for a weekly repeated event";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:10:"Exceptions";}s:1:"D";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:4:"$row";s:8:"readonly";s:1:"1";}s:1:"B";a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:4:"size";s:6:"delete";s:4:"name";s:27:"delete_exception[$row_cont]";s:4:"help";s:21:"Delete this exception";s:7:"onclick";s:40:"return confirm(\'Delete this exception\');";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:15:"recur_exception";s:7:"options";a:0:{}}}}s:4:"rows";i:4;s:4:"cols";i:4;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118737412',); + +$templ_data[] = array('name' => 'calendar.export','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:1:{s:2:"h5";s:2:",1";}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:8:",,,start";s:5:"label";s:5:"Start";}s:1:"B";a:3:{s:4:"type";s:4:"date";s:4:"name";s:5:"start";s:4:"help";s:23:"Startdate of the export";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:6:",,,end";s:5:"label";s:3:"End";}s:1:"B";a:3:{s:4:"type";s:4:"date";s:4:"name";s:3:"end";s:4:"help";s:21:"Enddate of the export";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:7:",,,file";s:5:"label";s:8:"Filename";}s:1:"B";a:3:{s:4:"type";s:4:"text";s:4:"name";s:4:"file";s:4:"help";s:24:"Filename of the download";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:10:",,,version";s:5:"label";s:7:"Version";}s:1:"B";a:2:{s:4:"type";s:6:"select";s:4:"name";s:7:"version";}}i:6;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:3:{s:4:"type";s:6:"button";s:5:"label";s:8:"Download";s:4:"name";s:8:"download";}}i:7;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:7;s:4:"cols";i:2;s:5:"align";s:6:"center";s:7:"options";a:0:{}}}','size' => '','style' => '','modified' => '1130738737',); + +$templ_data[] = array('name' => 'calendar.freetimesearch','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:9:",size120b";s:5:"label";s:15:"Freetime Search";}s:1:"B";a:4:{s:4:"type";s:5:"label";s:4:"span";s:5:",ired";s:7:"no_lang";s:1:"1";s:4:"name";s:3:"msg";}}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";}}}s:4:"rows";i:6;s:4:"cols";i:2;}}','size' => '','style' => '.size120b { text-size: 120%; font-weight: bold; } .ired { color: red; font-style: italic; }','modified' => '1097251203',); -$templ_data[] = array('name' => 'calendar.freetimesearch','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:7:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:9:",size120b";s:5:"label";s:15:"Freetime Search";}s:1:"B";a:4:{s:4:"type";s:5:"label";s:4:"span";s:5:",ired";s:7:"no_lang";s:1:"1";s:4:"name";s:3:"msg";}}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:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:4:{s:4:"type";s:6:"select";s:7:"no_lang";s:1:"1";s:4:"name";s:8:"duration";s:4:"help";s:23:"Duration of the meeting";}i:2;a:2:{s:4:"type";s:5:"label";s:5:"label";s:18:"or Enddate / -time";}i:3;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; } -.ired { color: red; font-style: italic; }','modified' => '1102850646',); +$templ_data[] = array('name' => 'calendar.freetimesearch','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:9:",size120b";s:5:"label";s:15:"Freetime Search";}s:1:"B";a:4:{s:4:"type";s:5:"label";s:4:"span";s:10:",redItalic";s:7:"no_lang";s:1:"1";s:4:"name";s:3:"msg";}}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:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:6:"select";s:7:"no_lang";s:1:"1";s:4:"name";s:8:"duration";s:4:"help";s:23:"Duration of the meeting";}i:2;a:4:{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";s:4:"span";s:9:",end_hide";}}}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:4:"hbox";s:4:"size";s:1:"2";i:1;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:2;a:5:{s:4:"type";s:6:"button";s:4:"name";s:6:"cancel";s:5:"label";s:6:"Cancel";s:4:"help";s:16:"Close the window";s:7:"onclick";s:15:"window.close();";}}}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";}}}s:4:"rows";i:6;s:4:"cols";i:2;}}','size' => '','style' => '.size120b { text-size: 120%; font-weight: bold; } +.redItalic { color: red; font-style: italic; } +.end_hide { visibility: hidden; }','modified' => '1102850646',); -$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',); +$templ_data[] = array('name' => 'calendar.freetimesearch.rows','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"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";}}}s:4:"rows";i:2;s:4:"cols";i:4;}}','size' => '','style' => '','modified' => '1097183756',); + +$templ_data[] = array('name' => 'calendar.import','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:9:"iCal file";}s:1:"B";a:3:{s:4:"type";s:4:"file";s:4:"name";s:9:"ical_file";s:6:"needed";s:1:"1";}}i:3;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:3:{s:4:"type";s:6:"button";s:5:"label";s:6:"Import";s:4:"name";s:6:"import";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:5:"align";s:6:"center";s:7:"options";a:0:{}}}','size' => '','style' => '','modified' => '1131469789',); + +$templ_data[] = array('name' => 'calendar.list','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:1:{s:2:"h1";s:6:",!@msg";}i:1;a:1:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:10:",redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";}}i:2;a:1:{s:1:"A";a:3:{s:4:"type";s:9:"nextmatch";s:4:"size";s:18:"calendar.list.rows";s:4:"name";s:2:"nm";}}}s:4:"rows";i:2;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1128458939',); + +$templ_data[] = array('name' => 'calendar.list.rows','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:3:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";s:1:"C";s:3:"50%";}i:1;a:5:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:5:"Start";s:4:"name";s:5:"start";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:3:"end";s:5:"label";s:3:"End";}}s:1:"C";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:5:"Title";s:4:"name";s:5:"title";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:3:"des";}}s:1:"D";a:3:{s:4:"type";s:23:"nextmatch-accountfilter";s:4:"size";s:12:"Participants";s:4:"name";s:11:"participant";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:2;a:5:{s:1:"A";a:2:{s:4:"type";s:5:"image";s:4:"name";s:12:"${row}[icon]";}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:13:"${row}[start]";s:8:"readonly";s:1:"1";}i:2;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"${row}[end]";s:8:"readonly";s:1:"1";}s:4:"name";s:5:"start";}s:1:"C";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[title]";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";s:4:"size";s:1:"b";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:19:"${row}[description]";s:7:"no_lang";s:1:"1";}}s:1:"D";a:4:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[parts]";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}s:1:"E";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"view";s:5:"label";s:4:"view";s:4:"name";s:19:"view[$row_cont[id]]";s:4:"help";s:15:"view this entry";s:7:"onclick";s:176:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.view&cal_id=$row_cont[id]\'),\'425\',\'dependent=yes,width=750,height=450,scrollbars=yes,status=yes\'); return false;";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"name";s:19:"edit[$row_cont[id]]";s:4:"help";s:15:"Edit this entry";s:7:"onclick";s:176:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.edit&cal_id=$row_cont[id]\'),\'425\',\'dependent=yes,width=750,height=450,scrollbars=yes,status=yes\'); return false;";}i:3;a:6:{s:4:"type";s:6:"button";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"help";s:17:"Delete this entry";s:7:"onclick";s:36:"return confirm(\'Delete this entry\');";}}}}s:4:"rows";i:2;s:4:"cols";i:5;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1128457387',); + +$templ_data[] = array('name' => 'calendar.list.rows','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:4:{s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";s:1:"B";s:3:"40%";s:1:"E";s:3:"10%";}i:1;a:5:{s:1:"A";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:5:"Start";s:4:"name";s:9:"cal_start";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:7:"cal_end";s:5:"label";s:3:"End";}}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:5:"Title";s:4:"name";s:9:"cal_title";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:15:"cal_description";}}s:1:"C";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:9:"cal_owner";s:5:"label";s:5:"Owner";s:8:"readonly";s:1:"1";}i:2;a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:4:"name";s:12:"cal_location";s:5:"label";s:8:"Location";}}s:1:"D";a:3:{s:4:"size";s:16:"All participants";s:4:"name";s:11:"participant";s:4:"type";s:23:"nextmatch-accountfilter";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:2;a:5:{s:1:"A";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:13:"${row}[start]";s:8:"readonly";s:1:"1";}i:2;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"${row}[end]";s:8:"readonly";s:1:"1";}s:4:"name";s:5:"start";}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[title]";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";s:4:"size";s:1:"b";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:19:"${row}[description]";s:7:"no_lang";s:1:"1";}}s:1:"C";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"${row}[owner]";s:8:"readonly";s:1:"1";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[location]";s:7:"no_lang";s:1:"1";}}s:1:"D";a:4:{s:4:"type";s:5:"label";s:4:"name";s:13:"${row}[parts]";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}s:1:"E";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"view";s:5:"label";s:4:"view";s:4:"name";s:19:"view[$row_cont[id]]";s:4:"help";s:15:"View this event";s:7:"onclick";s:176:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.view&cal_id=$row_cont[id]\'),\'425\',\'dependent=yes,width=750,height=450,scrollbars=yes,status=yes\'); return false;";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"name";s:19:"edit[$row_cont[id]]";s:4:"help";s:15:"Edit this event";s:7:"onclick";s:176:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.uiforms.edit&cal_id=$row_cont[id]\'),\'425\',\'dependent=yes,width=750,height=450,scrollbars=yes,status=yes\'); return false;";}i:3;a:6:{s:4:"type";s:6:"button";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"help";s:17:"Delete this event";s:7:"onclick";s:36:"return confirm(\'Delete this event\');";}}}}s:4:"rows";i:2;s:4:"cols";i:5;s:7:"options";a:0:{}s:4:"size";s:4:"100%";}}','size' => '100%','style' => '','modified' => '1128457387',); diff --git a/calendar/setup/phpgw_de.lang b/calendar/setup/phpgw_de.lang index 5835129a93..032fc43168 100644 --- a/calendar/setup/phpgw_de.lang +++ b/calendar/setup/phpgw_de.lang @@ -1,352 +1,275 @@ %1 %2 in %3 calendar de %1 %2 im %3 -%1 matches found calendar de %1 Treffer gefunden %1 records imported calendar de %1 Datensätze importiert %1 records read (not yet imported, you may go back and uncheck test import) calendar de %1 Datensätze gelesen (noch nicht importiert, sie können zurück gehen und Test Import ausschalten) -(for weekly) calendar de (für wöchentlich) -(i/v)cal calendar de [iv]Cal -1 match found calendar de 1 Treffer gefunden -a calendar de a -accept calendar de Zusagen +please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2.
    holidays are %3 automatic installed from %4. you can changed it in %5. calendar de Bitte beachten: Der Kalender verwendet die Feiertages Ihres Landes, welches auf %1 eingestellt ist. Das können Sie in Ihren %2 ändern.
    Feiertage werden %3 automatisch von %4 installiert, was in %5 änderbar ist. +a non blocking event will not conflict with other events calendar de Ein nicht blockierender Termin ergibt keine Konflikt mit anderen Terminen +accept or reject an invitation calendar de Einladung zu- oder absagen accepted calendar de Zugesagt action that caused the notify: added, canceled, accepted, rejected, ... calendar de Aktion die die Benachrichtigung verursacht hat: Zugefügt, Storniert, Zugesagt, Abgesagt -add a single entry by passing the fields. calendar de Einen einzelnen neuen Eintrag über seine Felder erzeugen. +actions calendar de Befehle add alarm calendar de Alarm zufügen -add contact calendar de Kontakt zufügen -add or update a single entry by passing the fields. calendar de Einen einzelnen Eintrag zufügen oder speichern durch Angabe der Felder. added calendar de Neuer Termin -address book calendar de Adressbuch +after current date calendar de Nach dem aktuellen Datum alarm calendar de Alarm +alarm added calendar de Alarm zugefügt +alarm deleted calendar de Alarm gelöscht alarm for %1 at %2 in %3 calendar de Alarm für %1 am %2 in %3 alarm management calendar de Alarm Management -alarm-management calendar de Alarm Management alarms calendar de Alarme all categories calendar de Alle Kategorien all day calendar de ganztägig +all events calendar de Alle Termine +all participants calendar de Alle Teilnehmer +allows to edit the event again calendar de Erlaubt den Termin erneut zu bearbeiten +apply the changes calendar de Übernimmt die Änderungen are you sure you want to delete this country ? calendar de Sind Sie sicher, dass Sie dieses Land löschen wollen ? are you sure you want to delete this holiday ? calendar de Sind Sie sicher, dass Sie diesen Feiertag löschen wollen ? -are you sure\nyou want to\ndelete these alarms? calendar de Sind Sie sicher,\ndass Sie diese\nAlarme löschen wollen ? -are you sure\nyou want to\ndelete this entry ? calendar de Sind Sie sicher,\ndass Sie diesen\nEintrag löschen wollen ? -are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar de Sind Sie sicher,\ndass Sie diesen\nEintrag löschen wollen ?\n\nDieser Eintrag wird damit\nfür alle Benutzer gelöscht. -are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar de Sind Sie sicher,\ndass Sie diesen einzelnen\nEintrag löschen wollen ?\n\nDieser Eintrag wird damit\nfür alle Benutzer gelöscht. -are you surenyou want tondelete these alarms? calendar de Sind Sie sicher,\ndass Sie diese\nAlarme löschen wollen ? -are you surenyou want tondelete this entry ? calendar de Sind Sie sicher,\ndass Sie diesen\nEintrag löschen wollen ? -are you surenyou want tondelete this entry ?nnthis will deletenthis entry for all users. calendar de Sind Sie sicher,\ndass Sie diesen\nEintrag löschen wollen ?\n\nDieser Eintrag wird damit\nfür alle Benutzer gelöscht. -are you surenyou want tondelete this single occurence ?nnthis will deletenthis entry for all users. calendar de Sind Sie sicher,\ndass Sie diesen einzelnen\nEintrag löschen wollen ?\n\nDieser Eintrag wird damit\nfür alle Benutzer gelöscht. -back calendar de zurück +back half a month calendar de einen halben Monat zurück +back one month calendar de einen Monat zurück +before current date calendar de Vor dem aktuellen Datum before the event calendar de vor dem Termin -brief description calendar de Kurzbeschreibung -business calendar de geschäftlich -calendar common de Kalender -calendar - [iv]cal importer calendar de Kalendar - [iv]Cal Importieren -calendar - add calendar de Kalendereintrag hinzufügen -calendar - edit calendar de Kalendereintrag bearbeiten +birthday calendar de Geburtstag +busy calendar de belegt +by calendar de von calendar event calendar de Kalender Aktualisierung calendar holiday management admin de Feiertage verwalten calendar preferences calendar de Kalender Einstellungen calendar settings admin de Kalender Einstellungen calendar-fieldname calendar de Kalender Feldname +can't add alarms in the past !!! calendar de Kann keine Alarme in der Vergangenheit setzen !!! canceled calendar de Abgesagt -change all events for $params['old_owner'] to $params['new_owner']. calendar de Ändere alle Termine für $params['old_owner'] auf $params['new_owner']. -change status calendar de Zusage ändern charset of file calendar de Zeichensatz der Datei -choose the category calendar de Kategorie auswählen -click %1here%2 to return to the calendar. calendar de %1Hier%2 klicken um zum Kalender zurück zu kehren. -configuration calendar de Konfiguration +close the window calendar de Schließt das Fenster +compose a mail to all participants after the event is saved calendar de Schreibe eine Mail an alle Teilnehmer nachdem der Termin gespeichert wurde +copy of: calendar de Kopie von: +copy this event calendar de Kopiert diesen Termin countries calendar de Länder country calendar de Land -created by calendar de Angelegt von +create new links calendar de Neue Verknüpfung erstellen +csv calendar de CSV csv-fieldname calendar de CSV-Feldname csv-filename calendar de CSV-Dateiname custom fields calendar de Benutzerdefinierte Felder -custom fields and sorting common de Benutzerdefinierte Felder und Sortierung daily calendar de Täglich -daily matrix view calendar de Matrix-Ansicht days calendar de Tage +days of the week for a weekly repeated event calendar de Wochentage für wöchentlich wiederholten Termin days repeated calendar de wiederholte Tage dayview calendar de Tagesansicht default appointment length (in minutes) calendar de Standardlänge eines neuen Kalendareintrags (in Minuten) default calendar filter calendar de Standard-Filter des Kalenders default calendar view calendar de Standard-Ansicht des Kalenders default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar de Vorgabe für die Länge von neuen Kalendareinträgen. Die Länge ist in Minuten, zb. 60 für 1 Stunde. -default view of appointments calendar de Standard-Ansicht der Termine default week view calendar de Vorgabe Wochenansicht defines the size in minutes of the lines in the day view. calendar de Bestimmt die Zeitskala in Minuten der Tagesansicht des Kalendars. -delete a single entry by passing the id. calendar de Lösche einen einzelnen Eintrag über seine Id. -delete an entire users calendar. calendar de Lösche den kompletten Kalender eines Benutzers. -delete selected contacts calendar de Löscht die ausgewählten Kontakte. -delete selected participants calendar de Löscht die ausgewählten Teilnehmer delete series calendar de Serie löschen -delete single calendar de Einzelevent löschen -deleted calendar de Abgesagt -description calendar de Beschreibung -determining window width ... calendar de Bestimme die Fensterbreite ... -disable calendar de Ausschalten -disabled calendar de ausgeschaltet -display interval in day view calendar de Intervall der Tagesansicht -display mini calendars when printing calendar de zeige einen kleinen Kalender beim drucken +delete this alarm calendar de Diesen Alarm löschen +delete this event calendar de Diesen Termin löschen +delete this exception calendar de Diese Ausnahme löschen +delete this series of recuring events calendar de Diese Serie von wiederholenden Terminen löschen +disinvited calendar de Ausgeladen display status of events calendar de Status von Terminen anzeigen -displayed view calendar de Ansicht displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar de Zeigt Ihre Standard-Kalendar-Ansicht auf der Startseite angezeigt werden (die Seite die sich nach dem Login öffnet oder wenn Sie auf Home klicken)? do you want a weekview with or without weekend? calendar de Wollen Sie eine Wochenansicht mit oder ohne Wochenende? -do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all changes include changes of title, description, participants and the acceptions and rejections of the appointment. calendar de Möchten Sie über neue oder geänderte Termine benachrichtigt werden? Sie werden benachrichtigt werden über Änderungen welche Sie selbst durchführen.
    Sie können die benachrichtigungen beschränken auf bestimmte Änderungen. Jeder auszuwählende Punkt schließt auch die darüber aufgeführten Benachrichtigungen mit ein. Alle Änderungen beinhaltet Änderungen des Titels, der Beschreibung, Teilnehmer so wie Zusagen so wie Absagen von Terminen. do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar de Wollen Sie über neue oder geänderte Termine benachrichtigt werden? Sie werden nie über eigene Änderungen benachrichtig.
    Sie können die Benachrichtigungen auf verschiedene Änderungen begrenzen. Jede Zeile enthält die Benachrichtigungen der darüberliegenden. Alle Änderungen umfasst den Title, die Beschreibung, Teilnehmer, aber keine Antworten der Teilnehmer. Wenn der Ersteller eines Event irgendeine Benachrichtigung will, erhält er automatisch auch die Antworten der Teilnehmer, wie Zusagen und Absagen. do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar de Möchten Sie eine regelmäßige Zusammenfassung Ihrer Termine via E-Mail erhalten?
    Die Zusammenfassung wird täglich (jeden Morgen), oder für eine wöchentliche Zusammenfassung Montags an Ihre standard E-Mail Adresse gesendet.
    Die Benachrichtigung wird nur versendet wenn Sie am nächsten Tag oder in der nächsten Woche auch einen Termin haben. 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 +download this event as ical calendar de Termin als iCal herunterladen 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 -email notification for %1 calendar de Benachrichtigung per Email für %1 +edit this event calendar de Diesen Termin bearbeiten +edit this series of recuring events calendar de Diese Serie von wiederholenden Terminen bearbeiten empty for all calendar de leer für alle -enable calendar de Einschalten -enabled calendar de eingeschaltet +end calendar de Ende 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 +enddate of the export calendar de Enddatum des Exports ends calendar de endet -enter output filename: ( .vcs appended ) calendar de Namen der Ausgabedatei (.vcs angehangen) +error adding the alarm calendar de Fehler beim Zufügen des Alarms +error: importing the ical calendar de Fehler: beim Importieren des iCal +error: saving the event !!! calendar de Fehler: beim Speichern des Termins !!! +event copied - the copy can now be edited calendar de Termin kopiert - die Kopie kann jetzt bearbeitet werden +event deleted calendar de Termin gelöscht event details follow calendar de Details zum Termin folgen +event saved calendar de Termin gespeichert +event will occupy the whole day calendar de Termin nimmt den ganzen Tag ein exceptions calendar de Ausnahmen +existing links calendar de Bestehende Verknüpfungen export calendar de Exportieren -export a list of entries in ical format. calendar de Eine Liste von Einträgen im iCal Format exportieren. extended calendar de Erweitert extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar de Erweiterte Benachrichtigungen enthälten immer die kompletten Termindetails. iCal's können von vielen anderen Kalendarprogrammen importiert werden. -external participants calendar de Externe Teilnehmer -failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar de Fehler beim Senden einer Email an '%1' #%2 Betreff='%3', Absender='%4' !!! fieldseparator calendar de Feldtrenner -find free timeslots where the marked participants are availible for the given timespan calendar de Such freie Zeitslots an denen die ausgewählten Teilnehmer für die gegebene Zeitspanne verfügbar sind +filename calendar de Dateiname +filename of the download calendar de Name der herunterzuladenden Datei +find free timeslots where the selected participants are availible for the given timespan calendar de Such freie Zeitslots an denen die ausgewählten Teilnehmer für die gegebene Zeitspanne verfügbar sind firstname of person to notify calendar de Vorname der zu benachrichtigenden Person +for calendar de für format of event updates calendar de Format der Benachrichtigungen -fr calendar de Fr -free/busy calendar de frei/belegt +forward half a month calendar de einen halben Monat weiter +forward one month calendar de einen Monat weiter 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 fullname of person to notify calendar de Name der zu benachrichtigenden Person -generate printer-friendly version calendar de Drucker-freundliche Version erzeugen -global categories calendar de Globale Kategorien +general calendar de Allgemein global public and group public calendar de Global öffentlich und Gruppen-öffentlich global public only calendar de nur Global öffentlich -go! calendar de Go! -grant calendar access common de Berechtigungen für Kalenderzugriffe group planner calendar de Gruppenplaner group public only calendar de Gruppen-Öffentlich here is your requested alarm. calendar de Hier ist ihr bestellter Alarm. -high calendar de hoch high priority calendar de Hohe Priorität holiday calendar de Feiertag holiday management calendar de Feiertagsverwaltung -holiday-management calendar de Feiertagsverwaltung 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 calendar de iCal ical / rfc2445 calendar de iCal / RFC2445 +ical export calendar de iCal Export +ical file calendar de iCal Datei +ical import calendar de iCal Import +ical successful imported calendar de iCal erfolgreich importiert 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 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 +import csv-file calendar de CSV-Datei importieren interval calendar de Interval intervals in day view calendar de Zeitintervalle in der Tagesansicht -intervals per day in planner view calendar de Zeitintervalle pro Tag in der Planeransicht -invalid entry id. calendar de ungültige Id des Eintrags. +invalid email-address "%1" for user %2 calendar de Ungültige Email-Adresse "%1" für Benutzer %2 last calendar de letzte lastname of person to notify calendar de Nachname der zu benachrichtigenden Person -length shown
    (emtpy for full length) calendar de angezeigte Länge
    (leer für volle Länge) -length
    (<= 255) calendar de Länge
    (<= 255) -link calendar de Verweis link to view the event calendar de Verweis (Weblink) um den Termin anzuzeigen -list all categories. calendar de Alle Kategorien auflisten. -load [iv]cal calendar de [iv]Cal Laden +links calendar de Verknüpfungen +links, attachments calendar de Verknüpfungen, Dateianhänge +listview calendar de Listenansicht location calendar de Ort location to autoload from admin de Von wo sollen sie geladen werden -low calendar de niedrig +location, start- and endtimes, ... calendar de Ort, Start- und Endzeiten +mail all participants calendar de Mail an alle Teilnehmer make freebusy information available to not loged in persons? calendar de Die Belegtzeiten für nicht angemeldete Personen verfügbar machen? -matrixview calendar de Matrixansicht minutes calendar de Minuten -mo calendar de Mo modified calendar de Geändert -modify list of external participants calendar de Liste der externen Teilnehmer änderen mon calendar de Mo -month calendar de Monat monthly calendar de Monatlich monthly (by date) calendar de Monatlich (nach Datum) monthly (by day) calendar de Monatlich (nach Wochentag) 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 events found calendar de Keine Termine gefunden no filter calendar de Kein Filter no matches found calendar de Keine Treffer gefunden -no matches found. calendar de Keine Treffer gefunden. no response calendar de Keine Antwort -normal calendar de normal -notification message for updates you send calendar de Mitteilungs Text für updates welche Sie versenden +non blocking calendar de nicht blockierend notification messages for added events calendar de Benachrichtigungstext für neue Termine notification messages for canceled events calendar de Benachrichtigungstext für stornierte Termine +notification messages for disinvited participants calendar de Benachrichtigung für ausgeladene Teilnehmer notification messages for modified events calendar de Benachrichtigungstext für geänderte Termine notification messages for your alarms calendar de Benachrichtigungstext für Ihre Alarme notification messages for your responses calendar de Benachrichtigungstext für Ihre Antworten -number of intervals per day in planner view calendar de Anzahl Intervale pro Tag im Planer -number of months calendar de Anzahl Monate number of records to read (%1) calendar de Anzeil Datensätze zu lesen (%1) observance rule calendar de Observance Rule occurence calendar de Wiederholung old startdate calendar de Altes Startdatum -olddate calendar de AltesDatum on %1 %2 %3 your meeting request for %4 calendar de Am %1 hat %2 Ihre Einladung für den %4 %3 -on all changes calendar de bei allen Veränderungen on all modification, but responses calendar de bei allen Änderungen, außer Antworten -on any time change (and above options) calendar de bei allen zeitliche Änderunge (und obige optionen) on any time change too calendar de auch jede zeitliche Veränderung 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 only the initial date of that recuring event is checked! calendar de Nur das Startdatum diese wiederholenden Termins wird geprüft! 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 participants calendar de Teilnehmer -participates calendar de nimmt teil +participants disinvited from an event calendar de Ausgeladene Teilnehmer eines Termins +participants, resources, ... calendar de Teilnehmer, Ressourcen password for not loged in users to your freebusy information? calendar de Passwort für Ihre Belegtzeiten für nicht angemeldete Personen? people holiday calendar de Feiertag permission denied calendar de Zugriff verweigert -planner calendar de Planer planner by category calendar de Planer nach Kategorien planner by user calendar de Planer nach Benutzern -please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar de Bitte den entsprechenden Eintrag im Ihrem Kalendar bestätigen, Zusagen, Absagen oder die Änderungen beachten -please enter a filename !!! calendar de Bitte geben Sie einen Dateinamen an !!! +please note: you can configure the field assignments after you uploaded the file. calendar de Bitte beachten: Die Feldzuordnung kann NACH dem Hochladen der Datei konfiguriert werden. preselected group for entering the planner calendar de vorausgewählte Gruppe beim Planeraufruf -previous day calendar de vorheriger Tag -print calendars in black & white calendar de Kalender in schwarz und weiß drucken -print the mini calendars calendar de Mini- Kalender drucken -printer friendly calendar de Drucker-freundlich -privat calendar de Privat +previous calendar de vorherig private and global public calendar de Privat und Global öffentlich private and group public calendar de Privat und Gruppen öffentlich private only calendar de nur private re-edit event calendar de Event erneut bearbeiten -read a list of entries. calendar de Eine Liste von Einträgen lesen. -read a single entry by passing the id and fieldlist. calendar de Einen einzelnen Eintrag über seine Id und eine Feldliste lesen. -read this list of methods. calendar de Diese Liste der Methoden lesen. receive email updates calendar de Empfange E-Mail updates -receive email updates when: calendar de Empfange E-Mail updates wenn: -receive extra information in event mails calendar de Zusätzliche Informationen bei EMail-Benachrichtigung receive summary of appointments calendar de Zusammenfassung der Termine erhalten +recurrence calendar de Wiederholung recurring event calendar de Wiederholender Termin -refresh calendar de Aktualisieren -reinstate calendar de Wiedereinsetzen -reject calendar de Absagen rejected calendar de Abgesagt -repeat day calendar de Wiederholungstag -repeat end date calendar de Enddatum +repeat days calendar de Wiederholungstage +repeat the event until which date (empty means unlimited) calendar de Bis zu welchen Datum soll der Termin wiederholt werden (leer bedeutet unbegrenzt) repeat type calendar de Wiederholungstyp repeating event information calendar de Informationen zu sich wiederholenden Ereignissen +repeating interval, eg. 2 to repeat every second week calendar de Wiederholungsinterval, zB. 2 für jeder zweite Woche repetition calendar de Wiederholung repetitiondetails (or empty) calendar de Details der Wiederholung (oder leer) reset calendar de Zurücksetzen +resources calendar de Ressourcen rule calendar de Regel -sa calendar de Sa sat calendar de Sa +saves the changes made calendar de Speichert die Änderungen +saves the event ignoring the conflict calendar de Speichert den Konflikt ignorierend den Termin 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 +select resources calendar de Ressourcen auswählen +select who should get the alarm calendar de Auswählen wer den Alarm erhalten soll set a year only for one-time / non-regular holidays. calendar de Nur für einmalige/unregelmäßige Feiertage das Jahr angeben. set new events to private calendar de Neue Termine als private Termine eintragen should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar de Sollen Einladungen welche von Ihnen abgelehnt wurden in Ihrem Kalender angezeigt werden?
    Sie können diese Einladungen dann später akzeptieren (z. B. wenn Sie eine Terminkolission gelöst haben), wenn Sie in Ihrem Kalender noch vorhanden sind! should new events created as private by default ? calendar de Sollen neue Termine generell als Privat angelegt werden? should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar de Sollen nicht angemeldete Personen ihre Belegtzeiten einsehen können? Sie können ein Passwort setzen um diese Informationen zu schützen. Das Passwort sollte sich von Ihrem normalen Passwort unterscheiden. Die Belegtzeiten sind im iCal Format und enthalten ausschließlich die Zeiten an denen sie nicht verfügbar sind. Sie enthalten NICHT den Namen, die Beschreibung oder den Ort des Termins. Die Adresse (URL) Ihrer Belegtzeiten ist %1. -should the mini calendars by printed / displayed in the printer friendly views ? calendar de Soll der Mini Kalender "gedruckt werden/angezeigt werden" in einer Druck freundlichen Ansicht ? -should the printer friendly view be in black & white or in color (as in normal view)? calendar de Soll die Drucker freundliche Ansicht in schwarz-weiß dargestellt werden oder in Farbe (identisch der normalen Ansicht)? should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar de Soll der Status (Zugesagt,Abgesagt ...)der Termin- Teilnehmer in Klammern hinter jeden Teilnehmer angezeigt werden? -show day view on main screen calendar de Tagesansicht auf Startseite anzeigen show default view on main screen calendar de Standardansicht auf der Startseite anzeigen -show high priority events on main screen calendar de Termine mit hoher Priorität auf der Startseite anzeigen show invitations you rejected calendar de Zeige Einladungen welche abgelehnt wurden an show list of upcoming events calendar de Zeige eine Liste der kommenden Termine -show next seven days calendar de Nächsten sieben Tage anzeigen -show only one day calendar de Nur einen Tag anzeigen -show the calendar of multiple users calendar de Kalender von mehreren Benutzeren anzeigen show this month calendar de Diesen Monat anzeigen show this week calendar de Diese Woche anzeigen single event calendar de Einzelner Termin -sorry, the owner has just deleted this event calendar de Der Eigentümer hat diesen Termin gerade gelöscht -sorry, this event does not exist calendar de Dieser Termin existiert nicht -sorry, this event does not have exceptions defined calendar de Dieser Termin hat keine Ausnahmen definiert -sort by calendar de Sortieren nach -specifies the the number of intervals shown in the planner view. calendar de Legt die Anzahl der Zeitintervalle fest welche in der Kalenderplanung angezeigt werden. +start calendar de Start 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 +startdate of the export calendar de Startdatum des Exports startrecord calendar de Startdatensatz -su calendar de So +status changed calendar de Status geändert submit to repository calendar de Übertragen zu eGroupWare.org sun calendar de So tentative calendar de Vorläufige Zusage test import (show importable records only in browser) calendar de Test Import (zeigt importierte Datensätze nur im Webbrowser an) -text calendar de Text -th calendar de Do -the following conflicts with the suggested time:
      %1
    calendar de Im gewählten Zeitraum gibt es einen Konflikt:
      %1
    -the user %1 is not participating in this event! calendar de Der Benutzer %1 nimmt nicht an diesem Event teil! -there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar de Fehler beim Kontaktieren Ihres News-Servers.
    Bitte benachrichtigen Sie Ihren Administrator um Servername, Username und Passwort für News zu überprüfen. this day is shown as first day in the week or month view. calendar de Dieser Tag wird als erster in der Wochen- oder Monatsansicht angezeigt this defines the end of your dayview. events after this time, are shown below the dayview. calendar de Diese Zeit definiert das Ende des Arbeitstags in der Tagesansicht. Alle späteren Einträge werden darunter dargestellt. -this defines the start of your dayview. events before this time, are shown above the dayview. calendar de Diese Zeit definiert das Start des Arbeitstags in der Tageseinsicht. Alle späteren Einträge werden darüber dargestellt. this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar de Diese Zeit definiert den Anfang des Arbeitstags in der Tagesansicht. Alle früheren Einträge werden darüber dargestellt. this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar de Diese Gruppe wird als vorauswahl ausgewählt wenn Sie den Planer öffnen. Sie können die Gruppe jederzeit wechseln wenn Sie möchten. -this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar de Das wird meistens durch einen nicht oder falsch konfigurierten SMTP Server verursacht. Benachrichtigen Sie Ihren Administrator. this message is sent for canceled or deleted events. calendar de Diese Benachrichtigung wird für stornierte oder gelöschte Termine versandt. this message is sent for modified or moved events. calendar de Diese Benachrichtigung wird für geänderte Termine versandt. +this message is sent to disinvited participants. calendar de Diese Nachricht wird ausgeladenen Teilnehmern geschickt. this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar de Diese Nachricht wird an alle Teilnehmer der Termine die Sie anlegen versandt, die Benachrichtigungen wünschen.
    Sie können verschiedene Variablen verwenden, welche durch die Daten des Termins ersetzt werden. Die erste Zeite ist der Betreff der E-Mail. -this message is sent to every participant of events you own, who has requested notifcations.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar de Mit dieser Nachricht laden Sie Teilnehmer zu einem Termin ein, welche eine automatische Benachrichtigung aktiviert haben.
    Sie können verschiedene Variablen benutzen welche durch die Daten des Meetings ersetzt werden. Die erste Zeile ist der Betreff der E-Mail this message is sent when you accept, tentative accept or reject an event. calendar de Diese Nachricht wird gesendet wenn Sie einen Termin zusagen, vorläufig zusagen oder absagen. this message is sent when you set an alarm for a certain event. include all information you might need. calendar de Diese Meldung wird ihnen gesandt, wenn sie einen Alarm für einen Termin setzen. Nehmen sie alle Information darin auf, die sie benötigen. -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 to many might exceed your execution-time-limit calendar de zu viele können ihre Laufzeitbeschränkung überschreiten -to-firstname calendar de An-Vorname -to-fullname calendar de An-Name -to-lastname calendar de An-Nachname -today calendar de Heute translation calendar de Übersetzung -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 +view this event calendar de Diesen Termin anzeigen wed calendar de Mi week calendar de Woche weekday starts on calendar de Arbeitswoche beginnt am @@ -354,37 +277,21 @@ weekdays calendar de Wochentage 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 +weekview with weekend calendar de Wochenansicht mit Wochenende weekview without weekend calendar de Wochenansicht ohne Wochenende -when creating new events default set to private calendar de neue Termine sind privat which events do you want to see when you enter the calendar. calendar de Welche Termine möchten Sie angezeigt bekommen wenn Sie den Kalender öffnen? which of calendar view do you want to see, when you start calendar ? calendar de Welche der möglichen Ansichten des Kalenders möchten Sie als Standard sehen wenn der Kalender geöffnet wird? -wk calendar de KW +whole day calendar de ganztägig work day ends on calendar de Arbeitstag endet um work day starts on calendar de Arbeitstag beginnt um -workdayends calendar de Arbeitstag endet -year calendar de Jahr yearly calendar de Jährlich yearview calendar de Jahresansicht you can either set a year or a occurence, not both !!! calendar de Sie können nur entweder das Jahr oder die Wiederholung angeben, nicht beides! you can only set a year or a occurence !!! calendar de Sie können nur ein Jahr oder eine Wiederholung angeben ! -you do not have permission to add alarms to this event !!! calendar de Sie haben keine Berechtigung Alarme zu diesem Termin zuzufügen !!! -you do not have permission to delete this alarm !!! calendar de Sie haben keine Berechtigung diesen Alarm zu löschen !!! -you do not have permission to enable/disable this alarm !!! calendar de Sie haben keine Berechtigung diesen Alarm ein- oder auszuschalten !!! you do not have permission to read this record! calendar de Sie haben keine Berechtigung diesen Eintrag zu lesen! -you have %1 high priority events on your calendar today. common de Sie haben heute %1 Einträge mit hoher Priorität auf Ihrer Liste! -you have 1 high priority event on your calendar today. common de Sie haben heute einen Eintrag mit hoher Priorität auf Ihrer Liste! you have a meeting scheduled for %1 calendar de Sie haben einen Termin am %1. -you have not entered a title calendar de Sie haben keinen Titel angegeben -you have not entered a valid date calendar de Sie haben kein gültiges Datum angegeben -you have not entered a valid time of day calendar de Sie haben keine gültige Uhrzeit angegeben -you have not entered a\nbrief description calendar de Sie haben keine a\nKurzbeschreibung eingegeben -you have not entered a\nvalid time of day calendar de Sie haben keine a\ngültige Tageszeit eingegeben. -you have not entered participants calendar de Sie haben keine Teilnehmer angegeben -you must enter one or more search keywords calendar de Sie müssen einen oder mehrere Suchbegriffe angeben -you must enter one or more search keywords. calendar de Sie müssen einen oder mehrere Suchbegriffe angeben. -you must select a [iv]cal. (*.[iv]cs) calendar de Sie müssen einen [iv]Cal (*.[iv]cs) auswählen. +you have been disinvited from the meeting at %1 calendar de Sie wurden vom Termin am %1 ausgeladen +you need to select an ical file first calendar de Sie müssen zuerst eine iCal Datei auswählen you need to set either a day or a occurence !!! calendar de Sie müssen entweder einen Tag oder eine Wiederholung angeben !!! your meeting scheduled for %1 has been canceled calendar de Ihr Termin am %1 wurde abgesagt. your meeting that had been scheduled for %1 has been rescheduled to %2 calendar de Ihr Termin am %1 wurde auf %2 verschoben. -your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar de Der von Ihnen gewählte Zeitraum %1 - %2 führt zu Konflikten mit folgenden bereits existierenden Kalendereinträgen: diff --git a/calendar/setup/phpgw_en.lang b/calendar/setup/phpgw_en.lang index 107252d271..277b238922 100644 --- a/calendar/setup/phpgw_en.lang +++ b/calendar/setup/phpgw_en.lang @@ -1,195 +1,179 @@ %1 %2 in %3 calendar en %1 %2 in %3 -%1 matches found calendar en %1 matches found %1 records imported calendar en %1 records imported %1 records read (not yet imported, you may go back and uncheck test import) calendar en %1 records read (not yet imported, you may go back and uncheck Test Import) -(for weekly) calendar en (for Weekly) -(i/v)cal calendar en (i/v)Cal -1 match found calendar en 1 match found -a calendar en a -accept calendar en Accept +please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2.
    holidays are %3 automatic installed from %4. you can changed it in %5. calendar en Please note: The calendar use the holidays of your country, which is set to %1. You can change it in your %2.
    Holidays are %3 automatic installed from %4. You can changed it in %5. +a non blocking event will not conflict with other events calendar en A non blocking event will not conflict with other events +accept or reject an invitation calendar en Accept or reject an invitation accepted calendar en Accepted action that caused the notify: added, canceled, accepted, rejected, ... calendar en Action that caused the notify: Added, Canceled, Accepted, Rejected, ... -add a single entry by passing the fields. calendar en Add a single entry by passing the fields. -add alarm calendar en Add Alarm -add contact calendar en Add Contact -add or update a single entry by passing the fields. calendar en Add or update a single entry by passing the fields. +actions calendar en Actions +add alarm calendar en Add alarm added calendar en Added -address book calendar en Address Book +after current date calendar en After current date alarm calendar en Alarm +alarm added calendar en Alarm added +alarm deleted calendar en Alarm deleted alarm for %1 at %2 in %3 calendar en Alarm for %1 at %2 in %3 -alarm management calendar en Alarm Management -alarm-management calendar en Alarm-Management +alarm management calendar en Alarm management alarms calendar en Alarms all categories calendar en All categories -all day calendar en All Day +all day calendar en all day +all events calendar en All events +all participants calendar en All participants +allows to edit the event again calendar en Allows to edit the event again +apply the changes calendar en apply the changes are you sure you want to delete this country ? calendar en Are you sure you want to delete this Country ? are you sure you want to delete this holiday ? calendar en Are you sure you want to delete this holiday ? -are you sure\nyou want to\ndelete these alarms? calendar en Are you sure\nyou want to\ndelete these alarms? -are you sure\nyou want to\ndelete this entry ? calendar en Are you sure\nyou want to\ndelete this entry ? -are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar en Are you sure\nyou want to\ndelete this entry ?\n\nThis will delete\nthis entry for all users. -are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar en Are you sure\nyou want to\ndelete this single occurence ?\n\nThis will delete\nthis entry for all users. +back half a month calendar en back half a month +back one month calendar en back one month +before current date calendar en Before current date before the event calendar en before the event -brief description calendar en Brief Description -business calendar en Business -calendar common en Calendar -calendar - [iv]cal importer calendar en Calendar - [iv]Cal Importer -calendar - add calendar en Calendar - Add -calendar - edit calendar en Calendar - Edit +birthday calendar en Birthday +busy calendar en busy +by calendar en by calendar event calendar en Calendar Event calendar holiday management admin en Calendar Holiday Management -calendar preferences calendar en Calendar Preferences -calendar settings admin en Calendar Settings -calendar-fieldname calendar en Calendar-Fieldname +calendar preferences calendar en Calendar preferences +calendar settings admin en Calendar settings +calendar-fieldname calendar en calendar-Fieldname +can't add alarms in the past !!! calendar en Can't add alarms in the past !!! canceled calendar en Canceled -change all events for $params['old_owner'] to $params['new_owner']. calendar en Change all events for $params['old_owner'] to $params['new_owner']. -change status calendar en Change Status charset of file calendar en Charset of file -click %1here%2 to return to the calendar. calendar en Click %1here%2 to return to the calendar. -configuration calendar en Configuration +close the window calendar en Close the window +compose a mail to all participants after the event is saved calendar en compose a mail to all participants after the event is saved +copy of: calendar en Copy of: +copy this event calendar en Copy this event countries calendar en Countries country calendar en Country -created by calendar en Created by +create new links calendar en Create new links +csv calendar en CSV csv-fieldname calendar en CSV-Fieldname csv-filename calendar en CSV-Filename -custom fields calendar en Custom Fields -custom fields and sorting common en Custom fields and sorting +custom fields calendar en Custom fields daily calendar en Daily -daily matrix view calendar en Daily Matrix View days calendar en days +days of the week for a weekly repeated event calendar en Days of the week for a weekly repeated event days repeated calendar en days repeated -dayview calendar en Day View +dayview calendar en dayview default appointment length (in minutes) calendar en default appointment length (in minutes) default calendar filter calendar en Default calendar filter -default calendar view calendar en Default calendar view +default calendar view calendar en default calendar view default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar en Default length of newly created events. The length is in minutes, eg. 60 for 1 hour. -default week view calendar en Default week view +default week view calendar en default week view defines the size in minutes of the lines in the day view. calendar en Defines the size in minutes of the lines in the day view. -delete a single entry by passing the id. calendar en Delete a single entry by passing the id. -delete an entire users calendar. calendar en Delete an entire users calendar. -delete selected contacts calendar en Delete selected contacts -delete selected participants calendar en Delete selected participants -delete series calendar en Delete Series -delete single calendar en Delete Single -deleted calendar en Deleted -description calendar en Description -determining window width ... calendar en Determining window width ... -disable calendar en Disable -disabled calendar en disabled -display interval in day view calendar en Display interval in Day View -display mini calendars when printing calendar en Display mini calendars when printing -display status of events calendar en Display Status of Events -displayed view calendar en displayed view +delete series calendar en Delete series +delete this alarm calendar en Delete this alarm +delete this event calendar en Delete this event +delete this exception calendar en Delete this exception +delete this series of recuring events calendar en Delete this series of recuring events +disinvited calendar en Disinvited +display status of events calendar en Display status of events displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar en Displays your default calendar view on the startpage (page you get when you enter eGroupWare or click on the homepage icon)? do you want a weekview with or without weekend? calendar en Do you want a weekview with or without weekend? do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar en Do you want to be notified about new or changed appointments? You be notified about changes you make yourself.
    You can limit the notifications to certain changes only. Each item includes all the notification listed above it. All modifications include changes of title, description, participants, but no participant responses. If the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar en Do you want to receive a regulary summary of your appointsments via email?
    The summary is sent to your standard email-address on the morning of that day or on Monday for weekly summarys.
    It is only sent when you have any appointments on that day or week. 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 +download this event as ical calendar en Download this event as iCal 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 -email notification for %1 calendar en Email Notification for %1 +edit series calendar en Edit series +edit this event calendar en Edit this event +edit this series of recuring events calendar en Edit this series of recuring events empty for all calendar en empty for all -enable calendar en Enable -enabled calendar en enabled +end calendar en End 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 +enddate of the export calendar en Enddate of the export ends calendar en ends -enter output filename: ( .vcs appended ) calendar en Enter Output Filename: ( .vcs appended ) -event details follow calendar en Event Details Follow +error adding the alarm calendar en Error adding the alarm +error: importing the ical calendar en Error: importing the iCal +error: saving the event !!! calendar en Error: saving the event !!! +event copied - the copy can now be edited calendar en Event copied - the copy can now be edited +event deleted calendar en Event deleted +event details follow calendar en Event Details follow +event saved calendar en Event saved +event will occupy the whole day calendar en Event will occupy the whole day exceptions calendar en Exceptions +existing links calendar en Existing links export calendar en Export -export a list of entries in ical format. calendar en Export a list of entries in iCal format. extended calendar en Extended extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar en Extended updates always include the complete event-details. iCal's can be imported by certain other calendar-applications. -external participants calendar en External Participants -failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar en Failed sending message to '%1' #%2 subject='%3', sender='%4' !!! fieldseparator calendar en Fieldseparator -find free timeslots where the marked participants are availible for the given timespan calendar en Find free timeslots where the marked participants are availible for the given timespan +filename calendar en Filename +filename of the download calendar en Filename of the download +find free timeslots where the selected participants are availible for the given timespan calendar en Find free timeslots where the selected participants are availible for the given timespan firstname of person to notify calendar en Firstname of person to notify +for calendar en for format of event updates calendar en Format of event updates -fr calendar en F -free/busy calendar en Free/Busy +forward half a month calendar en forward half a month +forward one month calendar en forward one month 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 +full description calendar en Full description fullname of person to notify calendar en Fullname of person to notify -generate printer-friendly version calendar en Generate printer-friendly version -global categories calendar en Global Categories -global public and group public calendar en Global Public and group public -global public only calendar en Global Public Only -go! calendar en Go! -grant calendar access common en Grant Calendar Access -group planner calendar en Group Planner -group public only calendar en Group Public Only +general calendar en General +global public and group public calendar en global public and group public +global public only calendar en global public only +group planner calendar en Group planner +group public only calendar en group public only here is your requested alarm. calendar en Here is your requested alarm. high priority calendar en high priority holiday calendar en Holiday 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 calendar en iCal ical / rfc2445 calendar en iCal / rfc2445 +ical export calendar en iCal Export +ical file calendar en iCal file +ical import calendar en iCal Import +ical successful imported calendar en iCal successful imported 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 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 csv-file common en Import CSV-File +import csv-file calendar en Import CSV-File interval calendar en Interval intervals in day view calendar en Intervals in day view -intervals per day in planner view calendar en Intervals per day in planner view -invalid entry id. calendar en Invalid entry id. -last calendar en last +invalid email-address "%1" for user %2 calendar en Invalid email-address "%1" for user %2 +last calendar en Last lastname of person to notify calendar en Lastname of person to notify -length shown
    (emtpy for full length) calendar en Length shown
    (emtpy for full length) -length
    (<= 255) calendar en Length
    (<= 255) -link calendar en Link link to view the event calendar en Link to view the event -list all categories. calendar en List all categories. -load [iv]cal calendar en Load [iv]Cal +links calendar en Links +links, attachments calendar en Links, Attachments +listview calendar en listview location calendar en Location location to autoload from admin en Location to autoload from +location, start- and endtimes, ... calendar en Location, Start- and Endtimes, ... +mail all participants calendar en mail all participants make freebusy information available to not loged in persons? calendar en Make freebusy information available to not loged in persons? -matrixview calendar en Matrix View -minutes calendar en minutes -mo calendar en M +minutes calendar en Minutes modified calendar en Modified -modify list of external participants calendar en Modify List of External Participants mon calendar en Mon -month calendar en Month monthly calendar en Monthly monthly (by date) calendar en Monthly (by date) monthly (by day) calendar en Monthly (by day) -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!!! +monthview calendar en monthview new search with the above parameters calendar en new search with the above parameters -next day calendar en next day +no events found calendar en No events found no filter calendar en No filter -no matches found calendar en No matches found -no response calendar en No Response +no matches found calendar en no matches found +no response calendar en No response +non blocking calendar en non blocking notification messages for added events calendar en Notification messages for added events notification messages for canceled events calendar en Notification messages for canceled events +notification messages for disinvited participants calendar en Notification messages for disinvited participants notification messages for modified events calendar en Notification messages for modified events notification messages for your alarms calendar en Notification messages for your alarms notification messages for your responses calendar en Notification messages for your responses -number of intervals per day in planner view calendar en Number of Intervals per Day in Planner View -number of months calendar en Number of months number of records to read (%1) calendar en Number of records to read (%1) observance rule calendar en Observance Rule occurence calendar en Occurence old startdate calendar en Old Startdate -olddate calendar en OldDate on %1 %2 %3 your meeting request for %4 calendar en On %1 %2 %3 your meeting request for %4 -on all changes calendar en on all changes on all modification, but responses calendar en on all modification, but responses on any time change too calendar en on any time change too on invitation / cancelation only calendar en on invitation / cancelation only @@ -199,169 +183,115 @@ one month calendar en one month one week calendar en one week one year calendar en one year only the initial date of that recuring event is checked! calendar en Only the initial date of that recuring event is checked! -open todo's: calendar en Open To Do Items: -or enddate / -time calendar en or Enddate / -time -order calendar en Order +open todo's: calendar en open ToDo's: overlap holiday calendar en overlap holiday -participant calendar en Participant participants calendar en Participants -participates calendar en Participates +participants disinvited from an event calendar en Participants disinvited from an event +participants, resources, ... calendar en Participants, Resources, ... password for not loged in users to your freebusy information? calendar en Password for not loged in users to your freebusy information? people holiday calendar en people holiday permission denied calendar en Permission denied -planner calendar en Planner -planner by category calendar en Planner by category -planner by user calendar en Planner by user -please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar en Please confirm, accept, reject or examine changes in the corresponding entry in your calendar -please enter a filename !!! calendar en please enter a filename !!! +planner by category calendar en planner by category +planner by user calendar en planner by user +please note: you can configure the field assignments after you uploaded the file. calendar en Please note: You can configure the field assignments AFTER you uploaded the file. preselected group for entering the planner calendar en Preselected group for entering the planner -previous day calendar en previous day -print calendars in black & white calendar en Print calendars in black & white -print the mini calendars calendar en Print the mini calendars -printer friendly calendar en Printer Friendly -privat calendar en Privat -private and global public calendar en Private and Global Public -private and group public calendar en Private and Group Public +previous calendar en previous +private and global public calendar en private and global public +private and group public calendar en private and group public private only calendar en Private Only -re-edit event calendar en Re-Edit Event -read a list of entries. calendar en Read a list of entries. -read a single entry by passing the id and fieldlist. calendar en Read a single entry by passing the id and fieldlist. -read this list of methods. calendar en Read this list of methods. +re-edit event calendar en Re-Edit event receive email updates calendar en Receive email updates -receive extra information in event mails calendar en Receive extra information in event mails receive summary of appointments calendar en Receive summary of appointments -recurring event calendar en recurring event -refresh calendar en Refresh -reinstate calendar en Reinstate +recurrence calendar en Recurrence +recurring event calendar en Recurring event rejected calendar en Rejected -repeat day calendar en Repeat day -repeat end date calendar en Repeat End date +repeat days calendar en Repeat days +repeat the event until which date (empty means unlimited) calendar en repeat the event until which date (empty means unlimited) repeat type calendar en Repeat type repeating event information calendar en Repeating Event Information +repeating interval, eg. 2 to repeat every second week calendar en repeating interval, eg. 2 to repeat every second week repetition calendar en Repetition repetitiondetails (or empty) calendar en Repetitiondetails (or empty) reset calendar en Reset +resources calendar en Resources rule calendar en Rule -sa calendar en Sa sat calendar en Sat -scheduling conflict calendar en Scheduling Conflict -search results calendar en Search Results -select a %1 calendar en Select a %1 +saves the changes made calendar en saves the changes made +saves the event ignoring the conflict calendar en Saves the event ignoring the conflict +scheduling conflict calendar en Scheduling conflict +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 +select resources calendar en Select resources +select who should get the alarm calendar en Select who should get the alarm set a year only for one-time / non-regular holidays. calendar en Set a Year only for one-time / non-regular holidays. set new events to private calendar en Set new events to private should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar en Should invitations you rejected still be shown in your calendar ?
    You can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! should new events created as private by default ? calendar en Should new events created as private by default ? should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar en Should not loged in persons be able to see your freebusy information? You can set an extra password, different from your normal password, to protect this informations. The freebusy information is in iCal format and only include the times when you are busy. It does not include the event-name, description or locations. The URL to your freebusy information is %1. -should the mini calendars by printed / displayed in the printer friendly views ? calendar en Should the mini calendars by printed / displayed in the printer friendly views ? -should the printer friendly view be in black & white or in color (as in normal view)? calendar en Should the printer friendly view be in black & white or in color (as in normal view)? should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar en Should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? -show day view on main screen calendar en show day view on main screen -show default view on main screen calendar en Show default view on main screen -show high priority events on main screen calendar en Show high priority events on main screen +show default view on main screen calendar en show default view on main screen show invitations you rejected calendar en Show invitations you rejected -show list of upcoming events calendar en Show list of upcoming events -show next seven days calendar en Show next seven days -show only one day calendar en Show only one day -show the calendar of multiple users calendar en show the calendar of multiple users +show list of upcoming events calendar en show list of upcoming events show this month calendar en show this month show this week calendar en show this week single event calendar en single event -sorry, the owner has just deleted this event calendar en Sorry, the owner has just deleted this event -sorry, this event does not exist calendar en Sorry, this event does not exist -sorry, this event does not have exceptions defined calendar en Sorry, this event does not have exceptions defined -sort by calendar en Sort by -specifies the the number of intervals shown in the planner view. calendar en Specifies the the number of intervals shown in the planner view. +start calendar en Start 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 +startdate of the export calendar en Startdate of the export startrecord calendar en Startrecord -su calendar en Su +status changed calendar en Status changed submit to repository calendar en Submit to Repository sun calendar en Sun tentative calendar en Tentative test import (show importable records only in browser) calendar en Test Import (show importable records only in browser) -text calendar en Text -th calendar en T -the following conflicts with the suggested time:
      %1
    calendar en The following conflicts with the suggested time:
      %1
    -the user %1 is not participating in this event! calendar en The user %1 is not participating in this event! -there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar en There was an error trying to connect to your news server.
    Please contact your admin to check the news servername, username or password. this day is shown as first day in the week or month view. calendar en This day is shown as first day in the week or month view. -this defines the end of your dayview. events after this time, are shown below the dayview. calendar en This defines the end of your day view. Events after this time are shown below the day view. -this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar en This defines the start of your day view. Events before this time are shown above the day view.
    This time is also used as a default start time for new events. +this defines the end of your dayview. events after this time, are shown below the dayview. calendar en This defines the end of your dayview. Events after this time, are shown below the dayview. +this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar en This defines the start of your dayview. Events before this time, are shown above the dayview.
    This time is also used as a default starttime for new events. this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar en This group that is preselected when you enter the planner. You can change it in the planner anytime you want. -this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar en This is mostly caused by a not or wrongly configured SMTP server. Notify your administrator. this message is sent for canceled or deleted events. calendar en This message is sent for canceled or deleted events. this message is sent for modified or moved events. calendar en This message is sent for modified or moved events. +this message is sent to disinvited participants. calendar en This message is sent to disinvited participants. this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar en This message is sent to every participant of events you own, who has requested notifcations about new events.
    You can use certain variables which get substituted with the data of the event. The first line is the subject of the email. -this message is sent when you accept, tentative accept or reject an event. calendar en This message is sent when you accept, tentatively accept, or reject an event. -this message is sent when you set an alarm for a certain event. include all information you might need. calendar en This message is sent when you set an Alarm for a certain event. Include all information you might need. -this month calendar en This Month -this week calendar en This Week -this year calendar en This Year +this message is sent when you accept, tentative accept or reject an event. calendar en This message is sent when you accept, tentative accept or reject an event. +this message is sent when you set an alarm for a certain event. include all information you might need. calendar en This message is sent when you set an Alarm for a certain event. Include all information you might need. 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 to many might exceed your execution-time-limit calendar en to many might exceed your execution-time-limit -to-firstname calendar en To-Firstname -to-fullname calendar en To-Fullname -to-lastname calendar en To-Lastname -today calendar en Today 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 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 +view this event calendar en View this event wed calendar en Wed 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 -weekview calendar en Week View -weekview including weekend calendar en Weekview including weekend +weekview calendar en weekview +weekview with weekend calendar en Weekview with weekend weekview without weekend calendar en weekview without weekend -when creating new events default set to private calendar en When creating new events default set to private which events do you want to see when you enter the calendar. calendar en Which events do you want to see when you enter the calendar. -which of calendar view do you want to see, when you start calendar ? calendar en Which of calendar view do you want to see when you start calendar ? -wk calendar en Wk -work day ends on calendar en Work day ends on -work day starts on calendar en Work day starts on -workdayends calendar en workdayends +which of calendar view do you want to see, when you start calendar ? calendar en Which of calendar view do you want to see, when you start calendar ? +whole day calendar en whole day +work day ends on calendar en work day ends on +work day starts on calendar en work day starts on yearly calendar en Yearly -yearview calendar en Year View +yearview calendar en yearview you can either set a year or a occurence, not both !!! calendar en You can either set a Year or a Occurence, not both !!! you can only set a year or a occurence !!! calendar en You can only set a year or a occurence !!! -you do not have permission to add alarms to this event !!! calendar en You do not have permission to add alarms to this event !!! -you do not have permission to delete this alarm !!! calendar en You do not have permission to delete this alarm !!! -you do not have permission to enable/disable this alarm !!! calendar en You do not have permission to enable/disable this alarm !!! you do not have permission to read this record! calendar en You do not have permission to read this record! -you have %1 high priority events on your calendar today. common en You have %1 high priority events on your calendar today. -you have 1 high priority event on your calendar today. common en You have 1 high priority event on your calendar today. you have a meeting scheduled for %1 calendar en You have a meeting scheduled for %1 -you have not entered a title calendar en You have not entered a title -you have not entered a valid date calendar en You have not entered a valid date -you have not entered a valid time of day calendar en You have not entered a valid time of day -you have not entered participants calendar en You have not entered participants -you must enter one or more search keywords calendar en You must enter one or more search keywords -you must select a [iv]cal. (*.[iv]cs) calendar en You must select a [iv]Cal. (*.[iv]cs) +you have been disinvited from the meeting at %1 calendar en You have been disinvited from the meeting at %1 +you need to select an ical file first calendar en You need to select an iCal file first you need to set either a day or a occurence !!! calendar en You need to set either a day or a occurence !!! your meeting scheduled for %1 has been canceled calendar en Your meeting scheduled for %1 has been canceled your meeting that had been scheduled for %1 has been rescheduled to %2 calendar en Your meeting that had been scheduled for %1 has been rescheduled to %2 -your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar en Your suggested time of %1 - %2 conflicts with the following existing calendar entries: diff --git a/calendar/setup/phpgw_es-es.lang b/calendar/setup/phpgw_es-es.lang index f1f689e4f1..37a053c9a4 100644 --- a/calendar/setup/phpgw_es-es.lang +++ b/calendar/setup/phpgw_es-es.lang @@ -5,32 +5,49 @@ (for weekly) calendar es-es (por semanal) (i/v)cal calendar es-es (i/v) Cal 1 match found calendar es-es 1 coincidencia encontrada +please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2.
    holidays are %3 automatic installed from %4. you can changed it in %5. calendar es-es Por favor, tenga en cuenta que: El calendario usa las fiestas de su país, que es %1. Puede cambiarlo en su %2.
    Las vacaciones %3 se instalan automáticamente desde %4. Lo puede cambiar en %5. a calendar es-es a +a non blocking event will not conflict with other events calendar es-es Un evento que no bloquea no entrará en conflicto con otros eventos accept calendar es-es Aceptar +accept or reject an invitation calendar es-es Aceptar o rechazar una invitación accepted calendar es-es Aceptado action that caused the notify: added, canceled, accepted, rejected, ... calendar es-es Acción que causó la notificación: Añadido, Cancelado, Aceptado, Rechazado, ... +actions calendar es-es Acciones add a single entry by passing the fields. calendar es-es Añadir una entrada simple pasando los campos: add alarm calendar es-es Añadir alarma add contact calendar es-es Añadir contacto add or update a single entry by passing the fields. calendar es-es Añadir o actualizar una simple entrada pasando los campos added calendar es-es Añadido address book calendar es-es Libreta de direcciones +after current date calendar es-es Después de la fecha actual alarm calendar es-es Alarma +alarm added calendar es-es Se ha añadido una alarma +alarm deleted calendar es-es Se ha borrado una alarma alarm for %1 at %2 in %3 calendar es-es Alarma para %1 en %2 in %3 alarm management calendar es-es Gestión de alarmas alarm-management calendar es-es Gestión de alarmas alarms calendar es-es Alarmas all categories calendar es-es Todas las categorías all day calendar es-es Todo el día +all events calendar es-es Todos los eventos +all participants calendar es-es Todos los participantes +allows to edit the event again calendar es-es Permite volver a editar el evento +apply the changes calendar es-es Aplicar los cambios are you sure you want to delete this country ? calendar es-es ¿Seguro que quiere borrar este país? are you sure you want to delete this holiday ? calendar es-es ¿Seguro que desea borrar esta fiesta? are you sure\nyou want to\ndelete these alarms? calendar es-es ¿Está seguro\nde querer\nborrar estas alarmas? are you sure\nyou want to\ndelete this entry ? calendar es-es ¿Está seguro\nde querer\nborrar esta entrada? are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar es-es ¿Está seguro\nde querer\nborrar esta entrada?\n\nEsto borrará\nla entrada para todos los usuarios. are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar es-es ¿Está seguronde querer\nborrar esta ocurrencia?\n\nEsto borrará\nla entrada para todos los usuarios. +back half a month calendar es-es medio mes hacia atrás +back one month calendar es-es un mes hacia atrás +before current date calendar es-es Antes de la fecha actual before the event calendar es-es antes del evento +birthday calendar es-es Cumpleaños brief description calendar es-es Descripción breve business calendar es-es Negocios +busy calendar es-es ocupado +by calendar es-es por calendar common es-es Calendario calendar - [iv]cal importer calendar es-es Calendario - Importador [iv]Cal calendar - add calendar es-es Calendario - Agregar @@ -40,15 +57,23 @@ calendar holiday management admin es-es Gesti calendar preferences calendar es-es Preferencias - Calendario calendar settings admin es-es Preferencias de calendario calendar-fieldname calendar es-es Calendario - Nombre de campo +can't add alarms in the past !!! calendar es-es ¡¡No se pueden añadir alarmas en el pasado!! canceled calendar es-es Cancelado change all events for $params['old_owner'] to $params['new_owner']. calendar es-es Cambiar todos los eventos de $params['old_owner'] a $params['new_owner']. change status calendar es-es Cambiar estado charset of file calendar es-es Juego de caracteres del fichero click %1here%2 to return to the calendar. calendar es-es Pulse %1aquí%2 para volver al calendario. +close the window calendar es-es Cerrar la ventana +common preferences calendar es-es preferencias comunes +compose a mail to all participants after the event is saved calendar es-es redactar un correo para todos los participantes después de guardar el evento configuration calendar es-es Configuración +copy of: calendar es-es Copia de: +copy this event calendar es-es Copiar este evento countries calendar es-es Paises country calendar es-es País +create new links calendar es-es Crear enlaces nuevos created by calendar es-es Creado por +csv calendar es-es CSV csv-fieldname calendar es-es CSV - Nombre del campo csv-filename calendar es-es CSV- Nombre del fichero custom fields calendar es-es Campos personalizados @@ -56,6 +81,7 @@ custom fields and sorting common es-es Campos personalizados y ordenaci daily calendar es-es Diario daily matrix view calendar es-es Vista matricial del día days calendar es-es días +days of the week for a weekly repeated event calendar es-es Días de la semana para un evento de repetición semanal days repeated calendar es-es días repetidos dayview calendar es-es Vista diaria default appointment length (in minutes) calendar es-es duración por defecto de los eventos (en minutos) @@ -70,11 +96,16 @@ delete selected contacts calendar es-es Eliminar contactos seleccionados delete selected participants calendar es-es Borrar los participantes seleccionados delete series calendar es-es Borrar series delete single calendar es-es Borrar simple +delete this alarm calendar es-es Borrar esta alarma +delete this event calendar es-es Borrar este evento +delete this exception calendar es-es Borrar esta excepción +delete this series of recuring events calendar es-es Borrar esta serie de eventos recurrentes deleted calendar es-es Eliminado description calendar es-es Descripción determining window width ... calendar es-es Determinando el ancho de la ventana... disable calendar es-es Desactivar disabled calendar es-es desactivado +disinvited calendar es-es Ya no está invitado display interval in day view calendar es-es Mostrar intervalo en vista diaria display mini calendars when printing calendar es-es Mostrar minicalendarios al imprimir display status of events calendar es-es Mostrar estado de los eventos @@ -85,22 +116,34 @@ do you want to be notified about new or changed appointments? you be notified ab do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar es-es ¿Desea recibir regularmente por correo un resumen de sus citas?
    El resumen se le enviará a su correo electrónico habitual el mismo día por la mañana o el lunes para resúmenes semanales.
    Sólo se envía si hay citas en ese día o esa semana. do you wish to autoload calendar holidays files dynamically? admin es-es ¿Desea cargar automáticamente en el calendario los ficheros de fiestas? download calendar es-es Descargar +download this event as ical calendar es-es Descargar este evento como iCal duration calendar es-es Duración duration of the meeting calendar es-es Duración de la reunión edit series calendar es-es Editar series edit single calendar es-es Editar sencillo +edit this event calendar es-es Editar este evento +edit this series of recuring events calendar es-es Editar esta serie de eventos recurrentes email notification calendar es-es Notificación por correo email notification for %1 calendar es-es Notificación por correo para %1 empty for all calendar es-es vacío para todos enable calendar es-es Activar enabled calendar es-es activado +end calendar es-es Fin end date/time calendar es-es Fecha/Hora final enddate calendar es-es Fecha final enddate / -time of the meeting, eg. for more then one day calendar es-es Fecha final / -hora de la reunión, p. ej. para más de un día +enddate of the export calendar es-es Fecha de fin de la exportación ends calendar es-es acaba enter output filename: ( .vcs appended ) calendar es-es Introduzca el nombre del fichero de salida (añadir .vcs) +error adding the alarm calendar es-es Error al añadir la alarma +error: saving the event !!! calendar es-es Error al guardar el evento +event copied - the copy can now be edited calendar es-es Evento copiado. Ahora se puede editar la copia +event deleted calendar es-es Evento borrado event details follow calendar es-es A continuación, los detalles del evento +event saved calendar es-es Evento guardado +event will occupy the whole day calendar es-es El evento ocupará todo el día exceptions calendar es-es Excepciones +existing links calendar es-es Enlaces existentes export calendar es-es Exportar export a list of entries in ical format. calendar es-es Exportar una lista de entradas en format iCal. extended calendar es-es Extendido @@ -108,9 +151,15 @@ extended updates always include the complete event-details. ical's can be import external participants calendar es-es Participantes externos failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar es-es Fallo al enviar mensaje a '%1' nº%2 asunto='%3', remitente='%4' fieldseparator calendar es-es Separador de campos +filename calendar es-es Nombre de fichero +filename of the download calendar es-es Nombre de fichero de la descarga find free timeslots where the marked participants are availible for the given timespan calendar es-es Encontrar espacios de tiempo libres donde los partipantes marcados estén disponibles para el horario elegido +find free timeslots where the selected participants are availible for the given timespan calendar es-es Buscar márgenes de tiempo libres donde los participantes seleccionados estén disponibles para las horas indicadas firstname of person to notify calendar es-es Nombre de pila de la persona a notificar +for calendar es-es para format of event updates calendar es-es Formato de las actualizaciones de eventos +forward half a month calendar es-es medio mes hacia adelante +forward one month calendar es-es un mes hacia adelante fr calendar es-es V free/busy calendar es-es Libre/Ocupado freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar es-es libre-ocupado: Usuario desconocido "%1", contraseña incorrecta o no está disponible @@ -119,6 +168,7 @@ frequency calendar es-es Frecuencia fri calendar es-es Vie full description calendar es-es Descripción completa fullname of person to notify calendar es-es Nombre completo de la persona a la que notificar +general calendar es-es General generate printer-friendly version calendar es-es Generar versión para impresion global categories calendar es-es Categorías globales global public and group public calendar es-es Público Global y grupo público @@ -136,16 +186,18 @@ holidays calendar es-es Festivos hours calendar es-es horas how far to search (from startdate) calendar es-es cuánto buscar (desde la fecha de inicio) i participate calendar es-es Participo +ical calendar es-es iCal ical / rfc2445 calendar es-es iCal / rfc2445 +ical export calendar es-es Exportar iCal if checked holidays falling on a weekend, are taken on the monday after. calendar es-es Si los festivos marcados caen en fin de semana, se toman el lunes siguiente. if you dont set a password here, the information is available to everyone, who knows the url!!! calendar es-es ¡Si no pone aquí una contraseña, la información está disponible para todos los que conozcan la URL! -if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar es-es Si no indica una contraseña aquí, ¡la información está disponible para todos los que conozcan la URL! ignore conflict calendar es-es Ignorar conflicto import calendar es-es Importar import csv-file common es-es Importar fichero CSV interval calendar es-es Intervalo intervals in day view calendar es-es Intervalos en la vista de día intervals per day in planner view calendar es-es Intervalos por día en la vista del planificador +invalid email-address "%1" for user %2 calendar es-es La dirección de correo "%1" no es válida para el usuario %2 invalid entry id. calendar es-es Id de entrada no válido last calendar es-es último lastname of person to notify calendar es-es Apellido de la persona a la que notificar @@ -153,12 +205,16 @@ length shown
    (emtpy for full length) calendar es-es Longitud mostrada
    (vac length
    (<= 255) calendar es-es Longitud
    (<=255) link calendar es-es Vínculo link to view the event calendar es-es Vínculo para ver el evento +links calendar es-es Enlaces +links, attachments calendar es-es Enlaces, adjuntos list all categories. calendar es-es Listar todas las categorías +listview calendar es-es Ver lista load [iv]cal calendar es-es Cargar [iv]Cal location calendar es-es Lugar location to autoload from admin es-es Lugar desde donde cargar automáticamente +location, start- and endtimes, ... calendar es-es Ubicación, hora de inicio y final... +mail all participants calendar es-es Enviar correo a todos los participantes make freebusy information available to not loged in persons? calendar es-es ¿Poner la información del tiempo disponible a las personas que no inicien sesión? -make freebusy information availible to not loged in persons? calendar es-es ¿Hacer la información libre-ocupado disponible para personas que no inicien sesión? matrixview calendar es-es Vista matricial minutes calendar es-es minutos mo calendar es-es L @@ -175,12 +231,15 @@ new entry calendar es-es Nueva entrada new name must not exist and not be empty!!! calendar es-es El nuevo nombre no debe existir previamente ni estar en blanco new search with the above parameters calendar es-es nueva búsqueda con los parámetros de arriba next day calendar es-es dia siguiente +no events found calendar es-es No se encontraron eventos no filter calendar es-es Sin filtro no matches found calendar es-es No se encontraron coincidencias -no matches found. calendar es-es No se encontraron coincidencias. no response calendar es-es Sin respuesta +non blocking calendar es-es no bloquea +not calendar es-es no notification messages for added events calendar es-es Mensajes de notificación para eventos añadidos notification messages for canceled events calendar es-es Mensajes de notificación para eventos cancelados +notification messages for disinvited participants calendar es-es Mensajes de notificación para participantes que dejan de ser invitados notification messages for modified events calendar es-es Mensajes de notificación para eventos modificados notification messages for your alarms calendar es-es Mensajes de notificación para sus alarmas notification messages for your responses calendar es-es Mensajes de notificación para sus respuestas @@ -203,11 +262,12 @@ one week calendar es-es una semana one year calendar es-es un año only the initial date of that recuring event is checked! calendar es-es ¡Sólo está marcada la fecha inicial del evento recurrente! open todo's: calendar es-es Abrir tareas pendientes -or enddate / -time calendar es-es or fecha de final / -hora order calendar es-es Orden overlap holiday calendar es-es solapar festivo participant calendar es-es Participante participants calendar es-es Participantes +participants disinvited from an event calendar es-es Participantes que dejan de ser invitados de un evento +participants, resources, ... calendar es-es Participantes, recursos participates calendar es-es Participa password for not loged in users to your freebusy information? calendar es-es ¿Contraseña para los usuarios sin sesión para la información libre-ocupado? people holiday calendar es-es festivo para la gente @@ -217,7 +277,9 @@ planner by category calendar es-es Planificador por categor planner by user calendar es-es Planificador por usuario please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar es-es Por favor, confirme, acepte, rechace o examine los cambios en la entrada correspondiente en su calendario please enter a filename !!! calendar es-es Por favor, introduzca un nombre de fichero +please note: you can configure the field assignments after you uploaded the file. calendar es-es Por favor, tenga en cuenta: puede configurar el campo asignaciones DESPUES de subir el fichero. preselected group for entering the planner calendar es-es Grupo preseleccionado para entrar en el planificador +previous calendar es-es anterior previous day calendar es-es día anterior print calendars in black & white calendar es-es Imprimir calendario en blanco y negro print the mini calendars calendar es-es Imprimir minicalendarios @@ -233,24 +295,33 @@ read this list of methods. calendar es-es Leer esta lista de m receive email updates calendar es-es Recibir actualizaciones de correo receive extra information in event mails calendar es-es Recibir información extra en los eventos de correo receive summary of appointments calendar es-es Recibir resumen de las citas +recurrence calendar es-es Repeticiones recurring event calendar es-es evento recurrente refresh calendar es-es Refrescar reinstate calendar es-es Restablecer rejected calendar es-es Rechazado repeat day calendar es-es Repetir día +repeat days calendar es-es Días de repetición repeat end date calendar es-es Repetir fecha final +repeat the event until which date (empty means unlimited) calendar es-es repetir el evento hasta qué fecha (en blanco significa sin límite) repeat type calendar es-es Tipo repetición repeating event information calendar es-es Información repetitiva de eventos +repeating interval, eg. 2 to repeat every second week calendar es-es intervalo de repetición, p. ej., 2 para repetir cada segunda semana repetition calendar es-es Repetición repetitiondetails (or empty) calendar es-es Detalles de la repetición (o vacío) reset calendar es-es Restablecer +resources calendar es-es Recursos rule calendar es-es Regla sa calendar es-es Sa sat calendar es-es Sáb +saves the changes made calendar es-es guarda los cambios realizados +saves the event ignoring the conflict calendar es-es Guarda el evento ignorando el conflicto scheduling conflict calendar es-es Conflicto de calendario search results calendar es-es Resultados de la búsqueda select a %1 calendar es-es Seleccionar un %1 select a time calendar es-es seleccionar una hora +select resources calendar es-es Seleccionar recursos +select who should get the alarm calendar es-es Seleccionar quién debe obtener la alarma selected contacts (%1) calendar es-es Contactos seleccionados (%1) send updates via email common es-es Enviar actualizaciones por correo electrónico send/receive updates via email calendar es-es Enviar y recibir actualizaciones por correo electrónico @@ -273,17 +344,21 @@ show the calendar of multiple users calendar es-es Mostrar el calendario de vari show this month calendar es-es Mostrar este mes show this week calendar es-es Mostrar esta semana single event calendar es-es evento simple +site configuration calendar es-es configuración del sitio sorry, the owner has just deleted this event calendar es-es Lo sentimos, el propietario acaba de eliminar este evento sorry, this event does not exist calendar es-es Lo sentimos, este evento no existe sorry, this event does not have exceptions defined calendar es-es Lo sentimos, este evento no tiene excepciones definidas sort by calendar es-es Ordenar por specifies the the number of intervals shown in the planner view. calendar es-es Especifica el número de intervalos mostrados en la vista del planificador. +start calendar es-es Inicio start date/time calendar es-es Fecha/Hora inicio start- and enddates calendar es-es Fechas de inicio y fin startdate calendar es-es Fecha de inicio startdate / -time calendar es-es Fecha de incio / -hora startdate and -time of the search calendar es-es Fecha de inicio y -hora de la búsqueda +startdate of the export calendar es-es Fecha de inicio de la exportación startrecord calendar es-es Registro inicial +status changed calendar es-es Estado modificado su calendar es-es Do submit to repository calendar es-es Enviar al repositorio sun calendar es-es Dom @@ -301,6 +376,7 @@ this group that is preselected when you enter the planner. you can change it in this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar es-es Esto se debe mayormente a una configuración errónea del servidor SMTP. Notifíquelo a su administrador. this message is sent for canceled or deleted events. calendar es-es Este mensaje se envía cuando un evento se borra o se cancela. this message is sent for modified or moved events. calendar es-es Este mensaje se envía al modificar o mover eventos. +this message is sent to disinvited participants. calendar es-es Este mensaje se envía a los participantes que dejan de estar invitados this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar es-es Este mensaje se envía a cada participante de los eventos de los que usted es el dueño, quien ha solicitado notificaciones sobre nuevos eventos.
    Puede usar ciertas variables a las que sustituyen los datos del evento. La primera línea es el asunto del correo electrónico. this message is sent when you accept, tentative accept or reject an event. calendar es-es Este mensaje se envía cuando acepta, acepta temporalmente o rechaza un evento. this message is sent when you set an alarm for a certain event. include all information you might need. calendar es-es Este mensaje se envía cuando pone una alarma para un evento concreto. Incluya toda la información necesaria. @@ -323,31 +399,30 @@ today calendar es-es Hoy translation calendar es-es Traducción tu calendar es-es M tue calendar es-es Mar -two dayview calendar es-es Dos vistas del día two weeks calendar es-es dos semanas update a single entry by passing the fields. calendar es-es Actualizar una entrada simple pasando los campos. updated calendar es-es Actualizado use end date calendar es-es Usar fecha final use the selected time and close the popup calendar es-es usar la hora seleccionada y cerrar la ventana -view this entry calendar es-es Ver esta entrada +view this event calendar es-es Ver este evento we calendar es-es Mi -wed calendar es-es Mie +wed calendar es-es Mié week calendar es-es Semana weekday starts on calendar es-es La semana empieza en weekdays calendar es-es Días laborales weekdays to use in search calendar es-es Días laborales a usar en la búsqueda weekly calendar es-es Semanal weekview calendar es-es Vista semanal -weekview including weekend calendar es-es Vista semanal incluyendo el fin de semana +weekview with weekend calendar es-es vista semanal con fin de semana weekview without weekend calendar es-es Vista semanal sin fin de semana when creating new events default set to private calendar es-es Crear nuevos eventos como privados which events do you want to see when you enter the calendar. calendar es-es ¿Qué eventos quiere ver al entrar al calendario? which of calendar view do you want to see, when you start calendar ? calendar es-es ¿Qué vista del calendario quiere ver cuando entra al calendario? +whole day calendar es-es todo el día wk calendar es-es Trabajo work day ends on calendar es-es Los días laborables acaban en work day starts on calendar es-es Los días laborables empiezan en workdayends calendar es-es Final del día laborable -year calendar es-es Año yearly calendar es-es Anual yearview calendar es-es Vista anual you can either set a year or a occurence, not both !!! calendar es-es Puede poner un año o una ocurrencia, pero no ambos. @@ -359,11 +434,10 @@ you do not have permission to read this record! calendar es-es you have %1 high priority events on your calendar today. common es-es Ud. tiene %1 eventos de alta prioridad en su calendario para hoy. you have 1 high priority event on your calendar today. common es-es Ud. tiene 1 evento de alta prioridad en su calendario para hoy. you have a meeting scheduled for %1 calendar es-es Ud. tiene una reunión programada para %1 +you have been disinvited from the meeting at %1 calendar es-es Ha dejado de estar invitado a la reunión de %1 you have not entered a title calendar es-es No ha introducido un título you have not entered a valid date calendar es-es Ha introducido una fecha incorrecta you have not entered a valid time of day calendar es-es Ha introducido una hora incorrecta -you have not entered a\nbrief description calendar es-es Ud. no ha ingresado una\nBrief descripción -you have not entered a\nvalid time of day. calendar es-es Ud. no ha ingresado una\nvalid hora valida. you have not entered participants calendar es-es No ha introducido participantes you must enter one or more search keywords calendar es-es Ud. debe introducir una o más claves de búsqueda you must select a [iv]cal. (*.[iv]cs) calendar es-es Debe seleccionar un [iv]Cal. (*.[iv]cs) diff --git a/calendar/setup/phpgw_fr.lang b/calendar/setup/phpgw_fr.lang index 25fc7c9bf2..cf841f7a5d 100644 --- a/calendar/setup/phpgw_fr.lang +++ b/calendar/setup/phpgw_fr.lang @@ -6,15 +6,19 @@ (i/v)cal calendar fr (i/v)Cal 1 match found calendar fr 1 correspondance trouvée a calendar fr un -accept calendar fr Accepte +a non blocking event will not conflict with other events calendar fr Un événement non bloquant n'entrera pas en conflit avec d'autres événements. +accept calendar fr Accepter +accept or reject an invitation calendar fr Accepter ou rejeter une invitation accepted calendar fr Accepté action that caused the notify: added, canceled, accepted, rejected, ... calendar fr L'action qui a causé la notification: Ajouté, Annulé, Accepté, Rejeté, ... +actions calendar fr Actions add a single entry by passing the fields. calendar fr Ajouter une unique entrée en passant les champs. add alarm calendar fr Ajouter une alarme add contact calendar fr Ajouter un contact add or update a single entry by passing the fields. calendar fr Ajoutez ou mettez à jour une seule entrée en passant les champs. added calendar fr Ajouté address book calendar fr Carnet d'adresses +after current date calendar fr Après la date courante alarm calendar fr Alarme alarm for %1 at %2 in %3 calendar fr Alarme pour %1 à %2 dans %3 alarm management calendar fr Gestion des alarmes @@ -22,19 +26,21 @@ alarm-management calendar fr Gestion des alarmes alarms calendar fr Alarmes all categories calendar fr Toutes catégories all day calendar fr Journée entière +all events calendar fr Tous les événements +all participants calendar fr Tous les participants +allows to edit the event again calendar fr Autorise à éditer à nouveau l'événement +apply the changes calendar fr Appliquer les modifications are you sure you want to delete this country ? calendar fr Etes-vous sûr de vouloir effacer ce pays ? are you sure you want to delete this holiday ? calendar fr Etes-vous sûr de vouloir effacer ces vacances ? are you sure\nyou want to\ndelete these alarms? calendar fr Etes-vous sûr\nde vouloir\neffacer ces alarmes? are you sure\nyou want to\ndelete this entry ? calendar fr Etes-vous sûr\nde vouloir\neffacer cette entrée ? are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar fr Etes-vous sûr\nde vouloir\neffacer cette entrée ?\n\nCeci va effacer\ncette entrée pour tous les utilisateurs. are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar fr Etes-vous sûr\nde vouloir\neffacer cette unique occurence ?\n\nCeci va effacer\ncette entrée pour tous les utilisateurs. -are you surenyou want tondelete these alarms? calendar fr Etes-vous sûr\nde vouloir\neffacer ces alarmes? -are you surenyou want tondelete this entry ? calendar fr Etes-vous sûr\nde vouloir\neffacer cette entrée ? -are you surenyou want tondelete this entry ?nnthis will deletenthis entry for all users. calendar fr Etes-vous sûr\nde vouloir\neffacer cette entrée ?\n\nCeci va effacer\ncette entrée pour tous les utilisateurs. -are you surenyou want tondelete this single occurence ?nnthis will deletenthis entry for all users. calendar fr Etes-vous sûr\nde vouloir\neffacer cette unique occurence ?\n\nCeci va effacer\ncette entrée pour tous les utilisateurs. -before the event calendar fr avant l'évènement +before current date calendar fr Avant la date courante +before the event calendar fr avant l'événement brief description calendar fr Description brève business calendar fr Travail +by calendar fr par calendar common fr Calendrier calendar - [iv]cal importer calendar fr Calendrier - Importateur [iv]Cal calendar - add calendar fr Calendrier - Ajouter @@ -49,9 +55,13 @@ change all events for $params['old_owner'] to $params['new_owner']. calendar fr change status calendar fr Modifier le statut charset of file calendar fr Table de charactères du fichier click %1here%2 to return to the calendar. calendar fr Cliquer %1ici%2 pour retourner au calendrier +close the window calendar fr Fermer la fenêtre +compose a mail to all participants after the event is saved calendar fr Ecrire un mail à tous les participants après l'enregistrement de l'événement configuration calendar fr Configuration +copy this event calendar fr Copier cet événement countries calendar fr Pays country calendar fr Pays +create new links calendar fr Créer de nouveaux liens created by calendar fr Créé par csv-fieldname calendar fr CSV-nom des champs csv-filename calendar fr CSV-nom du fichier @@ -60,6 +70,7 @@ custom fields and sorting common fr Champs personnalis daily calendar fr Journalier daily matrix view calendar fr Vue journalière de la matrice days calendar fr Jours +days of the week for a weekly repeated event calendar fr Jours de la semaine pour la répétition hebdomadaire days repeated calendar fr Jours répétés dayview calendar fr Vue journalière default appointment length (in minutes) calendar fr Durée du rendez-vous par défaut (en minutes) @@ -74,11 +85,14 @@ delete selected contacts calendar fr Effacer les contacts s delete selected participants calendar fr Supprimer les participants sélectionnées delete series calendar fr Effacer les séries delete single calendar fr Effacer un unique +delete this event calendar fr Effacer cet événement +delete this series of recuring events calendar fr Effacer cette série d'événements récurrents deleted calendar fr Effacé description calendar fr Description determining window width ... calendar fr Recherche de la largeur de fenêtre disable calendar fr Désactiver disabled calendar fr Désactivé +disinvited calendar fr Invitation annulée display interval in day view calendar fr Afficher l'intervalle dans la vue journalière display mini calendars when printing calendar fr Afficher mini calendriers à l'impression display status of events calendar fr Afficher le statut des événements @@ -93,19 +107,26 @@ duration calendar fr Dur duration of the meeting calendar fr Durée de la réunion edit series calendar fr Modifier toutes les occurrences edit single calendar fr Modifier cette occurrence +edit this event calendar fr Editer cet événement +edit this series of recuring events calendar fr Editer cette série d'événements récurrents email notification calendar fr Notification par email email notification for %1 calendar fr Notification par email pour %1 -email reminder calendar fr EMail de rappel empty for all calendar fr Vide pour tous enable calendar fr Activer enabled calendar fr Activé +end calendar fr Fin end date/time calendar fr Date/Heure de fin enddate calendar fr Date de fin enddate / -time of the meeting, eg. for more then one day calendar fr Date et fin de la réunion, eg. pour plus d'une journée ends calendar fr Finit enter output filename: ( .vcs appended ) calendar fr Entrer le nom du fichier de sortie: ( .vcs ajouté ) +error: saving the event !!! calendar fr Erreur de sauvegarde de l'événement !!! +event deleted calendar fr Evénement effacé event details follow calendar fr Les détails de l'évènement suivent +event saved calendar fr Evénement enregistré +event will occupy the whole day calendar fr L'événement occupera la journée entière exceptions calendar fr Exceptions +existing links calendar fr Liens existants export calendar fr Export export a list of entries in ical format. calendar fr Exporter une liste d'entrées dans le format iCal. extended calendar fr Etendu @@ -114,6 +135,7 @@ external participants calendar fr Participants ext failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar fr Impossible d'envoyer le message à "%1" #%2 sujet="%3", expéditeur="%4" ! fieldseparator calendar fr Séparateur de champs find free timeslots where the marked participants are availible for the given timespan calendar fr Recherche de crénaux horaires où les participants sélectionnés sont disponibles pour la durée choisie +find free timeslots where the selected participants are availible for the given timespan calendar fr Trouver des plages de temps libre sur lesquelles les participants sélectionnés sont disponibles firstname of person to notify calendar fr Prénom de la personne à prévenir format of event updates calendar fr Format des mises à jour d'évènement fr calendar fr V @@ -124,6 +146,7 @@ frequency calendar fr Fr fri calendar fr Ven full description calendar fr Description complète fullname of person to notify calendar fr Nom complet de la personne à prévenir +general calendar fr Général generate printer-friendly version calendar fr Générer une version imprimable global categories calendar fr Catégories globales global public and group public calendar fr Public global et groupe public @@ -144,11 +167,9 @@ i participate calendar fr Je participe ical / rfc2445 calendar fr iCal / rfc2445 if checked holidays falling on a weekend, are taken on the monday after. calendar fr Si activé les vacances tombant sur un Week-End, sont prises sur le lundi d'après. if you dont set a password here, the information is available to everyone, who knows the url!!! calendar fr Si vous ne définissez pas de mot de passe ici, les informations seront disponibles à n'importe qui connaissant l'adresse -if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar fr Si vous ne mettez pas de mot de passe ici, l'information sera accessible par n'importe quelle personne connaissant l'URL! ignore conflict calendar fr Ignorer le conflit import calendar fr Import import csv-file common fr Importer un fichier CSV -import csv-file into calendar calendar fr Importer un fichier CSV dans le calendrier interval calendar fr Intervalle intervals in day view calendar fr Intervalles dans la vue journalière intervals per day in planner view calendar fr Intervalles par jour dans la vue planning @@ -159,12 +180,16 @@ length shown
    (emtpy for full length) calendar fr Longueur montr length
    (<= 255) calendar fr Longueur
    (<= 255) link calendar fr Lien link to view the event calendar fr Lien pour voir l'événement +links calendar fr Liens +links, attachments calendar fr Liens, attachements list all categories. calendar fr Lister toutes les catégories +listview calendar fr Liste d'événements load [iv]cal calendar fr Charger [iv]Cal location calendar fr Emplacement location to autoload from admin fr Emplacement depuis lequel auto-charger +location, start- and endtimes, ... calendar fr Emplacement, Heures de début et de fin... +mail all participants calendar fr Envoyer un mail à tous les participants make freebusy information available to not loged in persons? calendar fr Mettre à disposition les disponibilités sans être loggué -make freebusy information availible to not loged in persons? calendar fr Mettre à disposition des utilisateurs non connectés l'information Libre/Occupé? matrixview calendar fr Vue matricielle minutes calendar fr minutes mo calendar fr L @@ -184,15 +209,16 @@ next day calendar fr Jour suivant no filter calendar fr Pas de filtres no matches found calendar fr Pas d'occurences trouvées no response calendar fr Pas de réponse -notification messages for added events calendar fr Messages de notification pour les évènements ajoutés -notification messages for canceled events calendar fr Messages de notification pour les évènements annulés -notification messages for modified events calendar fr Messages de notification pour les évènements modifiés +non blocking calendar fr Non bloquant +notification messages for added events calendar fr Messages de notification pour les événements ajoutés +notification messages for canceled events calendar fr Messages de notification pour les événements annulés +notification messages for disinvited participants calendar fr Messages de notification pour les invitations annulées +notification messages for modified events calendar fr Messages de notification pour les événements modifiés notification messages for your alarms calendar fr Messages de notification pour vos alarmes notification messages for your responses calendar fr Messages de notification pour vos réponses number of intervals per day in planner view calendar fr Nombre d'intervalles par jour dans la vue planificateur number of months calendar fr Nombre de mois number of records to read (%1) calendar fr Nombre d'entrées -number of records to read (<=200) calendar fr Nombre d'enregistrements à lire (<=200) observance rule calendar fr Règle d'observation occurence calendar fr Occurence old startdate calendar fr Ancienne date de début @@ -214,6 +240,8 @@ order calendar fr Ordre overlap holiday calendar fr Vacances recouvrantes participant calendar fr Participant participants calendar fr Participants +participants disinvited from an event calendar fr Invitations annulées pour un événement +participants, resources, ... calendar fr Participants, Ressources... participates calendar fr Participe password for not loged in users to your freebusy information? calendar fr Mot de passe des utilisateurs non connectés pour l'information Libre/Occupé? people holiday calendar fr Vacances des personnes @@ -239,20 +267,27 @@ read this list of methods. calendar fr Lire cette liste de m receive email updates calendar fr Recevoir les mises à jour par EMail receive extra information in event mails calendar fr Recevoir des informations supplémentaires dans les EMails d'évènements receive summary of appointments calendar fr Recevoir le résumé des rendez-vous +recurrence calendar fr Récurrence recurring event calendar fr Evènement récurrent refresh calendar fr Rafraîchir reinstate calendar fr Réinstaller rejected calendar fr Rejeté repeat day calendar fr Jour de répétition +repeat days calendar fr Jours de répétition repeat end date calendar fr Date de fin de répétition +repeat the event until which date (empty means unlimited) calendar fr Répéter l'événement jusqu'à quelle date ? (vide pour illimité) repeat type calendar fr Type de répétition repeating event information calendar fr Informations d'événement répétitif +repeating interval, eg. 2 to repeat every second week calendar fr Intervalle de répétition, par exemple 2 pour répéter chaque deuxième semaine repetition calendar fr Répétition repetitiondetails (or empty) calendar fr Détails de répétition (ou vide) reset calendar fr Réinitialiser +resources calendar fr Ressources rule calendar fr Règle sa calendar fr Sa sat calendar fr Sam +saves the changes made calendar fr Sauvegarder les modifications +saves the event ignoring the conflict calendar fr Sauvegarder l'événement en ignorant le conflit scheduling conflict calendar fr Conflit de planification search results calendar fr Résultats de recherche select a %1 calendar fr Sélectionnez un %1 @@ -284,12 +319,14 @@ sorry, this event does not exist calendar fr D sorry, this event does not have exceptions defined calendar fr Désolé, cet évènement n'a pas d'exceptions définies sort by calendar fr Sort by specifies the the number of intervals shown in the planner view. calendar fr Spécifie le nombre d'intervalles montrés dans la vue planning. +start calendar fr Début start date/time calendar fr Date/heure de début start- and enddates calendar fr Dates de début et de fin startdate calendar fr Date de début startdate / -time calendar fr Date/heure de début startdate and -time of the search calendar fr Date/heure de début de recherche startrecord calendar fr Enregistrement de début +status changed calendar fr Le statut a été modifié su calendar fr Di submit to repository calendar fr Soumettre au dépôt sun calendar fr Dim @@ -301,13 +338,13 @@ the following conflicts with the suggested time:
      %1
    calendar fr L' the user %1 is not participating in this event! calendar fr L'utilisateur %1 ne participe pas à cet évènement! there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar fr Il y a eu une erreur en essayant de se connecter à votre serveur de News.
    SVP, contactez votre administrateur pour vérifier le nom du serveur de News, votre nom ou mot de passe. this day is shown as first day in the week or month view. calendar fr Ce jour est montré comme le premier jour dans la vue hebdomadaire ou mensuelle. -this day is shown as last day in the week view. calendar fr Ce jour est considéré comme le dernier jour dans la vue hebdomadaire. this defines the end of your dayview. events after this time, are shown below the dayview. calendar fr Ceci définit la fin de votre vue journalière. Les évènements après cette heure sont montrés sous la vue journalière. this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar fr Ceci définit le début de votre vue journalière. Les évènements avant cette heuresont montrés au-dessus de la vue journalière.
    Cette heure est aussi utilisée comme l'heure de début par défaut pour les nouveaux évènements. this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar fr Ce groupe qui est présélectionné quand vous entrez dans le planning. Vous pouvez le changer dans le planning chaque fois que vous le voulez. this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar fr Cette erreur est généralement due à une mauvaise configuration du serveur SMTP. Contactez votre administrateur. this message is sent for canceled or deleted events. calendar fr Ce message est envoyé pour les évènements annulés ou effacés. this message is sent for modified or moved events. calendar fr Ce message est envoyé pour les évènements modifiés ou déplacés. +this message is sent to disinvited participants. calendar fr Ce message est envoyé aux participants dont l'invitation a été annulée. this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar fr Ce message est envoyé à tous les participants des évènements vous appartenant qui ont demandé des notifications à propos des nouveaux évènements.
    Vous pouvez utiliser certaines variables qui seront remplacées par les données de l'évènement. La première ligne est le sujet de l'EMail. this message is sent when you accept, tentative accept or reject an event. calendar fr Ce message est envoyé quand vous acceptez, essayez d'accepter ou rejetez un évènement. this message is sent when you set an alarm for a certain event. include all information you might need. calendar fr Ce message est envoyé quand vous réglez une Alarme pour un évènement précis. Incluez toutes les informations dont vous pourriez avoir besoin. @@ -340,7 +377,6 @@ view this entry calendar fr Voir cette entr we calendar fr M wed calendar fr Mer week calendar fr Semaine -weekday ends on calendar fr La semaine se termine le weekday starts on calendar fr La semaine débute le weekdays calendar fr Jours de la semaine weekdays to use in search calendar fr Jour de la semaine à inclure dans la recherche @@ -351,6 +387,7 @@ weekview without weekend calendar fr Vue Hebdo sans Weekend when creating new events default set to private calendar fr A la création de nouveaux événements mettre par défaut en privé which events do you want to see when you enter the calendar. calendar fr Quels évènements voulez-vous voir quand vous entrez dans le calendrier. which of calendar view do you want to see, when you start calendar ? calendar fr Laquelle des vues du calendrier vous voulez voir, quand vous entrez dans le calendrier ? +whole day calendar fr Journée entière wk calendar fr Sem. work day ends on calendar fr Jour de travail finit à work day starts on calendar fr Jour de travail démarre à @@ -366,6 +403,7 @@ you do not have permission to read this record! calendar fr Vous n'avez pas les you have %1 high priority events on your calendar today. common fr Vous avez %1 événements de haute priorité dans votre calendrier aujourd'hui. you have 1 high priority event on your calendar today. common fr Vous avez 1 événement de haute priorité dans votre calendrier aujourd'hui. you have a meeting scheduled for %1 calendar fr Vous avez une réunion planifiée pour %1 +you have been disinvited from the meeting at %1 calendar fr Votre invitation au rendez-vous de %1 a été annulée you have not entered a title calendar fr Vous n'avez pas entré de titre you have not entered a valid date calendar fr Vous n'avez pas entré une date correcte you have not entered a valid time of day calendar fr Vous n'avez pas entré une heure de la journée correcte diff --git a/calendar/setup/phpgw_it.lang b/calendar/setup/phpgw_it.lang index 0d13c8a577..e7bb58d197 100644 --- a/calendar/setup/phpgw_it.lang +++ b/calendar/setup/phpgw_it.lang @@ -5,32 +5,49 @@ (for weekly) calendar it (per settimana) (i/v)cal calendar it (i/v)Cal 1 match found calendar it Trovata 1 occorrenza -a calendar it A +please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2.
    holidays are %3 automatic installed from %4. you can changed it in %5. calendar it Attenzione: l'agenda usa le festività della tua nazione, che è impostata a %1. Puoi cambiarla in %2.
    Le festività sono %3 automaticamente installate da %4. Puoi cambiarle in %5. +a calendar it a +a non blocking event will not conflict with other events calendar it Un evento non bloccante non sarà in conflitto con altri eventi accept calendar it Accetta +accept or reject an invitation calendar it Accetta o o rifiuta un invito accepted calendar it Accettato action that caused the notify: added, canceled, accepted, rejected, ... calendar it Azione che ha causato la notifica: Aggiunto, Cancellato, Accettato, Rifiutato, ... +actions calendar it Azioni add a single entry by passing the fields. calendar it Aggiungi una singola voce compilando i campi add alarm calendar it Aggiungi Allarme add contact calendar it Aggiungi un Contatto add or update a single entry by passing the fields. calendar it Aggiungi o aggiorna una singola voce compilando i campi. added calendar it Aggiunto address book calendar it Rubrica -alarm calendar it allarme +after current date calendar it Dopo la data attuale +alarm calendar it Sveglia +alarm added calendar it Sveglia aggiunta +alarm deleted calendar it Sveglia cancellata alarm for %1 at %2 in %3 calendar it Allarme per %1 a %2 in %3 alarm management calendar it Gestione Allarmi alarm-management calendar it Gestione-Allarmi alarms calendar it Allarmi all categories calendar it Tutte le categorie all day calendar it Tutto il giorno +all events calendar it Tutti gli eventi +all participants calendar it Tutti i partecipanti +allows to edit the event again calendar it Permette di modificare ancora l'evento +apply the changes calendar it apllica le modifiche are you sure you want to delete this country ? calendar it Confermi la cancellazione di questa Nazione ? are you sure you want to delete this holiday ? calendar it Sei sicuro di voler cancellare questa festività ? are you sure\nyou want to\ndelete these alarms? calendar it Sei sicuro\ndi voler\ncancellare questo allarme ? are you sure\nyou want to\ndelete this entry ? calendar it Sei sicuro\ndi voler\ncancellare questa voce ? are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar it Sei sicuro di\nvoler cancellare\nquesta voce?\n\nQuesto comporterà la cancellazione\nper tutti gli utenti. are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar it Confermi la cancellazione di questa singola voce?\n\nQuesto comporterà la cancellazione\nper tutti gli utenti +back half a month calendar it indietro metà mese +back one month calendar it indietro un mese +before current date calendar it Prima della data attuale before the event calendar it prima dell'evento +birthday calendar it Compleanno brief description calendar it Descrizione breve business calendar it Business +busy calendar it occupato +by calendar it da calendar common it Agenda calendar - [iv]cal importer calendar it Agenda - Importazione [iv]Cal calendar - add calendar it Agenda - Aggiungi @@ -40,15 +57,22 @@ calendar holiday management admin it Gestione Festivit calendar preferences calendar it Preferenze Agenda calendar settings admin it Impostazioni Agenda calendar-fieldname calendar it Campi-Agenda +can't add alarms in the past !!! calendar it Non si può aggiungere sveglie nel passato !!! canceled calendar it Cancellato change all events for $params['old_owner'] to $params['new_owner']. calendar it Modifica tutti gli eventi per $params['old_owner'] a $params['new_owner']. change status calendar it Cambia Stato charset of file calendar it Charset del file click %1here%2 to return to the calendar. calendar it Per ritornare all'agenda premi %1qui%2. +close the window calendar it Chiudi la finestra +compose a mail to all participants after the event is saved calendar it componi una email per tutti i partecipanti dopo che l'evento è stato salvato configuration calendar it Configurazione +copy of: calendar it Copia di: +copy this event calendar it Copia questo evento countries calendar it Nazioni country calendar it Nazione +create new links calendar it Crea nuovi collegamenti created by calendar it Creato da +csv calendar it CSV csv-fieldname calendar it Campi-CSV csv-filename calendar it Nomefile-CSV custom fields calendar it Personalizza i Campi @@ -56,6 +80,7 @@ custom fields and sorting common it Personalizzazione e Ordinamento dei Campi daily calendar it Giornaliero daily matrix view calendar it Vista Matrice Giornaliera days calendar it giorni +days of the week for a weekly repeated event calendar it Giorni della settimana per un evento con ricorrenza settimanale days repeated calendar it giorni ripetuti dayview calendar it Vista Giornaliera default appointment length (in minutes) calendar it lunghezza predefinita degli appuntamenti (in minuti) @@ -70,11 +95,16 @@ delete selected contacts calendar it Cancella il contatto selezionato delete selected participants calendar it Cancella i partecipanti selezionati delete series calendar it Cancella serie delete single calendar it Cancellazione singola +delete this alarm calendar it Cancella questa sveglia +delete this event calendar it Cancella questo evento +delete this exception calendar it Cancella questa eccezione +delete this series of recuring events calendar it Cancella questa serie di eventi ricorrenti deleted calendar it Eliminato description calendar it Descrizione determining window width ... calendar it Determinazione larghezza finestra ... disable calendar it Disabilita disabled calendar it disabilitato +disinvited calendar it Disinvitato display interval in day view calendar it Visualizza intervallo nella Vista Giornaliera display mini calendars when printing calendar it Visualizza mini calendari quando stampi display status of events calendar it Visualizza lo stato per gli Eventi @@ -85,22 +115,34 @@ do you want to be notified about new or changed appointments? you be notified ab do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar it Vuoi ricevere regolarmente il resoconto dei tuoi appuntamenti via e-mail?
    Il resoconto sarà mandato al tuo indirizzo e-mail standard ogni mattina o ogni Lunedì per il resoconto settimanale.
    Sarà mandato solo se avrai un appuntamento per quel giorno o per quella settimana. do you wish to autoload calendar holidays files dynamically? admin it Vuoi caricare automaticamente nell'agenda i file con l'elenco delle festività? download calendar it Download +download this event as ical calendar it Scarica questo evento come iCal duration calendar it Durata duration of the meeting calendar it Durata della riunione edit series calendar it Modifica Serie edit single calendar it Modifica Singolo +edit this event calendar it Modifica questo evento +edit this series of recuring events calendar it Modifica questa serie di eventi ricorrenti email notification calendar it Notifica via e-mail email notification for %1 calendar it Notifica via e-mail %1 empty for all calendar it vuoto per tutti enable calendar it Abilita enabled calendar it abilitato +end calendar it Fine end date/time calendar it Data/Ora finale enddate calendar it Data-finale enddate / -time of the meeting, eg. for more then one day calendar it Data/ora finale della riunione, es: per più di un giorno +enddate of the export calendar it Data finale dell'esportazione ends calendar it finisce enter output filename: ( .vcs appended ) calendar it Inserisci il nome del file di destinazione +error adding the alarm calendar it Errore aggiungendo la sveglia +error: saving the event !!! calendar it Errore: durante il salvataggio dell'evento !!! +event copied - the copy can now be edited calendar it Evento copiato - la copia può ora essere modificata +event deleted calendar it Evento cancellato event details follow calendar it Dettagli dell'evento +event saved calendar it Evento salvato +event will occupy the whole day calendar it L'evento occuperà l'intera giornata exceptions calendar it Eccezioni +existing links calendar it Collegamenti esistenti export calendar it Esporta export a list of entries in ical format. calendar it Esporta una lista delle voci in formato iCal extended calendar it Esteso @@ -108,9 +150,15 @@ extended updates always include the complete event-details. ical's can be import external participants calendar it Partecipanti Esterni failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar it Invio messaggio a '%1' #%2 soggetto='%3', mittente='%4' fallito!!! fieldseparator calendar it Separatore +filename calendar it Nome file +filename of the download calendar it Nome file del download find free timeslots where the marked participants are availible for the given timespan calendar it Trova spazi liberi in cui i partecipanti selezionati sono disponibili per il periodo stabilito +find free timeslots where the selected participants are availible for the given timespan calendar it Trova spazi di tempo libero in cui tutti i partecipanti sono disponibili per il periodo stabilito firstname of person to notify calendar it Nome della persona da avvisare +for calendar it per format of event updates calendar it Formato degli aggiornamenti degli eventi +forward half a month calendar it avanti metà mese +forward one month calendar it avanti un mese fr calendar it V free/busy calendar it Libero/Occupato freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar it libero/occupato: Utente '%1' sconosciuto, password errata o non disponibile agli utenti non loggati !!! @@ -119,6 +167,7 @@ frequency calendar it Frequenza fri calendar it Ven full description calendar it Descrizione completa fullname of person to notify calendar it Nome completo della persona da avvisare +general calendar it Generale generate printer-friendly version calendar it Genera versione stampabile global categories calendar it Categorie Globali global public and group public calendar it Pubblico Globale e Pubblico per il Gruppo @@ -136,16 +185,18 @@ holidays calendar it Festivit hours calendar it ore how far to search (from startdate) calendar it quanto lontano cercare (dalla data iniziale) i participate calendar it Io Partecipo +ical calendar it iCal ical / rfc2445 calendar it iCal / rfc2445 +ical export calendar it Esportazione iCal if checked holidays falling on a weekend, are taken on the monday after. calendar it Se selezionato la festività che ricorre nel weekend sarà spostata al lunedì successivo. if you dont set a password here, the information is available to everyone, who knows the url!!! calendar it Se non stabilisci una password qui, l'informazione sarà disponibile a chiunque conosca l'URL!!! -if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar it Se non imposti una password, le infomrazioni saranno disponibili a tutti coloro che conoscono l'URL!!! ignore conflict calendar it Ignora Conflitto import calendar it Importa import csv-file common it Importa File-CSV interval calendar it Intervallo intervals in day view calendar it Intervallo nella Vista giornaliera intervals per day in planner view calendar it Intervallo giornaliero nel pianificatore +invalid email-address "%1" for user %2 calendar it Indirizzo email "%1" non valido per utente %2 invalid entry id. calendar it ID della voce non valido last calendar it ultimo lastname of person to notify calendar it Cognome della persona da avvisare @@ -153,12 +204,16 @@ length shown
    (emtpy for full length) calendar it Lunghezza visiva
    (vuoto p length
    (<= 255) calendar it Lunghezza
    (<= 255) link calendar it Link link to view the event calendar it Link per visualizzare l'evento +links calendar it Collegamenti +links, attachments calendar it Collegamenti, Allegati list all categories. calendar it Lista tutte le categorie. +listview calendar it Vista elenco load [iv]cal calendar it Carica [iv]Cal location calendar it Località location to autoload from admin it Indirizzo da cui caricare automaticamente +location, start- and endtimes, ... calendar it Luogo, Inizio e Fine, ... +mail all participants calendar it Invia email a tutti i partecipanti make freebusy information available to not loged in persons? calendar it Rendere disponibili le informazioni libero/occupato alle persone non loggate? -make freebusy information availible to not loged in persons? calendar it Rendi le informazioni di disponibilità alle persone non loggate? matrixview calendar it Vista a Matrice minutes calendar it minutes mo calendar it L @@ -175,11 +230,14 @@ new entry calendar it Nuova Voce new name must not exist and not be empty!!! calendar it I nuovi nomi devono esistere e non essere vuoti!!! new search with the above parameters calendar it nuova ricerca con i parametri indicati sopra next day calendar it giorno seguente +no events found calendar it Nessun evento trovato no filter calendar it Nessun Filtro no matches found calendar it Nessuna corrispondenza no response calendar it Nessuna Risposta +non blocking calendar it non bloccante notification messages for added events calendar it Messaggi di notifica per gli eventi aggiunti notification messages for canceled events calendar it Messaggi di notifica per gli eventi cancellati +notification messages for disinvited participants calendar it Messaggi di notifica per i partecipanti disinvitati notification messages for modified events calendar it Messaggi di notifica per gli eventi modificati notification messages for your alarms calendar it Messaggi di notifica per i tuoi allarmi notification messages for your responses calendar it Messaggi di notifica per le tue risposte @@ -200,22 +258,26 @@ on time change of more than 4 hours too calendar it anche sul cambio ora maggior one month calendar it un mese one week calendar it una settimana one year calendar it un anno +only the initial date of that recuring event is checked! calendar it Solo la data iniziale di quel evento ricorrente è selezionata! open todo's: calendar it ToDo Aperti: -or enddate / -time calendar it o data/ora finale order calendar it Ordine overlap holiday calendar it sovrapposizione di una festività participant calendar it Partecipante participants calendar it Partecipanti -participates calendar it partecipa +participants disinvited from an event calendar it Partecipanti disinvitati da un evento +participants, resources, ... calendar it Partecipanti, Risorse, ... +participates calendar it Partecipa password for not loged in users to your freebusy information? calendar it Password per gli utenti non loggati sulle tue informazioni di disponibilità? -people holiday calendar it festività personale +people holiday calendar it festività personali permission denied calendar it Permesso negato planner calendar it Pianificatore planner by category calendar it Pianificatore per categorie planner by user calendar it Pianificatore per utente please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar it Per favore conferma, accetta, rifiuta o esamina i cambiamenti della voce corrispondente nel tuo calendario please enter a filename !!! calendar it Prego inserire un nome File !!! +please note: you can configure the field assignments after you uploaded the file. calendar it Attenzione: Puoi configurare il campo assegnazioni DOPO che hai caricato il file. preselected group for entering the planner calendar it Gruppo predefinito per aggiunte al pianificatore +previous calendar it precedente previous day calendar it giorno prededente print calendars in black & white calendar it Stampa agende in bianco e nero print the mini calendars calendar it Stampa la mini agenda @@ -231,24 +293,33 @@ read this list of methods. calendar it Leggi questa lista di metodi receive email updates calendar it Ricevi aggiornamenti via e-mail receive extra information in event mails calendar it Ricevi informazioni extra nell'e-mail dell'evento receive summary of appointments calendar it Ricevi il resoconto degli appuntamenti +recurrence calendar it Ricorrenza recurring event calendar it evento ricorrente refresh calendar it Aggiorna reinstate calendar it reinstanziare rejected calendar it Rifiutato repeat day calendar it Giorno ripetizione +repeat days calendar it Giorni di ripetizione repeat end date calendar it Data ultima ripetizione +repeat the event until which date (empty means unlimited) calendar it ripeti l'evento fino a che data (vuoto significa illimitato) repeat type calendar it Tipo di ripetizione repeating event information calendar it Informazioni sugli eventi ricorrenti +repeating interval, eg. 2 to repeat every second week calendar it intervallo di ripetizione, es. 2 per ripetere ogni seconda settimana repetition calendar it Ripetizione repetitiondetails (or empty) calendar it Dettagli Ripetizione (o vuoto) reset calendar it Reset +resources calendar it Risorse rule calendar it Regola sa calendar it Sa sat calendar it Sab +saves the changes made calendar it salva le modifiche fatte +saves the event ignoring the conflict calendar it Salva l'evento ignorando il conflitto scheduling conflict calendar it Conflitto di orario search results calendar it Risultati Ricerca select a %1 calendar it Seleziona %1 select a time calendar it seleziona un'ora +select resources calendar it Seleziona risorse +select who should get the alarm calendar it Seleziona chi dovrà avere la sveglia selected contacts (%1) calendar it Contatti selezionati (%1) send updates via email common it Invia aggiornamenti via e-mail send/receive updates via email calendar it Invia/Ricevi aggiornamenti via e-mail @@ -276,12 +347,15 @@ sorry, this event does not exist calendar it Spiacente, questo evento non esiste sorry, this event does not have exceptions defined calendar it Spiacente, questo evento non ha eccezioni definite sort by calendar it Ordina per specifies the the number of intervals shown in the planner view. calendar it Specifica il numero di intervalli nel pianificatore +start calendar it Inizio start date/time calendar it Data/Ora Inizio start- and enddates calendar it Data Iniziale e Finale startdate calendar it Data Inizio startdate / -time calendar it Data/ora iniziale startdate and -time of the search calendar it Data/ora iniziale della ricerca +startdate of the export calendar it Data iniziale dell'esportazione startrecord calendar it Primo Record +status changed calendar it Stato modificato su calendar it Do submit to repository calendar it Invia all'archivio sun calendar it Dom @@ -299,6 +373,7 @@ this group that is preselected when you enter the planner. you can change it in this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar it Questo è causato da un impostazione sbagliata del server SMTP. Avvisa l'Amministratore. this message is sent for canceled or deleted events. calendar it Questo messaggio è inviato per gli eventi annullati o cancellati. this message is sent for modified or moved events. calendar it Questo messaggio è inviato. per gli eventi modficiati o spostati. +this message is sent to disinvited participants. calendar it Questo messaggio viene inviato ai partecipanti disinvitati. this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar it Questo messaggio è inviato ad ogni partecipante, che ha richiesto la notifica, all'evento da te creato.
    Puoi usare certe variabili che sostituiranno dati dell'evento. La prima linea è l'oggetto dell'e-mail. this message is sent when you accept, tentative accept or reject an event. calendar it Questo messaggio è inviato quando accetti, provi ad accettare, o rifiuti un evento. this message is sent when you set an alarm for a certain event. include all information you might need. calendar it Questo messaggio è inviato quando imposti un Allarme per certi eventi. Include tutte le informazioni di cui hai bisogno. @@ -321,13 +396,11 @@ today calendar it Oggi translation calendar it Traduzione tu calendar it M tue calendar it Mar -two dayview calendar it vista due giorni -two weeks calendar it due settimane update a single entry by passing the fields. calendar it Aggiornamento di una singola voce compilando i campi updated calendar it Modificato use end date calendar it Usa data di termine use the selected time and close the popup calendar it utilizza l'ora selezionata e chiudi popup -view this entry calendar it Visualizza questa voce +view this event calendar it Visualizza questo evento we calendar it M wed calendar it Mer week calendar it Settimana @@ -336,11 +409,12 @@ weekdays calendar it Giorni settimanali weekdays to use in search calendar it Giorni settimanali da usare per la ricerca weekly calendar it Settimanale weekview calendar it Vista Settimanale -weekview including weekend calendar it Vista settimanale con weekend +weekview with weekend calendar it Vista settimanale con weekend weekview without weekend calendar it Vista settimanale senza weekend when creating new events default set to private calendar it Quando vengono creati nuovi eventi settali automaticamente come privati which events do you want to see when you enter the calendar. calendar it Quali eventi vuoi vedere quando entri nell'agenda. which of calendar view do you want to see, when you start calendar ? calendar it Quale vista dell'agenda vuoi vedere quanto apri l'agenda? +whole day calendar it giornata intera wk calendar it Sett work day ends on calendar it La giornata lavorativa termina alle work day starts on calendar it La giornata lavorativa inizia alle @@ -356,6 +430,7 @@ you do not have permission to read this record! calendar it Non hai l'autorizzaz you have %1 high priority events on your calendar today. common it Oggi hai %1 eventi ad alta priorità nella tua agenda. you have 1 high priority event on your calendar today. common it Oggi hai 1 evento a priorità alta nella tua agenda. you have a meeting scheduled for %1 calendar it Hai un meeting fissato alle %1 +you have been disinvited from the meeting at %1 calendar it Sei stato disinvitato dal meeting alle you have not entered a title calendar it Non hai inserito alcun titolo you have not entered a valid date calendar it Non hai inserito una data valida you have not entered a valid time of day calendar it Non hai inserito un orario valido diff --git a/calendar/setup/phpgw_nl.lang b/calendar/setup/phpgw_nl.lang index 6c7f00b573..f57e7ae56a 100644 --- a/calendar/setup/phpgw_nl.lang +++ b/calendar/setup/phpgw_nl.lang @@ -5,34 +5,49 @@ (for weekly) calendar nl (voor wekelijks) (i/v)cal calendar nl (i/v)Cal 1 match found calendar nl 1 resultaat gevonden +please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2.
    holidays are %3 automatic installed from %4. you can changed it in %5. calendar nl Let op: de agenda gebruikt de vrije dagen van uw land dat staat ingesteld op %1. U kunt dit wijzigen in uw %2.
    Vrije dagen worden %3 automatisch geinstalleerd vanaf %4. U kunt dit wijzigen in %5. a calendar nl a +a non blocking event will not conflict with other events calendar nl Een niet-blokkerende gebeurtenis zal geen conflicten met andere gebeurtenissen geven accept calendar nl Accepteren +accept or reject an invitation calendar nl Accepteer of weiger een uitnodiging accepted calendar nl Geaccepteerd -action that caused the notify: added, canceled, accepted, rejected, ... calendar nl Reden van de notificatie:Toegevoegd, Geannuleerd, Geaccepteerd, Geweigerd, ... +action that caused the notify: added, canceled, accepted, rejected, ... calendar nl Reden van de notificatie: Toegevoegd, Geannuleerd, Geaccepteerd, Geweigerd, ... +actions calendar nl Acties add a single entry by passing the fields. calendar nl Een enkele afspraak toevoegen door de afzonderlijke velden in te voeren. add alarm calendar nl Alarm toevoegen add contact calendar nl Contact toevoegen +add or update a single entry by passing the fields. calendar nl Voeg een enkel veld toe of bewerk het door de velden door te geven. added calendar nl Toegevoegd address book calendar nl Adresboek -alarm calendar nl Alarm -alarm for %1 at %2 in %3 calendar nl Alarm voor %1 op %2 in %3 -alarm management calendar nl Alarmbeheer -alarm-management calendar nl Alarmbeheer -alarms calendar nl Alarms +after current date calendar nl Na de huidige datum +alarm calendar nl Herinnering +alarm added calendar nl Herinnering toegevoegd +alarm deleted calendar nl Herinnering verwijderd +alarm for %1 at %2 in %3 calendar nl Herinnering voor %1 op %2 in %3 +alarm management calendar nl Herinneringen beheer +alarm-management calendar nl Herinneringen beheer +alarms calendar nl Herinneringen +all categories calendar nl Alle categorieën all day calendar nl Hele dag +all events calendar nl Alle gebeurtenissen +all participants calendar nl Alle deelnemers +allows to edit the event again calendar nl Staat toe om de gebeurtenis opnieuw te wijzigen +apply the changes calendar nl wijzigingen doorvoeren are you sure you want to delete this country ? calendar nl Weet u zeker dat u dit land wilt verwijderen? are you sure you want to delete this holiday ? calendar nl Weet u zeker dat u deze feestdag wilt verwijderen? -are you sure\nyou want to\ndelete these alarms? calendar nl Weet u zeker dat u deze alarms wilt verwijderen? +are you sure\nyou want to\ndelete these alarms? calendar nl Weet u zeker\n dat u deze\n waarschuwingen wilt verwijderen? are you sure\nyou want to\ndelete this entry ? calendar nl Weet u zeker\n dat u deze\nafspraak wilt verwijderen? are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar nl Weet u zeker\n dat u deze\nafspraak wilt verwijderen?\nDit zal de afspraak bij\nalle gebruikers verwijderen. are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar nl Weet u zeker\n dat u deze enkele afpraak wilt verwijdere?\n\nDeze afspraak zal voor iedere gebruiker worden verwijderd. -are you surenyou want tondelete these alarms? calendar nl Weet u zeker dat u deze alarms wilt verwijderen? -are you surenyou want tondelete this entry ? calendar nl Weet u zeker\n dat u deze\nafspraak wilt verwijderen? -are you surenyou want tondelete this entry ?nnthis will deletenthis entry for all users. calendar nl Weet u zeker\n dat u deze\nafspraak wilt verwijderen?\nDit zal de afspraak bij\nalle gebruikers verwijderen. -are you surenyou want tondelete this single occurence ?nnthis will deletenthis entry for all users. calendar nl Weet u zeker\n dat u deze enkele afpraak wilt verwijdere?\n\nDeze afspraak zal voor iedere gebruiker worden verwijderd. +back half a month calendar nl halve maand terug +back one month calendar nl één maand terug +before current date calendar nl Voor de huidige datum before the event calendar nl voor de afspraak +birthday calendar nl Verjaardag brief description calendar nl Korte omschrijving business calendar nl Bedrijf +busy calendar nl bezet +by calendar nl door calendar common nl Agenda calendar - [iv]cal importer calendar nl Agenda - [iv]Cal Importeren calendar - add calendar nl Agenda - toevoegen @@ -42,14 +57,21 @@ calendar holiday management admin nl Agenda feestdagen beheer calendar preferences calendar nl Agenda voorkeuren calendar settings admin nl Agenda instellingen calendar-fieldname calendar nl Agenda - Veldnaam +can't add alarms in the past !!! calendar nl Herinneringen kunnen niet in het verleden aangemaakt worden !!! canceled calendar nl Geannuleerd change all events for $params['old_owner'] to $params['new_owner']. calendar nl Alle afspraken wijzigen voor $params['oude_eigenaar'] naar $params['nieuwe_eigenaar']. change status calendar nl Verander status charset of file calendar nl Karakterset van bestand -click %1here%2 to return to the calendar. calendar nl Klik %1here%2 om terug te keren naar de agenda. +click %1here%2 to return to the calendar. calendar nl Klik %1hier%2 om terug te keren naar de agenda. +close the window calendar nl Venster sluiten +common preferences calendar nl Normale voorkeuren +compose a mail to all participants after the event is saved calendar nl stel een email aan alle deelnemers op nadat de gebeurtenis is opgeslagen configuration calendar nl Configuratie +copy of: calendar nl Kopie van: +copy this event calendar nl Kopieer deze gebeurtenis countries calendar nl Landen country calendar nl Land +create new links calendar nl Nieuwe links aanmaken created by calendar nl Aangemaakt door csv-fieldname calendar nl CSV-veldnaam csv-filename calendar nl CSV-bestandsnaam @@ -58,46 +80,69 @@ custom fields and sorting common nl Aangepaste velden en volgorde daily calendar nl Dagelijks daily matrix view calendar nl Dagelijks matrix overzicht days calendar nl dagen +days of the week for a weekly repeated event calendar nl Dagen van de week voor een wekelijks herhalende gebeurtenis days repeated calendar nl dagen herhaald dayview calendar nl Dagweergave default appointment length (in minutes) calendar nl standaard afspraakduur (in minuten) default calendar filter calendar nl Standaard agendafilter default calendar view calendar nl Standaard agendaoverzicht default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar nl Standaard lengte van nieuw aangemaakte afspraken. De lengte is in minuten, bijv. 60 voor 1 uur. +default week view calendar nl Standaard weekoverzicht defines the size in minutes of the lines in the day view. calendar nl Standaard grootte in minutes van de regels in de dagelijkse weergave. delete a single entry by passing the id. calendar nl Verwijder een enkele afspraak door het ID in te voeren delete an entire users calendar. calendar nl Een complete gebruikersagenda verwijderen. delete selected contacts calendar nl Geselecteerde contacten verwijderen +delete selected participants calendar nl Geselecteerde deelnemers verwijderen delete series calendar nl Series verwijderen delete single calendar nl Enkele verwijderen -delete this entry ? calendar nl Weet u zeker +delete this alarm calendar nl Deze herinnering verwijderen +delete this event calendar nl Deze gebeurtenis verwijderen +delete this exception calendar nl Deze uitzondering verwijderen +delete this series of recuring events calendar nl Deze serie herhalende gebeurtenissen verwijderen deleted calendar nl Verwijderd description calendar nl Omschrijving +determining window width ... calendar nl Vensterbreedte wordt berekend ... disable calendar nl Deactiveer disabled calendar nl gedeactiveerd +disinvited calendar nl Uitnodiging teruggetrokken display interval in day view calendar nl Verdelingen in dagelijks overzicht display mini calendars when printing calendar nl Mini kalenders tijdens het afdrukken display status of events calendar nl Status van afspraken weergeven +displayed view calendar nl huidige weergave displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar nl Laat uw standaard agenda weergave zien op de startpagina (De pagina waarmee eGroupWare geopend wordt of die u krijgt als u op klikt op 'start' -displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar nl Geeft uw standaard agenda weer op de hoofdpagina -do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar nl Wilt u worden geïnformeerd over nieuwe of gewijzigde afspraken? U wordt geïnformeerd over wijzigingen die u zelf heeft gemaakt.
    U kunt de de notificaties beperken to alleen bepaalde wijzigingen. Elk item bevat alle notificaties hierboven weergegeven. "Alle wijzigingen" bevat wijziging va titel, beschrijving, deelnemers, maar niet reacties van deelnemers. Als de eigenaar van een afspraak verzocht heeft om een van de notificaties, zal hij of zij altijd reacties krijgen van de deelnemers zoals acceptaties en afwijzigingen. -do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar nl Wilt u per email een periodieke overzichten ontvangen van uw afspraken?
    Het overzicht wordt verzonden naar uw standaard emailadres op de ochtend dat de afspraak plaatsvind en op maandag voor wekelijkse overzichten.
    Er wordt alleen een overzicht verstuurd als er in die afspraken staan geregistreerd. +do you want a weekview with or without weekend? calendar nl Wil je weekoverzicht met of zonder weekend? +do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar nl Wilt u worden geinformeerd over nieuwe of gewijzigde afspraken? U wordt geïnformeerd over wijzigingen die u zelf heeft gemaakt.
    U kunt de de notificaties beperken to alleen bepaalde wijzigingen. Elk item bevat alle notificaties hierboven weergegeven. "Alle wijzigingen" bevat wijziging va titel, beschrijving, deelnemers, maar niet reacties van deelnemers. Als de eigenaar van een afspraak verzocht heeft om een van de notificaties, zal hij of zij altijd reacties krijgen van de deelnemers zoals acceptaties en afwijzigingen. +do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar nl Wilt u per email een periodieke overzichten ontvangen van uw afspraken?
    Het overzicht wordt verzonden naar uw standaard emailadres op de ochtend dat de afspraak plaatsvind en op maandag voor wekelijkse overzichten.
    Er wordt alleen een overzicht verstuurd als er in die afspraken staan geregistreerd. do you wish to autoload calendar holidays files dynamically? admin nl Wilt u de feestdagen automatisch downloaden download calendar nl Downloaden +download this event as ical calendar nl Download deze gebeurtenis als iCal duration calendar nl Duur +duration of the meeting calendar nl Duur van de bijeenkomst edit series calendar nl Alles bewerken edit single calendar nl Een bewerken +edit this event calendar nl Deze gebeurtenis bewerken +edit this series of recuring events calendar nl De hele reeks herhalende gebeurtenissen bewerken email notification calendar nl Email Notificatie email notification for %1 calendar nl Email Notificatie voor %1 empty for all calendar nl leeg voor alle enable calendar nl Activeren enabled calendar nl Geactiveerd +end calendar nl Eind end date/time calendar nl Einddatum/-tijd enddate calendar nl Einddatum +enddate / -time of the meeting, eg. for more then one day calendar nl Einddatum / -tijd van de bijeenkomst, bijvoorbeeld voor langer dan één dag +enddate of the export calendar nl Einddatum van de export ends calendar nl eindigt enter output filename: ( .vcs appended ) calendar nl Voer een bestandsnaam in om naartoe te schrijven (inclusief .vcs extentie) +error adding the alarm calendar nl Fout bij instellen van de herinnering +error: saving the event !!! calendar nl Fout: opslaan van de gebeurtenis !!! +event copied - the copy can now be edited calendar nl Gebeurtenis gekopieerd - de kopie kan nu bewerkt worden +event deleted calendar nl Gebeurtenis verwijderd event details follow calendar nl Afspraak details volgen +event saved calendar nl Gebeurtenis opgeslagen +event will occupy the whole day calendar nl Gebeurtenis duurt de hele dag exceptions calendar nl Uitzonderingen +existing links calendar nl Bestaande links export calendar nl Exporteren export a list of entries in ical format. calendar nl Een lijst met afspraken exporteren in iCal-formaat. extended calendar nl Uitgebreid @@ -105,14 +150,24 @@ extended updates always include the complete event-details. ical's can be import external participants calendar nl Externe participanten failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar nl Het versturen van een bericht naar '%1' #%2 onderwerp='%3', afzender='%4' is mislukt !!! fieldseparator calendar nl Veldscheidingssymbool +filename calendar nl Bestandsnaam +filename of the download calendar nl Bestandsnaam van de download +find free timeslots where the marked participants are availible for the given timespan calendar nl Zoek naar vrije tijdstippen waarop de gemarkeerde deelnemers beschikbaar zijn binnen de opgegeven tijdsduur +find free timeslots where the selected participants are availible for the given timespan calendar nl Zoek vrije tijdstippen waarop de geselecteerde deelnemers beschikbaar zijn binnen de opgegeven tijdsduur firstname of person to notify calendar nl Voornaam van persoon om te op de hoogte te brengen +for calendar nl voor format of event updates calendar nl Formaat van afspraakbewerkingen +forward half a month calendar nl halve maand verder +forward one month calendar nl één maand verder fr calendar nl Vr free/busy calendar nl Vrij/Bezet +freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar nl Vrij/Bezet: onbekende gebruiker '%1', verkeerd wachtwoord of niet beschikbaar voor niet-ingelogde gebruikers!!! +freetime search calendar nl Beschikbare tijd opzoeken frequency calendar nl Frequentie fri calendar nl Vri full description calendar nl Volledige omschrijving fullname of person to notify calendar nl Volledige naam van persoon om te op de hoogte te brengen +general calendar nl Algemeen generate printer-friendly version calendar nl Genereer printervriendelijke versie global categories calendar nl Globale categorieën global public and group public calendar nl Globaal publiek en group publiek @@ -121,8 +176,6 @@ go! calendar nl Uitvoeren! grant calendar access common nl Geef agenda toegang group planner calendar nl Groepsplanner group public only calendar nl Alleen group publiek -has been canceled calendar nl is geanulleerd -has been rescheduled to calendar nl is verplaats naar here is your requested alarm. calendar nl Hier is uw verzochte alarm. high priority calendar nl hoge prioriteit holiday calendar nl Vakantie @@ -130,23 +183,37 @@ holiday management calendar nl Feestdagenbeheer holiday-management calendar nl Feestdagenbeheer holidays calendar nl Vakanties hours calendar nl uren +how far to search (from startdate) calendar nl hoe ver vooruit zoeken (vanaf de startdatum) i participate calendar nl Ik doe mee +ical calendar nl iCal ical / rfc2445 calendar nl iCal / rfc2445 +ical export calendar nl iCal export if checked holidays falling on a weekend, are taken on the monday after. calendar nl wanneer deze optie is geactiveerd zullen feestdagen die vallen in het weekend, genomen worden op de maandag daarna. +if you dont set a password here, the information is available to everyone, who knows the url!!! calendar nl Indien u hier geen wachtwoord instelt, is de informatie beschikbaar voor iedereen die de URL kent!!! ignore conflict calendar nl Conflict negeren import calendar nl Importeren import csv-file common nl CSV-bstand importeren interval calendar nl Herhaling intervals in day view calendar nl Intervallen in dagelijke weergave intervals per day in planner view calendar nl Intervallen per dag in planner weergave +invalid email-address "%1" for user %2 calendar nl Ongeldig emailadres "%1" voor gebruiker %2 invalid entry id. calendar nl Ongeldige record-ID last calendar nl laatste lastname of person to notify calendar nl Achternaam van persoon om te op de hoogte te brengen -length shown
    (emtpy for full length) calendar nl Lengte weergeven
    (leeg laten voor de volledige lengte) -length
    (<= 255) calendar nl Lengte
    (<= 255) +length shown
    (emtpy for full length) calendar nl Lengte weergeven
    (leeg laten voor de volledige lengte) +length
    (<= 255) calendar nl Lengte
    (<= 255) +link calendar nl Link +link to view the event calendar nl Link om het evenement te bekijken +links calendar nl Links +links, attachments calendar nl Links, bijlagen +list all categories. calendar nl Lijst alle categorieën +listview calendar nl Lijstweergave load [iv]cal calendar nl [iv]Cal laden location calendar nl Plaats location to autoload from admin nl Plaats om van te laden +location, start- and endtimes, ... calendar nl Plaats, start- en eindtijden +mail all participants calendar nl Stuur een email naar alle deelnemers +make freebusy information available to not loged in persons? calendar nl Maak vrij/bezet informatie beschikbaar voor nietingelogde personen? matrixview calendar nl Matrixweergave minutes calendar nl minuten mo calendar nl Ma @@ -158,14 +225,21 @@ monthly calendar nl Maandelijks monthly (by date) calendar nl Maandelijks (op datum) monthly (by day) calendar nl Maandelijks (op dag) monthview calendar nl Maandweergave +needs javascript to be enabled !!! calendar nl Vereist dat javascript is ingeschakeld !!! new entry calendar nl Nieuwe afspraak new name must not exist and not be empty!!! calendar nl Nieuwe naam niet reeds bestaan en mag niet leeg zijn!!! +new search with the above parameters calendar nl opnieuw zoeken met de bovenstaande instellingen +next day calendar nl volgende dag +no events found calendar nl Geen gebeurtenissen gevonden +no filter calendar nl Geen filter no matches found calendar nl Geen resultaten gevonden -no matches found. calendar nl Geen resultaten gevonden no response calendar nl Geen Antwoord -notification messages for added events calendar nl Notificatieberichten voor toegevoegde afsrpaken -notification messages for canceled events calendar nl Notificatieberichten voor geannuleerde afsrpaken -notification messages for modified events calendar nl Notificatieberichten voor gewijzigde afsrpaken +non blocking calendar nl niet blokkerend +not calendar nl niet +notification messages for added events calendar nl Notificatieberichten voor toegevoegde afspraken +notification messages for canceled events calendar nl Notificatieberichten voor geannuleerde afspraken +notification messages for disinvited participants calendar nl Notificatieberichten voor deelnemers waarvan de uitnodiging is ingetrokken +notification messages for modified events calendar nl Notificatieberichten voor gewijzigde afspraken notification messages for your alarms calendar nl Notificatieberichten voor uw alarms notification messages for your responses calendar nl Notificatieberichten voor uw reacties number of intervals per day in planner view calendar nl Aantal items per dag in planner overzicht @@ -176,27 +250,37 @@ occurence calendar nl Gebeurtenis old startdate calendar nl Oude startdatum olddate calendar nl OudeDatum on %1 %2 %3 your meeting request for %4 calendar nl Op %1 %2 %3 uw afspraak aanvraag voor %4 -on all changes calendar nl op alle wijzigingen -on all modification, but responses calendar nl op alle wijzigingen, behalve reacties -on any time change too calendar nl op iedere tijd ook wijzigen -on invitation / cancelation only calendar nl op uitnodiging / alleen annulering -on participant responses too calendar nl ook op deelnemerreacties -on time change of more than 4 hours too calendar nl ook op tijdswijziging van meer dan 4 uur +on all changes calendar nl bij alle wijzigingen +on all modification, but responses calendar nl bij alle wijzigingen, behalve reacties +on any time change too calendar nl ook bij iedere wijziging van tijdstip +on invitation / cancelation only calendar nl alleen bij uitnodiging / annulering +on participant responses too calendar nl ook bij deelnemerreacties +on time change of more than 4 hours too calendar nl ook bij tijdswijziging van meer dan 4 uur +one month calendar nl één maand +one week calendar nl één week +one year calendar nl één jaar +only the initial date of that recuring event is checked! calendar nl Alleen de startdatum van die terugkerende gebeurtenis is gecontroleerd! open todo's: calendar nl Openstaande taken: order calendar nl Volgorde overlap holiday calendar nl vakantie overlapt participant calendar nl Deelnemer participants calendar nl Deelnemers -participates calendar nl Deelnemen +participants disinvited from an event calendar nl Deelnemers waarvan de uitnodiging is ingetrokken +participants, resources, ... calendar nl Deelnemers, hulpmiddelen, ... +participates calendar nl Neemt deel aan +password for not loged in users to your freebusy information? calendar nl Wachtwoord voor niet-ingelogde gebruiker voor jouw vrij/bezet informatie? people holiday calendar nl mensen vakantie permission denied calendar nl Toegang geweigerd planner calendar nl Planner planner by category calendar nl Planner per categorie planner by user calendar nl Planner per gebruiker please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar nl Wilt u de afspraak in uw agenda bevestigen, accepteren, weigeren of bijken. -preselected group for entering the planner calendar nl Geselecteerde groep bij het openen van de planner +please enter a filename !!! calendar nl vul s.v.p. een bestandsnaam in!!! +preselected group for entering the planner calendar nl Voorgeselecteerde groep bij het openen van de planner +previous calendar nl vorige +previous day calendar nl vorige dag print calendars in black & white calendar nl Kalenders in zwart/wit afdrukken -print the mini calendars calendar nl Print minikalenders +print the mini calendars calendar nl Minikalenders afdrukken printer friendly calendar nl Afdrukvriendelijk privat calendar nl Privé private and global public calendar nl Privé en globaal publiek @@ -209,22 +293,33 @@ read this list of methods. calendar nl Lees deze lijst met methodes. receive email updates calendar nl Ontvang email updates receive extra information in event mails calendar nl Ontvang extra informatie in afspraak berichten receive summary of appointments calendar nl Ontvang overzicht van afspraken -recurring event calendar nl terugkerende afsrpaak +recurrence calendar nl Terugkeren +recurring event calendar nl terugkerende afspraak refresh calendar nl Verversen reinstate calendar nl Opnieuw in gebruik nemen rejected calendar nl Afgewezen repeat day calendar nl Dag herhalen +repeat days calendar nl Dagen herhalen repeat end date calendar nl Einddatum herhalingspatroon +repeat the event until which date (empty means unlimited) calendar nl tot welke datum de gebeurtenis herhalen (leeg betekent onbeperkt) repeat type calendar nl Herhalingstype repeating event information calendar nl Afspraak herhalings informatie +repeating interval, eg. 2 to repeat every second week calendar nl herhalingsinterval, bijvoorbeeld 2 herhaalt iedere tweede week repetition calendar nl Herhalingspatroon repetitiondetails (or empty) calendar nl Details herhaling (of leeg laten) reset calendar nl Herstel +resources calendar nl Hulpmiddelen rule calendar nl Regel sa calendar nl Za sat calendar nl Zat +saves the changes made calendar nl bewaar de aangebrachte wijzigingen +saves the event ignoring the conflict calendar nl Bewaart de gebeurtenis en negeert het conflict scheduling conflict calendar nl Afspraak conflict search results calendar nl Zoekresultaten +select a %1 calendar nl Selecteer een %1 +select a time calendar nl selecteer een tijd +select resources calendar nl Selecteer hulpmiddelen +select who should get the alarm calendar nl Selecteer wie de herinnering moet ontvangen selected contacts (%1) calendar nl Geselecteerde contacten (%1) send updates via email common nl Zend aanpassingen via e-mail send/receive updates via email calendar nl Zend/ontvang aanpassingen via e-mail @@ -232,6 +327,7 @@ set a year only for one-time / non-regular holidays. calendar nl Stel een een ja set new events to private calendar nl Zet nieuwe afspraken op privé should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar nl Moeten uitnodigingen die u heeft afgewezen nog steeds worden weergegeven in uw agenda?
    U kunt ze alleen achteraf nog accepteren als ze in uw agenda worden weergegeven! (bijv. wanneer een planningsconflict is verwijderd) should new events created as private by default ? calendar nl Moeten nieuwe afspraken standaard als privé worden aangemaakt? +should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar nl Moeten niet-ingelogde personen jouw vrij/bezet informatie kunnen bekijken? Je kunt een extra wachtwoord instellen dat afwijkt van je normale wachtwoord, om deze informatie af te beveiligen. De vrij/bezet informatie is in iCal formaat en bevat uitsluitend de tijdstippen waarop je bezet bent. Het bevat niet de naam, omschrijving of locatie van de afspraak. De URL naar jouw vrij/bezet informatie is %1. should the mini calendars by printed / displayed in the printer friendly views ? calendar nl Moeten de minikalenders worden weergegeven en geprint in de printervriendelijke weergaves? should the printer friendly view be in black & white or in color (as in normal view)? calendar nl Moeten de printervriendelijke weergaves in kleur of in zwart wit worden weergegeven? should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar nl Moet de status van de afspraak-deelnemers (accepteren, afwijzen, ...) worden weergegeven tussen haakjes achter elke de namen van de deelnemers? @@ -240,16 +336,27 @@ show default view on main screen calendar nl Geeft standaard overzicht weer op b show high priority events on main screen calendar nl Evenementen met hoge prioriteit weergeven op hoofdscherm show invitations you rejected calendar nl Uitnodigingen weergeven die zijn afgewezen show list of upcoming events calendar nl Lijst weergeven van toekomstige afspraken +show next seven days calendar nl Toon volgende zeven dagen +show only one day calendar nl Toon slechts één dag +show the calendar of multiple users calendar nl toon de agenda van meerdere personen +show this month calendar nl toon deze maand +show this week calendar nl toon deze week single event calendar nl enkele afspraak +site configuration calendar nl site configuratie sorry, the owner has just deleted this event calendar nl Sorry, de eigenaar heeft deze afspraak zojuist verwijderd sorry, this event does not exist calendar nl Excuses, deze afspraak bestaat niet sorry, this event does not have exceptions defined calendar nl Excuses, deze afspraak heeft geen uitzonderingen gedefinieerd. sort by calendar nl Sorteren op -specifies the the number of intervals shown in the planner view. calendar nl Specificeerd het aantal intervallen die worden weergegeven in de plannerweergave +specifies the the number of intervals shown in the planner view. calendar nl Specificeert het aantal in de plannerweergave getoonde intervallen. +start calendar nl Start start date/time calendar nl Startdatum/ -tijd start- and enddates calendar nl Start- en einddata startdate calendar nl Startdatum +startdate / -time calendar nl Startdatum / -tijd +startdate and -time of the search calendar nl Startdatum en -tijd van de zoekopdracht +startdate of the export calendar nl Startdatum van de export startrecord calendar nl Startregel +status changed calendar nl Status gewijzigd su calendar nl Zo submit to repository calendar nl Naar repository inzenden sun calendar nl Zon @@ -259,21 +366,26 @@ text calendar nl Tekst th calendar nl Do the following conflicts with the suggested time:
      %1
    calendar nl Het volgende levert een conflict op met de voorgestelde tijd:
      %1
    the user %1 is not participating in this event! calendar nl De gebruiker %1 neemt niet deel aan deze afspraak! -there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar nl Er was een probleem tijdens de verbinding met de news server.
    Neem contact op met de beheerder om de servernaam, gebruikersnaam en wachtwoord te controleren. +there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar nl Er was een probleem tijdens de verbinding met de news server.
    Neem contact op met de beheerder om de servernaam, gebruikersnaam en wachtwoord te controleren. this day is shown as first day in the week or month view. calendar nl Deze dag wordt weergegeven als de eerste dag in de week- and maandweergave. -this defines the end of your dayview. events after this time, are shown below the dayview. calendar nl Dit definieerd het einde van uw dagweergave. Afspraken die na deze tijd plaatsvinden worden onderaan de dagweergave weergegeven. -this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar nl Dit definieerd het begin van uw dagweergave. Afspraken die voor deze tijd plaatsvinden worden boven de dagweergave weergegeven. +this defines the end of your dayview. events after this time, are shown below the dayview. calendar nl Dit definieert het einde van uw dagweergave. Afspraken die na deze tijd plaatsvinden worden onderaan de dagweergave weergegeven. +this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar nl Dit definieert het begin van uw dagweergave. Afspraken die voor deze tijd plaatsvinden worden boven de dagweergave weergegeven.
    Deze tijd wordt ook gebruikt als standaard starttijd voor nieuwe afspraken. this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar nl Deze groep is voorgeselecteerd wanneer u de planner opent. U kunt deze selectie in de planner eventueel wijzigen. this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar nl Dit wordt meestal veroorzaakt door een verkeerd geconfigureerde SMTP-server. Waarschuw uw systeembeheerder. this message is sent for canceled or deleted events. calendar nl Deze notificatie wordt verstuurd voor geannuleerde en verwijderde afspraken. this message is sent for modified or moved events. calendar nl Deze notificatie wordt verstuurd voor gewijzigde afspraken. -this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar nl Deze notificatie wordt verstuurd naar elke deelnemer van uw afspraken die notificatie voor nieuwe afspraken heeft geactiveerd.
    U kunt bepaalde plaatsvervangende woorden invullen die worden gebruikt met de gegevens van de afspraak. De eerste regel is het onderwerp van de email. -this message is sent when you accept, tentative accept or reject an event. calendar nl Deze notificatie wordt verstuurd wanneer uw afspraken accepteerd, op proef accepteerd of afwijst. -this message is sent when you set an alarm for a certain event. include all information you might need. calendar nl Deze notificatie wordt verstuur als u een alarm instelt voor een bepaalde afspraak. Geef aan welke informatie u mogelijker nodig heeft. +this message is sent to disinvited participants. calendar nl Deze notificatie wordt verstuurd aan deelnemers waarvan de uitnodiging is ingetrokken. +this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar nl Deze notificatie wordt verstuurd naar elke deelnemer van uw afspraken die notificatie voor nieuwe afspraken heeft geactiveerd.
    U kunt bepaalde plaatsvervangende woorden invullen die worden gebruikt met de gegevens van de afspraak. De eerste regel is het onderwerp van de email. +this message is sent when you accept, tentative accept or reject an event. calendar nl Deze notificatie wordt verstuurd wanneer u afspraken accepteert, op proef accepteert of afwijst. +this message is sent when you set an alarm for a certain event. include all information you might need. calendar nl Deze notificatie wordt verstuurd als u een alarm instelt voor een bepaalde afspraak. Geef aan welke informatie u mogelijker nodig heeft. this month calendar nl Deze maand this week calendar nl Deze week this year calendar nl Dit jaar +three month calendar nl drie maanden thu calendar nl Don +til calendar nl tot +timeframe calendar nl Tijdskader +timeframe to search calendar nl Tijdskader om te zoeken title calendar nl Titel title of the event calendar nl Titel van afspraak title-row calendar nl Regeltitel @@ -285,23 +397,30 @@ today calendar nl Vandaag translation calendar nl Vertaling tu calendar nl Di tue calendar nl Din +two weeks calendar nl twee weken update a single entry by passing the fields. calendar nl Werk een enkele afspraak bij door de afzonderlijke velden in te voeren. updated calendar nl Bijgewerkt use end date calendar nl Gebruik einddatum -view this entry calendar nl Deze afspraak bekijken +use the selected time and close the popup calendar nl gebruik de geselecteerde tijd en sluit het popupvenster +view this event calendar nl Bekijk deze gebeurtenis we calendar nl Wo wed calendar nl Woe week calendar nl Week weekday starts on calendar nl De week begint op +weekdays calendar nl Weekdagen +weekdays to use in search calendar nl Weekdagen waarop gezocht moet worden weekly calendar nl wekelijks weekview calendar nl Weekweergave -when creating new events default set to private calendar nl Nieuwe afspraken standaard op prive zetten +weekview with weekend calendar nl weekweergave met weekend +weekview without weekend calendar nl weekweergave zonder weekend +when creating new events default set to private calendar nl Nieuwe afspraken standaard op privé zetten which events do you want to see when you enter the calendar. calendar nl Welke afspraken wilt u zien wanneer u de agenda opent? which of calendar view do you want to see, when you start calendar ? calendar nl Welke agendaweergave wilt u zien wanneer u de agenda opent? +whole day calendar nl hele dag +wk calendar nl Wk work day ends on calendar nl Werkdag eindigt om work day starts on calendar nl Werkdag begint om workdayends calendar nl werkdag eindigt -year calendar nl Jaar yearly calendar nl Jaarlijks yearview calendar nl Jaarweergave you can either set a year or a occurence, not both !!! calendar nl U kunt of een Jaar of een Gebeurtenis in, niet beide !!! @@ -312,19 +431,15 @@ you do not have permission to enable/disable this alarm !!! calendar nl U heeft you do not have permission to read this record! calendar nl U heeft geen toegang om dit record in te lezen you have %1 high priority events on your calendar today. common nl U hebt vandaag %1 afspraken met hoge prioriteit op uw agenda staan. you have 1 high priority event on your calendar today. common nl U hebt vandaag 1 afspraak met hoge prioriteit op uw agenda staan. -you have a meeting scheduled for calendar nl U heeft een afspraak om you have a meeting scheduled for %1 calendar nl U heeft een vergadering gepland voor %1 +you have been disinvited from the meeting at %1 calendar nl Uw uitnodiging voor de bijeenkomst op %1 is ingetrokken you have not entered a title calendar nl U heeft geen titel opgegeven you have not entered a valid date calendar nl U heeft geen geldige datum opgegeven you have not entered a valid time of day calendar nl U heeft geen geldige tijd opgegeven -you have not entered a\nbrief description calendar nl U hebt geen korte\nomschrijving ingevoerd -you have not entered a\nvalid time of day. calendar nl U hebt geen geldige\n tijd ingevoerd you have not entered participants calendar nl U heeft geen deelnemers opgegeven you must enter one or more search keywords calendar nl U moet een of meer zoektermen invoeren you must select a [iv]cal. (*.[iv]cs) calendar nl U moet een iCal of vCal selecteren (*.ics of *.vcs) you need to set either a day or a occurence !!! calendar nl U moet of een Dag of een Gebeurtenis instellen !!! -your meeting scheduled for calendar nl Uw afspraak op your meeting scheduled for %1 has been canceled calendar nl U geplande vergadering voor %1 is geannuleerd. -your meeting that had been scheduled for calendar nl Uw afspraak die was op your meeting that had been scheduled for %1 has been rescheduled to %2 calendar nl Uw vergadering die stond gepland voor %1 is opnieuw ingepland naar %2 your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar nl Uw opgegeven tijd (%1 - %2) levert een conflict op met de volgende afspraken: diff --git a/calendar/setup/phpgw_no.lang b/calendar/setup/phpgw_no.lang index d413daf13c..477abd0d69 100644 --- a/calendar/setup/phpgw_no.lang +++ b/calendar/setup/phpgw_no.lang @@ -5,32 +5,48 @@ (for weekly) calendar no (for Ukentlig) (i/v)cal calendar no (i/v)Kal 1 match found calendar no 1 treff funnet +please note: the calendar use the holidays of your country, which is set to %1. you can change it in your %2.
    holidays are %3 automatic installed from %4. you can changed it in %5. calendar no Vennligst bemerk: Kalenderen bruker helligdager for ditt land som er satt til %1. Du kan endre dette i ditt %2.Helligdager er %3 automatisk lagt til for %4. Du kan endre dette til %5. a calendar no a +a non blocking event will not conflict with other events calendar no En hendelse som ikke blokkerer vil ikke være i konflikt med andre hendelser accept calendar no Godta +accept or reject an invitation calendar no Aksepter eller avslå invitasjonen accepted calendar no Godtatt action that caused the notify: added, canceled, accepted, rejected, ... calendar no Handling som utløste denne meldingen: Lagt til, Kansellert, Akseptert, Avslått, ... -add a single entry by passing the fields. calendar no Llegg til en enkel oppføring ved å hoppe over feltene. +actions calendar no Aksjoner +add a single entry by passing the fields. calendar no Legg til en enkel oppføring ved å hoppe over feltene. add alarm calendar no Legg til alarm add contact calendar no Legg til kontakt add or update a single entry by passing the fields. calendar no Legg til eller oppdater en enkel oppføring ved å hoppe over feltene. added calendar no Lagt til address book calendar no Adresseliste +after current date calendar no Etter inneværende dato alarm calendar no Alarm +alarm added calendar no Alarm lagt til +alarm deleted calendar no Alarm slettet alarm for %1 at %2 in %3 calendar no Alarm for %1 ved %2 i %3 alarm management calendar no Alarm Styring alarm-management calendar no Alarm-Styring alarms calendar no Alarmer all categories calendar no Alle kategorier all day calendar no Hele Dagen +all events calendar no Alle hendelser +all participants calendar no Alle deltagere +allows to edit the event again calendar no Tillate endring av alarmen +apply the changes calendar no Oppdater endringene are you sure you want to delete this country ? calendar no Er du sikker på at du vil slette dette landet? are you sure you want to delete this holiday ? calendar no Er du sikker på at du vil slette denne ferien? are you sure\nyou want to\ndelete these alarms? calendar no Er du sikker\npå at du vil\nslette disse alarmene? are you sure\nyou want to\ndelete this entry ? calendar no Er dy sikker\npå at du vil\nslette denne oppføringen? are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar no Er du sikker\npå at du vil\nslette denne oppføringen?\n\nDette sletter oppføringen\nfor alle brukere. are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar no Er du sikker\npå at du vil slette\ndenne enkle oppføringen?\n\nDette sletter oppføringen\nfor alle brukere. +back half a month calendar no Tilbake en halv mnd. +back one month calendar no Tilbake en mnd. +before current date calendar no For inneværende dato before the event calendar no før hendelsen brief description calendar no Kort beskrivelse business calendar no Arbeid +busy calendar no Opptatt +by calendar no av calendar common no Kalender calendar - [iv]cal importer calendar no Kalender - [iv}Kal Importer calendar - add calendar no Kalender - Legg til @@ -40,14 +56,20 @@ calendar holiday management admin no Kalender Feriestyring calendar preferences calendar no Kalender Preferanser calendar settings admin no Kalender Innstillinger calendar-fieldname calendar no Kalender-Feltnavn +can't add alarms in the past !!! calendar no Kan ikke legge til alarmer for passerte hendelser! canceled calendar no Annullert change all events for $params['old_owner'] to $params['new_owner']. calendar no Endre alle hendelser for $params['old_owner'] til $parame['new_owner']. change status calendar no Forandre Status charset of file calendar no Karaktersett i fil click %1here%2 to return to the calendar. calendar no Klikk %1her%2 for å returnere til kalenderen. +close the window calendar no Lukk vinduet +compose a mail to all participants after the event is saved calendar no Komponer en mail til alle deltagere etter at hendelsen er lagret configuration calendar no Konfigurasjon +copy of: calendar no Kopi av: +copy this event calendar no Kopier denne hendelsen countries calendar no Land country calendar no Land +create new links calendar no Opprett ny lenke created by calendar no Opprettet av csv-fieldname calendar no CSV-Feltnavn csv-filename calendar no CSV-Filnavn @@ -56,6 +78,7 @@ custom fields and sorting common no Egendefinerte felt og sortering daily calendar no Daglig daily matrix view calendar no Daglig matrisevisning days calendar no dager +days of the week for a weekly repeated event calendar no Ukedag for ukentlig repeterende hendelser days repeated calendar no dager gjentatt dayview calendar no Dagvisning default appointment length (in minutes) calendar no standard avtalelengde (i minutter) @@ -70,11 +93,16 @@ delete selected contacts calendar no Slett valgte kontakter delete selected participants calendar no Slett valgte deltagere delete series calendar no Slett en serie delete single calendar no Slett enkel +delete this alarm calendar no Slett denne alarmen +delete this event calendar no Slett denne hendelsen +delete this exception calendar no Slett dette unntaket +delete this series of recuring events calendar no Slett serie med repeterende hendelser deleted calendar no Slettet description calendar no Beskrivelse determining window width ... calendar no Bestemmer vindusbredde... disable calendar no Koble ut disabled calendar no utkoblet +disinvited calendar no Ikke lenger invitert display interval in day view calendar no Vis intervall i dagvisning display mini calendars when printing calendar no Vis små kalendere når man printer display status of events calendar no Vis Status av Hending @@ -85,22 +113,34 @@ do you want to be notified about new or changed appointments? you be notified ab do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar no Ønsker du å motta regelmessige sammendrag av dine avtaler via e-post?
    Oppsummeringen vil bli sendt til din standard e-post adresse på morgenen samme dag, eller på mandager for ukentlige sammendrag.
    Den vil bare bli sendt når du har en avtale den dagen eller uken. do you wish to autoload calendar holidays files dynamically? admin no Ønsker du å automatisk laste kalenderferiefiler? download calendar no Last ned +download this event as ical calendar no Last ned denne hendelsen som iCal duration calendar no Varighet duration of the meeting calendar no Varighet av møtet edit series calendar no Redigere Serie edit single calendar no Redigere Enkel +edit this event calendar no Endre hendelse +edit this series of recuring events calendar no Endre denne serien med repeterende hendelser email notification calendar no E-post Varsel email notification for %1 calendar no E-post Varsel for %1 empty for all calendar no tøm for alle enable calendar no Koble inn enabled calendar no innkoblet +end calendar no Slutt end date/time calendar no Slutt Dato/Tid enddate calendar no Sluttdato enddate / -time of the meeting, eg. for more then one day calendar no Sluttdato / - tid for møtet, dersom mere enn en dag. +enddate of the export calendar no Sluttdato for eksport ends calendar no slutter enter output filename: ( .vcs appended ) calendar no Skriv inn utgående filnavn: (.vcs tilføyes) +error adding the alarm calendar no Feil ved forsøk på å sette alarm +error: saving the event !!! calendar no Feil ved forsøk på lagring av hendelse! +event copied - the copy can now be edited calendar no Hendelse kopiert - kopien kan nå endres +event deleted calendar no Hendelse slettet event details follow calendar no Hendelses Detaljer Følger +event saved calendar no Hendelse lagret +event will occupy the whole day calendar no Hendelse opptar hele dagen exceptions calendar no Unntak +existing links calendar no Eksisterende lenker export calendar no Eksporter export a list of entries in ical format. calendar no Eksporter en liste over oppføringer som iCal format. extended calendar no Forlenget @@ -108,9 +148,15 @@ extended updates always include the complete event-details. ical's can be import external participants calendar no Eksterne deltagere failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar no Feil ved sending av melding til '%1' #2 emne='%3', avsender='%4' !!! fieldseparator calendar no Feltseperator +filename calendar no Filnavn +filename of the download calendar no Filnavn for nedlastingen find free timeslots where the marked participants are availible for the given timespan calendar no Finn frie tidspunkter hvor de valgte deltagerne er tilgjengelige for angitt varighet +find free timeslots where the selected participants are availible for the given timespan calendar no Finn frie tidssoner hvor de valgte deltagerne er tilgjengelig for angitt varighet. firstname of person to notify calendar no Fornavn til person som skal varsles +for calendar no for format of event updates calendar no Format på hendelsesoppdateringer +forward half a month calendar no Forover en halv mnd. +forward one month calendar no Forover en mnd. fr calendar no F free/busy calendar no Ledig/Opptatt freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar no Ledig/opptatt: Ukjent bruker '%1', feil passord eller ikke tilgjengelig når du ikke er innlogget !!! @@ -119,6 +165,7 @@ frequency calendar no Hvor ofte fri calendar no Fre full description calendar no Full beskrivelse fullname of person to notify calendar no Hele navnet til person som skal varsles +general calendar no Generell generate printer-friendly version calendar no Generer printer-vennlig versjon global categories calendar no Globale kategorier global public and group public calendar no Global offentlig og gruppe offentlig @@ -136,6 +183,7 @@ holidays calendar no Ferier hours calendar no timer how far to search (from startdate) calendar no Hvor langt skal det søkes (fra startdato) i participate calendar no Jeg deltar +ical calendar no iCal ical / rfc2445 calendar no iCal / rfc2445 if checked holidays falling on a weekend, are taken on the monday after. calendar no Hvis merket ferie faller på en helg, blir den tatt mandagen etter. if you dont set a password here, the information is available to everyone, who knows the url!!! calendar no Dersom du ikke setter et passord her vil informasjonen være tilgjengelig for alle som kjenner nettadressen ! @@ -145,6 +193,7 @@ import csv-file common no Importer CSV-Fil interval calendar no Intervall intervals in day view calendar no Intervaller i dagvisning intervals per day in planner view calendar no Intervaller per dag i planleggervisning +invalid email-address "%1" for user %2 calendar no Feil e-mailadresse "%1" for bruker %2 invalid entry id. calendar no Feil oppføringsidentifikasjon last calendar no siste lastname of person to notify calendar no Etternavn til person som skal varsles @@ -152,10 +201,15 @@ length shown
    (emtpy for full length) calendar no Lengde vist
    (tom for full length
    (<= 255) calendar no Lengde
    (<=255) link calendar no Lenke link to view the event calendar no Lenke til hendelse +links calendar no Lenker +links, attachments calendar no Lenker, tillegg list all categories. calendar no Vis alle kategorier. +listview calendar no Listevisning load [iv]cal calendar no Last [iv]Cal location calendar no Lokasjon location to autoload from admin no Lokasjon å automatisk laste fra +location, start- and endtimes, ... calendar no Lokasjon, start- og sluttid,... +mail all participants calendar no Send e-mail til deltagerne make freebusy information available to not loged in persons? calendar no Skal informasjon om ledig/opptatt være tilgjengelig for personer som ikke er pålogget ? matrixview calendar no Matrisevisning minutes calendar no minutter @@ -176,8 +230,10 @@ next day calendar no neste dag no filter calendar no uten filter no matches found calendar no Ingen treff funnet no response calendar no Ingen Respons +non blocking calendar no Ikke blokkerende notification messages for added events calendar no Varslingsmeldinger for tillagte hendelser notification messages for canceled events calendar no Varslingsmeldinger for avbrutte hendelser +notification messages for disinvited participants calendar no Varslingsmeldinger for avmeldte deltagere notification messages for modified events calendar no Varslingsmeldinger for endrede hendelser notification messages for your alarms calendar no Varslingsmeldinger for dine alarmer notification messages for your responses calendar no Varslingsmeldinger for dine responser @@ -200,11 +256,12 @@ one week calendar no en uke one year calendar no et år only the initial date of that recuring event is checked! calendar no Bare startdato for den repeterende handlingen blir kontrollert ! open todo's: calendar no Åpne gjøremål liste: -or enddate / -time calendar no eller sluttdato / -tid order calendar no Bestill overlap holiday calendar no overlapp ferie participant calendar no Deltaker participants calendar no Deltakere +participants disinvited from an event calendar no Deltagere avmeldt fra en hendelse +participants, resources, ... calendar no Deltagere, ressurser,.... participates calendar no Deltar password for not loged in users to your freebusy information? calendar no Passord for ikke påloggede brukere til din freebusy informasjon? people holiday calendar no personer ferie @@ -215,7 +272,8 @@ planner by user calendar no Planlegger for bruker please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar no Vennligst bekreft, godta, avslå eller etterse endringer i den korresponderende oppføringen i din kalender please enter a filename !!! calendar no Vennligst angi et filnavn !!! preselected group for entering the planner calendar no Forhåndsvelg gruppe når du starter planlegger -previous day calendar no foregående dag +previous calendar no Foregående +previous day calendar no Foregående dag print calendars in black & white calendar no Skriv ut kalendere i svart/hvit print the mini calendars calendar no Skriv ut de små kalenderne printer friendly calendar no Printer Vennlig @@ -230,24 +288,33 @@ read this list of methods. calendar no Les denne listen av metoder. receive email updates calendar no Motta e-post oppdateringer receive extra information in event mails calendar no Motta ekstra informasjon i hendelses e-post receive summary of appointments calendar no Motta et sammendrag av avtaler +recurrence calendar no Repeterende recurring event calendar no periodisk oppføring refresh calendar no Oppdater reinstate calendar no Sett inn på ny rejected calendar no Avslått repeat day calendar no Gjenta dag +repeat days calendar no Repeterende dag repeat end date calendar no Gjenta sluttdato +repeat the event until which date (empty means unlimited) calendar no Repeter hendelse til hvilken dato (tom setter ingen grense) repeat type calendar no Gjenta type repeating event information calendar no Gjenta oppføringsinformasjon +repeating interval, eg. 2 to repeat every second week calendar no Repeterende interval, feks. 2 for hver annen uke repetition calendar no Gjentakelse repetitiondetails (or empty) calendar no Repitasjonsdetaljer (eller tom) reset calendar no Tilbakestill +resources calendar no Ressurser rule calendar no Regel sa calendar no Lø sat calendar no Lør +saves the changes made calendar no Lagre endringene +saves the event ignoring the conflict calendar no Lagre hendelse uten hensyn til konflikt scheduling conflict calendar no Planleggingskonflikt search results calendar no Søkeresultater select a %1 calendar no Velg en %1 select a time calendar no velg en tid +select resources calendar no Velg ressurser +select who should get the alarm calendar no Velg hvem som skal motta alarmen selected contacts (%1) calendar no Velg kontakter (%1) send updates via email common no Send oppdateringer via e-post send/receive updates via email calendar no Send/Motta oppdateringer via e-post @@ -275,12 +342,15 @@ sorry, this event does not exist calendar no Beklager, denne oppf sorry, this event does not have exceptions defined calendar no Beklager, denne oppføringen har ingen unntak definert sort by calendar no Sorter etter specifies the the number of intervals shown in the planner view. calendar no Spesifiserer antall intervaller som er vist i planlegger visning. +start calendar no Start start date/time calendar no Start Dato/Tid start- and enddates calendar no Start- og Slutt-dato startdate calendar no Startdato startdate / -time calendar no Startdato /-tid startdate and -time of the search calendar no Startdato og -tid i søket +startdate of the export calendar no Startdato for eksport startrecord calendar no Startrekke +status changed calendar no Status endret su calendar no Sø submit to repository calendar no Send til Arkiv sun calendar no Søn @@ -298,6 +368,7 @@ this group that is preselected when you enter the planner. you can change it in this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar no Dette er normalt forårsaket av en feil konfigurert SMTP gjener. Meld fra til din administrator. this message is sent for canceled or deleted events. calendar no Denne meldingen blir sent for kansellerte eller slettede oppføringer. this message is sent for modified or moved events. calendar no Denne meldingen er sendt for endrede eller flyttede oppføringer +this message is sent to disinvited participants. calendar no Denne meldingen er til avmeldte deltagere. this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar no Denne meldingen blir sendt til alle deltakere på denne oppføringen som du er eier av, som har bedt om en varsling om nye oppføringer.
    Du kan bruke forskjellige alternativer som blir byttet med innholdet i denne oppføringen. Den første linjen er overskriften av e-posten. this message is sent when you accept, tentative accept or reject an event. calendar no Denne meldingen blir sendt når du godtar, forsøksvis godtar, eller avslår en oppføring. this message is sent when you set an alarm for a certain event. include all information you might need. calendar no Denne meldingen blir sendt når du har satt en Alarm for en spesiell oppføring. Inkluder all den informasjonen du trenger. @@ -320,13 +391,11 @@ today calendar no Idag translation calendar no Oversettelse tu calendar no T tue calendar no Tir -two dayview calendar no to dager -two weeks calendar no to uker update a single entry by passing the fields. calendar no oppdater en enkel oppføring ved å hoppe over feltene updated calendar no Oppdatert use end date calendar no Bruk sluttdato use the selected time and close the popup calendar no bruk valgt tid og lukk popup-vinduet -view this entry calendar no Vis denne oppføringen +view this event calendar no Vis denne hendelsen we calendar no O wed calendar no Ons week calendar no Uke @@ -335,11 +404,12 @@ weekdays calendar no Ukedager weekdays to use in search calendar no Ukedager som skal benyttes i søk weekly calendar no Ukentlig weekview calendar no Ukevisning -weekview including weekend calendar no Ukevisning inkl. helg +weekview with weekend calendar no Ukevisning inkl. helg weekview without weekend calendar no Ukevisning eksl. helg when creating new events default set to private calendar no Når du lager en ny oppføring, sett den som standard til privat which events do you want to see when you enter the calendar. calendar no Hvilke oppføringer du ønsker å se når du starter kalenderen. which of calendar view do you want to see, when you start calendar ? calendar no Hvilke kalendervisning ønsker du å se når du starter kalenderen? +whole day calendar no Hele dagen wk calendar no Uke work day ends on calendar no Arbeidsdagen ender på work day starts on calendar no Arbeidsdagen starter på @@ -355,6 +425,7 @@ you do not have permission to read this record! calendar no Du har ikke tilgang you have %1 high priority events on your calendar today. common no Du har %1 høy prioritets oppføring i din kalender i dag. you have 1 high priority event on your calendar today. common no Du har 1 høy prioritets oppføring i din kalender i dag. you have a meeting scheduled for %1 calendar no Du har ett møte planlagt for %1 +you have been disinvited from the meeting at %1 calendar no Du har blitt avmeldt fra møtet den %1 you have not entered a title calendar no Du har ikke skrevet inn en tittel you have not entered a valid date calendar no Du har ikke skrevet inn en gyldig dato you have not entered a valid time of day calendar no Du har ikke skrevet inn ett gyldig tidspunkt på dagen diff --git a/calendar/setup/phpgw_zh-tw.lang b/calendar/setup/phpgw_zh-tw.lang new file mode 100644 index 0000000000..05bc8e4ba4 --- /dev/null +++ b/calendar/setup/phpgw_zh-tw.lang @@ -0,0 +1,367 @@ +%1 %2 in %3 calendar zh-tw 在%3çš„%1 %2 +%1 matches found calendar zh-tw 共有 %1 ç­†è³‡æ–™ç¬¦åˆ +%1 records imported calendar zh-tw %1 筆資料匯入 +%1 records read (not yet imported, you may go back and uncheck test import) calendar zh-tw 讀å–了%1筆資料(還沒匯入,您必須回到上一é ä¸¦ä¸”å–消圈é¸åŒ¯å…¥æ¸¬è©¦) +(for weekly) calendar zh-tw (æ¯é€±ï¼‰ +(i/v)cal calendar zh-tw (i/v)Cal +1 match found calendar zh-tw 共有 1 ç­†è³‡æ–™ç¬¦åˆ +a calendar zh-tw 一 +accept calendar zh-tw æŽ¥å— +accepted calendar zh-tw å·²æŽ¥å— +action that caused the notify: added, canceled, accepted, rejected, ... calendar zh-tw 需è¦æ醒的æ“作:新增ã€å–消ã€æŽ¥å—ã€æ‹’絕ã€... +add a single entry by passing the fields. calendar zh-tw ä¾æ“šé€™å€‹é …目建立一個複本 +add alarm calendar zh-tw 新增警示 +add contact calendar zh-tw 新增è¯ç¹« +add or update a single entry by passing the fields. calendar zh-tw é€éŽå‚³éžæ¬„ä½ä¾†æ–°å¢žæˆ–更新一筆記錄 +added calendar zh-tw 新增日期 +address book calendar zh-tw 通訊錄 +alarm calendar zh-tw 警告 +alarm for %1 at %2 in %3 calendar zh-tw 在%3çš„%1 中 %2警告 +alarm management calendar zh-tw è­¦ç¤ºç®¡ç† +alarm-management calendar zh-tw 警告管ç†å“¡ +alarms calendar zh-tw 警告 +all categories calendar zh-tw 所有類別 +all day calendar zh-tw 所有日期 +are you sure you want to delete this country ? calendar zh-tw 您確定è¦ç§»é™¤é€™å€‹åœ‹å®¶å—Žï¼Ÿ +are you sure you want to delete this holiday ? calendar zh-tw 您確定è¦ç§»é™¤é€™å€‹å‡æ—¥å—Žï¼Ÿ +are you sure\nyou want to\ndelete these alarms? calendar zh-tw 您確定\nè¦åˆªé™¤\n這些æ醒? +are you sure\nyou want to\ndelete this entry ? calendar zh-tw 您確定è¦ç§»é™¤\n這筆資料嗎? +are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar zh-tw 您確定è¦ç§»é™¤é€™ç­†è³‡æ–™å—Žï¼Ÿ\n所有使用者的資料將一併移除。 +are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar zh-tw 您確定\n您è¦åˆªé™¤é€™å€‹æœŸé–“?\n\n這將會\n刪除所有使用者的相åŒäº‹ä»¶ã€‚ +before the event calendar zh-tw äº‹ä»¶ä¹‹å‰ +brief description calendar zh-tw 簡短敘述 +business calendar zh-tw 商務 +calendar common zh-tw 行事曆 +calendar - [iv]cal importer calendar zh-tw Calendar - [iv]Cal Importer +calendar - add calendar zh-tw 行事曆 - 新增 +calendar - edit calendar zh-tw 行事曆 - 編輯 +calendar event calendar zh-tw 日曆事件 +calendar holiday management admin zh-tw 行事曆å‡æ—¥ç®¡ç† +calendar preferences calendar zh-tw 行事曆喜好設定 +calendar settings admin zh-tw 設定行事曆 +calendar-fieldname calendar zh-tw 行事曆欄ä½å稱 +canceled calendar zh-tw å–消 +change all events for $params['old_owner'] to $params['new_owner']. calendar zh-tw 改變所有$params['old_owner']的事件給$params['new_owner']。 +change status calendar zh-tw 修改狀態 +charset of file calendar zh-tw 檔案字元編碼 +click %1here%2 to return to the calendar. calendar zh-tw é»žé¸ %1這裡%2 回到行事曆 +configuration calendar zh-tw 設定 +countries calendar zh-tw 國家 +country calendar zh-tw 國家 +created by calendar zh-tw 建立者 +csv-fieldname calendar zh-tw CSV-欄ä½å稱 +csv-filename calendar zh-tw CSV-檔案å稱 +custom fields calendar zh-tw è‡ªè¨‚æ¬„ä½ +custom fields and sorting common zh-tw 自訂欄ä½èˆ‡æŽ’åº +daily calendar zh-tw æ¯æ—¥ +daily matrix view calendar zh-tw æ¯æ—¥é™£åˆ—æª¢è¦–æ¨¡å¼ +days calendar zh-tw æ—¥ +days repeated calendar zh-tw æ—¥é‡è¦† +dayview calendar zh-tw 日行事曆 +default appointment length (in minutes) calendar zh-tw é è¨­æœƒè­°æ™‚間長度(分é˜) +default calendar filter calendar zh-tw é è¨­è¡Œäº‹æ›†éŽæ¿¾å™¨ +default calendar view calendar zh-tw é è¨­è¡Œäº‹æ›†æª¢è¦–æ¨¡å¼ +default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar zh-tw é è¨­å»ºç«‹äº‹ä»¶çš„長度(分é˜),é è¨­ç‚º60=1å°æ™‚。 +default week view calendar zh-tw é è¨­é€±æ›†æ¨¡å¼ +defines the size in minutes of the lines in the day view. calendar zh-tw 定義行事曆ç€è¦½æ™‚æ¯å€‹æ™‚段的分é˜æ•¸ +delete a single entry by passing the id. calendar zh-tw 刪除這個事件並且略éŽé€™å€‹ID +delete an entire users calendar. calendar zh-tw 刪除整個使用者的行事曆 +delete selected contacts calendar zh-tw 刪除è¯ç¹« +delete selected participants calendar zh-tw 刪除åƒèˆ‡è€… +delete series calendar zh-tw 刪除連鎖項目 +delete single calendar zh-tw 刪除單一項目 +deleted calendar zh-tw 刪除日期 +description calendar zh-tw æè¿° +determining window width ... calendar zh-tw åµæ¸¬è¦–窗寬度... +disable calendar zh-tw åœç”¨ +disabled calendar zh-tw åœç”¨ +display interval in day view calendar zh-tw æ¯æ—¥é¡¯ç¤ºçš„é–“éš” +display mini calendars when printing calendar zh-tw 列å°æ™‚顯示å°è¡Œäº‹æ›† +display status of events calendar zh-tw 顯示事件的狀態 +displayed view calendar zh-tw å·²é¡¯ç¤ºæ¨¡å¼ +displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar zh-tw 顯示您é è¨­çš„行事曆ç€è¦½æ¨¡å¼åœ¨å•Ÿå§‹é (您登入egroupWare第一個看到或是按下您的首é æŒ‰éˆ•çš„é é¢) +do you want a weekview with or without weekend? calendar zh-tw 您是å¦å¸Œæœ›é€±æ›†åŒ…å«é€±æœ«ï¼Ÿ +do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar zh-tw 您希望系統在約會新增或是修改時主動æ醒您嗎?您也會收到包括您自己更新的通知。
    您å¯ä»¥é™åˆ¶ç³»çµ±åªæ醒確定的修改。æ¯å€‹é …目包å«å®ƒä»¥ä¸Šçš„清單。所有的修改包括標題ã€æè¿°ã€åƒèˆ‡è€…的改變,但是ä¸åŒ…括åƒèˆ‡è€…的回應。如果事件的æ“有者è¦æ±‚任何æ醒,他會收到åƒèˆ‡è€…接å—或是拒絕的回應。 +do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar zh-tw 您希望定期é€éŽé›»å­éƒµä»¶æ”¶åˆ°ç³»çµ±è‡ªå‹•å¯„出的約會通知概è¦å—Žï¼Ÿ
    這個概è¦æœƒåœ¨æ¯å¤©æ—©ä¸Šå¯„出æ¯æ—¥æ¦‚è¦æˆ–是æ¯å€‹æ˜ŸæœŸä¸€å¯„出æ¯é€±æ¦‚è¦ã€‚
    它åªæœƒåœ¨é‚£ä¸€å¤©æˆ–是那一週有約會時寄出。 +do you wish to autoload calendar holidays files dynamically? admin zh-tw 您希望動態新增行事曆的å‡æ—¥å—Žï¼Ÿ +download calendar zh-tw 下載 +duration calendar zh-tw 期間 +duration of the meeting calendar zh-tw 會議期間 +edit series calendar zh-tw 編輯全系列約會 +edit single calendar zh-tw 編輯單一約會 +email notification calendar zh-tw é›»å­éƒµä»¶æ醒 +email notification for %1 calendar zh-tw %1çš„é›»å­éƒµä»¶æ醒 +empty for all calendar zh-tw 全部空白 +enable calendar zh-tw 啟用 +enabled calendar zh-tw 啟用 +end date/time calendar zh-tw çµæŸæ—¥æœŸæ™‚é–“ +enddate calendar zh-tw çµæŸæ—¥æœŸ +enddate / -time of the meeting, eg. for more then one day calendar zh-tw çµæŸæ—¥æœŸ / 會議的時間,例如超éŽä¸€å¤©çš„會議 +ends calendar zh-tw çµæŸæ—¥æœŸ +enter output filename: ( .vcs appended ) calendar zh-tw 輸入輸出檔å:(記得加上副檔å.vcs) +event details follow calendar zh-tw 事件細節 +exceptions calendar zh-tw 例外 +export calendar zh-tw 匯出 +export a list of entries in ical format. calendar zh-tw 匯出事件清單æˆç‚ºiCalæ ¼å¼ +extended calendar zh-tw 延伸的 +extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar zh-tw 延伸的更新包å«å®Œæ•´çš„事件細節,iCalæ ¼å¼å¯ä»¥è¢«å…¶ä»–行事曆軟體讀å–。 +external participants calendar zh-tw 外部åƒèˆ‡è€… +failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar zh-tw 無法傳é€å°‹çµ¦'%1'#%2 標題='%3',傳é€è€…='%4'ï¼ +fieldseparator calendar zh-tw 欄ä½åˆ†éš”å­—å…ƒ +find free timeslots where the marked participants are availible for the given timespan calendar zh-tw 找尋指定人員的行程是å¦æœ‰ç©ºæª” +firstname of person to notify calendar zh-tw 需è¦é€šçŸ¥çš„人å +format of event updates calendar zh-tw äº‹ä»¶æ›´æ–°çš„æ ¼å¼ +fr calendar zh-tw 五 +free/busy calendar zh-tw 有空/忙錄 +freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar zh-tw 狀態:ä¸çŸ¥å的使用者'%1',錯誤的密碼或是目å‰ç„¡æ³•ç™»å…¥ï¼ +freetime search calendar zh-tw 時間空檔查詢 +frequency calendar zh-tw 頻率 +fri calendar zh-tw 五 +full description calendar zh-tw 完整敘述 +fullname of person to notify calendar zh-tw 需è¦é€šçŸ¥çš„å…¨å +generate printer-friendly version calendar zh-tw 產生å‹å–„列å°ç‰ˆæœ¬ +global categories calendar zh-tw 全域類別 +global public and group public calendar zh-tw å…¨å€å…¬ç”¨åŠç¾¤çµ„公用 +global public only calendar zh-tw å…¨å€å…¬ç”¨ +go! calendar zh-tw å‡ºç™¼ï¼ +grant calendar access common zh-tw 管ç†è¡Œäº‹æ›†æ¬Šé™ +group planner calendar zh-tw 群組計畫 +group public only calendar zh-tw 群組公用 +here is your requested alarm. calendar zh-tw 這是您è¦æ±‚çš„æ醒。 +high priority calendar zh-tw 高優先權 +holiday calendar zh-tw å‡æ—¥ +holiday management calendar zh-tw å‡æ—¥ç®¡ç† +holiday-management calendar zh-tw å‡æ—¥ç®¡ç† +holidays calendar zh-tw å‡æ—¥ +hours calendar zh-tw å°æ™‚ +how far to search (from startdate) calendar zh-tw æœå°‹çš„期間(從開始日期) +i participate calendar zh-tw 我è¦åƒèˆ‡ +ical / rfc2445 calendar zh-tw iCal / rfc2445 +if checked holidays falling on a weekend, are taken on the monday after. calendar zh-tw 如果é¸æ“‡çš„å‡æ—¥å‰›å¥½æ˜¯é€±æœ«ï¼Œç³»çµ±æœƒè‡ªå‹•ç§»åˆ°æ˜ŸæœŸä¸€ã€‚ +if you dont set a password here, the information is available to everyone, who knows the url!!! calendar zh-tw 如果您在此並未設定密碼,知é“網å€çš„人就能夠讀å–。 +ignore conflict calendar zh-tw 忽略é‡ç–Šçš„約會 +import calendar zh-tw 匯入 +import csv-file common zh-tw 匯入CSV逗點分隔檔案 +interval calendar zh-tw é–“éš” +intervals in day view calendar zh-tw æ¯æ—¥ç€è¦½çš„é–“éš” +intervals per day in planner view calendar zh-tw 在計畫ç€è¦½æ¨¡å¼çš„間隔日數 +invalid entry id. calendar zh-tw 錯誤的事件ID。 +last calendar zh-tw 最後 +lastname of person to notify calendar zh-tw è¦æ醒的人å(姓) +length shown
    (emtpy for full length) calendar zh-tw 顯示長度
    (空白代表完整長度) +length
    (<= 255) calendar zh-tw 長度
    (<=255) +link calendar zh-tw é€£çµ +link to view the event calendar zh-tw äº‹ä»¶é€£çµ +list all categories. calendar zh-tw 顯示所有分類 +load [iv]cal calendar zh-tw Load [iv]Cal +location calendar zh-tw 約會ä½ç½® +location to autoload from admin zh-tw 自動讀å–çš„ä½ç½® +make freebusy information available to not loged in persons? calendar zh-tw 將行程資訊開放給未登入的人? +matrixview calendar zh-tw 基礎ç€è¦½ +minutes calendar zh-tw åˆ†é˜ +mo calendar zh-tw 一 +modified calendar zh-tw 修改日期 +modify list of external participants calendar zh-tw 外部åƒèˆ‡è€…的修改清單 +mon calendar zh-tw 一 +month calendar zh-tw 月 +monthly calendar zh-tw æ¯æœˆ +monthly (by date) calendar zh-tw æ¯æœˆï¼ˆä»¥æ—¥æœŸè¨ˆï¼‰ +monthly (by day) calendar zh-tw æ¯æœˆï¼ˆä»¥å¤©æ•¸è¨ˆï¼‰ +monthview calendar zh-tw 月行事曆 +needs javascript to be enabled !!! calendar zh-tw 您必須啟用ç€è¦½å™¨çš„javascript功能 +new entry calendar zh-tw 新增資料 +new name must not exist and not be empty!!! calendar zh-tw æ–°çš„å稱必須未存在或是ä¸èƒ½å¤ ç©ºç™½ï¼ +new search with the above parameters calendar zh-tw é€éŽä¸Šé¢çš„åƒæ•¸å¾žæ–°æœå°‹ +next day calendar zh-tw 下一天 +no filter calendar zh-tw 沒有è¦å‰‡ +no matches found calendar zh-tw 沒有找到符åˆçš„çµæžœ +no response calendar zh-tw 沒有回應 +notification messages for added events calendar zh-tw 新增事件æ醒 +notification messages for canceled events calendar zh-tw å–消事件æ醒 +notification messages for modified events calendar zh-tw 修改事件æ醒 +notification messages for your alarms calendar zh-tw 您的通知事件æ醒 +notification messages for your responses calendar zh-tw 您的回覆事件æ醒 +number of intervals per day in planner view calendar zh-tw 在計畫ç€è¦½æ¨¡å¼ä¸‹çš„間隔日數 +number of months calendar zh-tw 月數 +number of records to read (%1) calendar zh-tw 讀å–的資料筆數(%1) +observance rule calendar zh-tw éµå¾ªè¦å‰‡ +occurence calendar zh-tw 期間 +old startdate calendar zh-tw 舊的開始日期 +olddate calendar zh-tw 舊的日期 +on %1 %2 %3 your meeting request for %4 calendar zh-tw 在 %1 %2 %3 有 %4 的約會 +on all changes calendar zh-tw 所有改變 +on all modification, but responses calendar zh-tw 所有修改,除了回應 +on any time change too calendar zh-tw 任何時間改變 +on invitation / cancelation only calendar zh-tw åªæœ‰é‚€è«‹èˆ‡å–消 +on participant responses too calendar zh-tw åƒèˆ‡è€…回應時 +on time change of more than 4 hours too calendar zh-tw 在改變超éŽå››å°æ™‚後 +one month calendar zh-tw 一個月 +one week calendar zh-tw 一星期 +one year calendar zh-tw 一年 +only the initial date of that recuring event is checked! calendar zh-tw åªæœ‰é¸å–é‡è¤‡äº‹ä»¶çš„åˆå§‹æ—¥æœŸï¼ +open todo's: calendar zh-tw 未完æˆçš„待辦事項 +or enddate / -time calendar zh-tw 或çµæŸæ—¥æœŸ / 時間 +order calendar zh-tw é †åº +overlap holiday calendar zh-tw é‡ç–Šçš„å‡æ—¥ +participant calendar zh-tw 與會者 +participants calendar zh-tw 與會者 +participates calendar zh-tw åƒèˆ‡ +password for not loged in users to your freebusy information? calendar zh-tw 讓未登入使用者檢視您有空或是忙碌的密碼? +people holiday calendar zh-tw å‡æ—¥ +permission denied calendar zh-tw æ‹’çµ•å­˜å– +planner calendar zh-tw 計畫者 +planner by category calendar zh-tw 類別計畫者 +planner by user calendar zh-tw 使用者計畫者 +please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar zh-tw 請確èªã€åŒæ„ã€æ‹’絕或是檢查您的行事曆中相åŒçš„事件異動 +please enter a filename !!! calendar zh-tw 請輸入檔案åç¨±ï¼ +preselected group for entering the planner calendar zh-tw 進入計畫管ç†çš„é è¨­ç¾¤çµ„ +previous day calendar zh-tw å‰ä¸€å¤© +print calendars in black & white calendar zh-tw ä½¿ç”¨å–®è‰²åˆ—å° +print the mini calendars calendar zh-tw 列å°è¿·ä½ è¡Œäº‹æ›† +printer friendly calendar zh-tw å‹å–„åˆ—å° +privat calendar zh-tw ç§äººçš„ +private and global public calendar zh-tw ç§äººåŠå…¨å€å…¬ç”¨ +private and group public calendar zh-tw ç§äººåŠç¾¤çµ„公用 +private only calendar zh-tw ç§äºº +re-edit event calendar zh-tw é‡æ–°ç·¨è¼¯ç´„會 +read a list of entries. calendar zh-tw 讀å–事件列表 +read a single entry by passing the id and fieldlist. calendar zh-tw 從傳éžçš„ID與欄ä½æ¸…單讀å–單一事件 +read this list of methods. calendar zh-tw 讀å–這個方法的列表 +receive email updates calendar zh-tw 接收更新郵件æ醒 +receive extra information in event mails calendar zh-tw 在事件æ醒郵件中接收é¡å¤–的資訊 +receive summary of appointments calendar zh-tw æŽ¥æ”¶ç´„æœƒæ¦‚è¦ +recurring event calendar zh-tw 循環事件 +refresh calendar zh-tw é‡æ–°æ•´ç† +reinstate calendar zh-tw 復原 +rejected calendar zh-tw 拒絕 +repeat day calendar zh-tw é‡è¦†å¤©æ•¸ +repeat end date calendar zh-tw é‡è¦†çµæŸæ—¥æœŸ +repeat type calendar zh-tw é‡è¦†é¡žåž‹ +repeating event information calendar zh-tw 約會é‡è¦†è³‡è¨Š +repetition calendar zh-tw é‡è¦†ç´„會 +repetitiondetails (or empty) calendar zh-tw é‡è¤‡ç´°ç¯€(或空白) +reset calendar zh-tw é‡è¨­ +rule calendar zh-tw è¦å‰‡ +sa calendar zh-tw å…­ +sat calendar zh-tw å…­ +scheduling conflict calendar zh-tw 約會é‡ç–Š +search results calendar zh-tw æœå°‹çµæžœ +select a %1 calendar zh-tw é¸äº†ä¸€å€‹ %1 +select a time calendar zh-tw é¸æ“‡ä¸€å€‹æ™‚é–“ +selected contacts (%1) calendar zh-tw é¸æ“‡çš„è¯çµ¡äºº(%1) +send updates via email common zh-tw é€éŽé›»å­éƒµä»¶å‚³é€æœ€æ–°æ¶ˆæ¯ +send/receive updates via email calendar zh-tw é€éŽé›»å­éƒµä»¶å‚³é€/æŽ¥æ”¶æœ€æ–°æ¶ˆæ¯ +set a year only for one-time / non-regular holidays. calendar zh-tw 設定åªæœ‰ç‰¹å®šå¹´æœƒç™¼ç”Ÿçš„å‡æ—¥ +set new events to private calendar zh-tw 設定新事件為ç§äººçš„ +should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar zh-tw 您已經拒絕的邀請還è¦é¡¯ç¤ºåœ¨æ‚¨çš„行事曆中嗎?
    如果它ä»ç„¶é¡¯ç¤ºåœ¨æ‚¨çš„行事曆中,您å¯ä»¥åœ¨äº‹å¾ŒæŽ¥å—(例如原本有牴觸的行程已經å–消)它。 +should new events created as private by default ? calendar zh-tw é è¨­æ–°å¢žçš„事件是ç§äººçš„? +should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar zh-tw 沒有登入的使用者能å¦çŸ¥é“您ç¾åœ¨æ˜¯æœ‰ç©ºæˆ–是忙碌?您å¯ä»¥è¨­å®šé¡å¤–的密碼(ä¸æ˜¯è‡ªå·±ç™»å…¥çš„密碼)來é¿å…其他未經授權的人ç€è¦½ã€‚有空或是忙碌的資訊是 iCal æ ¼å¼ï¼Œè€Œä¸”åªæœƒè®“ç€è¦½çš„人看到有無行程,他們無法進一步å–得行程的詳細資料,åƒæ˜¯äº‹ä»¶å稱ã€æ述或是地點等。連çµåˆ°é€™å€‹åŠŸèƒ½çš„網å€æ˜¯ %1 。 +should the mini calendars by printed / displayed in the printer friendly views ? calendar zh-tw è¦é¡¯ç¤º/列å°çš„迷你行事曆需è¦æ”¾åœ¨å‹å–„列å°çš„é é¢ä¸­ç€è¦½å—Žï¼Ÿ +should the printer friendly view be in black & white or in color (as in normal view)? calendar zh-tw å‹å–„列å°è¦ä½¿ç”¨å–®è‰²é¡¯ç¤ºå—Žï¼Ÿ +should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar zh-tw 在æ¯å€‹åƒèˆ‡è€…å稱的後é¢éœ€è¦é¡¯ç¤ºè©²åƒèˆ‡è€…的狀態(接å—ã€æ‹’絕ã€...)嗎? +show day view on main screen calendar zh-tw 在首é é¡¯ç¤ºç•¶æ—¥è¡Œç¨‹ +show default view on main screen calendar zh-tw 在主è¦ç•«é¢é¡¯ç¤ºé è¨­ç€è¦½ +show high priority events on main screen calendar zh-tw 在首é é¡¯ç¤ºé«˜å„ªå…ˆæ¬Šçš„約會 +show invitations you rejected calendar zh-tw 顯示您已經拒絕的邀請 +show list of upcoming events calendar zh-tw 顯示å³å°‡åˆ°ä¾†çš„行程 +show next seven days calendar zh-tw 顯示下一週 +show only one day calendar zh-tw åªé¡¯ç¤ºä¸€å¤© +show the calendar of multiple users calendar zh-tw 顯示多人行事曆 +show this month calendar zh-tw 顯示這個月 +show this week calendar zh-tw 顯示這一週 +single event calendar zh-tw 單一事件 +sorry, the owner has just deleted this event calendar zh-tw 很抱歉,該約會的æ“有者剛移除了該約會 +sorry, this event does not exist calendar zh-tw 抱歉,這個事件ä¸å­˜åœ¨ +sorry, this event does not have exceptions defined calendar zh-tw 報建,這個事件並沒有例外 +sort by calendar zh-tw æŽ’åº +specifies the the number of intervals shown in the planner view. calendar zh-tw 指定計畫管ç†ç€è¦½æ¨¡å¼çš„間隔數 +start date/time calendar zh-tw 開始日期/時間 +start- and enddates calendar zh-tw 開始與çµæŸæ—¥æœŸ +startdate calendar zh-tw 開始日期 +startdate / -time calendar zh-tw 開始日期 / 時間 +startdate and -time of the search calendar zh-tw æœå°‹çš„開始日期 / 時間 +startrecord calendar zh-tw 開始紀錄 +su calendar zh-tw æ—¥ +submit to repository calendar zh-tw é€å‡ºåˆ°å„²è—庫中 +sun calendar zh-tw æ—¥ +tentative calendar zh-tw 暫定 +test import (show importable records only in browser) calendar zh-tw 測試匯入(åªæœ‰åœ¨ç€è¦½å™¨ä¸­é¡¯ç¤ºå¯ä»¥åŒ¯å…¥çš„紀錄) +text calendar zh-tw 文字 +th calendar zh-tw å›› +the following conflicts with the suggested time:
      %1
    calendar zh-tw 下列的約會和您欲加入的約會é‡ç–Šï¼š
      %1
    +the user %1 is not participating in this event! calendar zh-tw %1ä¸æ˜¯é€™å€‹äº‹ä»¶çš„åƒèˆ‡è€… +there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar zh-tw 無法連çµåˆ°æ‚¨çš„æ–°èžä¸»æ©Ÿï¼Œ
    請和網路管ç†è€…è¯çµ¡ï¼Œå”助檢查新èžä¸»æ©Ÿçš„å稱ã€ä½¿ç”¨è€…代號åŠå¯†ç¢¼ã€‚ +this day is shown as first day in the week or month view. calendar zh-tw 這一天會在週或是月行事曆中第一個顯示 +this defines the end of your dayview. events after this time, are shown below the dayview. calendar zh-tw 這定義了æ¯æ—¥è¡Œäº‹æ›†çš„çµæŸï¼Œåœ¨é€™å€‹æ™‚間之後的事件會顯示在日行事曆下é¢ã€‚ +this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar zh-tw 這定義了æ¯æ—¥è¡Œäº‹æ›†çš„開始,在這個時間之å‰çš„事件會顯示在日行事曆上é¢ã€‚
    這個時間也會是新增事件的é è¨­é–‹å§‹æ™‚間。 +this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar zh-tw 這個群組是當您進入計畫管ç†æ™‚é è¨­çš„群組,您å¯ä»¥åœ¨äº‹å¾Œä¿®æ”¹ã€‚ +this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar zh-tw 這通常是SMTP伺æœå™¨è¨­å®šéŒ¯èª¤æ‰€é€ æˆï¼Œè«‹æ醒您的管ç†å“¡ã€‚ +this message is sent for canceled or deleted events. calendar zh-tw 這個訊æ¯æ˜¯å› ç‚ºäº‹ä»¶çš„å–消或刪除 +this message is sent for modified or moved events. calendar zh-tw 這個訊æ¯æ˜¯å› ç‚ºäº‹ä»¶çš„修改或移動 +this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar zh-tw 這個訊æ¯æœƒé€çµ¦æ‚¨æ‰€æ“有的所有事件中有設定æ醒功能的åƒèˆ‡äººã€‚
    您å¯ä»¥ä½¿ç”¨äº‹ä»¶è³‡æ–™çš„替代值。第一行是郵件的標題。 +this message is sent when you accept, tentative accept or reject an event. calendar zh-tw 這個訊æ¯æœƒåœ¨æ‚¨åŒæ„ã€æš«æ™‚åŒæ„或是拒絕一個事件後寄出, +this message is sent when you set an alarm for a certain event. include all information you might need. calendar zh-tw 這個訊æ¯æœƒåœ¨æ‚¨è¨­å®šäº‹ä»¶è­¦ç¤ºæ™‚寄出,包å«ä¸€äº›æ‚¨æˆ–需需è¦çš„訊æ¯ã€‚ +this month calendar zh-tw 本月 +this week calendar zh-tw 本週 +this year calendar zh-tw 今年 +three month calendar zh-tw 一季 +thu calendar zh-tw å›› +til calendar zh-tw 到 +timeframe calendar zh-tw 時段 +timeframe to search calendar zh-tw æœå°‹çš„時段 +title calendar zh-tw 標題 +title of the event calendar zh-tw 事件標題 +title-row calendar zh-tw 事件-列 +to many might exceed your execution-time-limit calendar zh-tw 處ç†å¤ªå¤šè³‡æ–™å¯èƒ½æœƒè¶…éŽç³»çµ±å…許的處ç†æ™‚é–“ +to-firstname calendar zh-tw -å +to-fullname calendar zh-tw -å…¨å +to-lastname calendar zh-tw -姓 +today calendar zh-tw 今天 +translation calendar zh-tw 翻譯 +tu calendar zh-tw 二 +tue calendar zh-tw 二 +two dayview calendar zh-tw å…©å¤©æ¨¡å¼ +two weeks calendar zh-tw 兩週 +update a single entry by passing the fields. calendar zh-tw é€éŽç¬¬é€çš„欄ä½æ›´æ–°ä¸€å€‹å–®ä¸€äº‹ä»¶ +updated calendar zh-tw 更新日期 +use end date calendar zh-tw 有çµæŸæ—¥æœŸ +use the selected time and close the popup calendar zh-tw 使用指定的時間並且關閉彈出視窗 +view this entry calendar zh-tw 檢視此筆資料 +we calendar zh-tw 三 +wed calendar zh-tw 三 +week calendar zh-tw 星期 +weekday starts on calendar zh-tw 星期開始日 +weekdays calendar zh-tw 週日數 +weekdays to use in search calendar zh-tw æœå°‹çš„週日數 +weekly calendar zh-tw æ¯é€± +weekview calendar zh-tw 週行事曆 +weekview including weekend calendar zh-tw 週曆包å«é€±æœ« +weekview without weekend calendar zh-tw 週曆ä¸åŒ…å«é€±æœ« +when creating new events default set to private calendar zh-tw 新增約會時é è¨­ç‚ºç§äººæ€§ç´„會 +which events do you want to see when you enter the calendar. calendar zh-tw 當您進入行事曆時您希望看到什麼樣的行事曆。 +which of calendar view do you want to see, when you start calendar ? calendar zh-tw 當您開始了一個行事曆您希望看到哪個行事曆? +wk calendar zh-tw 週 +work day ends on calendar zh-tw æ¯æ—¥çµæŸæ™‚é–“ +work day starts on calendar zh-tw æ¯æ—¥é–‹å§‹æ™‚é–“ +workdayends calendar zh-tw 工作日çµæŸæ–¼ +yearly calendar zh-tw æ¯å¹´ +yearview calendar zh-tw 年行事曆 +you can either set a year or a occurence, not both !!! calendar zh-tw 您å¯ä»¥è¨­å®šä¸€å€‹æœŸé–“或是星期幾,ä¸èƒ½å…©è€…都é¸ï¼ +you can only set a year or a occurence !!! calendar zh-tw 您åªå¯ä»¥è¨­å®šä¸€å¹´æˆ–æ˜¯ä¸€å€‹äº‹ä»¶ï¼ +you do not have permission to add alarms to this event !!! calendar zh-tw 您沒有權é™æ–°å¢žé€™å€‹äº‹ä»¶çš„ +you do not have permission to delete this alarm !!! calendar zh-tw 您沒有刪除這個警報的權é™ï¼ +you do not have permission to enable/disable this alarm !!! calendar zh-tw 您沒有啟用/關閉這個警報的權é™ï¼ +you do not have permission to read this record! calendar zh-tw 您沒有讀å–這個紀錄的權é™ï¼ +you have %1 high priority events on your calendar today. common zh-tw 您今天有 %1 個高é‡è¦æ€§çš„約會。 +you have 1 high priority event on your calendar today. common zh-tw 您今天有 1 個高é‡è¦æ€§çš„約會。 +you have a meeting scheduled for %1 calendar zh-tw 您跟%1有個行程 +you have not entered a title calendar zh-tw 您沒有輸入約會主題 +you have not entered a valid date calendar zh-tw 您沒有輸入正確的日期 +you have not entered a valid time of day calendar zh-tw 您沒有輸入正確的時間 +you have not entered participants calendar zh-tw 您沒有é¸æ“‡èˆ‡æœƒè€… +you must enter one or more search keywords calendar zh-tw 您必需輸入一個或一個以上的關éµå­— +you must select a [iv]cal. (*.[iv]cs) calendar zh-tw 您必須é¸æ“‡ä¸€å€‹ [iv]Cal. (*.[iv]cs) +you need to set either a day or a occurence !!! calendar zh-tw æ‚¨å¿…é ˆè¨­å®šä¸€å€‹æ—¥æœŸæˆ–æ˜¯ä¸€å€‹æœŸé–“ï¼ +your meeting scheduled for %1 has been canceled calendar zh-tw 您與%1的行程已經å–消了 +your meeting that had been scheduled for %1 has been rescheduled to %2 calendar zh-tw 您與%1的行程已經é‡æ–°å®‰æŽ’到%2 +your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar zh-tw 您所使用的約會時間 %1 - %2 和下列的約會é‡ç–Šï¼š diff --git a/calendar/setup/phpgw_zt.lang b/calendar/setup/phpgw_zt.lang deleted file mode 100644 index 72f9db74e3..0000000000 --- a/calendar/setup/phpgw_zt.lang +++ /dev/null @@ -1,375 +0,0 @@ -%1 %2 in %3 calendar zt 在%3çš„%1 %2 -%1 matches found calendar zt 共有 %1 ç­†è³‡æ–™ç¬¦åˆ -%1 records imported calendar zt %1 筆資料匯入 -%1 records read (not yet imported, you may go back and uncheck test import) calendar zt 讀å–了%1筆資料(還沒匯入,您必須回到上一é ä¸¦ä¸”å–消圈é¸åŒ¯å…¥æ¸¬è©¦) -(for weekly) calendar zt (æ¯é€±ï¼‰ -(i/v)cal calendar zt (i/v)Cal -1 match found calendar zt 共有 1 ç­†è³‡æ–™ç¬¦åˆ -a calendar zt 一 -accept calendar zt æŽ¥å— -accepted calendar zt å·²æŽ¥å— -action that caused the notify: added, canceled, accepted, rejected, ... calendar zt 需è¦æ醒的æ“作:新增ã€å–消ã€æŽ¥å—ã€æ‹’絕ã€... -add a single entry by passing the fields. calendar zt ä¾æ“šé€™å€‹é …目建立一個複本 -add alarm calendar zt 新增警示 -add contact calendar zt 新增è¯ç¹« -add or update a single entry by passing the fields. calendar zt é€éŽå‚³éžæ¬„ä½ä¾†æ–°å¢žæˆ–更新一筆記錄 -added calendar zt 新增日期 -address book calendar zt 通訊錄 -alarm calendar zt 警告 -alarm for %1 at %2 in %3 calendar zt 在%3çš„%1 中 %2警告 -alarm management calendar zt è­¦ç¤ºç®¡ç† -alarm-management calendar zt 警告管ç†å“¡ -alarms calendar zt 警告 -all categories calendar zt 所有類別 -all day calendar zt 所有日期 -are you sure you want to delete this country ? calendar zt 您確定è¦ç§»é™¤é€™å€‹åœ‹å®¶å—Žï¼Ÿ -are you sure you want to delete this holiday ? calendar zt 您確定è¦ç§»é™¤é€™å€‹å‡æ—¥å—Žï¼Ÿ -are you sure\nyou want to\ndelete these alarms? calendar zt 您確定\nè¦åˆªé™¤\n這些æ醒? -are you sure\nyou want to\ndelete this entry ? calendar zt 您確定è¦ç§»é™¤\n這筆資料嗎? -are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar zt 您確定è¦ç§»é™¤é€™ç­†è³‡æ–™å—Žï¼Ÿ\n所有使用者的資料將一併移除。 -are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar zt 您確定\n您è¦åˆªé™¤é€™å€‹æœŸé–“?\n\n這將會\n刪除所有使用者的相åŒäº‹ä»¶ã€‚ -before the event calendar zt äº‹ä»¶ä¹‹å‰ -brief description calendar zt 簡短敘述 -business calendar zt 商務 -calendar common zt 行事曆 -calendar - [iv]cal importer calendar zt Calendar - [iv]Cal Importer -calendar - add calendar zt 行事曆 - 新增 -calendar - edit calendar zt 行事曆 - 編輯 -calendar event calendar zt 日曆事件 -calendar holiday management admin zt 行事曆å‡æ—¥ç®¡ç† -calendar preferences calendar zt 行事曆喜好設定 -calendar settings admin zt 設定行事曆 -calendar-fieldname calendar zt 行事曆欄ä½å稱 -canceled calendar zt å–消 -change all events for $params['old_owner'] to $params['new_owner']. calendar zt 改變所有$params['old_owner']的事件給$params['new_owner']。 -change status calendar zt 修改狀態 -charset of file calendar zt 檔案字元編碼 -click %1here%2 to return to the calendar. calendar zt é»žé¸ %1這裡%2 回到行事曆 -configuration calendar zt 設定 -countries calendar zt 國家 -country calendar zt 國家 -created by calendar zt 建立者 -csv-fieldname calendar zt CSV-欄ä½å稱 -csv-filename calendar zt CSV-檔案å稱 -custom fields calendar zt è‡ªè¨‚æ¬„ä½ -custom fields and sorting common zt 自訂欄ä½èˆ‡æŽ’åº -daily calendar zt æ¯æ—¥ -daily matrix view calendar zt æ¯æ—¥é™£åˆ—æª¢è¦–æ¨¡å¼ -days calendar zt æ—¥ -days repeated calendar zt æ—¥é‡è¦† -dayview calendar zt 日行事曆 -default appointment length (in minutes) calendar zt é è¨­æœƒè­°æ™‚間長度(分é˜) -default calendar filter calendar zt é è¨­è¡Œäº‹æ›†éŽæ¿¾å™¨ -default calendar view calendar zt é è¨­è¡Œäº‹æ›†æª¢è¦–æ¨¡å¼ -default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar zt é è¨­å»ºç«‹äº‹ä»¶çš„長度(分é˜),é è¨­ç‚º60=1å°æ™‚。 -default week view calendar zt é è¨­é€±æ›†æ¨¡å¼ -defines the size in minutes of the lines in the day view. calendar zt 定義行事曆ç€è¦½æ™‚æ¯å€‹æ™‚段的分é˜æ•¸ -delete a single entry by passing the id. calendar zt 刪除這個事件並且略éŽé€™å€‹ID -delete an entire users calendar. calendar zt 刪除整個使用者的行事曆 -delete selected contacts calendar zt 刪除è¯ç¹« -delete selected participants calendar zt 刪除åƒèˆ‡è€… -delete series calendar zt 刪除連鎖項目 -delete single calendar zt 刪除單一項目 -deleted calendar zt 刪除日期 -description calendar zt æè¿° -determining window width ... calendar zt åµæ¸¬è¦–窗寬度... -disable calendar zt åœç”¨ -disabled calendar zt åœç”¨ -display interval in day view calendar zt æ¯æ—¥é¡¯ç¤ºçš„é–“éš” -display mini calendars when printing calendar zt 列å°æ™‚顯示å°è¡Œäº‹æ›† -display status of events calendar zt 顯示事件的狀態 -displayed view calendar zt å·²é¡¯ç¤ºæ¨¡å¼ -displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar zt 顯示您é è¨­çš„行事曆ç€è¦½æ¨¡å¼åœ¨å•Ÿå§‹é (您登入egroupWare第一個看到或是按下您的首é æŒ‰éˆ•çš„é é¢) -do you want a weekview with or without weekend? calendar zt 您是å¦å¸Œæœ›é€±æ›†åŒ…å«é€±æœ«ï¼Ÿ -do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar zt 您希望系統在約會新增或是修改時主動æ醒您嗎?您也會收到包括您自己更新的通知。
    您å¯ä»¥é™åˆ¶ç³»çµ±åªæ醒確定的修改。æ¯å€‹é …目包å«å®ƒä»¥ä¸Šçš„清單。所有的修改包括標題ã€æè¿°ã€åƒèˆ‡è€…的改變,但是ä¸åŒ…括åƒèˆ‡è€…的回應。如果事件的æ“有者è¦æ±‚任何æ醒,他會收到åƒèˆ‡è€…接å—或是拒絕的回應。 -do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar zt 您希望定期é€éŽé›»å­éƒµä»¶æ”¶åˆ°ç³»çµ±è‡ªå‹•å¯„出的約會通知概è¦å—Žï¼Ÿ
    這個概è¦æœƒåœ¨æ¯å¤©æ—©ä¸Šå¯„出æ¯æ—¥æ¦‚è¦æˆ–是æ¯å€‹æ˜ŸæœŸä¸€å¯„出æ¯é€±æ¦‚è¦ã€‚
    它åªæœƒåœ¨é‚£ä¸€å¤©æˆ–是那一週有約會時寄出。 -do you wish to autoload calendar holidays files dynamically? admin zt 您希望動態新增行事曆的å‡æ—¥å—Žï¼Ÿ -download calendar zt 下載 -duration calendar zt 期間 -duration of the meeting calendar zt 會議期間 -edit series calendar zt 編輯全系列約會 -edit single calendar zt 編輯單一約會 -email notification calendar zt é›»å­éƒµä»¶æ醒 -email notification for %1 calendar zt %1çš„é›»å­éƒµä»¶æ醒 -empty for all calendar zt 全部空白 -enable calendar zt 啟用 -enabled calendar zt 啟用 -end date/time calendar zt çµæŸæ—¥æœŸæ™‚é–“ -enddate calendar zt çµæŸæ—¥æœŸ -enddate / -time of the meeting, eg. for more then one day calendar zt çµæŸæ—¥æœŸ / 會議的時間,例如超éŽä¸€å¤©çš„會議 -ends calendar zt çµæŸæ—¥æœŸ -enter output filename: ( .vcs appended ) calendar zt 輸入輸出檔å:(記得加上副檔å.vcs) -event details follow calendar zt 事件細節 -exceptions calendar zt 例外 -export calendar zt 匯出 -export a list of entries in ical format. calendar zt 匯出事件清單æˆç‚ºiCalæ ¼å¼ -extended calendar zt 延伸的 -extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar zt 延伸的更新包å«å®Œæ•´çš„事件細節,iCalæ ¼å¼å¯ä»¥è¢«å…¶ä»–行事曆軟體讀å–。 -external participants calendar zt 外部åƒèˆ‡è€… -failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar zt 無法傳é€å°‹çµ¦'%1'#%2 標題='%3',傳é€è€…='%4'ï¼ -fieldseparator calendar zt 欄ä½åˆ†éš”å­—å…ƒ -find free timeslots where the marked participants are availible for the given timespan calendar zt 找尋指定人員的行程是å¦æœ‰ç©ºæª” -firstname of person to notify calendar zt 需è¦é€šçŸ¥çš„人å -format of event updates calendar zt äº‹ä»¶æ›´æ–°çš„æ ¼å¼ -fr calendar zt 五 -free/busy calendar zt 有空/忙錄 -freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar zt 狀態:ä¸çŸ¥å的使用者'%1',錯誤的密碼或是目å‰ç„¡æ³•ç™»å…¥ï¼ -freetime search calendar zt 時間空檔查詢 -frequency calendar zt 頻率 -fri calendar zt 五 -full description calendar zt 完整敘述 -fullname of person to notify calendar zt 需è¦é€šçŸ¥çš„å…¨å -generate printer-friendly version calendar zt 產生å‹å–„列å°ç‰ˆæœ¬ -global categories calendar zt 全域類別 -global public and group public calendar zt å…¨å€å…¬ç”¨åŠç¾¤çµ„公用 -global public only calendar zt å…¨å€å…¬ç”¨ -go! calendar zt å‡ºç™¼ï¼ -grant calendar access common zt 管ç†è¡Œäº‹æ›†æ¬Šé™ -group planner calendar zt 群組計畫 -group public only calendar zt 群組公用 -here is your requested alarm. calendar zt 這是您è¦æ±‚çš„æ醒。 -high priority calendar zt 高優先權 -holiday calendar zt å‡æ—¥ -holiday management calendar zt å‡æ—¥ç®¡ç† -holiday-management calendar zt å‡æ—¥ç®¡ç† -holidays calendar zt å‡æ—¥ -hours calendar zt å°æ™‚ -how far to search (from startdate) calendar zt æœå°‹çš„期間(從開始日期) -i participate calendar zt 我è¦åƒèˆ‡ -ical / rfc2445 calendar zt iCal / rfc2445 -if checked holidays falling on a weekend, are taken on the monday after. calendar zt 如果é¸æ“‡çš„å‡æ—¥å‰›å¥½æ˜¯é€±æœ«ï¼Œç³»çµ±æœƒè‡ªå‹•ç§»åˆ°æ˜ŸæœŸä¸€ã€‚ -if you dont set a password here, the information is available to everyone, who knows the url!!! calendar zt 如果您在此並未設定密碼,知é“網å€çš„人就能夠讀å–。 -if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar zt 如果您沒有在這裡設定密碼,所有的人都å¯ä»¥çœ‹åˆ°æ‚¨çš„è³‡è¨Šï¼ -ignore conflict calendar zt 忽略é‡ç–Šçš„約會 -import calendar zt 匯入 -import csv-file common zt 匯入CSV逗點分隔檔案 -import csv-file into calendar calendar zt 匯入CSV檔案到行事曆 -interval calendar zt é–“éš” -intervals in day view calendar zt æ¯æ—¥ç€è¦½çš„é–“éš” -intervals per day in planner view calendar zt 在計畫ç€è¦½æ¨¡å¼çš„間隔日數 -invalid entry id. calendar zt 錯誤的事件ID。 -last calendar zt 最後 -lastname of person to notify calendar zt è¦æ醒的人å(姓) -length shown
    (emtpy for full length) calendar zt 顯示長度
    (空白代表完整長度) -length
    (<= 255) calendar zt 長度
    (<=255) -link calendar zt é€£çµ -link to view the event calendar zt äº‹ä»¶é€£çµ -list all categories. calendar zt 顯示所有分類 -load [iv]cal calendar zt Load [iv]Cal -location calendar zt 約會ä½ç½® -location to autoload from admin zt 自動讀å–çš„ä½ç½® -make freebusy information available to not loged in persons? calendar zt 將行程資訊開放給未登入的人? -make freebusy information availible to not loged in persons? calendar zt 讓未登入的使用者ç€è¦½æ‚¨ç›®å‰æ˜¯æœ‰ç©ºæˆ–是忙碌中? -matrixview calendar zt 基礎ç€è¦½ -minutes calendar zt åˆ†é˜ -mo calendar zt 一 -modified calendar zt 修改日期 -modify list of external participants calendar zt 外部åƒèˆ‡è€…的修改清單 -mon calendar zt 一 -month calendar zt 月 -monthly calendar zt æ¯æœˆ -monthly (by date) calendar zt æ¯æœˆï¼ˆä»¥æ—¥æœŸè¨ˆï¼‰ -monthly (by day) calendar zt æ¯æœˆï¼ˆä»¥å¤©æ•¸è¨ˆï¼‰ -monthview calendar zt 月行事曆 -needs javascript to be enabled !!! calendar zt 您必須啟用ç€è¦½å™¨çš„javascript功能 -new entry calendar zt 新增資料 -new name must not exist and not be empty!!! calendar zt æ–°çš„å稱必須未存在或是ä¸èƒ½å¤ ç©ºç™½ï¼ -new search with the above parameters calendar zt é€éŽä¸Šé¢çš„åƒæ•¸å¾žæ–°æœå°‹ -next day calendar zt 下一天 -no filter calendar zt 沒有è¦å‰‡ -no matches found calendar zt 沒有找到符åˆçš„çµæžœ -no matches found. calendar zt 沒有找到符åˆçš„資料 -no repsonse calendar zt 沒有回應 -no response calendar zt 沒有回應 -notification messages for added events calendar zt 新增事件æ醒 -notification messages for canceled events calendar zt å–消事件æ醒 -notification messages for modified events calendar zt 修改事件æ醒 -notification messages for your alarms calendar zt 您的通知事件æ醒 -notification messages for your responses calendar zt 您的回覆事件æ醒 -number of intervals per day in planner view calendar zt 在計畫ç€è¦½æ¨¡å¼ä¸‹çš„間隔日數 -number of months calendar zt 月數 -number of records to read (%1) calendar zt 讀å–的資料筆數(%1) -number of records to read (<=200) calendar zt 讀å–的資料筆數(<=200) -observance rule calendar zt éµå¾ªè¦å‰‡ -occurence calendar zt 期間 -old startdate calendar zt 舊的開始日期 -olddate calendar zt 舊的日期 -on %1 %2 %3 your meeting request for %4 calendar zt 在 %1 %2 %3 有 %4 的約會 -on all changes calendar zt 所有改變 -on all modification, but responses calendar zt 所有修改,除了回應 -on any time change too calendar zt 任何時間改變 -on invitation / cancelation only calendar zt åªæœ‰é‚€è«‹èˆ‡å–消 -on participant responses too calendar zt åƒèˆ‡è€…回應時 -on time change of more than 4 hours too calendar zt 在改變超éŽå››å°æ™‚後 -one month calendar zt 一個月 -one week calendar zt 一星期 -one year calendar zt 一年 -only the initial date of that recuring event is checked! calendar zt åªæœ‰é¸å–é‡è¤‡äº‹ä»¶çš„åˆå§‹æ—¥æœŸï¼ -open todo's: calendar zt 未完æˆçš„待辦事項 -or enddate / -time calendar zt 或çµæŸæ—¥æœŸ / 時間 -order calendar zt é †åº -overlap holiday calendar zt é‡ç–Šçš„å‡æ—¥ -participant calendar zt 與會者 -participants calendar zt 與會者 -participates calendar zt åƒèˆ‡ -password for not loged in users to your freebusy information? calendar zt 讓未登入使用者檢視您有空或是忙碌的密碼? -people holiday calendar zt å‡æ—¥ -permission denied calendar zt æ‹’çµ•å­˜å– -planner calendar zt 計畫者 -planner by category calendar zt 類別計畫者 -planner by user calendar zt 使用者計畫者 -please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar zt 請確èªã€åŒæ„ã€æ‹’絕或是檢查您的行事曆中相åŒçš„事件異動 -please enter a filename !!! calendar zt 請輸入檔案åç¨±ï¼ -preselected group for entering the planner calendar zt 進入計畫管ç†çš„é è¨­ç¾¤çµ„ -previous day calendar zt å‰ä¸€å¤© -print calendars in black & white calendar zt ä½¿ç”¨å–®è‰²åˆ—å° -print the mini calendars calendar zt 列å°è¿·ä½ è¡Œäº‹æ›† -printer friendly calendar zt å‹å–„åˆ—å° -privat calendar zt ç§äººçš„ -private and global public calendar zt ç§äººåŠå…¨å€å…¬ç”¨ -private and group public calendar zt ç§äººåŠç¾¤çµ„公用 -private only calendar zt ç§äºº -re-edit event calendar zt é‡æ–°ç·¨è¼¯ç´„會 -read a list of entries. calendar zt 讀å–事件列表 -read a single entry by passing the id and fieldlist. calendar zt 從傳éžçš„ID與欄ä½æ¸…單讀å–單一事件 -read this list of methods. calendar zt 讀å–這個方法的列表 -receive email updates calendar zt 接收更新郵件æ醒 -receive extra information in event mails calendar zt 在事件æ醒郵件中接收é¡å¤–的資訊 -receive summary of appointments calendar zt æŽ¥æ”¶ç´„æœƒæ¦‚è¦ -recurring event calendar zt 循環事件 -refresh calendar zt é‡æ–°æ•´ç† -reinstate calendar zt 復原 -reject calendar zt 拒絕 -rejected calendar zt 拒絕 -repeat day calendar zt é‡è¦†å¤©æ•¸ -repeat end date calendar zt é‡è¦†çµæŸæ—¥æœŸ -repeat type calendar zt é‡è¦†é¡žåž‹ -repeating event information calendar zt 約會é‡è¦†è³‡è¨Š -repetition calendar zt é‡è¦†ç´„會 -repetitiondetails (or empty) calendar zt é‡è¤‡ç´°ç¯€(或空白) -reset calendar zt é‡è¨­ -rule calendar zt è¦å‰‡ -sa calendar zt å…­ -sat calendar zt å…­ -scheduling conflict calendar zt 約會é‡ç–Š -search results calendar zt æœå°‹çµæžœ -select a %1 calendar zt é¸äº†ä¸€å€‹ %1 -select a time calendar zt é¸æ“‡ä¸€å€‹æ™‚é–“ -selected contacts (%1) calendar zt é¸æ“‡çš„è¯çµ¡äºº(%1) -send updates via email common zt é€éŽé›»å­éƒµä»¶å‚³é€æœ€æ–°æ¶ˆæ¯ -send/receive updates via email calendar zt é€éŽé›»å­éƒµä»¶å‚³é€/æŽ¥æ”¶æœ€æ–°æ¶ˆæ¯ -set a year only for one-time / non-regular holidays. calendar zt 設定åªæœ‰ç‰¹å®šå¹´æœƒç™¼ç”Ÿçš„å‡æ—¥ -set new events to private calendar zt 設定新事件為ç§äººçš„ -should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar zt 您已經拒絕的邀請還è¦é¡¯ç¤ºåœ¨æ‚¨çš„行事曆中嗎?
    如果它ä»ç„¶é¡¯ç¤ºåœ¨æ‚¨çš„行事曆中,您å¯ä»¥åœ¨äº‹å¾ŒæŽ¥å—(例如原本有牴觸的行程已經å–消)它。 -should new events created as private by default ? calendar zt é è¨­æ–°å¢žçš„事件是ç§äººçš„? -should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar zt 沒有登入的使用者能å¦çŸ¥é“您ç¾åœ¨æ˜¯æœ‰ç©ºæˆ–是忙碌?您å¯ä»¥è¨­å®šé¡å¤–的密碼(ä¸æ˜¯è‡ªå·±ç™»å…¥çš„密碼)來é¿å…其他未經授權的人ç€è¦½ã€‚有空或是忙碌的資訊是 iCal æ ¼å¼ï¼Œè€Œä¸”åªæœƒè®“ç€è¦½çš„人看到有無行程,他們無法進一步å–得行程的詳細資料,åƒæ˜¯äº‹ä»¶å稱ã€æ述或是地點等。連çµåˆ°é€™å€‹åŠŸèƒ½çš„網å€æ˜¯ %1 。 -should the mini calendars by printed / displayed in the printer friendly views ? calendar zt è¦é¡¯ç¤º/列å°çš„迷你行事曆需è¦æ”¾åœ¨å‹å–„列å°çš„é é¢ä¸­ç€è¦½å—Žï¼Ÿ -should the printer friendly view be in black & white or in color (as in normal view)? calendar zt å‹å–„列å°è¦ä½¿ç”¨å–®è‰²é¡¯ç¤ºå—Žï¼Ÿ -should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar zt 在æ¯å€‹åƒèˆ‡è€…å稱的後é¢éœ€è¦é¡¯ç¤ºè©²åƒèˆ‡è€…的狀態(接å—ã€æ‹’絕ã€...)嗎? -show day view on main screen calendar zt 在首é é¡¯ç¤ºç•¶æ—¥è¡Œç¨‹ -show default view on main screen calendar zt 在主è¦ç•«é¢é¡¯ç¤ºé è¨­ç€è¦½ -show high priority events on main screen calendar zt 在首é é¡¯ç¤ºé«˜å„ªå…ˆæ¬Šçš„約會 -show invitations you rejected calendar zt 顯示您已經拒絕的邀請 -show list of upcoming events calendar zt 顯示å³å°‡åˆ°ä¾†çš„行程 -show next seven days calendar zt 顯示下一週 -show only one day calendar zt åªé¡¯ç¤ºä¸€å¤© -show the calendar of multiple users calendar zt 顯示多人行事曆 -show this month calendar zt 顯示這個月 -show this week calendar zt 顯示這一週 -single event calendar zt 單一事件 -sorry, the owner has just deleted this event calendar zt 很抱歉,該約會的æ“有者剛移除了該約會 -sorry, this event does not exist calendar zt 抱歉,這個事件ä¸å­˜åœ¨ -sorry, this event does not have exceptions defined calendar zt 報建,這個事件並沒有例外 -sort by calendar zt æŽ’åº -specifies the the number of intervals shown in the planner view. calendar zt 指定計畫管ç†ç€è¦½æ¨¡å¼çš„間隔數 -start date/time calendar zt 開始日期/時間 -start- and enddates calendar zt 開始與çµæŸæ—¥æœŸ -startdate calendar zt 開始日期 -startdate / -time calendar zt 開始日期 / 時間 -startdate and -time of the search calendar zt æœå°‹çš„開始日期 / 時間 -startrecord calendar zt 開始紀錄 -su calendar zt æ—¥ -submit to repository calendar zt é€å‡ºåˆ°å„²è—庫中 -sun calendar zt æ—¥ -tentative calendar zt 暫定 -test import (show importable records only in browser) calendar zt 測試匯入(åªæœ‰åœ¨ç€è¦½å™¨ä¸­é¡¯ç¤ºå¯ä»¥åŒ¯å…¥çš„紀錄) -text calendar zt 文字 -th calendar zt å›› -the following conflicts with the suggested time:
      %1
    calendar zt 下列的約會和您欲加入的約會é‡ç–Šï¼š
      %1
    -the user %1 is not participating in this event! calendar zt %1ä¸æ˜¯é€™å€‹äº‹ä»¶çš„åƒèˆ‡è€… -there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar zt 無法連çµåˆ°æ‚¨çš„æ–°èžä¸»æ©Ÿï¼Œ
    請和網路管ç†è€…è¯çµ¡ï¼Œå”助檢查新èžä¸»æ©Ÿçš„å稱ã€ä½¿ç”¨è€…代號åŠå¯†ç¢¼ã€‚ -this day is shown as first day in the week or month view. calendar zt 這一天會在週或是月行事曆中第一個顯示 -this defines the end of your dayview. events after this time, are shown below the dayview. calendar zt 這定義了æ¯æ—¥è¡Œäº‹æ›†çš„çµæŸï¼Œåœ¨é€™å€‹æ™‚間之後的事件會顯示在日行事曆下é¢ã€‚ -this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar zt 這定義了æ¯æ—¥è¡Œäº‹æ›†çš„開始,在這個時間之å‰çš„事件會顯示在日行事曆上é¢ã€‚
    這個時間也會是新增事件的é è¨­é–‹å§‹æ™‚間。 -this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar zt 這個群組是當您進入計畫管ç†æ™‚é è¨­çš„群組,您å¯ä»¥åœ¨äº‹å¾Œä¿®æ”¹ã€‚ -this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar zt 這通常是SMTP伺æœå™¨è¨­å®šéŒ¯èª¤æ‰€é€ æˆï¼Œè«‹æ醒您的管ç†å“¡ã€‚ -this message is sent for canceled or deleted events. calendar zt 這個訊æ¯æ˜¯å› ç‚ºäº‹ä»¶çš„å–消或刪除 -this message is sent for modified or moved events. calendar zt 這個訊æ¯æ˜¯å› ç‚ºäº‹ä»¶çš„修改或移動 -this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar zt 這個訊æ¯æœƒé€çµ¦æ‚¨æ‰€æ“有的所有事件中有設定æ醒功能的åƒèˆ‡äººã€‚
    您å¯ä»¥ä½¿ç”¨äº‹ä»¶è³‡æ–™çš„替代值。第一行是郵件的標題。 -this message is sent when you accept, tentative accept or reject an event. calendar zt 這個訊æ¯æœƒåœ¨æ‚¨åŒæ„ã€æš«æ™‚åŒæ„或是拒絕一個事件後寄出, -this message is sent when you set an alarm for a certain event. include all information you might need. calendar zt 這個訊æ¯æœƒåœ¨æ‚¨è¨­å®šäº‹ä»¶è­¦ç¤ºæ™‚寄出,包å«ä¸€äº›æ‚¨æˆ–需需è¦çš„訊æ¯ã€‚ -this month calendar zt 本月 -this week calendar zt 本週 -this year calendar zt 今年 -three month calendar zt 一季 -thu calendar zt å›› -til calendar zt 到 -timeframe calendar zt 時段 -timeframe to search calendar zt æœå°‹çš„時段 -title calendar zt 標題 -title of the event calendar zt 事件標題 -title-row calendar zt 事件-列 -to many might exceed your execution-time-limit calendar zt 處ç†å¤ªå¤šè³‡æ–™å¯èƒ½æœƒè¶…éŽç³»çµ±å…許的處ç†æ™‚é–“ -to-firstname calendar zt -å -to-fullname calendar zt -å…¨å -to-lastname calendar zt -姓 -today calendar zt 今天 -translation calendar zt 翻譯 -tu calendar zt 二 -tue calendar zt 二 -two dayview calendar zt å…©å¤©æ¨¡å¼ -two weeks calendar zt 兩週 -update a single entry by passing the fields. calendar zt é€éŽç¬¬é€çš„欄ä½æ›´æ–°ä¸€å€‹å–®ä¸€äº‹ä»¶ -updated calendar zt 更新日期 -use end date calendar zt 有çµæŸæ—¥æœŸ -use the selected time and close the popup calendar zt 使用指定的時間並且關閉彈出視窗 -view this entry calendar zt 檢視此筆資料 -we calendar zt 三 -wed calendar zt 三 -week calendar zt 星期 -weekday starts on calendar zt 星期開始日 -weekdays calendar zt 週日數 -weekdays to use in search calendar zt æœå°‹çš„週日數 -weekly calendar zt æ¯é€± -weekview calendar zt 週行事曆 -weekview including weekend calendar zt 週曆包å«é€±æœ« -weekview without weekend calendar zt 週曆ä¸åŒ…å«é€±æœ« -when creating new events default set to private calendar zt 新增約會時é è¨­ç‚ºç§äººæ€§ç´„會 -which events do you want to see when you enter the calendar. calendar zt 當您進入行事曆時您希望看到什麼樣的行事曆。 -which of calendar view do you want to see, when you start calendar ? calendar zt 當您開始了一個行事曆您希望看到哪個行事曆? -wk calendar zt 週 -work day ends on calendar zt æ¯æ—¥çµæŸæ™‚é–“ -work day starts on calendar zt æ¯æ—¥é–‹å§‹æ™‚é–“ -workdayends calendar zt 工作日çµæŸæ–¼ -year calendar zt å¹´ -yearly calendar zt æ¯å¹´ -yearview calendar zt 年行事曆 -you can either set a year or a occurence, not both !!! calendar zt 您å¯ä»¥è¨­å®šä¸€å€‹æœŸé–“或是星期幾,ä¸èƒ½å…©è€…都é¸ï¼ -you can only set a year or a occurence !!! calendar zt 您åªå¯ä»¥è¨­å®šä¸€å¹´æˆ–æ˜¯ä¸€å€‹äº‹ä»¶ï¼ -you do not have permission to add alarms to this event !!! calendar zt 您沒有權é™æ–°å¢žé€™å€‹äº‹ä»¶çš„ -you do not have permission to delete this alarm !!! calendar zt 您沒有刪除這個警報的權é™ï¼ -you do not have permission to enable/disable this alarm !!! calendar zt 您沒有啟用/關閉這個警報的權é™ï¼ -you do not have permission to read this record! calendar zt 您沒有讀å–這個紀錄的權é™ï¼ -you have %1 high priority events on your calendar today. common zt 您今天有 %1 個高é‡è¦æ€§çš„約會。 -you have 1 high priority event on your calendar today. common zt 您今天有 1 個高é‡è¦æ€§çš„約會。 -you have a meeting scheduled for %1 calendar zt 您跟%1有個行程 -you have not entered a title calendar zt 您沒有輸入約會主題 -you have not entered a valid date calendar zt 您沒有輸入正確的日期 -you have not entered a valid time of day calendar zt 您沒有輸入正確的時間 -you have not entered participants calendar zt 您沒有é¸æ“‡èˆ‡æœƒè€… -you must enter one or more search keywords calendar zt 您必需輸入一個或一個以上的關éµå­— -you must select a [iv]cal. (*.[iv]cs) calendar zt 您必須é¸æ“‡ä¸€å€‹ [iv]Cal. (*.[iv]cs) -you need to set either a day or a occurence !!! calendar zt æ‚¨å¿…é ˆè¨­å®šä¸€å€‹æ—¥æœŸæˆ–æ˜¯ä¸€å€‹æœŸé–“ï¼ -your meeting scheduled for %1 has been canceled calendar zt 您與%1的行程已經å–消了 -your meeting that had been scheduled for %1 has been rescheduled to %2 calendar zt 您與%1的行程已經é‡æ–°å®‰æŽ’到%2 -your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar zt 您所使用的約會時間 %1 - %2 和下列的約會é‡ç–Šï¼š diff --git a/calendar/setup/setup.inc.php b/calendar/setup/setup.inc.php index 1afd4f641c..24fafbe070 100755 --- a/calendar/setup/setup.inc.php +++ b/calendar/setup/setup.inc.php @@ -12,50 +12,45 @@ /* $Id$ */ $setup_info['calendar']['name'] = 'calendar'; - $setup_info['calendar']['version'] = '1.0.0.005'; + $setup_info['calendar']['version'] = '1.0.1.009'; $setup_info['calendar']['app_order'] = 3; $setup_info['calendar']['enable'] = 1; - $setup_info['calendar']['author'] = 'Mark Peters'; $setup_info['calendar']['license'] = 'GPL'; $setup_info['calendar']['description'] = - 'Powerful calendar with meeting request system and ACL security.'; - $setup_info['calendar']['note'] = - 'Originaly based on Webcalendar by Craig Knudsen.

    - '; - $setup_info['calendar']['maintainer'] = array( + 'Powerful group calendar with meeting request system and ACL security.'; + $setup_info['calendar']['note'] = + 'The calendar has been completly rewritten for eGroupWare 1.2.'; + $setup_info['calendar']['author'] = $setup_info['calendar']['maintainer'] = array( 'name' => 'Ralf Becker', 'email' => 'RalfBecker@outdoor-training.de' ); - $setup_info['calendar']['tables'][] = 'phpgw_cal'; - $setup_info['calendar']['tables'][] = 'phpgw_cal_holidays'; - $setup_info['calendar']['tables'][] = 'phpgw_cal_repeats'; - $setup_info['calendar']['tables'][] = 'phpgw_cal_user'; - $setup_info['calendar']['tables'][] = 'phpgw_cal_extra'; + $setup_info['calendar']['tables'][] = 'egw_cal'; + $setup_info['calendar']['tables'][] = 'egw_cal_holidays'; + $setup_info['calendar']['tables'][] = 'egw_cal_repeats'; + $setup_info['calendar']['tables'][] = 'egw_cal_user'; + $setup_info['calendar']['tables'][] = 'egw_cal_extra'; + $setup_info['calendar']['tables'][] = 'egw_cal_dates'; /* The hooks this app includes, needed for hooks registration */ $setup_info['calendar']['hooks'][] = 'add_def_prefs'; $setup_info['calendar']['hooks'][] = 'admin'; $setup_info['calendar']['hooks'][] = 'deleteaccount'; - $setup_info['calendar']['hooks'][] = 'email'; $setup_info['calendar']['hooks'][] = 'home'; - $setup_info['calendar']['hooks'][] = 'home_day'; - $setup_info['calendar']['hooks'][] = 'home_month'; - $setup_info['calendar']['hooks'][] = 'home_week'; - $setup_info['calendar']['hooks'][] = 'home_year'; $setup_info['calendar']['hooks'][] = 'preferences'; $setup_info['calendar']['hooks'][] = 'settings'; $setup_info['calendar']['hooks']['sidebox_menu'] = 'calendar.uical.sidebox_menu'; + $setup_info['calendar']['hooks']['search_link'] = 'calendar.bocal.search_link'; /* Dependencies for this app to work */ $setup_info['calendar']['depends'][] = array( 'appname' => 'phpgwapi', - 'versions' => Array('0.9.14','0.9.15','0.9.16','1.0.0','1.0.1') + 'versions' => Array('1.0.0','1.0.1','1.2') ); $setup_info['calendar']['depends'][] = array( 'appname' => 'etemplate', - 'versions' => Array('1.0.0','1.0.1') + 'versions' => Array('1.0.0','1.0.1','1.2') ); @@ -63,3 +58,12 @@ + + + + + + + + + diff --git a/calendar/setup/tables_current.inc.php b/calendar/setup/tables_current.inc.php index 0164d6e135..f82652583f 100644 --- a/calendar/setup/tables_current.inc.php +++ b/calendar/setup/tables_current.inc.php @@ -12,30 +12,29 @@ /* $Id$ */ $phpgw_baseline = array( - 'phpgw_cal' => array( + 'egw_cal' => array( 'fd' => array( 'cal_id' => array('type' => 'auto','nullable' => False), 'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False), - 'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False), + 'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False), 'cal_category' => array('type' => 'varchar','precision' => '30'), 'cal_groups' => array('type' => 'varchar','precision' => '255'), - 'cal_starttime' => array('type' => 'int','precision' => '8'), 'cal_modified' => array('type' => 'int','precision' => '8'), - 'cal_endtime' => array('type' => 'int','precision' => '8'), - 'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'), - 'cal_type' => array('type' => 'varchar','precision' => '10'), - 'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'), + 'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'), + 'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1'), 'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'), 'cal_description' => array('type' => 'text'), 'cal_location' => array('type' => 'varchar','precision' => '255'), - 'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0') + 'cal_reference' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'), + 'cal_modifier' => array('type' => 'int','precision' => '4'), + 'cal_non_blocking' => array('type' => 'int','precision' => '2','default' => '0') ), 'pk' => array('cal_id'), 'fk' => array(), 'ix' => array(), 'uc' => array() ), - 'phpgw_cal_holidays' => array( + 'egw_cal_holidays' => array( 'fd' => array( 'hol_id' => array('type' => 'auto','nullable' => False), 'hol_locale' => array('type' => 'char','precision' => '2','nullable' => False), @@ -51,34 +50,35 @@ 'ix' => array('hol_locale'), 'uc' => array() ), - 'phpgw_cal_repeats' => array( + 'egw_cal_repeats' => array( 'fd' => array( - 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False), - 'recur_type' => array('type' => 'int','precision' => '8','nullable' => False), - 'recur_use_end' => array('type' => 'int','precision' => '8','default' => '0'), + 'cal_id' => array('type' => 'int','precision' => '4','nullable' => False), + 'recur_type' => array('type' => 'int','precision' => '2','nullable' => False), 'recur_enddate' => array('type' => 'int','precision' => '8'), - 'recur_interval' => array('type' => 'int','precision' => '8','default' => '1'), - 'recur_data' => array('type' => 'int','precision' => '8','default' => '1'), - 'recur_exception' => array('type' => 'varchar','precision' => '255','default' => '') + 'recur_interval' => array('type' => 'int','precision' => '2','default' => '1'), + 'recur_data' => array('type' => 'int','precision' => '2','default' => '1'), + 'recur_exception' => array('type' => 'text') ), 'pk' => array('cal_id'), 'fk' => array(), 'ix' => array(), 'uc' => array() ), - 'phpgw_cal_user' => array( + 'egw_cal_user' => array( 'fd' => array( - 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'), - 'cal_user_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'), + 'cal_id' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'), + 'cal_recur_date' => array('type' => 'int','precision' => '8','default' => '0'), + 'cal_user_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u'), + 'cal_user_id' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'), 'cal_status' => array('type' => 'char','precision' => '1','default' => 'A'), - 'cal_user_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u') + 'cal_quantity' => array('type' => 'int','precision' => '4','default' => '1') ), - 'pk' => array('cal_id','cal_user_id','cal_user_type'), + 'pk' => array('cal_id','cal_recur_date','cal_user_type','cal_user_id'), 'fk' => array(), 'ix' => array(), 'uc' => array() ), - 'phpgw_cal_extra' => array( + 'egw_cal_extra' => array( 'fd' => array( 'cal_id' => array('type' => 'int','precision' => '4','nullable' => False), 'cal_extra_name' => array('type' => 'varchar','precision' => '40','nullable' => False), @@ -88,6 +88,16 @@ 'fk' => array(), 'ix' => array(), 'uc' => array() + ), + 'egw_cal_dates' => array( + 'fd' => array( + 'cal_id' => array('type' => 'int','precision' => '4','nullable' => False), + 'cal_start' => array('type' => 'int','precision' => '8','nullable' => False), + 'cal_end' => array('type' => 'int','precision' => '8','nullable' => False) + ), + 'pk' => array('cal_id','cal_start'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() ) ); -?> diff --git a/calendar/setup/tables_update.inc.php b/calendar/setup/tables_update.inc.php index 0b15df5a50..622d149183 100644 --- a/calendar/setup/tables_update.inc.php +++ b/calendar/setup/tables_update.inc.php @@ -13,14 +13,14 @@ function calendar_v0_9_2to0_9_3update_owner($table, $field) { - $GLOBALS['phpgw_setup']->oProc->query("select distinct($field) from $table"); - if ($GLOBALS['phpgw_setup']->oProc->num_rows()) + $GLOBALS['egw_setup']->oProc->query("select distinct($field) from $table"); + if ($GLOBALS['egw_setup']->oProc->num_rows()) { - while ($GLOBALS['phpgw_setup']->oProc->next_record()) + while ($GLOBALS['egw_setup']->oProc->next_record()) { - $owner[count($owner)] = $GLOBALS['phpgw_setup']->oProc->f($field); + $owner[count($owner)] = $GLOBALS['egw_setup']->oProc->f($field); } - if($GLOBALS['phpgw_setup']->alessthanb($GLOBALS['setup_info']['phpgwapi']['currentver'],'0.9.10pre4')) + if($GLOBALS['egw_setup']->alessthanb($GLOBALS['setup_info']['phpgwapi']['currentver'],'0.9.10pre4')) { $acctstbl = 'accounts'; } @@ -30,12 +30,12 @@ } for($i=0;$ioProc->query("SELECT account_id FROM $acctstbl WHERE account_lid='".$owner[$i]."'"); - $GLOBALS['phpgw_setup']->oProc->next_record(); - $GLOBALS['phpgw_setup']->oProc->query("UPDATE $table SET $field=".$GLOBALS['phpgw_setup']->oProc->f('account_id')." WHERE $field='".$owner[$i]."'"); + $GLOBALS['egw_setup']->oProc->query("SELECT account_id FROM $acctstbl WHERE account_lid='".$owner[$i]."'"); + $GLOBALS['egw_setup']->oProc->next_record(); + $GLOBALS['egw_setup']->oProc->query("UPDATE $table SET $field=".$GLOBALS['egw_setup']->oProc->f('account_id')." WHERE $field='".$owner[$i]."'"); } } - $GLOBALS['phpgw_setup']->oProc->AlterColumn($table, $field, array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => 0)); + $GLOBALS['egw_setup']->oProc->AlterColumn($table, $field, array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => 0)); } @@ -117,8 +117,8 @@ $test[] = '0.9.4pre2'; function calendar_upgrade0_9_4pre2() { - $GLOBALS['phpgw_setup']->oProc->RenameColumn('webcal_entry', 'cal_create_by', 'cal_owner'); - $GLOBALS['phpgw_setup']->oProc->AlterColumn('webcal_entry', 'cal_owner', array('type' => 'int', 'precision' => 4, 'nullable' => false)); + $GLOBALS['egw_setup']->oProc->RenameColumn('webcal_entry', 'cal_create_by', 'cal_owner'); + $GLOBALS['egw_setup']->oProc->AlterColumn('webcal_entry', 'cal_owner', array('type' => 'int', 'precision' => 4, 'nullable' => false)); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre3'; return $GLOBALS['setup_info']['calendar']['currentver']; } @@ -175,18 +175,9 @@ $test[] = '0.9.7pre1'; function calendar_upgrade0_9_7pre1() { - $db2 = $GLOBALS['phpgw_setup']->db; + $db2 = clone($GLOBALS['egw_setup']->db); - if($GLOBALS['phpgw_setup']->alessthanb($GLOBALS['setup_info']['phpgwapi']['currentver'],'0.9.10pre8')) - { - $appstable = 'applications'; - } - else - { - $appstable = 'phpgw_applications'; - } - - $GLOBALS['phpgw_setup']->oProc->CreateTable('calendar_entry', + $GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry', Array( 'fd' => array( 'cal_id' => array('type' => 'auto', 'nullable' => false), @@ -208,23 +199,23 @@ ) ); - $GLOBALS['phpgw_setup']->oProc->query('SELECT count(*) FROM webcal_entry',__LINE__,__FILE__); - $GLOBALS['phpgw_setup']->oProc->next_record(); - if($GLOBALS['phpgw_setup']->oProc->f(0)) + $GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry',__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->next_record(); + if($GLOBALS['egw_setup']->oProc->f(0)) { - $GLOBALS['phpgw_setup']->oProc->query('SELECT cal_id,cal_owner,cal_duration,cal_priority,cal_type,cal_access,cal_name,cal_description,cal_id,cal_date,cal_time,cal_mod_date,cal_mod_time FROM webcal_entry ORDER BY cal_id',__LINE__,__FILE__); - while($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_owner,cal_duration,cal_priority,cal_type,cal_access,cal_name,cal_description,cal_id,cal_date,cal_time,cal_mod_date,cal_mod_time FROM webcal_entry ORDER BY cal_id',__LINE__,__FILE__); + while($GLOBALS['egw_setup']->oProc->next_record()) { - $cal_id = $GLOBALS['phpgw_setup']->oProc->f('cal_id'); - $cal_owner = $GLOBALS['phpgw_setup']->oProc->f('cal_owner'); - $cal_duration = $GLOBALS['phpgw_setup']->oProc->f('cal_duration'); - $cal_priority = $GLOBALS['phpgw_setup']->oProc->f('cal_priority'); - $cal_type = $GLOBALS['phpgw_setup']->oProc->f('cal_type'); - $cal_access = $GLOBALS['phpgw_setup']->oProc->f('cal_access'); - $cal_name = $GLOBALS['phpgw_setup']->oProc->f('cal_name'); - $cal_description = $GLOBALS['phpgw_setup']->oProc->f('cal_description'); - $datetime = mktime(intval(strrev(substr(strrev($GLOBALS['phpgw_setup']->oProc->f('cal_time')),4))),intval(strrev(substr(strrev($GLOBALS['phpgw_setup']->oProc->f('cal_time')),2,2))),intval(strrev(substr(strrev($GLOBALS['phpgw_setup']->oProc->f('cal_time')),0,2))),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_date'),4,2)),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_date'),6,2)),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_date'),0,4))); - $moddatetime = mktime(intval(strrev(substr(strrev($GLOBALS['phpgw_setup']->oProc->f('cal_mod_time')),4))),intval(strrev(substr(strrev($GLOBALS['phpgw_setup']->oProc->f('cal_mod_time')),2,2))),intval(strrev(substr(strrev($GLOBALS['phpgw_setup']->oProc->f('cal_mod_time')),0,2))),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_mod_date'),4,2)),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_mod_date'),6,2)),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_mod_date'),0,4))); + $cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id'); + $cal_owner = $GLOBALS['egw_setup']->oProc->f('cal_owner'); + $cal_duration = $GLOBALS['egw_setup']->oProc->f('cal_duration'); + $cal_priority = $GLOBALS['egw_setup']->oProc->f('cal_priority'); + $cal_type = $GLOBALS['egw_setup']->oProc->f('cal_type'); + $cal_access = $GLOBALS['egw_setup']->oProc->f('cal_access'); + $cal_name = $GLOBALS['egw_setup']->oProc->f('cal_name'); + $cal_description = $GLOBALS['egw_setup']->oProc->f('cal_description'); + $datetime = mktime(intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_time')),4))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_time')),2,2))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_time')),0,2))),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_date'),4,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_date'),6,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_date'),0,4))); + $moddatetime = mktime(intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_mod_time')),4))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_mod_time')),2,2))),intval(strrev(substr(strrev($GLOBALS['egw_setup']->oProc->f('cal_mod_time')),0,2))),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_mod_date'),4,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_mod_date'),6,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_mod_date'),0,4))); $db2->query('SELECT groups FROM webcal_entry_groups WHERE cal_id='.$cal_id,__LINE__,__FILE__); $db2->next_record(); $cal_group = $db2->f('groups'); @@ -233,10 +224,10 @@ } } - $GLOBALS['phpgw_setup']->oProc->DropTable('webcal_entry_groups'); - $GLOBALS['phpgw_setup']->oProc->DropTable('webcal_entry'); + $GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_groups'); + $GLOBALS['egw_setup']->oProc->DropTable('webcal_entry'); - $GLOBALS['phpgw_setup']->oProc->CreateTable('calendar_entry_user', + $GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry_user', Array( 'fd' => array( 'cal_id' => array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => '0'), @@ -250,23 +241,23 @@ ) ); - $GLOBALS['phpgw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_user',__LINE__,__FILE__); - $GLOBALS['phpgw_setup']->oProc->next_record(); - if($GLOBALS['phpgw_setup']->oProc->f(0)) + $GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_user',__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->next_record(); + if($GLOBALS['egw_setup']->oProc->f(0)) { - $GLOBALS['phpgw_setup']->oProc->query('SELECT cal_id,cal_login,cal_status FROM webcal_entry_user ORDER BY cal_id',__LINE__,__FILE__); - while($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_login,cal_status FROM webcal_entry_user ORDER BY cal_id',__LINE__,__FILE__); + while($GLOBALS['egw_setup']->oProc->next_record()) { - $cal_id = $GLOBALS['phpgw_setup']->oProc->f('cal_id'); - $cal_login = $GLOBALS['phpgw_setup']->oProc->f('cal_login'); - $cal_status = $GLOBALS['phpgw_setup']->oProc->f('cal_status'); + $cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id'); + $cal_login = $GLOBALS['egw_setup']->oProc->f('cal_login'); + $cal_status = $GLOBALS['egw_setup']->oProc->f('cal_status'); $db2->query('INSERT INTO calendar_entry_user(cal_id,cal_login,cal_status) VALUES('.$cal_id.','.$cal_login.",'".$cal_status."')",__LINE__,__FILE__); } } - $GLOBALS['phpgw_setup']->oProc->DropTable('webcal_entry_user'); + $GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_user'); - $GLOBALS['phpgw_setup']->oProc->CreateTable('calendar_entry_repeats', + $GLOBALS['egw_setup']->oProc->CreateTable('calendar_entry_repeats', Array( 'fd' => array( 'cal_id' => array('type' => 'int', 'precision' => 4, 'default' => '0', 'nullable' => false), @@ -283,18 +274,18 @@ ) ); - $GLOBALS['phpgw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_repeats',__LINE__,__FILE__); - $GLOBALS['phpgw_setup']->oProc->next_record(); - if($GLOBALS['phpgw_setup']->oProc->f(0)) + $GLOBALS['egw_setup']->oProc->query('SELECT count(*) FROM webcal_entry_repeats',__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->next_record(); + if($GLOBALS['egw_setup']->oProc->f(0)) { - $GLOBALS['phpgw_setup']->oProc->query('SELECT cal_id,cal_type,cal_end,cal_frequency,cal_days FROM webcal_entry_repeats ORDER BY cal_id',__LINE__,__FILE__); - while($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_type,cal_end,cal_frequency,cal_days FROM webcal_entry_repeats ORDER BY cal_id',__LINE__,__FILE__); + while($GLOBALS['egw_setup']->oProc->next_record()) { - $cal_id = $GLOBALS['phpgw_setup']->oProc->f('cal_id'); - $cal_type = $GLOBALS['phpgw_setup']->oProc->f('cal_type'); - if(isset($GLOBALS['phpgw_setup']->oProc->Record['cal_end'])) + $cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id'); + $cal_type = $GLOBALS['egw_setup']->oProc->f('cal_type'); + if(isset($GLOBALS['egw_setup']->oProc->Record['cal_end'])) { - $enddate = mktime(0,0,0,intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_end'),4,2)),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_end'),6,2)),intval(substr($GLOBALS['phpgw_setup']->oProc->f('cal_end'),0,4))); + $enddate = mktime(0,0,0,intval(substr($GLOBALS['egw_setup']->oProc->f('cal_end'),4,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_end'),6,2)),intval(substr($GLOBALS['egw_setup']->oProc->f('cal_end'),0,4))); $useend = 1; } else @@ -302,14 +293,14 @@ $enddate = 0; $useend = 0; } - $cal_frequency = $GLOBALS['phpgw_setup']->oProc->f('cal_frequency'); - $cal_days = $GLOBALS['phpgw_setup']->oProc->f('cal_days'); + $cal_frequency = $GLOBALS['egw_setup']->oProc->f('cal_frequency'); + $cal_days = $GLOBALS['egw_setup']->oProc->f('cal_days'); $db2->query('INSERT INTO calendar_entry_repeats(cal_id,cal_type,cal_use_end,cal_end,cal_frequency,cal_days) VALUES('.$cal_id.",'".$cal_type."',".$useend.",".$enddate.",".$cal_frequency.",'".$cal_days."')",__LINE__,__FILE__); } } - $GLOBALS['phpgw_setup']->oProc->DropTable('webcal_entry_repeats'); - $GLOBALS['phpgw_setup']->oProc->query("UPDATE $appstable SET app_tables='calendar_entry,calendar_entry_user,calendar_entry_repeats' WHERE app_name='calendar'",__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->DropTable('webcal_entry_repeats'); + $GLOBALS['egw_setup']->oProc->query("UPDATE {$GLOBALS['egw_setup']->applications_table} SET app_tables='calendar_entry,calendar_entry_user,calendar_entry_repeats' WHERE app_name='calendar'",__LINE__,__FILE__); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.7pre2'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -318,21 +309,21 @@ $test[] = "0.9.7pre2"; function calendar_upgrade0_9_7pre2() { - $db2 = $GLOBALS['phpgw_setup']->db; + $db2 = $GLOBALS['egw_setup']->db; - $GLOBALS['phpgw_setup']->oProc->RenameColumn('calendar_entry', 'cal_duration', 'cal_edatetime'); - $GLOBALS['phpgw_setup']->oProc->query('SELECT cal_id,cal_datetime,cal_owner,cal_edatetime,cal_mdatetime FROM calendar_entry ORDER BY cal_id',__LINE__,__FILE__); - if($GLOBALS['phpgw_setup']->oProc->num_rows()) + $GLOBALS['egw_setup']->oProc->RenameColumn('calendar_entry', 'cal_duration', 'cal_edatetime'); + $GLOBALS['egw_setup']->oProc->query('SELECT cal_id,cal_datetime,cal_owner,cal_edatetime,cal_mdatetime FROM calendar_entry ORDER BY cal_id',__LINE__,__FILE__); + if($GLOBALS['egw_setup']->oProc->num_rows()) { - while($GLOBALS['phpgw_setup']->oProc->next_record()) + while($GLOBALS['egw_setup']->oProc->next_record()) { - $db2->query("SELECT preference_value FROM preferences WHERE preference_name='tz_offset' AND preference_appname='common' AND preference_owner=".$GLOBALS['phpgw_setup']->db->f('cal_owner'),__LINE__,__FILE__); + $db2->query("SELECT preference_value FROM preferences WHERE preference_name='tz_offset' AND preference_appname='common' AND preference_owner=".$GLOBALS['egw_setup']->db->f('cal_owner'),__LINE__,__FILE__); $db2->next_record(); $tz = $db2->f('preference_value'); - $cal_id = $GLOBALS['phpgw_setup']->oProc->f('cal_id'); - $datetime = $GLOBALS['phpgw_setup']->oProc->f('cal_datetime') - ((60 * 60) * $tz); - $mdatetime = $GLOBALS['phpgw_setup']->oProc->f('cal_mdatetime') - ((60 * 60) * $tz); - $edatetime = $datetime + (60 * $GLOBALS['phpgw_setup']->oProc->f('cal_edatetime')); + $cal_id = $GLOBALS['egw_setup']->oProc->f('cal_id'); + $datetime = $GLOBALS['egw_setup']->oProc->f('cal_datetime') - ((60 * 60) * $tz); + $mdatetime = $GLOBALS['egw_setup']->oProc->f('cal_mdatetime') - ((60 * 60) * $tz); + $edatetime = $datetime + (60 * $GLOBALS['egw_setup']->oProc->f('cal_edatetime')); $db2->query('UPDATE calendar_entry SET cal_datetime='.$datetime.', cal_edatetime='.$edatetime.', cal_mdatetime='.$mdatetime.' WHERE cal_id='.$cal_id,__LINE__,__FILE__); } } @@ -579,7 +570,7 @@ $test[] = '0.9.11.001'; function calendar_upgrade0_9_11_001() { - $db2 = $GLOBALS['phpgw_setup']->db; + $db2 = $GLOBALS['egw_setup']->db; if(extension_loaded('mcal') == False) { @@ -600,7 +591,7 @@ } // calendar_entry => phpgw_cal - $GLOBALS['phpgw_setup']->oProc->CreateTable('phpgw_cal', + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal', Array( 'fd' => array( 'cal_id' => array('type' => 'auto', 'nullable' => False), @@ -623,12 +614,12 @@ ) ); - $GLOBALS['phpgw_setup']->oProc->query('SELECT * FROM calendar_entry',__LINE__,__FILE__); - while($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query('SELECT * FROM calendar_entry',__LINE__,__FILE__); + while($GLOBALS['egw_setup']->oProc->next_record()) { - $id = $GLOBALS['phpgw_setup']->oProc->f('cal_id'); - $owner = $GLOBALS['phpgw_setup']->oProc->f('cal_owner'); - $access = $GLOBALS['phpgw_setup']->oProc->f('cal_access'); + $id = $GLOBALS['egw_setup']->oProc->f('cal_id'); + $owner = $GLOBALS['egw_setup']->oProc->f('cal_owner'); + $access = $GLOBALS['egw_setup']->oProc->f('cal_access'); switch($access) { case 'private': @@ -641,22 +632,22 @@ $is_public = 2; break; } - $groups = $GLOBALS['phpgw_setup']->oProc->f('cal_group'); - $datetime = $GLOBALS['phpgw_setup']->oProc->f('cal_datetime'); - $mdatetime = $GLOBALS['phpgw_setup']->oProc->f('cal_mdatetime'); - $edatetime = $GLOBALS['phpgw_setup']->oProc->f('cal_edatetime'); - $priority = $GLOBALS['phpgw_setup']->oProc->f('cal_priority'); - $type = $GLOBALS['phpgw_setup']->oProc->f('cal_type'); - $title = $GLOBALS['phpgw_setup']->oProc->f('cal_name'); - $description = $GLOBALS['phpgw_setup']->oProc->f('cal_description'); + $groups = $GLOBALS['egw_setup']->oProc->f('cal_group'); + $datetime = $GLOBALS['egw_setup']->oProc->f('cal_datetime'); + $mdatetime = $GLOBALS['egw_setup']->oProc->f('cal_mdatetime'); + $edatetime = $GLOBALS['egw_setup']->oProc->f('cal_edatetime'); + $priority = $GLOBALS['egw_setup']->oProc->f('cal_priority'); + $type = $GLOBALS['egw_setup']->oProc->f('cal_type'); + $title = $GLOBALS['egw_setup']->oProc->f('cal_name'); + $description = $GLOBALS['egw_setup']->oProc->f('cal_description'); $db2->query("INSERT INTO phpgw_cal(cal_id,owner,groups,datetime,mdatetime,edatetime,priority,cal_type,is_public,title,description) " . "VALUES($id,$owner,'$groups',$datetime,$mdatetime,$edatetime,$priority,'$type',$is_public,'$title','$description')",__LINE__,__FILE__); } - $GLOBALS['phpgw_setup']->oProc->DropTable('calendar_entry'); + $GLOBALS['egw_setup']->oProc->DropTable('calendar_entry'); // calendar_entry_repeats => phpgw_cal_repeats - $GLOBALS['phpgw_setup']->oProc->CreateTable('phpgw_cal_repeats', + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_repeats', Array( 'fd' => array( 'cal_id' => array('type' => 'int', 'precision' => 8,'nullable' => False), @@ -672,11 +663,11 @@ 'uc' => array() ) ); - $GLOBALS['phpgw_setup']->oProc->query('SELECT * FROM calendar_entry_repeats',__LINE__,__FILE__); - while($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query('SELECT * FROM calendar_entry_repeats',__LINE__,__FILE__); + while($GLOBALS['egw_setup']->oProc->next_record()) { - $id = $GLOBALS['phpgw_setup']->oProc->f('cal_id'); - $recur_type = $GLOBALS['phpgw_setup']->oProc->f('cal_type'); + $id = $GLOBALS['egw_setup']->oProc->f('cal_id'); + $recur_type = $GLOBALS['egw_setup']->oProc->f('cal_type'); switch($recur_type) { case 'daily': @@ -695,10 +686,10 @@ $recur_type_num = RECUR_YEARLY; break; } - $recur_end_use = $GLOBALS['phpgw_setup']->oProc->f('cal_use_end'); - $recur_end = $GLOBALS['phpgw_setup']->oProc->f('cal_end'); - $recur_interval = $GLOBALS['phpgw_setup']->oProc->f('cal_frequency'); - $days = strtoupper($GLOBALS['phpgw_setup']->oProc->f('cal_days')); + $recur_end_use = $GLOBALS['egw_setup']->oProc->f('cal_use_end'); + $recur_end = $GLOBALS['egw_setup']->oProc->f('cal_end'); + $recur_interval = $GLOBALS['egw_setup']->oProc->f('cal_frequency'); + $days = strtoupper($GLOBALS['egw_setup']->oProc->f('cal_days')); $recur_data = 0; $recur_data += (substr($days,0,1)=='Y'?M_SUNDAY:0); $recur_data += (substr($days,1,1)=='Y'?M_MONDAY:0); @@ -710,10 +701,10 @@ $db2->query("INSERT INTO phpgw_cal_repeats(cal_id,recur_type,recur_use_end,recur_enddate,recur_interval,recur_data) " . "VALUES($id,$recur_type_num,$recur_use_end,$recur_end,$recur_interval,$recur_data)",__LINE__,__FILE__); } - $GLOBALS['phpgw_setup']->oProc->DropTable('calendar_entry_repeats'); + $GLOBALS['egw_setup']->oProc->DropTable('calendar_entry_repeats'); // calendar_entry_user => phpgw_cal_user - $GLOBALS['phpgw_setup']->oProc->RenameTable('calendar_entry_user','phpgw_cal_user'); + $GLOBALS['egw_setup']->oProc->RenameTable('calendar_entry_user','phpgw_cal_user'); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.002'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -729,7 +720,7 @@ $test[] = '0.9.11.003'; function calendar_upgrade0_9_11_003() { - $GLOBALS['phpgw_setup']->oProc->CreateTable('phpgw_cal_holidays', + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_holidays', Array( 'fd' => array( 'locale' => array('type' => 'char', 'precision' => 2,'nullable' => False), @@ -764,8 +755,8 @@ $test[] = '0.9.11.006'; function calendar_upgrade0_9_11_006() { - $GLOBALS['phpgw_setup']->oProc->DropTable('phpgw_cal_holidays'); - $GLOBALS['phpgw_setup']->oProc->CreateTable('phpgw_cal_holidays', + $GLOBALS['egw_setup']->oProc->DropTable('phpgw_cal_holidays'); + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_holidays', Array( 'fd' => array( 'hol_id' => array('type' => 'auto','nullable' => False), @@ -787,11 +778,11 @@ $test[] = '0.9.11.007'; function calendar_upgrade0_9_11_007() { - $GLOBALS['phpgw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays'); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_holidays','mday',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_holidays','month_num',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_holidays','occurence',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_holidays','dow',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); + $GLOBALS['egw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays'); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','mday',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','month_num',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','occurence',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','dow',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.008'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -807,8 +798,8 @@ $test[] = '0.9.11.009'; function calendar_upgrade0_9_11_009() { - $GLOBALS['phpgw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays'); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_holidays','observance_rule',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); + $GLOBALS['egw_setup']->oProc->query('DELETE FROM phpgw_cal_holidays'); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_holidays','observance_rule',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.11.010'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -843,7 +834,7 @@ $test[] = '0.9.13.002'; function calendar_upgrade0_9_13_002() { - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal','reference',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','reference',array('type' => 'int', 'precision' => 8,'nullable' => False, 'default' => '0')); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.003'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -852,7 +843,7 @@ $test[] = '0.9.13.003'; function calendar_upgrade0_9_13_003() { - $GLOBALS['phpgw_setup']->oProc->CreateTable('phpgw_cal_alarm', + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_alarm', Array( 'fd' => array( 'alarm_id' => array('type' => 'auto','nullable' => False), @@ -868,8 +859,8 @@ ) ); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal','uid',array('type' => 'varchar', 'precision' => 255,'nullable' => False)); - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal','location',array('type' => 'varchar', 'precision' => 255,'nullable' => True)); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','uid',array('type' => 'varchar', 'precision' => 255,'nullable' => False)); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal','location',array('type' => 'varchar', 'precision' => 255,'nullable' => True)); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.004'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -878,7 +869,7 @@ $test[] = '0.9.13.004'; function calendar_upgrade0_9_13_004() { - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_alarm','alarm_enabled',array('type' => 'int', 'precision' => 4,'nullable' => False, 'default' => '1')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_alarm','alarm_enabled',array('type' => 'int', 'precision' => 4,'nullable' => False, 'default' => '1')); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.005'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -888,18 +879,18 @@ function calendar_upgrade0_9_13_005() { $calendar_data = Array(); - $GLOBALS['phpgw_setup']->oProc->query('SELECT cal_id, category FROM phpgw_cal',__LINE__,__FILE__); - while($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query('SELECT cal_id, category FROM phpgw_cal',__LINE__,__FILE__); + while($GLOBALS['egw_setup']->oProc->next_record()) { - $calendar_data[$GLOBALS['phpgw_setup']->oProc->f('cal_id')] = $GLOBALS['phpgw_setup']->oProc->f('category'); + $calendar_data[$GLOBALS['egw_setup']->oProc->f('cal_id')] = $GLOBALS['egw_setup']->oProc->f('category'); } - $GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cal','category',array('type' => 'varchar', 'precision' => 30,'nullable' => True)); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal','category',array('type' => 'varchar', 'precision' => 30,'nullable' => True)); @reset($calendar_data); while($calendar_data && list($cal_id,$category) = each($calendar_data)) { - $GLOBALS['phpgw_setup']->oProc->query("UPDATE phpgw_cal SET category='".$category."' WHERE cal_id=".$cal_id,__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->query("UPDATE phpgw_cal SET category='".$category."' WHERE cal_id=".$cal_id,__LINE__,__FILE__); } $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.006'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -908,7 +899,7 @@ $test[] = '0.9.13.006'; function calendar_upgrade0_9_13_006() { - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_repeats','recur_exception',array('type' => 'varchar', 'precision' => 255, 'nullable' => True, 'default' => '')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_repeats','recur_exception',array('type' => 'varchar', 'precision' => 255, 'nullable' => True, 'default' => '')); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.13.007'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -918,14 +909,14 @@ $test[] = '0.9.13.007'; function calendar_upgrade0_9_13_007() { - $GLOBALS['phpgw_setup']->oProc->AddColumn('phpgw_cal_user','cal_type',array( + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_cal_user','cal_type',array( 'type' => 'varchar', 'precision' => '1', 'nullable' => False, 'default' => 'u' )); - $GLOBALS['phpgw_setup']->oProc->CreateTable('phpgw_cal_extra',array( + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_cal_extra',array( 'fd' => array( 'cal_id' => array('type' => 'int','precision' => '4','nullable' => False), 'cal_extra_name' => array('type' => 'varchar','precision' => '40','nullable' => False), @@ -937,7 +928,7 @@ 'uc' => array() )); - $GLOBALS['phpgw_setup']->oProc->DropTable('phpgw_cal_alarm'); + $GLOBALS['egw_setup']->oProc->DropTable('phpgw_cal_alarm'); $GLOBALS['setup_info']['calendar']['currentver'] = '0.9.16.002'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -948,7 +939,7 @@ function calendar_upgrade0_9_16_001() { // this is to set the default as schema_proc was not setting an empty default - $GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cal_user','cal_type',array( + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal_user','cal_type',array( 'type' => 'varchar', 'precision' => '1', 'nullable' => False, @@ -965,7 +956,7 @@ $test[] = '0.9.16.002'; function calendar_upgrade0_9_16_002() { - $GLOBALS['phpgw_setup']->oProc->RefreshTable('phpgw_cal_repeats',array( + $GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_repeats',array( 'fd' => array( 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False), 'recur_type' => array('type' => 'int','precision' => '8','nullable' => False), @@ -989,7 +980,7 @@ $test[] = '0.9.16.003'; function calendar_upgrade0_9_16_003() { - $GLOBALS['phpgw_setup']->oProc->RefreshTable('phpgw_cal_user',array( + $GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_user',array( 'fd' => array( 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'), 'cal_login' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'), @@ -1010,7 +1001,7 @@ $test[] = '0.9.16.004'; function calendar_upgrade0_9_16_004() { - $GLOBALS['phpgw_setup']->oProc->RefreshTable('phpgw_cal_holidays',array( + $GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_holidays',array( 'fd' => array( 'hol_id' => array('type' => 'auto','nullable' => False), 'locale' => array('type' => 'char','precision' => '2','nullable' => False), @@ -1037,14 +1028,14 @@ { // creates uid's for all entries which do not have unique ones, they are '-@domain.com' // very old entries even have an empty uid, see 0.9.16.006 update - $GLOBALS['phpgw_setup']->oProc->query("SELECT config_name,config_value FROM phpgw_config WHERE config_name IN ('install_id','mail_suffix') AND config_app='phpgwapi'",__LINE__,__FILE__); - while ($GLOBALS['phpgw_setup']->oProc->next_record()) + $GLOBALS['egw_setup']->oProc->query("SELECT config_name,config_value FROM {$GLOBALS['egw_setup']->config_table} WHERE config_name IN ('install_id','mail_suffix') AND config_app='phpgwapi'",__LINE__,__FILE__); + while ($GLOBALS['egw_setup']->oProc->next_record()) { - $config[$GLOBALS['phpgw_setup']->oProc->f(0)] = $GLOBALS['phpgw_setup']->oProc->f(1); + $config[$GLOBALS['egw_setup']->oProc->f(0)] = $GLOBALS['egw_setup']->oProc->f(1); } - $GLOBALS['phpgw_setup']->oProc->query('UPDATE phpgw_cal SET uid='. - $GLOBALS['phpgw_setup']->db->concat($GLOBALS['phpgw_setup']->db->quote('cal-'),'cal_id', - $GLOBALS['phpgw_setup']->db->quote('-'.$config['install_id'].'@'. + $GLOBALS['egw_setup']->oProc->query('UPDATE phpgw_cal SET uid='. + $GLOBALS['egw_setup']->db->concat($GLOBALS['egw_setup']->db->quote('cal-'),'cal_id', + $GLOBALS['egw_setup']->db->quote('-'.$config['install_id'].'@'. ($config['mail_suffix'] ? $config['mail_suffix'] : 'local'))). " WHERE uid LIKE '-@%' OR uid=''"); @@ -1066,7 +1057,7 @@ function calendar_upgrade0_9_16_007() { // update the sequenzes for refreshed tables (postgres only) - $GLOBALS['phpgw_setup']->oProc->UpdateSequence('phpgw_cal_holidays','hol_id'); + $GLOBALS['egw_setup']->oProc->UpdateSequence('phpgw_cal_holidays','hol_id'); $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -1076,19 +1067,19 @@ $test[] = '1.0.0'; function calendar_upgrade1_0_0() { - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','uid','cal_uid'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','owner','cal_owner'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','category','cal_category'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','groups','cal_groups'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','datetime','cal_starttime'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','mdatetime','cal_modified'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','edatetime','cal_endtime'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','priority','cal_priority'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','is_public','cal_public'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','title','cal_title'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','description','cal_description'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','location','cal_location'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal','reference','cal_reference'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','uid','cal_uid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','owner','cal_owner'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','category','cal_category'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','groups','cal_groups'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','datetime','cal_starttime'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','mdatetime','cal_modified'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','edatetime','cal_endtime'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','priority','cal_priority'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','is_public','cal_public'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','title','cal_title'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','description','cal_description'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','location','cal_location'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal','reference','cal_reference'); $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.001'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -1098,13 +1089,13 @@ $test[] = '1.0.0.001'; function calendar_upgrade1_0_0_001() { - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','locale','hol_locale'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','name','hol_name'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','mday','hol_mday'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','month_num','hol_month_num'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','occurence','hol_occurence'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','dow','hol_dow'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_holidays','observance_rule','hol_observance_rule'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','locale','hol_locale'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','name','hol_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','mday','hol_mday'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','month_num','hol_month_num'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','occurence','hol_occurence'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','dow','hol_dow'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_holidays','observance_rule','hol_observance_rule'); $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.002'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -1114,8 +1105,8 @@ $test[] = '1.0.0.002'; function calendar_upgrade1_0_0_002() { - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_user','cal_login','cal_user_id'); - $GLOBALS['phpgw_setup']->oProc->RenameColumn('phpgw_cal_user','cal_type','cal_user_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_user','cal_login','cal_user_id'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_cal_user','cal_type','cal_user_type'); $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.003'; return $GLOBALS['setup_info']['calendar']['currentver']; @@ -1125,7 +1116,7 @@ $test[] = '1.0.0.003'; function calendar_upgrade1_0_0_003() { - $GLOBALS['phpgw_setup']->oProc->AlterColumn('phpgw_cal','cal_title',array( + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_cal','cal_title',array( 'type' => 'varchar', 'precision' => '255', 'nullable' => False, @@ -1140,7 +1131,7 @@ $test[] = '1.0.0.004'; function calendar_upgrade1_0_0_004() { - $GLOBALS['phpgw_setup']->oProc->RefreshTable('phpgw_cal_repeats',array( + $GLOBALS['egw_setup']->oProc->RefreshTable('phpgw_cal_repeats',array( 'fd' => array( 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False), 'recur_type' => array('type' => 'int','precision' => '8','nullable' => False), @@ -1159,4 +1150,300 @@ $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.0.005'; return $GLOBALS['setup_info']['calendar']['currentver']; } + + + $test[] = '1.0.0.005'; + function calendar_upgrade1_0_0_005() + { + // change prefix of all calendar tables to egw_ + foreach(array('cal','cal_user','cal_repeats','cal_extra','cal_holidays') as $name) + { + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_'.$name,'egw_'.$name); + } + + // create new dates table, with content from the egw_cal table + $GLOBALS['egw_setup']->oProc->CreateTable('egw_cal_dates',array( + 'fd' => array( + 'cal_id' => array('type' => 'int','precision' => '4','nullable' => False), + 'cal_start' => array('type' => 'int','precision' => '8','nullable' => False), + 'cal_end' => array('type' => 'int','precision' => '8','nullable' => False) + ), + 'pk' => array('cal_id','cal_start'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + )); + $GLOBALS['egw_setup']->oProc->query("INSERT INTO egw_cal_dates SELECT cal_id,cal_starttime,cal_endtime FROM egw_cal"); + + // drop the fields transfered to the dates table + $GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array( + 'fd' => array( + 'cal_id' => array('type' => 'auto','nullable' => False), + 'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False), + 'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False), + 'cal_category' => array('type' => 'varchar','precision' => '30'), + 'cal_groups' => array('type' => 'varchar','precision' => '255'), + 'cal_modified' => array('type' => 'int','precision' => '8'), + 'cal_endtime' => array('type' => 'int','precision' => '8'), + 'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'), + 'cal_type' => array('type' => 'varchar','precision' => '10'), + 'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'), + 'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'), + 'cal_description' => array('type' => 'text'), + 'cal_location' => array('type' => 'varchar','precision' => '255'), + 'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0') + ), + 'pk' => array('cal_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ),'cal_starttime'); + $GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array( + 'fd' => array( + 'cal_id' => array('type' => 'auto','nullable' => False), + 'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False), + 'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False), + 'cal_category' => array('type' => 'varchar','precision' => '30'), + 'cal_groups' => array('type' => 'varchar','precision' => '255'), + 'cal_modified' => array('type' => 'int','precision' => '8'), + 'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'), + 'cal_type' => array('type' => 'varchar','precision' => '10'), + 'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'), + 'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'), + 'cal_description' => array('type' => 'text'), + 'cal_location' => array('type' => 'varchar','precision' => '255'), + 'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0') + ), + 'pk' => array('cal_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ),'cal_endtime'); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.001'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.001'; + function calendar_upgrade1_0_1_001() + { + /* done by RefreshTable() anyway + $GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_recur_date',array( + 'type' => 'int', + 'precision' => '8', + 'default' => '0' + ));*/ + $GLOBALS['egw_setup']->oProc->RefreshTable('egw_cal_user',array( + 'fd' => array( + 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'), + 'cal_recur_date' => array('type' => 'int','precision' => '8','default' => '0'), + 'cal_user_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u'), + 'cal_user_id' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0'), + 'cal_status' => array('type' => 'char','precision' => '1','default' => 'A') + ), + 'pk' => array('cal_id','cal_recur_date','cal_user_type','cal_user_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.002'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.002'; + function calendar_upgrade1_0_1_002() + { + $GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array( + 'fd' => array( + 'cal_id' => array('type' => 'auto','nullable' => False), + 'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False), + 'cal_owner' => array('type' => 'int','precision' => '8','nullable' => False), + 'cal_category' => array('type' => 'varchar','precision' => '30'), + 'cal_groups' => array('type' => 'varchar','precision' => '255'), + 'cal_modified' => array('type' => 'int','precision' => '8'), + 'cal_priority' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '2'), + 'cal_public' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '1'), + 'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'), + 'cal_description' => array('type' => 'text'), + 'cal_location' => array('type' => 'varchar','precision' => '255'), + 'cal_reference' => array('type' => 'int','precision' => '8','nullable' => False,'default' => '0') + ), + 'pk' => array('cal_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ),'cal_type'); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_owner',array( + 'type' => 'int', + 'precision' => '4', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_priority',array( + 'type' => 'int', + 'precision' => '2', + 'nullable' => False, + 'default' => '2' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_public',array( + 'type' => 'int', + 'precision' => '2', + 'nullable' => False, + 'default' => '1' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal','cal_reference',array( + 'type' => 'int', + 'precision' => '4', + 'nullable' => False, + 'default' => '0' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_modifier',array( + 'type' => 'int', + 'precision' => '4' + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.003'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.003'; + function calendar_upgrade1_0_1_003() + { + $GLOBALS['egw_setup']->oProc->DropColumn('egw_cal_repeats',array( + 'fd' => array( + 'cal_id' => array('type' => 'int','precision' => '8','nullable' => False), + 'recur_type' => array('type' => 'int','precision' => '8','nullable' => False), + 'recur_enddate' => array('type' => 'int','precision' => '8'), + 'recur_interval' => array('type' => 'int','precision' => '8','default' => '1'), + 'recur_data' => array('type' => 'int','precision' => '8','default' => '1'), + 'recur_exception' => array('type' => 'varchar','precision' => '255','default' => '') + ), + 'pk' => array('cal_id'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ),'recur_use_end'); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','cal_id',array( + 'type' => 'int', + 'precision' => '4', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_type',array( + 'type' => 'int', + 'precision' => '2', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_interval',array( + 'type' => 'int', + 'precision' => '2', + 'default' => '1' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_data',array( + 'type' => 'int', + 'precision' => '2', + 'default' => '1' + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.004'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.004'; + function calendar_upgrade1_0_1_004() + { + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_id',array( + 'type' => 'int', + 'precision' => '4', + 'nullable' => False, + 'default' => '0' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_user','cal_user_id',array( + 'type' => 'int', + 'precision' => '4', + 'nullable' => False, + 'default' => '0' + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.005'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.005'; + function calendar_upgrade1_0_1_005() + { + $GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_quantity',array( + 'type' => 'int', + 'precision' => '4', + 'default' => '1' + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.006'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.006'; + function calendar_upgrade1_0_1_006() + { + $GLOBALS['egw_setup']->oProc->AddColumn('egw_cal','cal_non_blocking',array( + 'type' => 'int', + 'precision' => '2', + 'default' => '0' + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.007'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.007'; + function calendar_upgrade1_0_1_007() + { + $GLOBALS['egw_setup']->db->update('egw_cal_repeats',array('recur_exception' => null),array('recur_exception' => ''),__LINE__,__FILE__,'calendar'); + + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_cal_repeats','recur_exception',array( + 'type' => 'text' + )); + + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.008'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } + + + $test[] = '1.0.1.008'; + function calendar_upgrade1_0_1_008() + { + $config =& CreateObject('phpgwapi.config','calendar'); + $config_data = $config->read_repository(); + if (isset($config_data['fields'])) // old custom fields + { + $customfields = array(); + $order = 0; + foreach($config_data['fields'] as $name => $data) + { + if ($name{0} == '#' && !$data['disabled']) // real not-disabled custom field + { + $customfields[substr($name,1)] = array( + 'type' => 'text', + 'len' => $data['length'].($data['shown'] ? ','.$data['shown'] : ''), + 'label' => $data['name'], + 'order' => ($order += 10), + ); + } + } + if (count($customfields)) + { + $config->save_value('customfields',$customfields); + } + $config->delete_value('fields'); + $config->save_repository(); // delete_value does not save + } + $GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.009'; + return $GLOBALS['setup_info']['calendar']['currentver']; + } ?> diff --git a/calendar/templates/default/alarm.tpl b/calendar/templates/default/alarm.tpl deleted file mode 100755 index 90ba695990..0000000000 --- a/calendar/templates/default/alarm.tpl +++ /dev/null @@ -1,63 +0,0 @@ - - -

    -{hidden_vars} - - {rows} - - - - -
    -
     {input_days} {input_hours} {input_minutes} {input_owner} {input_add}
      -
    - {input_cancel} -
    -
    - - - - - {lang_time} - {lang_text} - {lang_owner} - {lang_enabled} - {lang_select} - - - - - - - {field}: - - - {data} - - - {owner} - - - {enabled} - - - {select} - - - - - - - - {hr_text} - - - - - - - - {enable_button} {disable_button} {delete_button} - - - diff --git a/calendar/templates/default/app.css b/calendar/templates/default/app.css index c10ed90e6f..0613be10a5 100644 --- a/calendar/templates/default/app.css +++ b/calendar/templates/default/app.css @@ -1,10 +1,30 @@ -/* CSS Document */ +/* $Id$ */ -/* - * CSS settings for the new uiviews code - */ +/****************************************************************** + * CSS settings for the day, week and month view (timeGridWidget) * + ******************************************************************/ .redItalic { color: red; font-style: italic; } +.size120b { font-size: 120%; font-weight: bold; } + +/* marks a day in the colum-header as today + */ +.calToday{ + background: #ffffcc; +} +/* marks a day in the colum-header as holiday + */ +.calHoliday{ + background: #dac0c0; +} +/* marks a day in the column-header additionaly as birthday of some contact, + * it should work together with the backgrounds of calToday, calHoliday, th, row_on and row_off + */ +.calBirthday,.calBirthday a{ + color: black; + font-weight: bold; + font-style: italic; +} /* timeGridWidget, contains timeRow's and dayCol's */ @@ -12,20 +32,21 @@ position: relative; top: 0px; left: 0px; - border:1px solid gray; - margin-top: 20px; /* contains the dayColHeader */ + border:1px solid silver; + width: 100%; /* set via inline style on runtime: - * width: + * height: */ } /* single row in the time-line, always used in conjunction with row_{on|off}, you dont need to set a bgcolor, but you can */ .calTimeRow,.calTimeRowOff{ - position: relative; + position: absolute; width: 100%; /* set via inline style on runtime: * height: + * top: */ } .calTimeRow{ @@ -47,6 +68,8 @@ position: absolute; top: 0px; height: 100%; + left: 50px; + right: 0px; /* set via inline style on runtime: * left: width(calTimeRowTime) * width: 100% - width(calTimeRowTime) @@ -63,28 +86,24 @@ * left: * width: */ - border-left: 1px solid gray; + border-left: 1px solid silver; } /* header for the dayCol */ .calDayColHeader,.calGridHeader{ position: absolute; - top: -20px; + top: 0px; width: 100%; text-align: center; font-size: 100%; white-space: nowrap; - border: 1px solid gray; + border-bottom: 1px solid gray; + border-right: 1px solid gray; height: 16px; - left: -1px; - padding-top: 2px; -} -.calToday{ - background: #ffffcc; -} -.calHoliday{ - background: #dac0c0; + line-height: 16px; + left: 0px; + z-index: 10; } .calViewUserNameBox { @@ -130,20 +149,20 @@ * left: * width: */ -/* border: 1px dotted red; */ } /* contains one event: header-row & -body */ -.calEvent,.calEvent:hover{ +.calEvent,.calEventPrivate{ position: absolute; -/* background-color: #ffffC0;*/ left: 0px; width: 100%; overflow: hidden; + z-index: 20; /* set via inline style on runtime: * top: depending on startime - * top: depending on length + * height: depending on length + * background-color: depending on category */ } .calEvent:hover{ @@ -152,6 +171,18 @@ cursor: hand; } +.calAddEvent{ + position: absolute; + width: 100%; + z-index: 10; +} + +.calAddEvent:hover{ + background-color: #D2D7FF; + cursor: pointer; + cursor: hand; +} + /* header-row of the event */ .calEventHeader,.calEventHeaderSmall{ @@ -189,286 +220,153 @@ font-size: 110%; } -/* cal day-view's todo column - */ -.calDayToDos { - width: 250px; - text-align: center; -} -/* header row +/* table of the dayView containing 2 cols: 1) day-view, 2) todos */ +.calDayView{ + width: 100%; +} +/* calDayTods is the day-view's todo column, containing the calDayTodoHeader and the calDayTodoTable + */ .calDayTodos .calDayTodosHeader { margin: 0px; padding: 2px; font-weight: bold; } -/* div containing the table with the ToDo's -*/ .calDayTodos .calDayTodosTable { overflow: auto; max-height: 400px; } +.calDayTodos { + width: 250px; + text-align: center; + margin-left: 10px; + border: 1px solid silver; +} -/* - * From here on, settings for the "old" uicalendar code +/****************************************************** + * CSS settings for the planner views (plannerWidget) * + ******************************************************/ + +/* plannerWidget represents the whole planner, consiting of the plannerHeader and multiple plannerRowWidgets */ -.to_continue -{ - font-size: 9px; +.plannerWidget { + position: relative; + top: 0px; + left: 0px; + width: 99.5%; + border: 1px solid gray; + padding-right: 3px; } -A.minicalendar -{ - color: #000000; - font-size: 9px; - +/* plannerHeader contains a plannerHeaderTitle and multiple plannerHeaderRows + */ +.plannerHeader { + position: relative; + top: 0px; + left: 0px; + width: 100%; } -A.bminicalendar -{ - color: #336699; - font-style: italic; - font-weight: bold; - font-size: 9px; +/* plannerRowWidget contains a plannerRowHeader and multiple eventRowWidgets in an eventRows + */ +.plannerRowWidget { + position: relative; + top: 0px; + left: 0px; + width: 100%; } -A.minicalendargrey -{ - color: #999999; - font-size: 10px; +/* plannerScale represents a scale-row of the plannerHeader, containing multiple planner{Day|Week|Month}Scales + */ +.plannerScale,.plannerScaleDay{ + position: relative; + top: 0px; + left: 0%; + width: 100%; + height: 20px; + line-height: 20px; +} +.plannerScaleDay { + height: 28px; + line-height: 14px; +} +.plannerDayScale,.plannerMonthScale,.plannerWeekScale,.plannerHourScale { + position: absolute; + top: 0px; + /* left+width: is set by the code on runtime */ + text-align: center; + height: 100%; + border: 1px solid white; +/* set via inline style on runtime: + * left: + * width: + */ +} +.plannerHourScale { + font-size: 90%; +} +.plannerDayScale { + font-size: 90%; +} +.plannerWeekScale { + line-height: 20px; +} +.plannerMonthScale { font-weight: bold; } - -A.bminicalendargrey -{ - color: #336699; - font-style: italic; - font-size:10px; -} - -A.minicalhol -{ - padding-left:3px; - padding-right:3px; - background: #dab0b0; - color: #000000; - font-size: 10px; -} - -A.bminicalhol -{ - padding-left:3px; - padding-right:3px; - background: #dab0b0; - color: #336699; - font-size: 10px; -} - -A.minicalgreyhol -{ - padding-left:3px; - padding-right:3px; - background: #dab0b0; - color: #999999; - font-size: 10px; -} - -A.bminicalgreyhol -{ - padding-left:3px; - padding-right:3px; - background: #dab0b0; - color: #999999; - font-size: 10px; -} - - -.event-on -{ - background: #D3DCE3; - border: #E8F0F0 1px solid; -} - -.event-off -{ - background: #E8F0F0; - border: #D3DCE3 1px solid; -} - -.event-holiday -{ - font-size: 100%; - background: #dac0c0; - color:#000000; +.plannerDayScale img,.plannerWeekScale img,.plannerMonthScale img { vertical-align: middle; } -.time -{ - background: #D3DCE3; - color:#000000; - font-size: 10px; - font-weight: bold; - vertical-align: middle; - width: 5.2%; - text-align: right; - padding-right: 5px; - line-height: 11px; - border: #E8F0F0 1px solid; +/* plannerRowHeader contains the user or category name of the plannerRowWidget + */ +.plannerRowHeader, .plannerHeaderTitle { + position: absolute; + top: 0px; + left: 0%; + width: 15%; /* need to be identical for plannerRowHeader and plannerHeaderTitle and match left of eventRows/plannerHeaderRows */ + height: 100%; + line-height: 20px; + border: 1px solid white; } +/* eventRows contain multiple eventRowWidgets + */ +.eventRows, .plannerHeaderRows { + position: relative; + top: 0px; + left: 15%; /* need to be identical for eventRows and plannerHeaderRows and match width of plannerRowHeader/plannerHeaderTitle */ + width: 85%; +} -.planner-cell -{ +/* eventRowWidget contains non-overlapping events + */ +.eventRowWidget { + position: relative; + top: 0px; + left: 0px; + width: 100%; + height: 20px; + border: 1px solid white; +} + +.plannerEvent,.plannerEventPrivate{ + position: absolute; + top: 0px; + height: 100%; + overflow: hidden; + z-index: 20; + border: 1px solid black; +/* set via inline style on runtime: + * left: depending on startime + * width: depending on length + * background-color: depending on category + */ +} +.plannerEvent img,.plannerEventPrivate img { + padding-top: 2px; +} +.plannerEvent:hover{ cursor: pointer; cursor: hand; - border: thin solid black; -} - -/* common */ -.calendar_link_print -{ - text-align: center; - font-size: 10px; -} - -//Mini Calendar - -.calendar_minical_table -{ - width: 180px; - font-weight: bold; -} - -.calendar_minical_daytable -{ - width: 100%; -} - -.calendar_minical_dayname -{ - font-size: 9px; - text-align: right; -} - -.calendar_minical_hrule -{ - width: 96%; -} - -/* Header */ -.calendar_dropbuttons -{ - align: center; - text-align: center; - vertical-align: bottom; - font-weight: bold; - font-size: 8px; -} - -.calendar-weekidentifier -{ - font-size:16px; - font-weight: bold; - text-align: center; -} - -.calendar_header -{ - font-size: 16px; - font-weight: bold; - text-align: center; -} - -.calendar_dayview_table_header -{ - font-size: 13px; - font-weight: bold; - text-align: center; -} - -.calendar_dayview_todo_header -{ - margin: 0px; - padding: 2px; - font-weight: bold; -} - -/* week view */ -.calendar_week_identifier_table -{ - border: 0px solid black; - width: 100%; -} - -.calendar_week_identifier -{ - font-size: 13px; - text-align: center; - font-weight: bold; -} - -.calendar_weekview_daytitle -{ - font-weight: bold; - font-size: 12px; - background: #D3DCE3; -} - -.calendar_m_w_table -{ - table-layout:fixed; - overflow:auto; - height: 100%; - width: 100%; - border: 0px #000000 solid; -} - -.calendar_m_w_table_row -{ - height: 80px; -} - -.calendar_m_w_tablecell -{ - vertical-align: top; - padding-left: 4px; - padding-right: 4px; - padding-bottom: 6px; -} - -A.event_entry -{ - font-size:10px; -} - -/* month view */ - -.calendar_month_identifier -{ - font-size:14px; - font-weight: bold; -} - -.calendar_user_identifier -{ - font-size:12px; - color: #009999; - font-weight: bold; -} - -.calendar_week_minical_table -{ - width:100%; - border: 0px solid #000000 -} - -.calendar_weekinfo -{ - color: #000000; - padding-left: 2px; - padding-right: 2px; - font-size: 10px; - font-weight: bold; - font-style: italic; } diff --git a/calendar/templates/default/csv_import.tpl b/calendar/templates/default/csv_import.tpl index b186ce50a8..50d8dd4beb 100644 --- a/calendar/templates/default/csv_import.tpl +++ b/calendar/templates/default/csv_import.tpl @@ -1,7 +1,7 @@ - - {lang_csvfile} - + + {lang_csvfile} + {lang_fieldsep} @@ -14,8 +14,11 @@   - - + + + + {lang_help} + @@ -29,21 +32,21 @@ {csv_field} - + -
    {submit} +
    {submit}
    - {lang_start}     - {lang_max} + {lang_start}     + {lang_max} - {lang_debug} - + {lang_debug} +  

    {help_on_trans} @@ -55,20 +58,15 @@ {log}

    {anz_imported} - + -
    -

    -
    - - - {rows} - -
    - {hiddenvars} -
    - -
    +
    +
    +{hiddenvars} + +{rows} +
    +
    diff --git a/calendar/templates/default/custom_fields.tpl b/calendar/templates/default/custom_fields.tpl deleted file mode 100644 index 57bba92875..0000000000 --- a/calendar/templates/default/custom_fields.tpl +++ /dev/null @@ -1,46 +0,0 @@ - - -{lang_error}
    -
    - {hidden_vars} -
    - - - - - - - - - - - {rows} - - - - - - - - - - - - -
    {lang_name}{lang_length}{lang_shown}{lang_order}{lang_title}{lang_disabled} 
    {name}{length}{shown}{order}{title}{disabled}{button}
    {save_button}   {cancel_button}
    -
    -
    -
    - - - - - {name} - {length} - {shown} - {order} - {title} - {disabled} - {button} - - diff --git a/calendar/templates/default/day.tpl b/calendar/templates/default/day.tpl deleted file mode 100755 index df9f66738a..0000000000 --- a/calendar/templates/default/day.tpl +++ /dev/null @@ -1,47 +0,0 @@ - - -{printer_friendly} - - - - - -
    - - - - - {day_events} -
    - {date} : {username} : -
    -
    -

    {print}

    -
    - - - - - - - -
    - {small_calendar} -
    -
    -

    {lang_todos}

    - {todos} -
    -
    -
    - - - - - - - {daily_events} - - - - diff --git a/calendar/templates/default/day_cal.tpl b/calendar/templates/default/day_cal.tpl deleted file mode 100755 index 552b309cf2..0000000000 --- a/calendar/templates/default/day_cal.tpl +++ /dev/null @@ -1,25 +0,0 @@ - - -
    - -{row} -
    -
    - - - {time}{event} - - - -  {event} - - -  {event} - - -  {event} - - - {open_link}{time}{close_link} - - diff --git a/calendar/templates/default/day_list.tpl b/calendar/templates/default/day_list.tpl deleted file mode 100755 index e1263b2cb2..0000000000 --- a/calendar/templates/default/day_list.tpl +++ /dev/null @@ -1,29 +0,0 @@ - - -
    - - - - -
    -{row} -
    -
    - - - {event} - - - {event} - - - {event} - - - {event} - - - {time} - - - diff --git a/calendar/templates/default/edit.tpl b/calendar/templates/default/edit.tpl deleted file mode 100755 index cd53d39ce9..0000000000 --- a/calendar/templates/default/edit.tpl +++ /dev/null @@ -1,43 +0,0 @@ - - -
    - - -
    -{common_hidden} - - - - -{row} - - - - -
    -
    {errormsg}
    -
    - - - -
    -
    -
    -
    {cancel_button}
    -
    {delete_button}
    -
    -
    - - - -  {field}: - {data} - - - - - - {hr_text} - - - diff --git a/calendar/templates/default/edit.xet b/calendar/templates/default/edit.xet index 071a2f01b7..fa8de1edad 100644 --- a/calendar/templates/default/edit.xet +++ b/calendar/templates/default/edit.xet @@ -2,43 +2,49 @@ - -