/********************************************************************************* * SugarCRM is a customer relationship management program developed by * SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License version 3 as published by the * Free Software Foundation with the addition of the following permission added * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License along with * this program; if not, see http://www.gnu.org/licenses or write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. * * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * SugarCRM" logo. If the display of the logo is not reasonably feasible for * technical reasons, the Appropriate Legal Notices must display the words * "Powered by SugarCRM". ********************************************************************************/ /** * Datetimecombo.js * This is a javascript object that handles rendering the non-date portions * of a datetime field. There are some assumptions that are made so this * class serves more as a utility rather than a building block. It is used * primarily to handle the datetime field shown for Call, Meetings and Tasks * edit views. */ /* * Datetimecombo constructor * @param datetime * @param fieldname * @param timeformat * @param tabindex * @allowEmptyHM - if this param was set true , the hour and minute select field will has an empty option. */ function Datetimecombo (datetime, field, timeformat, tabindex, showCheckbox, checked, allowEmptyHM) { this.datetime = datetime; this.allowEmptyHM = allowEmptyHM; if(typeof this.datetime == "undefined" || datetime == '' || trim(datetime).length < 10) { this.datetime = ""; var d = new Date(); var month = d.getMonth(); var date = d.getDate(); var year = d.getYear(); var hours = d.getHours(); var minutes = d.getMinutes(); } this.fieldname = field; //Get hours and minutes and adjust as necessary this.hrs = parseInt(datetime.substring(11,13), 10); this.mins = parseInt(datetime.substring(14,16), 10); //A safety scan to make sure hrs and minutes are formatted correctly if (this.mins > 0 && this.mins < 15) { this.mins = 15; } else if (this.mins > 15 && this.mins < 30) { this.mins = 30; } else if (this.mins > 30 && this.mins < 45) { this.mins = 45; } else if (this.mins > 45) { this.hrs += 1; this.mins = 0; } //if-else this.timeformat = timeformat; //23:00 || 11:00 this.tabindex = tabindex == null || isNaN(tabindex) ? 1 : tabindex; // Calculate other derived values this.timeseparator = this.timeformat.substring(2,3); this.has12Hours = /^11/.test(this.timeformat); this.hasMeridiem = /am|pm/i.test(this.timeformat); if(this.hasMeridiem) { this.pm = /pm/.test(this.timeformat); } this.meridiem = this.hasMeridiem ? trim(this.datetime.substring(16)) : ''; this.datetime = this.datetime.substr(0,10); this.showCheckbox = showCheckbox; this.checked = parseInt(checked); document.getElementById(this.fieldname + '_date').value = this.datetime; } /** * jsscript * This function renders the javascript portion to handle updates * on the calendar widget. We have to do this because browsers like Mozilla * have errors when attempting to handle events inside a class function. * This is the reason why this code that is generated is not placed within * the update function of the Datetimecombo class. Instead, it is run * using the eval() method when the widget is loaded. */ Datetimecombo.prototype.jsscript = function(callback) { //text = '\n'; return text; } /** * html * This function renders the HTML form elements for this widget */ Datetimecombo.prototype.html = function(callback) { //Now render the items var text = ' '; text += this.timeseparator; text += '\n '; if(this.hasMeridiem) { text += '\n '; text += '\n'; } if(this.showCheckbox) { text += '\n'; //text += ' ' + SUGAR.language.get("app_strings", "LBL_LINK_NONE"); } return text; }; /** * update * This method handles events on the hour, minute and meridiem elements for the widget * * XXX TODO 20100317 Frank Steegmans: The code in this module is violating so many best practices * that it will need to get rewritten. Also note that it still stems from before the datetime unification. */ Datetimecombo.prototype.update = function() { // Bug 42025: hour/minute/second still required when start_date is non required // Fixing this by just assigning default when they aren't required var d = window.document.getElementById(this.fieldname + '_date'); var h = window.document.getElementById(this.fieldname + '_hours'); var m = window.document.getElementById(this.fieldname + '_minutes'); var mer = document.getElementById(this.fieldname + "_meridiem"); if(d.value == "") { // if date is not set wipe time settings h.selectedIndex = 0; m.selectedIndex = 0; if(mer) mer.selectedIndex = 0; } else { // if date is set and hours/minutes are not allowed empty, initialize them if(this.allowEmptyHM) { if(h.selectedIndex == 0) h.selectedIndex = 12; if(m.selectedIndex == 0) m.selectedIndex = 1; if(mer && (mer.selectedIndex == 0)) mer.selectedIndex = 1; } } var newdate = d.value + ' ' + h.value + this.timeseparator + m.value; if(this.hasMeridiem) { ampm = document.getElementById(this.fieldname + "_meridiem").value; newdate += ampm; } if(trim(newdate) == ""+this.timeseparator+""){ newdate = ''; } document.getElementById(this.fieldname).value = newdate; if(this.showCheckbox) { flag = this.fieldname + '_flag'; date = this.fieldname + '_date'; hours = this.fieldname + '_hours'; mins = this.fieldname + '_minutes'; if(document.getElementById(flag).checked) { document.getElementById(flag).value=1; document.getElementById(this.fieldname).value = ''; document.getElementById(date).disabled=true; document.getElementById(hours).disabled=true; document.getElementById(mins).disabled=true; } else { document.getElementById(flag).value=0; document.getElementById(date).disabled=false; document.getElementById(hours).disabled=false; document.getElementById(mins).disabled=false; } } };