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 ********************************************************************************/
39 class CalendarDisplay {
42 * colors of items on calendar
44 public $activity_colors = array(
46 'border' => '#1C5FBD',
50 'border' => '#DE4040',
54 'border' => '#015900',
61 * @param Calendar $cal
62 * @param string $dashlet_id for dashlet mode
64 function __construct(&$cal,$dashlet_id = ""){
66 $this->dashlet_id = $dashlet_id;
70 * main displaying function of Calendar
72 public function display(){
77 $ss = new Sugar_Smarty();
79 $ss->assign('APP',$GLOBALS['app_strings']);
80 $ss->assign('APPLIST',$GLOBALS['app_list_strings']);
81 $ss->assign('MOD',$GLOBALS['cal_strings']);
83 $ss->assign('view',$cal->view);
84 $ss->assign('t_step',$cal->time_step);
85 $ss->assign('current_user_id',$GLOBALS['current_user']->id);
86 $ss->assign('current_user_name',$GLOBALS['current_user']->name);
87 $ss->assign('time_format',$GLOBALS['timedate']->get_user_time_format());
88 $ss->assign('items_draggable',SugarConfig::getInstance()->get('calendar.items_draggable',true));
89 $ss->assign('mouseover_expand',SugarConfig::getInstance()->get('calendar.mouseover_expand',true));
90 $ss->assign('item_text','name');
91 $ss->assign('cells_per_day',$cal->cells_per_day);
92 $ss->assign('img_edit_inline',SugarThemeRegistry::current()->getImageURL('edit_inline.gif',false));
93 $ss->assign('img_view_inline',SugarThemeRegistry::current()->getImageURL('view_inline.gif',false));
94 $ss->assign('img_close',SugarThemeRegistry::current()->getImageURL('close.gif',false));
95 $ss->assign('dashlet',$cal->dashlet);
97 $ss->assign('grid_start_ts',$cal->grid_start_ts);
98 $ss->assign('celcount',$cal->celcount);
100 if(count($cal->shared_ids)){
101 $ss->assign('shared_ids',$cal->shared_ids);
102 $ss->assign('shared_users_count',count($cal->shared_ids));
104 $ss->assign('activity_colors',$this->activity_colors);
106 $ss->assign('scroll_slot',$this->cal->scroll_slot);
108 $ss->assign('editview_width',SugarConfig::getInstance()->get('calendar.editview_width',800));
109 $ss->assign('editview_height',SugarConfig::getInstance()->get('calendar.editview_height',600));
110 $ss->assign('a_str',$cal->get_activities_js());
112 $ss->assign('sugar_body_only',(isset($_REQUEST['to_pdf']) && $_REQUEST['to_pdf'] || isset($_REQUEST['sugar_body_only']) && $_REQUEST['sugar_body_only']));
113 require_once('include/json_config.php');
115 $json = getJSONobj();
116 $json_config = new json_config();
117 $ss->assign('GRjavascript',$json_config->get_static_json_server(false, true, 'Meetings'));
120 $user_default_date_start = $timedate->asUser($timedate->getNow());
121 $ss->assign('user_default_date_start',$user_default_date_start);
124 if($_REQUEST['module'] == "Calendar"){
125 $this->load_settings_template($ss);
126 $settings = "custom/modules/Calendar/tpls/settings.tpl";
127 if(!file_exists($settings))
128 $settings = "modules/Calendar/tpls/settings.tpl";
129 $ss->assign("settings",$settings);
132 $main = "custom/modules/Calendar/tpls/main.tpl";
133 if(!file_exists($main))
134 $main = "modules/Calendar/tpls/main.tpl";
135 $form_tpl = "custom/modules/Calendar/tpls/form.tpl";
136 if(!file_exists($form_tpl))
137 $form_tpl = "modules/Calendar/tpls/form.tpl";
139 $ss->assign("form",$form_tpl);
141 echo $ss->fetch($main);
144 $grid = new CalendarGrid($cal);
145 echo $grid->display();
150 * load settings popup template
152 protected function load_settings_template(&$ss){
154 list($d_start_hour,$d_start_min) = explode(":",$this->cal->day_start_time);
155 list($d_end_hour,$d_end_min) = explode(":",$this->cal->day_end_time);
157 require_once("include/utils.php");
158 global $app_strings,$app_list_strings,$beanList;
161 $user_default_date_start = $timedate->asUser($timedate->getNow());
162 if(!isset($time_separator))
163 $time_separator = ":";
164 $date_format = $timedate->get_cal_date_format();
165 $time_format = $timedate->get_user_time_format();
166 $TIME_FORMAT = $time_format;
167 $t23 = strpos($time_format, '23') !== false ? '%H' : '%I';
168 if(!isset($match[2]) || $match[2] == '') {
169 $CALENDAR_FORMAT = $date_format . ' ' . $t23 . $time_separator . "%M";
171 $pm = $match[2] == "pm" ? "%P" : "%p";
172 $CALENDAR_FORMAT = $date_format . ' ' . $t23 . $time_separator . "%M" . $pm;
174 $hours_arr = array ();
178 $time_pref = $timedate->get_time_format();
180 if(strpos($time_pref, 'a') || strpos($time_pref, 'A')){
184 if($d_start_hour == 0){
188 if($d_start_hour == 12)
190 if($d_start_hour > 12){
191 $d_start_hour = $d_start_hour - 12;
195 if($d_end_hour == 0){
199 if($d_end_hour == 12)
202 if($d_end_hour > 12){
203 $d_end_hour = $d_end_hour - 12;
206 if(strpos($time_pref, 'A')){
207 $start_m = strtoupper($start_m);
208 $end_m = strtoupper($end_m);
210 $options = strpos($time_pref, 'a') ? $app_list_strings['dom_meridiem_lowercase'] : $app_list_strings['dom_meridiem_uppercase'];
211 $TIME_START_MERIDIEM = get_select_options_with_id($options, $start_m);
212 $TIME_END_MERIDIEM = get_select_options_with_id($options, $end_m);
213 $TIME_START_MERIDIEM = "<select id='day_start_meridiem' name='day_start_meridiem' tabindex='2'>".$TIME_START_MERIDIEM."</select>";
214 $TIME_END_MERIDIEM = "<select id='day_end_meridiem' name='day_end_meridiem' tabindex='2'>".$TIME_END_MERIDIEM."</select>";
216 $TIME_START_MERIDIEM = $TIME_END_MERIDIEM = "";
218 for($i = $start_at; $i <= $num_of_hours; $i ++){
224 $TIME_START_HOUR_OPTIONS = get_select_options_with_id($hours_arr, $d_start_hour);
225 $TIME_START_MINUTES_OPTIONS = get_select_options_with_id(array('0'=>'00','15'=>'15','30'=>'30','45'=>'45'), $d_start_min);
226 $TIME_END_HOUR_OPTIONS = get_select_options_with_id($hours_arr, $d_end_hour);
227 $TIME_END_MINUTES_OPTIONS = get_select_options_with_id(array('0'=>'00','15'=>'15','30'=>'30','45'=>'45'), $d_end_min);
229 $ss->assign('day',$_REQUEST['day']);
230 $ss->assign('week',$_REQUEST['week']);
231 $ss->assign('month',$_REQUEST['month']);
232 $ss->assign('year',$_REQUEST['year']);
233 $ss->assign('TIME_START_HOUR_OPTIONS',$TIME_START_HOUR_OPTIONS);
234 $ss->assign('TIME_START_MINUTES_OPTIONS',$TIME_START_MINUTES_OPTIONS);
235 $ss->assign('TIME_START_MERIDIEM',$TIME_START_MERIDIEM);
236 $ss->assign('TIME_END_HOUR_OPTIONS',$TIME_END_HOUR_OPTIONS);
237 $ss->assign('TIME_END_MINUTES_OPTIONS',$TIME_END_MINUTES_OPTIONS);
238 $ss->assign('TIME_END_MERIDIEM',$TIME_END_MERIDIEM);
239 $ss->assign('show_calls',$this->cal->show_calls);
240 $ss->assign('show_tasks',$this->cal->show_tasks);
244 * Get date info string (legacy from old calendar)
247 public function get_date_info($view, $date_time){
250 global $current_user;
251 $dateFormat = $current_user->getUserDateTimePreferences();
253 if($view == 'month'){
254 for($i=0; $i<strlen($dateFormat['date']); $i++){
255 switch($dateFormat['date']{$i}){
257 $str .= " ".$date_time->year;
260 $str .= " ".$date_time->get_month_name();
265 if($view == 'week' || $view == 'shared') {
266 $first_day = $date_time;
268 $first_day = CalendarUtils::get_first_day_of_week($date_time);
269 $last_day = $first_day->get("+6 days");
271 for($i=0; $i<strlen($dateFormat['date']); $i++) {
272 switch($dateFormat['date']{$i}){
274 $str .= " ".$first_day->year;
277 $str .= " ".$first_day->get_month_name();
280 $str .= " ".$first_day->get_day();
285 for($i=0; $i<strlen($dateFormat['date']); $i++) {
286 switch($dateFormat['date']{$i}) {
288 $str .= " ".$last_day->year;
291 $str .= " ".$last_day->get_month_name();
294 $str .= " ".$last_day->get_day();
298 }else if($view == 'day'){
299 $str .= $date_time->get_day_of_week()." ";
301 for($i=0; $i<strlen($dateFormat['date']); $i++){
302 switch($dateFormat['date']{$i}){
304 $str .= " ".$date_time->year;
307 $str .= " ".$date_time->get_month_name();
310 $str .= " ".$date_time->get_day();
314 }else if($view == 'year') {
315 $str .= $date_time->year;
317 sugar_die("echo_date_info: date not supported");
323 * Get link to next date range
326 protected function get_next_calendar(){
327 global $cal_strings,$image_path;
329 if($_REQUEST['module'] == "Calendar"){
330 $str .= "<a href='".ajaxLink("index.php?action=index&module=Calendar&view=".$this->cal->view."&".$this->cal->get_neighbor_date_str("next"))."'>";
333 $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."\")'>";
335 $str .= $cal_strings["LBL_NEXT_".strtoupper($this->cal->view)];
337 $str .= " ".SugarThemeRegistry::current()->getImage("calendar_next", 'align="absmiddle" border="0"' ,null,null,'.gif', '') . "</a>"; //setting alt tag blank on purpose for 508 compliance
342 * Get link to previous date range
345 protected function get_previous_calendar(){
346 global $cal_strings,$image_path;
348 if($_REQUEST['module'] == "Calendar"){
349 $str .= "<a href='".ajaxLink("index.php?action=index&module=Calendar&view=".$this->cal->view."&".$this->cal->get_neighbor_date_str("previous")."")."'>";
351 $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."\")'>";
353 $str .= SugarThemeRegistry::current()->getImage('calendar_previous','align="absmiddle" border="0"', null, null, '.gif', ''); //setting alt tag blank on purpose for 508 compliance
354 $str .= " ".$cal_strings["LBL_PREVIOUS_".strtoupper($this->cal->view)] . "</a>";
360 * @param boolean $controls display ui contol elements
362 public function display_calendar_header($controls = true){
365 $ss = new Sugar_Smarty();
366 $ss->assign("MOD",$cal_strings);
367 $ss->assign("view",$this->cal->view);
370 $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;
372 $tabs = array('day', 'week', 'month', 'year', 'shared');
373 $tabs_params = array();
374 foreach($tabs as $tab){
375 $tabs_params[$tab]['title'] = $cal_strings["LBL_".strtoupper($tab)];
376 $tabs_params[$tab]['id'] = $tab . "_tab";
377 $tabs_params[$tab]['link'] = "window.location.href='".ajaxLink("index.php?module=Calendar&action=index&view=". $tab . $this->cal->date_time->get_date_str())."'";
379 $ss->assign('controls',$controls);
380 $ss->assign('tabs',$tabs);
381 $ss->assign('tabs_params',$tabs_params);
382 $ss->assign('current_date',$current_date);
383 $ss->assign('start_weekday',$GLOBALS['current_user']->get_first_day_of_week());
384 $ss->assign('cal_img',SugarThemeRegistry::current()->getImageURL("jscalendar.gif",false));
387 $ss->assign('previous',$this->get_previous_calendar());
388 $ss->assign('next',$this->get_next_calendar());
390 $ss->assign('date_info',$this->get_date_info($this->cal->view,$this->cal->date_time));
392 $header = "custom/modules/Calendar/tpls/header.tpl";
393 if(!file_exists($header))
394 $header = "modules/Calendar/tpls/header.tpl";
395 echo $ss->fetch($header);
401 public function display_calendar_footer(){
404 $ss = new Sugar_Smarty();
405 $ss->assign("MOD",$cal_strings);
406 $ss->assign("view",$this->cal->view);
408 $ss->assign('previous',$this->get_previous_calendar());
409 $ss->assign('next',$this->get_next_calendar());
411 $footer = "custom/modules/Calendar/tpls/footer.tpl";
412 if(!file_exists($footer))
413 $footer = "modules/Calendar/tpls/footer.tpl";
414 echo $ss->fetch($footer);
420 public function display_title(){
422 echo get_module_title("Calendar","<span class='pointer'>»</span>".$mod_strings['LBL_MODULE_TITLE'], false);
426 * display html used in shared view
428 public function display_shared_html(){
429 global $app_strings,$cal_strings,$action;
431 $ss = new Sugar_Smarty();
432 $ss->assign("APP",$app_strings);
433 $ss->assign("MOD",$cal_strings);
434 $ss->assign("UP",SugarThemeRegistry::current()->getImage('uparrow_big', 'border="0" style="margin-bottom: 1px;"', null, null, '.gif', $app_strings['LBL_SORT']));
435 $ss->assign("DOWN",SugarThemeRegistry::current()->getImage('downarrow_big', 'border="0" style="margin-top: 1px;"', null, null, '.gif', $app_strings['LBL_SORT']));
437 if(empty($_REQUEST['edit_shared'])){
438 $ss->assign("style","display: none");
442 $ss->assign("users_options",get_select_options_with_id(get_user_array(false), $this->cal->shared_ids));
444 $tpl = "modules/Calendar/tpls/shared_users.tpl";
445 echo $ss->fetch($tpl);