2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM Community Edition is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU Affero General Public License version 3 as published by the
9 * Free Software Foundation with the addition of the following permission added
10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19 * You should have received a copy of the GNU Affero General Public License along with
20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
27 * The interactive user interfaces in modified source and object code versions
28 * of this program must display Appropriate Legal Notices, as required under
29 * Section 5 of the GNU Affero General Public License version 3.
31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32 * these Appropriate Legal Notices must retain the display of the "Powered by
33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34 * technical reasons, the Appropriate Legal Notices must display the words
35 * "Powered by SugarCRM".
36 ********************************************************************************/
41 class CalendarDisplay {
44 * colors of items on calendar
46 public $activity_colors = array(
48 'border' => '#1C5FBD',
52 'border' => '#DE4040',
56 'border' => '#015900',
63 * @param Calendar $cal
64 * @param string $dashlet_id for dashlet mode
66 function __construct(&$cal,$dashlet_id = ""){
68 $this->dashlet_id = $dashlet_id;
72 * main displaying function of Calendar
74 public function display(){
79 $ss = new Sugar_Smarty();
81 $ss->assign('APP',$GLOBALS['app_strings']);
82 $ss->assign('APPLIST',$GLOBALS['app_list_strings']);
83 $ss->assign('MOD',$GLOBALS['cal_strings']);
85 $ss->assign('view',$cal->view);
86 $ss->assign('t_step',$cal->time_step);
87 $ss->assign('current_user_id',$GLOBALS['current_user']->id);
88 $ss->assign('current_user_name',$GLOBALS['current_user']->name);
89 $ss->assign('time_format',$GLOBALS['timedate']->get_user_time_format());
90 $ss->assign('items_draggable',SugarConfig::getInstance()->get('calendar.items_draggable',true));
91 $ss->assign('mouseover_expand',SugarConfig::getInstance()->get('calendar.mouseover_expand',true));
92 $ss->assign('item_text','name');
93 $ss->assign('cells_per_day',$cal->cells_per_day);
94 $ss->assign('img_edit_inline',SugarThemeRegistry::current()->getImageURL('edit_inline.gif',false));
95 $ss->assign('img_view_inline',SugarThemeRegistry::current()->getImageURL('view_inline.gif',false));
96 $ss->assign('img_close',SugarThemeRegistry::current()->getImageURL('close.gif',false));
97 $ss->assign('dashlet',$cal->dashlet);
99 $ss->assign('grid_start_ts',$cal->grid_start_ts);
100 $ss->assign('celcount',$cal->celcount);
102 if(count($cal->shared_ids)){
103 $ss->assign('shared_ids',$cal->shared_ids);
104 $ss->assign('shared_users_count',count($cal->shared_ids));
106 $ss->assign('activity_colors',$this->activity_colors);
109 if($cal->time_step < 30)
111 $ss->assign('scroll_slot',intval(60 / $cal->time_step) * $scroll_hour);
113 $ss->assign('editview_width',SugarConfig::getInstance()->get('calendar.editview_width',800));
114 $ss->assign('editview_height',SugarConfig::getInstance()->get('calendar.editview_height',600));
115 $ss->assign('a_str',$cal->get_activities_js());
117 $ss->assign('sugar_body_only',(isset($_REQUEST['to_pdf']) && $_REQUEST['to_pdf'] || isset($_REQUEST['sugar_body_only']) && $_REQUEST['sugar_body_only']));
118 require_once('include/json_config.php');
120 $json = getJSONobj();
121 $json_config = new json_config();
122 $ss->assign('GRjavascript',$json_config->get_static_json_server(false, true, 'Meetings'));
125 $user_default_date_start = $timedate->asUser($timedate->getNow());
126 $ss->assign('user_default_date_start',$user_default_date_start);
129 if($_REQUEST['module'] == "Calendar"){
130 $this->load_settings_template($ss);
131 $settings = "custom/modules/Calendar/tpls/settings.tpl";
132 if(!file_exists($settings))
133 $settings = "modules/Calendar/tpls/settings.tpl";
134 $ss->assign("settings",$settings);
137 $main = "custom/modules/Calendar/tpls/main.tpl";
138 if(!file_exists($main))
139 $main = "modules/Calendar/tpls/main.tpl";
140 $form_tpl = "custom/modules/Calendar/tpls/form.tpl";
141 if(!file_exists($form_tpl))
142 $form_tpl = "modules/Calendar/tpls/form.tpl";
144 $ss->assign("form",$form_tpl);
146 echo $ss->fetch($main);
149 $grid = new CalendarGrid($cal);
150 echo $grid->display();
155 * load settings popup template
157 protected function load_settings_template(&$ss){
159 list($d_start_hour,$d_start_min) = explode(":",$this->cal->day_start_time);
160 list($d_end_hour,$d_end_min) = explode(":",$this->cal->day_end_time);
162 require_once("include/utils.php");
163 global $app_strings,$app_list_strings,$beanList;
166 $user_default_date_start = $timedate->asUser($timedate->getNow());
167 if(!isset($time_separator))
168 $time_separator = ":";
169 $date_format = $timedate->get_cal_date_format();
170 $time_format = $timedate->get_user_time_format();
171 $TIME_FORMAT = $time_format;
172 $t23 = strpos($time_format, '23') !== false ? '%H' : '%I';
173 if(!isset($match[2]) || $match[2] == '') {
174 $CALENDAR_FORMAT = $date_format . ' ' . $t23 . $time_separator . "%M";
176 $pm = $match[2] == "pm" ? "%P" : "%p";
177 $CALENDAR_FORMAT = $date_format . ' ' . $t23 . $time_separator . "%M" . $pm;
179 $hours_arr = array ();
183 $time_pref = $timedate->get_time_format();
185 if(strpos($time_pref, 'a') || strpos($time_pref, 'A')){
189 if($d_start_hour == 0){
193 if($d_start_hour == 12)
195 if($d_start_hour > 12){
196 $d_start_hour = $d_start_hour - 12;
200 if($d_end_hour == 0){
204 if($d_end_hour == 12)
207 if($d_end_hour > 12){
208 $d_end_hour = $d_end_hour - 12;
211 if(strpos($time_pref, 'A')){
212 $start_m = strtoupper($start_m);
213 $end_m = strtoupper($end_m);
215 $options = strpos($time_pref, 'a') ? $app_list_strings['dom_meridiem_lowercase'] : $app_list_strings['dom_meridiem_uppercase'];
216 $TIME_MERIDIEM1 = get_select_options_with_id($options, $start_m);
217 $TIME_MERIDIEM2 = get_select_options_with_id($options, $end_m);
218 $TIME_MERIDIEM1 = "<select id='day_start_meridiem' name='day_start_meridiem' tabindex='2'>".$TIME_MERIDIEM1."</select>";
219 $TIME_MERIDIEM2 = "<select id='day_end_meridiem' name='day_end_meridiem' tabindex='2'>".$TIME_MERIDIEM2."</select>";
221 $TIME_MERIDIEM1 = $TIME_MERIDIEM2 = "";
223 for($i = $start_at; $i <= $num_of_hours; $i ++){
229 $TIME_START_HOUR_OPTIONS1 = get_select_options_with_id($hours_arr, $d_start_hour);
230 $TIME_START_MINUTES_OPTIONS1 = get_select_options_with_id(array('0'=>'00','15'=>'15','30'=>'30','45'=>'45'), $d_start_min);
231 $TIME_START_HOUR_OPTIONS2 = get_select_options_with_id($hours_arr, $d_end_hour);
232 $TIME_START_MINUTES_OPTIONS2 = get_select_options_with_id(array('0'=>'00','15'=>'15','30'=>'30','45'=>'45'), $d_end_min);
234 $ss->assign('day',$_REQUEST['day']);
235 $ss->assign('week',$_REQUEST['week']);
236 $ss->assign('month',$_REQUEST['month']);
237 $ss->assign('year',$_REQUEST['year']);
238 $ss->assign('TIME_START_HOUR_OPTIONS1',$TIME_START_HOUR_OPTIONS1);
239 $ss->assign('TIME_START_MINUTES_OPTIONS1',$TIME_START_MINUTES_OPTIONS1);
240 $ss->assign('TIME_MERIDIEM1',$TIME_MERIDIEM1);
241 $ss->assign('TIME_START_HOUR_OPTIONS2',$TIME_START_HOUR_OPTIONS2);
242 $ss->assign('TIME_START_MINUTES_OPTIONS2',$TIME_START_MINUTES_OPTIONS2);
243 $ss->assign('TIME_MERIDIEM2',$TIME_MERIDIEM2);
244 $ss->assign('show_calls',$this->cal->show_calls);
245 $ss->assign('show_tasks',$this->cal->show_tasks);
249 * Get date info string (legacy from old calendar)
252 public function get_date_info($view, $date_time){
255 global $current_user;
256 $dateFormat = $current_user->getUserDateTimePreferences();
258 if($view == 'month'){
259 for($i=0; $i<strlen($dateFormat['date']); $i++){
260 switch($dateFormat['date']{$i}){
262 $str .= " ".$date_time->year;
265 $str .= " ".$date_time->get_month_name();
270 if($view == 'week' || $view == 'shared') {
271 $first_day = $date_time;
273 $first_day = CalendarUtils::get_first_day_of_week($date_time);
274 $last_day = $first_day->get("+6 days");
276 for($i=0; $i<strlen($dateFormat['date']); $i++) {
277 switch($dateFormat['date']{$i}){
279 $str .= " ".$first_day->year;
282 $str .= " ".$first_day->get_month_name();
285 $str .= " ".$first_day->get_day();
290 for($i=0; $i<strlen($dateFormat['date']); $i++) {
291 switch($dateFormat['date']{$i}) {
293 $str .= " ".$last_day->year;
296 $str .= " ".$last_day->get_month_name();
299 $str .= " ".$last_day->get_day();
303 }else if($view == 'day'){
304 $str .= $date_time->get_day_of_week()." ";
306 for($i=0; $i<strlen($dateFormat['date']); $i++){
307 switch($dateFormat['date']{$i}){
309 $str .= " ".$date_time->year;
312 $str .= " ".$date_time->get_month_name();
315 $str .= " ".$date_time->get_day();
319 }else if($view == 'year') {
320 $str .= $date_time->year;
322 sugar_die("echo_date_info: date not supported");
328 * Get link to next date range
331 protected function get_next_calendar(){
332 global $cal_strings,$image_path;
334 if($_REQUEST['module'] == "Calendar"){
335 $str .= "<a href='".ajaxLink("index.php?action=index&module=Calendar&view=".$this->cal->view."&".$this->cal->get_neighbor_date_str("next"))."'>";
338 $str .= "<a href='#' onclick='return SUGAR.mySugar.retrieveDashlet(\"".$this->dashlet_id."\", \"index.php?module=Home&action=DynamicAction&DynamicAction=displayDashlet&sugar_body_only=1&".$this->cal->get_neighbor_date_str("next")."&id=".$this->dashlet_id."\")'>";
340 $str .= $cal_strings["LBL_NEXT_".strtoupper($this->cal->view)];
342 $str .= " ".SugarThemeRegistry::current()->getImage("calendar_next", 'align="absmiddle" border="0"' ,null,null,'.gif', '') . "</a>"; //setting alt tag blank on purpose for 508 compliance
347 * Get link to previous date range
350 protected function get_previous_calendar(){
351 global $cal_strings,$image_path;
353 if($_REQUEST['module'] == "Calendar"){
354 $str .= "<a href='".ajaxLink("index.php?action=index&module=Calendar&view=".$this->cal->view."&".$this->cal->get_neighbor_date_str("previous")."")."'>";
356 $str .= "<a href='#' onclick='return SUGAR.mySugar.retrieveDashlet(\"".$this->dashlet_id."\", \"index.php?module=Home&action=DynamicAction&DynamicAction=displayDashlet&sugar_body_only=1&".$this->cal->get_neighbor_date_str("previous")."&id=".$this->dashlet_id."\")'>";
358 $str .= SugarThemeRegistry::current()->getImage('calendar_previous','align="absmiddle" border="0"', null, null, '.gif', ''); //setting alt tag blank on purpose for 508 compliance
359 $str .= " ".$cal_strings["LBL_PREVIOUS_".strtoupper($this->cal->view)] . "</a>";
365 * @param boolean $controls display ui contol itmes
367 public function display_calendar_header($controls = true){
370 $ss = new Sugar_Smarty();
371 $ss->assign("MOD",$cal_strings);
372 $ss->assign("view",$this->cal->view);
375 $current_date = str_pad($this->cal->date_time->month,2,'0',STR_PAD_LEFT)."/".str_pad($this->cal->date_time->day,2,'0',STR_PAD_LEFT)."/".$this->cal->date_time->year;
377 $tabs = array('day', 'week', 'month', 'year', 'shared');
378 $tabs_params = array();
379 foreach($tabs as $tab){
380 $tabs_params[$tab]['title'] = $cal_strings["LBL_".strtoupper($tab)];
381 $tabs_params[$tab]['link'] = "window.location.href='".ajaxLink("index.php?module=Calendar&action=index&view=". $tab . $this->cal->date_time->get_date_str())."'";
383 $ss->assign('controls',$controls);
384 $ss->assign('tabs',$tabs);
385 $ss->assign('tabs_params',$tabs_params);
386 $ss->assign('current_date',$current_date);
387 $ss->assign('start_weekday',$GLOBALS['current_user']->get_first_day_of_week());
388 $ss->assign('cal_img',SugarThemeRegistry::current()->getImageURL("jscalendar.gif",false));
391 $ss->assign('previous',$this->get_previous_calendar());
392 $ss->assign('next',$this->get_next_calendar());
394 $ss->assign('date_info',$this->get_date_info($this->cal->view,$this->cal->date_time));
396 $header = "custom/modules/Calendar/tpls/header.tpl";
397 if(!file_exists($header))
398 $header = "modules/Calendar/tpls/header.tpl";
399 echo $ss->fetch($header);
405 public function display_calendar_footer(){
408 $ss = new Sugar_Smarty();
409 $ss->assign("MOD",$cal_strings);
410 $ss->assign("view",$this->cal->view);
412 $ss->assign('previous',$this->get_previous_calendar());
413 $ss->assign('next',$this->get_next_calendar());
415 $footer = "custom/modules/Calendar/tpls/footer.tpl";
416 if(!file_exists($footer))
417 $footer = "modules/Calendar/tpls/footer.tpl";
418 echo $ss->fetch($footer);
424 public function display_title(){
426 echo get_module_title("Calendar","<span class='pointer'>»</span>".$mod_strings['LBL_MODULE_TITLE'], false);
430 * display html used in shared view (legacy code from old calendar)
432 public function display_shared_html(){
433 global $app_strings,$cal_strings,$action;
435 if(empty($_SESSION['shared_ids']))
436 $_SESSION['shared_ids'] = "";
438 $ss = new Sugar_Smarty();
439 $ss->assign("APP",$app_strings);
440 $ss->assign("MOD",$cal_strings);
441 $ss->assign("UP",SugarThemeRegistry::current()->getImage('uparrow_big', 'border="0" style="margin-bottom: 1px;"', null, null, '.gif', $app_strings['LBL_SORT']));
442 $ss->assign("DOWN",SugarThemeRegistry::current()->getImage('downarrow_big', 'border="0" style="margin-top: 1px;"', null, null, '.gif', $app_strings['LBL_SORT']));
443 $ss->assign("options",get_select_options_with_id(get_user_array(false), $this->cal->shared_ids));
445 $tpl = "modules/Calendar/tpls/shared_users.tpl";
446 echo $ss->fetch($tpl);