]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - jssource/src_files/include/javascript/calendar.js
Release 6.3.0
[Github/sugarcrm.git] / jssource / src_files / include / javascript / calendar.js
1 /*********************************************************************************
2  * SugarCRM Community Edition is a customer relationship management program developed by
3  * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
4  * 
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU Affero General Public License version 3 as published by the
7  * Free Software Foundation with the addition of the following permission added
8  * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
9  * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
10  * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
11  * 
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
15  * details.
16  * 
17  * You should have received a copy of the GNU Affero General Public License along with
18  * this program; if not, see http://www.gnu.org/licenses or write to the Free
19  * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20  * 02110-1301 USA.
21  * 
22  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
23  * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
24  * 
25  * The interactive user interfaces in modified source and object code versions
26  * of this program must display Appropriate Legal Notices, as required under
27  * Section 5 of the GNU Affero General Public License version 3.
28  * 
29  * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
30  * these Appropriate Legal Notices must retain the display of the "Powered by
31  * SugarCRM" logo. If the display of the logo is not reasonably feasible for
32  * technical reasons, the Appropriate Legal Notices must display the words
33  * "Powered by SugarCRM".
34  ********************************************************************************/
35
36
37 Calendar = function() {};
38
39 Calendar.getHighestZIndex = function (containerEl)
40 {
41    var highestIndex = 0;
42    var currentIndex = 0;
43    var els = Array();
44    
45    els = containerEl ? containerEl.getElementsByTagName('*') : document.getElementsByTagName('*');
46    
47    for(var i=0; i < els.length; i++)
48    {
49       currentIndex = YAHOO.util.Dom.getStyle(els[i], "zIndex");
50       if(!isNaN(currentIndex) && currentIndex > highestIndex)
51       { 
52          highestIndex = parseInt(currentIndex); 
53       }
54    }
55    
56    return (highestIndex == Number.MAX_VALUE) ? Number.MAX_VALUE : highestIndex+1;
57 };
58
59 Calendar.setup = function (params) {
60
61     YAHOO.util.Event.onDOMReady(function(){
62         
63         var Event = YAHOO.util.Event;
64         var Dom = YAHOO.util.Dom;
65         var dialog;
66         var calendar;
67         var showButton = params.button ? params.button : params.buttonObj;
68         var userDateFormat = params.ifFormat ? params.ifFormat : (params.daFormat ? params.daFormat : "m/d/Y");
69         var inputField = params.inputField ? params.inputField : params.inputFieldObj;
70         var dateFormat = userDateFormat.substr(0,10);
71         var date_field_delimiter = /([-.\\/])/.exec(dateFormat)[0];
72         dateFormat = dateFormat.replace(/[^a-zA-Z]/g,'');
73         
74         var monthPos = dateFormat.search(/m/);
75         var dayPos = dateFormat.search(/d/);
76         var yearPos = dateFormat.search(/Y/);         
77         
78         Event.on(Dom.get(showButton), "click", function() {
79
80             if (!dialog) {
81                                   
82                 dialog = new YAHOO.widget.SimpleDialog("container_" + showButton, {
83                     visible:false,
84                     context:[showButton, "tl", "bl"],
85                     buttons:[],
86                     draggable:false,
87                     close:true,
88                     zIndex: Calendar.getHighestZIndex(document.body)
89                 });
90                 
91                 dialog.setHeader(SUGAR.language.get('app_strings', 'LBL_MASSUPDATE_DATE'));
92                 var dialogBody = '<p class="callnav_today"><a href="javascript:void(0)"  id="callnav_today">' + SUGAR.language.get('app_strings', 'LBL_EMAIL_DATE_TODAY') + '</a></p><div id="' + showButton + '_div"></div>';
93                 dialog.setBody(dialogBody);
94                 dialog.render(document.body);
95
96                 //Since the cal div name is dynamic we need to add a custom class to override some default yui css styles
97                 Dom.addClass("container_" + showButton, "cal_panel");
98                 
99                 //Clear the date selection if the user clicks on today.
100                 Event.addListener("callnav_today", "click", function(){ 
101                     calendar.clear();
102                     var now = new Date();
103                     //Reset the input field value
104                     Dom.get(inputField).value = formatSelectedDate(now);
105                     //Highlight the cell
106                     var cellIndex = calendar.getCellIndex(now);
107                     if(cellIndex > -1 )
108                     {
109                         var cell = calendar.cells[cellIndex];
110                         Dom.addClass(cell, calendar.Style.CSS_CELL_SELECTED);
111                     }
112                     //Must return false to prevent onbeforeunload from firing in IE8
113                     return false;
114                 });
115                 
116                 dialog.showEvent.subscribe(function() {
117                     if (YAHOO.env.ua.ie) {
118                         // Since we're hiding the table using yui-overlay-hidden, we 
119                         // want to let the dialog know that the content size has changed, when
120                         // shown
121                         dialog.fireEvent("changeContent");
122                     }
123                 });
124                 
125                 // Hide Calendar if we click anywhere in the document other than the calendar
126                 Event.on(document, "click", function(e) {
127                         
128                     if(!dialog)
129                     {
130                        return;  
131                     }                   
132                         
133                     var el = Event.getTarget(e);                   
134                     var dialogEl = dialog.element;
135                     if (el != dialogEl && !Dom.isAncestor(dialogEl, el) && el != Dom.get(showButton) && !Dom.isAncestor(Dom.get(showButton), el)) {
136                         dialog.hide();
137                     }
138                 });                
139             }
140
141             // Lazy Calendar Creation - Wait to create the Calendar until the first time the button is clicked.
142             if (!calendar) {
143                 var navConfig = {
144                     strings : {
145                         month: SUGAR.language.get('app_strings', 'LBL_CHOOSE_MONTH'),
146                         year: SUGAR.language.get('app_strings', 'LBL_ENTER_YEAR'),
147                         submit: SUGAR.language.get('app_strings', 'LBL_EMAIL_OK'),
148                         cancel: SUGAR.language.get('app_strings', 'LBL_CANCEL_BUTTON_LABEL'),
149                         invalidYear: SUGAR.language.get('app_strings', 'LBL_ENTER_VALID_YEAR')
150                     },
151                     monthFormat: YAHOO.widget.Calendar.SHORT,
152                     initialFocus: "year"
153                 };                      
154                 
155                 calendar = new YAHOO.widget.Calendar(showButton + '_div', {
156                     iframe:false,
157                     hide_blank_weeks:true,
158                     navigator:navConfig
159                 });
160                 
161                 calendar.cfg.setProperty('DATE_FIELD_DELIMITER', date_field_delimiter);
162                 calendar.cfg.setProperty('MDY_DAY_POSITION', dayPos+1);
163                 calendar.cfg.setProperty('MDY_MONTH_POSITION', monthPos+1);
164                 calendar.cfg.setProperty('MDY_YEAR_POSITION', yearPos+1);
165                 
166                 //Configure the month and days label with localization support where defined
167                 if(typeof SUGAR.language.languages['app_list_strings'] != 'undefined' && SUGAR.language.languages['app_list_strings']['dom_cal_month_long'] != 'undefined')
168                 {
169                         if(SUGAR.language.languages['app_list_strings']['dom_cal_month_long'].length == 13)
170                         {
171                            SUGAR.language.languages['app_list_strings']['dom_cal_month_long'].shift();
172                         }
173                         calendar.cfg.setProperty('MONTHS_LONG', SUGAR.language.languages['app_list_strings']['dom_cal_month_long']);
174                 }
175                 
176                 if(typeof SUGAR.language.languages['app_list_strings'] != 'undefined'  && typeof SUGAR.language.languages['app_list_strings']['dom_cal_day_short'] != 'undefined')
177                 {
178                         if(SUGAR.language.languages['app_list_strings']['dom_cal_day_short'].length == 8)
179                         {
180                            SUGAR.language.languages['app_list_strings']['dom_cal_day_short'].shift();
181                         }                       
182                         calendar.cfg.setProperty('WEEKDAYS_SHORT', SUGAR.language.languages['app_list_strings']['dom_cal_day_short']);
183                 }
184
185                 var formatSelectedDate = function(selDate)
186                 {
187                     var monthVal = selDate.getMonth() + 1; //Add one for month value
188                     if(monthVal < 10)
189                     {
190                         monthVal = '0' + monthVal;
191                     }
192
193                     var dateVal = selDate.getDate();
194
195                     if(dateVal < 10)
196                     {
197                         dateVal = '0' + dateVal;
198                     }
199
200                     var yearVal = selDate.getFullYear();
201
202                     selDate = '';
203                     if(monthPos == 0)
204                     {
205                         selDate = monthVal;
206                     }
207                     else if(dayPos == 0)
208                     {
209                         selDate = dateVal;
210                     }
211                     else
212                     {
213                         selDate = yearVal;
214                     }
215
216                     if(monthPos == 1)
217                     {
218                         selDate += date_field_delimiter + monthVal;
219                     }
220                     else if(dayPos == 1)
221                     {
222                         selDate += date_field_delimiter + dateVal;
223                     }
224                     else
225                     {
226                         selDate += date_field_delimiter + yearVal;
227                     }
228
229                     if(monthPos == 2)
230                     {
231                         selDate += date_field_delimiter + monthVal;
232                     }
233                     else if(dayPos == 2)
234                     {
235                         selDate += date_field_delimiter + dateVal;
236                     }
237                     else
238                     {
239                         selDate += date_field_delimiter + yearVal;
240                     }
241
242                     return selDate;
243                 };
244                 
245                 calendar.selectEvent.subscribe(function() {
246                     var input = Dom.get(inputField);
247                                         if (calendar.getSelectedDates().length > 0) {
248
249                         input.value = formatSelectedDate(calendar.getSelectedDates()[0]);
250                         
251                         if(params.comboObject)
252                         {
253                            params.comboObject.update();
254                         }
255                     } else {
256                         input.value = "";
257                     }
258                                         
259                                         //bug 44147 fix
260                     //does not trigger onchange event
261                     if(input.onchange)
262                         input.onchange();
263                     //end bugfix
264                     
265
266                     dialog.hide();
267                                         //Fire any on-change events for this input field
268                                         SUGAR.util.callOnChangeListers(input);
269                 });
270
271                 calendar.renderEvent.subscribe(function() {
272                     // Tell Dialog it's contents have changed, which allows 
273                     // container to redraw the underlay (for IE6/Safari2)
274                     dialog.fireEvent("changeContent");
275                 });
276                
277             }
278             
279             var seldate = calendar.getSelectedDates();
280             if (Dom.get(inputField).value.length > 0) {
281                 val = new Date(Dom.get(inputField).value);
282                 if(!isNaN(val.getTime()))
283                 {
284                         calendar.cfg.setProperty("selected", Dom.get(inputField).value);
285                         seldate = Dom.get(inputField).value.split(date_field_delimiter);        
286                         calendar.cfg.setProperty("pagedate", seldate[monthPos] + calendar.cfg.getProperty("DATE_FIELD_DELIMITER") + seldate[yearPos]);
287                     }
288             } else if (seldate.length > 0) {
289                 // Set the pagedate to show the selected date if it exists
290                 calendar.cfg.setProperty("selected", seldate[0]);
291                 var month = seldate[0].getMonth() + 1;
292                 var year = seldate[0].getFullYear();
293                 calendar.cfg.setProperty("pagedate", month + calendar.cfg.getProperty("DATE_FIELD_DELIMITER") + year);          
294             }      
295
296             calendar.render();
297             dialog.show();
298         });
299     }); 
300 };