http://www.radix.net/~cknudsen * * @link http://www.egroupware.org * @package calendar * @author Mark Peters * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ use EGroupware\Api; use EGroupware\Api\Framework; /** * 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; var $base_url; var $bo; var $template_dir; var $holidays; var $cat_id; var $public_functions = array( 'admin' => True, 'edit_locale' => True, 'edit_holiday' => True, 'copy_holiday' => True, 'delete_holiday' => True, 'delete_locale' => True, 'submit' => True ); function uiholiday() { Api\Header\ContentSecurityPolicy::add('script-src', 'unsafe-inline'); $this->bo = CreateObject('calendar.boholiday'); $this->bo->check_admin(); $this->base_url = $this->bo->base_url; $this->template_dir = Framework\Template::get_dir('calendar'); $this->sb = CreateObject('calendar.sbox'); // calendar does not work with hidden sidebox atm. unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); $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['egw_info']['flags']['noheader']); unset($GLOBALS['egw_info']['flags']['nonavbar']); $GLOBALS['egw_info']['flags']['noappfooter'] = True; $p = &$GLOBALS['egw']->template; $p->set_file(Array('locales'=>'locales.tpl')); $p->set_block('locales','list','list'); $p->set_block('locales','row','row'); $p->set_block('locales','row_empty','row_empty'); $var = Array( '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['egw']->nextmatchs->show_sort_order($this->bo->sort,'hol_locale',$this->bo->order,'/calendar/'.basename($SCRIPT_FILENAME),lang('Country')), 'header_edit' => lang('Edit'), 'header_delete' => lang('Delete'), 'header_extra' => lang('Submit to Repository'), 'extra_width' => 'width="45%"', 'rule' => '', 'header_rule' => '', 'back_button' => '' ); $p->set_var($var); $locales = $this->bo->get_locale_list($this->bo->sort, $this->bo->order, $this->bo->query, $this->bo->total); @reset($locales); if (!$locales) { $p->set_var('message',lang('no matches found')); $p->parse('rows','row_empty',True); } else { $p->set_var('submit_extra',' width="5%"'); while (list(,$value) = each($locales)) { $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').' ' ); $p->set_var($var); $p->parse('rows','row',True); } } $var = Array( 'new_action' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.edit_holiday','id'=>0)), 'lang_add' => lang('add'), 'search_action' => $GLOBALS['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), 'lang_search' => lang('search') ); $p->set_var($var); $p->pparse('out','list'); } function edit_locale($locale='') { if ($locale === '') { $locale = $this->bo->locale; } if ($locale) { $this->bo->locales = array($locale); $this->bo->total = $this->bo->so->holiday_total($locale,$this->bo->query); } if(!$this->bo->total && !isset($this->bo->query)) { $link_params = Array( 'menuaction' => 'calendar.uiholiday.admin' ); $GLOBALS['egw']->redirect_link($this->base_url,$link_params); } unset($GLOBALS['egw_info']['flags']['noheader']); unset($GLOBALS['egw_info']['flags']['nonavbar']); $GLOBALS['egw_info']['flags']['noappfooter'] = True; $GLOBALS['egw']->framework->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'); $year_form = str_replace('','',Api\Html::form(Api\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]))); $holidays = $this->bo->get_holiday_list(); $total = count($holidays); $var = Array( '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['egw']->nextmatchs->show_sort_order($this->bo->sort,'hol_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['egw']->nextmatchs->show_sort_order($this->bo->sort,'hol_month_num,hol_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%"' ); $p->set_var($var); if (!count($holidays)) { $p->set_var('total',lang('no matches found')); //$p->parse('rows','row_empty',True); } else { $maxmatchs = $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs']; $end = min($total,$this->bo->start+$maxmatchs); $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['egw']->nextmatchs->alternate_row_color($tr_color); if (!$holidays[$i]['name']) { $holidays[$i]['name'] = ' '; } $var = Array( 'tr_color' => $tr_color, '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').' ' ); $p->set_var($var); $p->parse('rows','row',True); } } $var = Array( '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['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), 'lang_back' => lang('Back'), '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); $p->parse('back_button','back_button_form',False); $p->pparse('out','list'); } function copy_holiday() { if(@$this->bo->id) { $holiday = $this->bo->read_entry($this->bo->id); } $this->bo->id = 0; if (!$holiday['occurence'] || $holiday['occurence'] >= 1900) { $holiday['occurence'] = date('Y'); } $this->edit_holiday('',$holiday); } function edit_holiday($error='',$holiday='') { if(@$this->bo->id && !$holiday) { $holiday = $this->bo->read_entry($this->bo->id); } if ($this->bo->locale) { $holiday['locale'] = $this->bo->locale; } 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']->framework->header(); $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 = common::error_list($error); } else { $message = ''; } $var = Array( 'title_holiday' => ($this->bo->id ? lang('Edit') : lang('Add')).' '.lang('Holiday'), 'message' => $message, 'actionurl' => $GLOBALS['egw']->link($this->base_url,'menuaction=calendar.boholiday.add&year='.$this->bo->year), 'hidden_vars' => ''."\n" . ''."\n" ); $t->set_var($var); // Locale $this->display_item($t,lang('Country'),$this->sb->form_select($holiday['locale'],'holiday[locale]')); // Title/Name $this->display_item($t,lang('title'),''); // Date $this->display_item($t,lang('Date'),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 $occur = Array( 0 => '', 1 => '1.', 2 => '2.', 3 => '3.', 4 => '4.', 5 => '5.', 99 => lang('Last') ); $out = ''; while(list($key,$value) = each($occur)) { $out .= ''."\n"; } $occurence_html = ''."\n"; $dow = Array( 0 => lang('Sun'), 1 => lang('Mon'), 2 => lang('Tue'), 3 => lang('Wed'), 4 => lang('Thu'), 5 => lang('Fri'), 6 => lang('Sat') ); $out = ''; for($i=0;$i<7;$i++) { $out .= ''."\n"; } $dow_html = ''."\n"; $this->display_item($t,lang('Occurence'),$occurence_html.' '.$dow_html. ' '.lang('You can either set a Year or a Occurence, not both !!!')); $this->display_item($t,lang('Observance Rule'),''. ' '.lang('If checked holidays falling on a weekend, are taken on the monday after.')); $t->set_var('lang_add',lang('Save')); $t->set_var('lang_reset',lang('Reset')); if(@$this->bo->locales[0]) { $link_params = Array( 'menuaction' => 'calendar.uiholiday.edit_locale', 'year' => $this->bo->year, 'locale' => $this->bo->locales[0] ); } else { $link_params = Array( 'menuaction' => 'calendar.uiholiday.admin' ); } $t->set_var(Array( 'action_url_button' => $GLOBALS['egw']->link($this->base_url,$link_params), 'action_text_button' => lang('Cancel'), 'action_confirm_button' => '', 'action_extra_field' => '' )); $t->parse('cancel_button','form_button'); if ($this->bo->id) { $link_params = Array( 'menuaction' => 'calendar.uiholiday.delete_holiday', 'year' => $this->bo->year, 'locale' => $this->bo->locales[0], 'id' => $this->bo->id ); $t->set_var(Array( 'action_url_button' => $GLOBALS['egw']->link($this->base_url,$link_params), 'action_text_button' => lang('Delete'), 'action_confirm_button' => '', 'action_extra_field' => '' )); $t->parse('delete_button','form_button'); } else { $t->set_var('delete_button',' '); } $t->pparse('out','form'); } function delete_locale() { $this->admin(); $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['egw']->link($this->base_url,Array('menuaction'=>'calendar.uiholiday.admin')), 'action_text_button' => lang('No'), 'action_confirm_button' => '', 'action_extra_field' => '' ); $p->set_var($var); $p->parse('no','form_button'); $var = Array( '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' => '' ); $p->set_var($var); $p->parse('yes','form_button'); $p->pparse('out','form'); } function delete_holiday() { $holiday = $this->bo->read_entry($this->bo->id); if(!$holiday) { return $this->edit_locale(); } unset($GLOBALS['egw_info']['flags']['noheader']); unset($GLOBALS['egw_info']['flags']['nonavbar']); $GLOBALS['egw_info']['flags']['noappfooter'] = True; $GLOBALS['egw']->framework->header(); $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['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' => '' ); $p->set_var($var); $p->parse('no','form_button'); $var = Array( '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' => '' ); $p->set_var($var); $p->parse('yes','form_button'); $p->pparse('out','form'); } function submit() { if(!@$this->bo->locales[0]) { return $this->admin(); } $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]; Api\Header\Content::type("holidays.$locale.csv",'text/text'); echo "charset\t".Api\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"; } exit(); } if($this->debug) { $action = $GLOBALS['egw']->link('/calendar/egroupware.org/accept_holiday.php'); } else { $action = 'http://www.egroupware.org/cal/accept_holiday.php'; } $GLOBALS['egw_info']['flags']['noappheader'] = True; $GLOBALS['egw_info']['flags']['noappfooter'] = True; $GLOBALS['egw_info']['flags']['nofooter'] = True; $GLOBALS['egw']->framework->header(); echo ''."\n"; echo '
'."\n"; echo ''."\n"; echo ''."\n"; foreach($holidays as $holiday) { echo ''."\n" . ''."\n" . ''."\n" . ''."\n" . ''."\n" . ''."\n\n"; } echo "
\n\n"; } /* private functions */ function display_item(&$p,$field,$data) { $var = Array( 'tr_color' => $GLOBALS['egw']->nextmatchs->alternate_row_color(), 'field' => $field, 'data' => $data ); $p->set_var($var); $p->parse('rows','list',True); } }