shell bypass 403
if (typeof RSFormPro !== 'object') {
var RSFormPro = {};
}
// if the browser has not defined the Object.keys function
if (!Object.keys) Object.keys = function(o) {
if (o !== Object(o))
throw new TypeError('Object.keys called on a non-object');
var k=[],p;
for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p);
return k;
};
// set the moment custom localization
jQuery(document).ready(function(){
moment.locale('custom', {
months : RSFormPro.jQueryCalendar.settings.MONTHS_LONG,
monthsShort : RSFormPro.jQueryCalendar.settings.MONTHS_SHORT,
weekdays : RSFormPro.jQueryCalendar.settings.WEEKDAYS_LONG,
weekdaysShort : RSFormPro.jQueryCalendar.settings.WEEKDAYS_MEDIUM,
weekdaysMin: RSFormPro.jQueryCalendar.settings.WEEKDAYS_SHORT
});
});
Date.parseDate = function( input, format ){
return moment(input,format).toDate();
};
Date.prototype.dateFormat = function( format ){
return moment(this).format(format);
};
RSFormPro.jQueryCalendar = {
settings: {},
calendars: {},
calendarsData: {},
setCalendar: function(formId, idCalendar, config) {
if (typeof RSFormPro.jQueryCalendar.calendarsData[formId] === 'undefined') {
RSFormPro.jQueryCalendar.calendarsData[formId] = {};
}
if (typeof RSFormPro.jQueryCalendar.calendarsData[formId][idCalendar] === 'undefined') {
RSFormPro.jQueryCalendar.calendarsData[formId][idCalendar] = {};
}
RSFormPro.jQueryCalendar.calendarsData[formId][idCalendar].config = config;
},
renderCalendars: function() {
var forms = Object.keys(RSFormPro.jQueryCalendar.calendarsData);
var countForms = forms.length;
if (countForms > 0) {
for (var i = 0; i < countForms; i++) {
var formId = forms[i];
var calendarsIds = Object.keys(RSFormPro.jQueryCalendar.calendarsData[formId]);
for (var j = 0; j < calendarsIds.length; j++) {
RSFormPro.jQueryCalendar.initCalendar(formId, calendarsIds[j], RSFormPro.jQueryCalendar.calendarsData[formId][calendarsIds[j]].config);
}
}
}
},
initCalendar: function(formId, idCalendar, config) {
if (typeof RSFormPro.jQueryCalendar.calendars[formId] === 'undefined') {
RSFormPro.jQueryCalendar.calendars[formId] = {};
}
var calendarId = 'cal'+idCalendar;
var txtDate = jQuery('#txtjQ' + calendarId);
if (!txtDate.length)
{
return;
}
var hiddenDate = jQuery('#hiddenjQ' + calendarId);
var calendarName = txtDate.attr('name').substring(5, txtDate.attr('name').length - 1);
if (typeof RSFormPro.jQueryCalendar.calendars[formId][calendarName] === 'undefined') {
// initiate the object
RSFormPro.jQueryCalendar.calendars[formId][calendarName] = {};
// check if the date format configured by the user has any time data in it
var hasTimeDateFormat = /H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|S{1,3}|Z{1,2}/.test(config.format);
if (config.timepicker && !hasTimeDateFormat) {
config.timepicker = false;
}
// if the value is set configure the startDate and apply it to the hidden field
var startDate = RSFormPro.jQueryCalendar.stringToDate(config.value, config.timepicker);
if (startDate) {
hiddenDate.val(config.value);
}
// set the min and max Date
var minDate = typeof config.extra.minDate !== 'undefined' ? config.extra.minDate : false;
var maxDate = typeof config.extra.maxDate !== 'undefined' ? config.extra.maxDate : false;
// set the min and max Time
var minTime = (typeof config.extra.minTime !== 'undefined' && config.extra.minTime.indexOf(':') > -1) ? config.extra.minTime : false;
var maxTime = (typeof config.extra.maxTime !== 'undefined' && config.extra.maxTime.indexOf(':') > -1) ? config.extra.maxTime : false;
// set the time step
var step = (typeof config.extra.step !== 'undefined' && !isNaN(config.extra.step)) ? parseInt(config.extra.step) : 60;
// set the allowDates
var allowDates = (typeof config.extra.allowDates === 'object' && jQuery.isArray(config.extra.allowDates)) ? config.extra.allowDates : [];
// set the allowDateRe
var allowDateRe = typeof config.extra.allowDateRe !== 'undefined' ? config.extra.allowDateRe : null;
// set the disabledDates
var disabledDates = (typeof config.extra.disabledDates === 'object' && jQuery.isArray(config.extra.disabledDates)) ? config.extra.disabledDates : [];
// set the allowDateRe
var disabledWeekDays = (typeof config.extra.disabledWeekDays === 'object' && jQuery.isArray(config.extra.disabledWeekDays)) ? config.extra.disabledWeekDays : [];
// set the hidden field date format
var hiddenFormat = 'MM/DD/YYYY';
if (config.timepicker) {
hiddenFormat += ' HH:mm';
}
// set the rule
var operation = false;
var offset = 1;
if (config.extra.rule) {
var rule = config.extra.rule.split('|');
var otherCalendarName = rule[1];
operation = rule[0];
if (typeof rule[2] !== 'undefined')
{
offset = parseInt(rule[2]);
}
}
// set the timepicker format
if (typeof config.timepickerformat === 'undefined') {
config.timepickerformat = 'HH:mm';
}
// set the minTime/maxTime for the specific date according to the minDate/MaxDate
var minSpecificTime = '';
var maxSpecificTime = '';
if (config.timepicker) {
if (minDate) {
var minDateParts = minDate.split(' ');
minDate = minDateParts[0];
minSpecificTime = minDateParts[1];
}
if (maxDate) {
var maxDateParts = maxDate.split(' ');
maxDate = maxDateParts[0];
maxSpecificTime = maxDateParts[1];
}
}
// set the minDate and maxDate for the other calendar if the rule is present
if (operation && ((typeof config.value !== 'undefined' && config.value != '') || minDate || maxDate)) {
// configure the date and time regarding the rule for the other calendar
var referenceDate = false;
if (typeof config.value != 'undefined' && config.value != '') {
referenceDate = config.value;
} else if (minDate && operation == 'min') {
referenceDate = minDate;
} else if (maxDate && operation == 'max') {
referenceDate = maxDate;
}
if (referenceDate) {
var newDateParts = referenceDate.split(' ');
var newDate = newDateParts[0];
var newTime = false;
if (newDateParts.length > 1) {
newTime = newDateParts[1];
}
// if the calendar does not use the timepicker we must increment or decrement the day by 1
if (!config.timepicker) {
var newDateObject = new Date.parseDate(newDate, 'MM/DD/YYYY');
if (operation == 'min') {
var d = newDateObject.getDate() + offset;
} else {
var d = newDateObject.getDate() - offset;
}
newDateObject.setDate(d);
newDate = newDateObject.dateFormat('MM/DD/YYYY');
}
var otherCalendar = false;
if (typeof RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName] != 'undefined') {
otherCalendar = RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName];
}
if (otherCalendar) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker((operation == 'min' ? {minDate: newDate} : {maxDate: newDate}));
var newDateObject = new Date.parseDate(newDate, 'MM/DD/YYYY');
var otherDate = RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].currentDate;
if (otherDate != '') {
otherDate = Date.parseDate(otherDate, RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenFormat);
if ((operation == 'min' && newDateObject.getTime() > otherDate.getTime()) || (operation == 'max' && newDateObject.getTime() < otherDate.getTime())) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.val('');
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({startDate:false});
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenDate.val('');
}
}
if (newTime) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker((operation == 'min' ? {minTime: newTime} : {maxTime: newTime}));
}
} else {
var otherCalendarInput = document.getElementsByName("form["+otherCalendarName+"]");
// get the proper field
for (i = 0 ; i < otherCalendarInput.length; i++) {
var otherCalendarId = otherCalendarInput[i].id;
if (otherCalendarId.indexOf('txtjQcal'+formId+'_') === 0)
{
otherCalendarId = otherCalendarId.substring(8, otherCalendarId.length);
break;
}
}
if (operation == 'min') {
if (typeof RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.minDate == 'undefined') {
RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.minDate = '';
}
RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.minDate = newDate;
}
if (operation == 'max') {
if (typeof RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.maxDate == 'undefined') {
RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.maxDate = '';
}
RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.maxDate = newDate;
}
var otherTxtDate = jQuery('#txtjQcal'+otherCalendarId);
var otherHiddenDate = jQuery('#hiddenjQcal'+otherCalendarId);
var otherDate = new Date.parseDate(otherHiddenDate.val(), 'MM/DD/YYYY HH:mm');
var newDateObject = new Date.parseDate(newDate, 'MM/DD/YYYY');
if ((operation == 'min' && newDateObject.getTime() > otherDate.getTime()) || (operation == 'max' && newDateObject.getTime() < otherDate.getTime())) {
otherHiddenDate.val('');
otherTxtDate.val('');
RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.value='';
}
if (newTime) {
RSFormPro.jQueryCalendar.calendarsData[formId][otherCalendarId].config.extra.useTimeLogic = {date: newDate, time: newTime, rule: operation};
}
}
}
}
// set the current date based on the config value if is set and the hidden date format, will be needing this for the correct rule implementation
RSFormPro.jQueryCalendar.calendars[formId][calendarName].currentDate = config.value;
RSFormPro.jQueryCalendar.calendars[formId][calendarName].hiddenFormat = hiddenFormat;
RSFormPro.jQueryCalendar.calendars[formId][calendarName].hiddenDate = hiddenDate;
RSFormPro.jQueryCalendar.calendars[formId][calendarName].timepicker = config.timepicker;
RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic = (typeof config.extra.useTimeLogic != 'undefined' ? config.extra.useTimeLogic : false);
RSFormPro.jQueryCalendar.calendars[formId][calendarName].callbackSelectedDateTime = false;
if (minSpecificTime != '' || maxSpecificTime !='') {
RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic = {minSpecificTime:minSpecificTime, maxSpecificTime: maxSpecificTime, minDate: minDate, maxDate: maxDate, defaultMinTime:minTime, defaultMaxTime: maxTime};
} else {
RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic = false;
}
var defaultSelectValue = config.inline ? false : true;
// set yearStart if minDate is available
var yearStart = 1920;
var startDateForce = false;
if (minDate) {
var minDateObject = new Date.parseDate(minDate, 'MM/DD/YYYY');
yearStart = minDateObject.getFullYear();
if (!startDate) {
var currentTime = new Date();
if (minDateObject > currentTime) {
startDateForce = minDateObject;
}
}
}
// set yearEnd if maxDate is available
var yearEnd = 2050;
if (maxDate) {
var maxDateObject = new Date.parseDate(maxDate, 'MM/DD/YYYY');
yearEnd = maxDateObject.getFullYear();
if (!startDate) {
var currentTime = new Date();
if (maxDateObject < currentTime) {
startDateForce = maxDateObject;
}
}
}
RSFormPro.jQueryCalendar.calendars[formId][calendarName].calendar = jQuery(txtDate).datetimepicker({
format: config.format, // the format used for the output
formatDate: 'MM/DD/YYYY', // the format used by the minDate and maxDate
formatTime: config.timepickerformat, // the time format used in the calendar, works only if the timepicker is available
inline: config.inline,
defaultSelect: defaultSelectValue,
startDate: (startDate ? startDate : startDateForce),
timepicker: config.timepicker,
theme: config.theme,
closeOnDateSelect: config.timepicker == '1' ? false : true,
closeOnWithoutClick: true,
minDate: minDate,
maxDate: maxDate,
minTime: minTime,
maxTime: maxTime,
allowDates: allowDates,
allowDateRe: allowDateRe,
disabledDates: disabledDates,
disabledWeekDays: disabledWeekDays,
yearStart: yearStart,
yearEnd: yearEnd,
step: step,
validateOnBlur: false,
onChangeMonth: function($ct, $i){
// if the timepicker exists but a year is not in the min/max range then we must disable the timepicker if its active
if (config.timepicker) {
// check if max/min date is set
var currentMaxDate = this.getOptions('maxDate');
var currentMinDate = this.getOptions('minDate');
// handle the conditions
if (currentMaxDate || currentMinDate) {
currentMaxDate = new Date.parseDate(currentMaxDate, 'MM/DD/YYYY HH:mm');
currentMinDate = new Date.parseDate(currentMinDate, 'MM/DD/YYYY HH:mm');
if ($ct > currentMaxDate || $ct < currentMinDate){
this.setOptions({timepicker: false});
}
}
//if the allowDateRe or allowDates are used
var allowDateRegex = this.getOptions('allowDateRe');
var allowDates = this.getOptions('allowDates');
if (allowDateRegex || (allowDates && allowDates.length > 0)) {
var formatDate = this.getOptions('formatDate');
if (allowDateRegex) {
if (!allowDateRegex.test($ct.dateFormat(formatDate))) {
this.setOptions({timepicker: false});
}
} else {
if(allowDates.indexOf($ct.dateFormat(formatDate)) === -1){
this.setOptions({timepicker: false});
}
}
}
}
},
dayOfWeekStart: RSFormPro.jQueryCalendar.settings.START_WEEKDAY,
i18n: {
'custom': {
months: RSFormPro.jQueryCalendar.settings.MONTHS_LONG,
dayOfWeek: RSFormPro.jQueryCalendar.settings.WEEKDAYS_SHORT
}
},
lang: 'custom',
onSelectDate: function(ct, $i) {
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic) {
RSFormPro.jQueryCalendar.specificTimeLogic(this, ct, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic);
}
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic) {
var inputParams = {formId: formId, calendarName: calendarName, config: config};
RSFormPro.jQueryCalendar.timeLogic(this, ct, inputParams, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic);
}
var selectedDate = ct.dateFormat(hiddenFormat);
if (config.timepicker) {
// check timepicker state
var checkTimePicker = this.getOptions('timepicker');
if (!checkTimePicker) {
this.setOptions({timepicker: true});
}
var currentMinTime = this.getOptions('minTime');
var currentMaxTime = this.getOptions('maxTime');
// need the time Line
var timeLine = RSFormPro.jQueryCalendar.generateTimeLine(ct, currentMinTime, currentMaxTime, step);
var checkDate = RSFormPro.jQueryCalendar.checkSelected(this, selectedDate, currentMinTime, currentMaxTime, step, timeLine);
if (checkDate != selectedDate) {
selectedDate = checkDate;
var calendarInput = $i;
if (selectedDate != '') {
var startDateObject = RSFormPro.jQueryCalendar.stringToDate(selectedDate, true);
var startMiliseconds = startDateObject.getTime();
ct.setTime(startMiliseconds);
calendarInput.val(startDateObject.dateFormat(config.format));
} else {
calendarInput.val(selectedDate);
}
}
// if the currentMinTime is higher than the currentMaxTime we need to increment a day in the calendar
if (currentMinTime && currentMaxTime) {
var curentMinTimeParts = currentMinTime.split(':');
var currentMaxTimeParts = currentMaxTime.split(':');
var change = false;
if (parseInt(curentMinTimeParts[0]) > parseInt(currentMaxTimeParts[0])) {
change = true;
} else {
if (parseInt(curentMinTimeParts[1]) > parseInt(currentMaxTimeParts[1])) {
change = false;
}
}
if (change) {
var d = ct.getDate() + 1;
var minTimeParts = minTime.split(':');
ct.setHours(minTimeParts[0]);
ct.setMinutes(minTimeParts[1]);
ct.setSeconds(0);
ct.setDate(d);
this.setOptions({minDate:ct.dateFormat('MM/DD/YYYY'), minTime:minTime, maxTime:maxTime});
calendarInput.val(ct.dateFormat(config.format));
selectedDate = ct.dateFormat(hiddenFormat);
}
}
}
hiddenDate.val(selectedDate);
RSFormPro.jQueryCalendar.calendars[formId][calendarName].currentDate = selectedDate;
},
onSelectTime: function(ct, $i) {
var selectedDate = ct.dateFormat(hiddenFormat);
if (operation && config.timepicker) {
// if the calendar only has the time picker we must let the timepicker option unchanged
if (RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].datepicker && RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].timepicker) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({timepicker: false});
}
}
hiddenDate.val(selectedDate);
RSFormPro.jQueryCalendar.calendars[formId][calendarName].currentDate = selectedDate;
},
// used to take in consideration the rules
onChangeDateTime: function(dp,$input) {
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic) {
RSFormPro.jQueryCalendar.specificTimeLogic(this, dp, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic);
}
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic) {
var inputParams = {formId: formId, calendarName: calendarName, config: config};
RSFormPro.jQueryCalendar.timeLogic(this, dp, inputParams, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic);
}
if (operation) {
var selectedDateTime = dp;
var otherCalendarDate = false;
if (!RSFormPro.jQueryCalendar.calendars[formId][calendarName].timepicker) {
otherCalendarDate = Date.parse(selectedDateTime);
otherCalendarDate = new Date(otherCalendarDate);
if (operation == 'min') {
var d = otherCalendarDate.getDate() + offset;
} else {
var d = otherCalendarDate.getDate() - offset;
}
otherCalendarDate.setDate(d);
}
if (!otherCalendarDate) {
otherCalendarDate = selectedDateTime;
}
// force startDate
var currentTime = new Date();
var startDateForceOther = false;
var startForceCalendar = false;
if ((operation == 'min' && otherCalendarDate > currentTime) || (operation == 'max' && otherCalendarDate < currentTime)) {
startDateForceOther = otherCalendarDate;
}
var otherDate = RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].currentDate;
if (otherDate != '') {
otherDate = Date.parseDate(otherDate, RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenFormat);
if ((operation == 'min' && selectedDateTime.getTime() > otherDate.getTime()) || (operation == 'max' && selectedDateTime.getTime() < otherDate.getTime())) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.val('');
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({startDate:startDateForceOther});
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenDate.val('');
if (RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].timepicker) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({timepicker: false});
}
startForceCalendar = false;
}
} else {
// if there is no date previously selected we only need to set the start date if the startDateForceOther is set
if (startDateForceOther) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({startDate:startDateForceOther});
startForceCalendar = false;
}
}
var selectedDate = otherCalendarDate.dateFormat('MM/DD/YYYY');
var selectedTime = otherCalendarDate.dateFormat('HH:mm');
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker((operation == 'min' ? {minDate: selectedDate, yearStart: otherCalendarDate.getFullYear()} : {maxDate: selectedDate, yearEnd: otherCalendarDate.getFullYear()}));
if (startForceCalendar && startDateForceOther) {
if (RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.getOptions('inline')) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({value:startDateForceOther});
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({value:''});
}
}
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].timepicker) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].useTimeLogic = {date: selectedDate, time: selectedTime, rule: operation};
}
}
},
onAfterChanges : function(ct, $i) {
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic) {
var inputParams = {formId: formId, calendarName: calendarName, config: config};
RSFormPro.jQueryCalendar.timeLogic(this, ct, inputParams, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic);
}
var selectedDate = ct.dateFormat(hiddenFormat);
if (config.timepicker) {
// check timepicker state
if (!this.getOptions('timepicker')) {
this.setOptions({timepicker: true});
}
var currentMinTime = this.getOptions('minTime');
var currentMaxTime = this.getOptions('maxTime');
// need the time Line
var timeLine = RSFormPro.jQueryCalendar.generateTimeLine(ct, currentMinTime, currentMaxTime, step);
var checkDate = RSFormPro.jQueryCalendar.checkSelected(this, selectedDate, currentMinTime, currentMaxTime, step, timeLine);
if (checkDate != selectedDate) {
selectedDate = checkDate;
var calendarInput = $i;
if (selectedDate != '') {
var startDateObject = RSFormPro.jQueryCalendar.stringToDate(selectedDate, true);
var startMiliseconds = startDateObject.getTime();
ct.setTime(startMiliseconds);
calendarInput.val(startDateObject.dateFormat(config.format));
} else {
calendarInput.val(selectedDate);
}
}
// if the currentMinTime is higher than the currentMaxTime we need to increment a day in the calendar
if (currentMinTime && currentMaxTime) {
var curentMinTimeParts = currentMinTime.split(':');
var currentMaxTimeParts = currentMaxTime.split(':');
var change = false;
if (parseInt(curentMinTimeParts[0]) > parseInt(currentMaxTimeParts[0])) {
change = true;
} else {
if (parseInt(curentMinTimeParts[1]) > parseInt(currentMaxTimeParts[1])) {
change = false;
}
}
if (change) {
var d = ct.getDate() + 1;
var minTimeParts = minTime.split(':');
ct.setHours(minTimeParts[0]);
ct.setMinutes(minTimeParts[1]);
ct.setSeconds(0);
ct.setDate(d);
this.setOptions({minDate:ct.dateFormat('MM/DD/YYYY'), minTime:minTime, maxTime:maxTime});
calendarInput.val(ct.dateFormat(config.format));
selectedDate = ct.dateFormat(hiddenFormat);
}
}
}
if (operation && selectedDate != '') {
var selectedDateTime = RSFormPro.jQueryCalendar.stringToDate(selectedDate, config.timepicker);
// force startDate
var currentTime = new Date();
var startDateForceOther = false;
var startForceCalendar = false;
if ((operation == 'min' && selectedDateTime > currentTime) || (operation == 'max' && selectedDateTime < currentTime)) {
startDateForceOther = selectedDateTime;
}
var otherDate = RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].currentDate;
if (otherDate != '') {
otherDate = Date.parseDate(otherDate, RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenFormat);
if (
(operation == 'min' && selectedDateTime.getTime() > otherDate.getTime()) ||
(operation == 'max' && selectedDateTime.getTime() < otherDate.getTime())) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.val('');
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({startDate:startDateForceOther});
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenDate.val('');
if (RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].timepicker) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({timepicker: false});
}
startForceCalendar = true;
}
} else {
// if there is no date previously selected we only need to set the start date if the startDateForceOther is set
if (startDateForceOther) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker({startDate:startDateForceOther});
startForceCalendar = true;
}
}
if (operation === 'min') {
selectedDateTime.setDate(selectedDateTime.getDate() + offset);
} else {
selectedDateTime.setDate(selectedDateTime.getDate() - offset);
}
var selectedOtherDate = selectedDateTime.dateFormat('MM/DD/YYYY');
var selectedOtherTime = selectedDateTime.dateFormat('HH:mm');
// put the minTime/maxTime if the timepicker is active on the same day
if (otherDate != '' && operation && RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.getOptions('timepicker') && selectedOtherDate == otherDate.dateFormat('MM/DD/YYYY'))
{
// set the min
if (operation == 'min')
{
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({minTime:selectedOtherTime});
}
// set the max
else
{
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({maxTime:selectedOtherTime});
}
// set the selection to the calendar and the hidden field
if ((operation == 'min' && otherDate.getTime() < selectedDateTime.getTime()) || (operation == 'max' && otherDate.getTime() > selectedDateTime.getTime()))
{
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({value:selectedDateTime});
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].hiddenDate.val(selectedDateTime.dateFormat(config.format));
}
}
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendar.datetimepicker((operation == 'min' ? {minDate: selectedOtherDate,yearStart: selectedDateTime.getFullYear()} : {maxDate: selectedOtherDate, yearEnd: selectedDateTime.getFullYear()}));
if (startForceCalendar && startDateForceOther) {
if (RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.getOptions('inline')) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({value:startDateForceOther});
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].calendarInstance.setOptions({value:''});
}
}
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].timepicker) {
RSFormPro.jQueryCalendar.calendars[formId][otherCalendarName].useTimeLogic = {date: selectedOtherDate, time: selectedOtherTime, rule: operation};
}
}
var selectedDateObject = {};
selectedDateObject.selectedDate = selectedDate;
// trigger function after all chages have been made (if the function si defined)
if (typeof RSFormPro.jQueryCalendar.calendars[formId][calendarName].callbackSelectedDateTime == 'function') {
var result = RSFormPro.jQueryCalendar.calendars[formId][calendarName].callbackSelectedDateTime(selectedDateObject, this, ct, $i, config.format);
// reset the current calendar if the callback functions returns a false result
if (typeof result != 'undefined' && !result) {
hiddenDate.val('');
RSFormPro.jQueryCalendar.calendars[formId][calendarName].currentDate = '';
RSFormPro.jQueryCalendar.calendars[formId][calendarName].calendar.datetimepicker('reset');
if (this.getOptions('mask')) {
this.setOptions({mask:this.getOptions('mask')});
}
if (config.timepicker) {
var checkTimePicker = this.getOptions('timepicker');
if (checkTimePicker) {
this.setOptions({timepicker: false});
}
}
return false;
}
}
hiddenDate.val(selectedDateObject.selectedDate);
RSFormPro.jQueryCalendar.calendars[formId][calendarName].currentDate = selectedDateObject.selectedDate;
// lose focus on selection
jQuery(':focus').blur();
},
onShow: function() {
var index = RSFormPro.jQueryCalendar.shownCalendars.indexOf(calendarId);
if (index < 0) {
RSFormPro.jQueryCalendar.shownCalendars.push(calendarId);
}
},
onClose: function() {
var index = RSFormPro.jQueryCalendar.shownCalendars.indexOf(calendarId);
if (index > -1) {
RSFormPro.jQueryCalendar.shownCalendars.splice(index, 1);
}
},
onCreate: function() {
if (startDate) {
// if on load the specificTimeLogic is active
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic) {
RSFormPro.jQueryCalendar.specificTimeLogic(this, startDate, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useSpecificTimeLogic);
}
// if on load the timeLogic is active
if (RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic) {
var inputParams = {formId: formId, calendarName: calendarName, config: config};
RSFormPro.jQueryCalendar.timeLogic(this, startDate, inputParams, RSFormPro.jQueryCalendar.calendars[formId][calendarName].useTimeLogic);
}
} else {
this.setOptions({timepicker: false})
}
// hold the calendar instance so that users cand work with it
RSFormPro.jQueryCalendar.calendars[formId][calendarName].calendarInstance = this;
// try and focus out other focused fields if anything is pressed inside the calendar, only when inline
if (this.getOptions('inline'))
{
var currentCalendar = jQuery(this);
currentCalendar.click(function (e) {
if (jQuery(e.target).parents(".xdsoft_datetimepicker").length) {
jQuery(':focus').blur();
}
});
}
},
onGenerate: function(ct, $i){
// focus time on popup calendar
if (!config.inline){
this.trigger('afterOpen.xdsoft');
}
}
});
}
},
// recontruct the timeLine form the datetimepicker.js
generateTimeLine: function(selected, minTime, maxTime, step) {
var now = new Date(selected.getTime());
var dateFormat = now.dateFormat('MM/DD/YYYY');
var i, j;
var minTimeDate = RSFormPro.jQueryCalendar.stringToDate(dateFormat, false);
var maxTimeDate = RSFormPro.jQueryCalendar.stringToDate(dateFormat, false);
if (minTime) {
var minTimeParts = minTime.split(':');
minTimeDate.setHours(minTimeParts[0]);
minTimeDate.setMinutes(minTimeParts[1]);
minTimeDate.setSeconds(0);
}
if (maxTime) {
var maxTimeParts = maxTime.split(':');
maxTimeDate.setHours(maxTimeParts[0]);
maxTimeDate.setMinutes(maxTimeParts[1]);
maxTimeDate.setSeconds(0);
}
var timeLine = [];
var newNow = now;
var h, m;
for (i = 0, j = 0; i < 24; i += 1) {
for (j = 0; j < 60; j += step) {
h = (i < 10 ? '0' : '') + i;
m = (j < 10 ? '0' : '') + j;
newNow.setHours(h);
h = parseInt(newNow.getHours(), 10);
newNow.setMinutes(m);
m = parseInt(newNow.getMinutes(), 10);
if (maxTime !== false && maxTimeDate.getTime() < newNow.getTime()) {
continue;
} else if (minTime !== false && minTimeDate.getTime() > newNow.getTime()) {
continue;
}
timeLine.push(newNow.dateFormat('HH:mm'));
}
}
return timeLine;
},
checkSelected: function(calendar, selectedDate, minTime, maxTime, step, timeLine) {
var conditionMinDate = new Date.parseDate(selectedDate, 'MM/DD/YYYY HH:mm');
var conditionMaxDate = new Date.parseDate(selectedDate, 'MM/DD/YYYY HH:mm');
selectedDate = new Date.parseDate(selectedDate, 'MM/DD/YYYY HH:mm');
//set the minTime
if (minTime) {
var minTimeParts = minTime.split(':');
conditionMinDate.setHours(minTimeParts[0]);
conditionMinDate.setMinutes(minTimeParts[1]);
conditionMinDate.setSeconds(0);
}
// check if the selected date and time is less than the minimum set by the user
var diffMin = selectedDate.getTime() - conditionMinDate.getTime();
if (diffMin < 0) {
return RSFormPro.jQueryCalendar.findInTimeLine(conditionMinDate, timeLine, step, minTime, maxTime); //.dateFormat('MM/DD/YYYY HH:mm');
}
//set the maxTime
if (maxTime) {
var maxTimeParts = maxTime.split(':');
conditionMaxDate.setHours(maxTimeParts[0]);
conditionMaxDate.setMinutes(maxTimeParts[1]);
conditionMaxDate.setSeconds(0);
}
// check if the selected date and time is more than the maximum set by the user
var diffMax = selectedDate.getTime() - conditionMaxDate.getTime();
if (diffMax > 0) {
return '';
}
return RSFormPro.jQueryCalendar.findInTimeLine(selectedDate, timeLine, step, minTime, maxTime); //.dateFormat('MM/DD/YYYY HH:mm');
},
findInTimeLine: function(newDate, timeLine, step, minTime, maxTime) {
var dateHours = newDate.getHours();
var dateMin = newDate.getMinutes();
var arrayType = '';
if (dateHours > 9) {
arrayType += dateHours;
} else {
arrayType += '0'+dateHours;
}
arrayType +=':';
if (dateMin > 9) {
arrayType += dateMin;
} else {
arrayType += '0'+dateMin;
}
if (timeLine.indexOf(arrayType) > -1) {
return newDate.dateFormat('MM/DD/YYYY HH:mm');
}
else {
var timeFound = '';
for(i = 0; i < timeLine.length; i++){
var lineTime = timeLine[i].split(':');
var lineH = parseInt(lineTime[0]);
var lineM = parseInt(lineTime[1]);
if (lineH == dateHours) {
var diffMinutes = dateMin - lineM;
if (diffMinutes < 0) diffMinutes = -diffMinutes;
if (diffMinutes > step) {
continue;
} else {
// check if the next timeLine entry is closer
var middleStep = step / 2;
if (diffMinutes > middleStep) {
timeFound = timeLine[(i+1)];
} else {
timeFound = timeLine[i];
}
break;
}
}
}
// if the currentTime is less than the min of the timeline or higher than the max of the timeLine
if (timeFound == '' && timeLine.length > 0) {
var referenceMin = timeLine[0].replace(':', '');
var referenceMax = timeLine[(timeLine.length - 1)].replace(':', '');
var currentTime = dateHours.toString() + dateMin.toString();
currentTime = parseInt(currentTime);
if (currentTime < parseInt(referenceMin)) {
timeFound = timeLine[0];
} else if(currentTime > parseInt(referenceMax)) {
timeFound = timeLine[(timeLine.length - 1)];
}
}
if (typeof(timeFound) !== 'undefined' && timeFound != '') {
timeFound = timeFound.split(':');
newDate.setHours(timeFound[0]);
newDate.setMinutes(timeFound[1]);
newDate.setSeconds(0);
return newDate.dateFormat('MM/DD/YYYY HH:mm');
}
}
return newDate.dateFormat('MM/DD/YYYY HH:mm');
},
specificTimeLogic : function(element, currentDateTime, params) {
if (params.minSpecificTime !='') {
var refferenceDate = RSFormPro.jQueryCalendar.stringToDate(params.minDate, false);
if (refferenceDate.getFullYear() == currentDateTime.getFullYear() && refferenceDate.getMonth() == currentDateTime.getMonth() && refferenceDate.getDate() == currentDateTime.getDate()) {
element.setOptions({minTime:params.minSpecificTime});
} else {
element.setOptions({minTime:params.defaultMinTime});
}
}
if (params.maxSpecificTime !='') {
var refferenceDate = RSFormPro.jQueryCalendar.stringToDate(params.maxDate, false);
if (refferenceDate.getFullYear() == currentDateTime.getFullYear() && refferenceDate.getMonth() == currentDateTime.getMonth() && refferenceDate.getDate() == currentDateTime.getDate()) {
element.setOptions({maxTime:params.maxSpecificTime})
} else {
element.setOptions({maxTime:params.defaultMaxTime});
}
}
},
timeLogic: function(element, currentDateTime, inputParams, params) {
var conditionDate = new Date.parseDate((params.date), 'MM/DD/YYYY');
if (currentDateTime.getFullYear() == conditionDate.getFullYear() && currentDateTime.getMonth() == conditionDate.getMonth() && currentDateTime.getDate() == conditionDate.getDate()) {
element.setOptions((params.rule == 'min' ? {minTime: params.time} : {maxTime: params.time}));
// check the current time if is less then the minTime
if (params.rule == 'min') {
var timeParts = params.time.split(':');
var h = parseInt(timeParts[0]);
var min = parseInt(timeParts[1]);
if (currentDateTime.getHours() < h || (currentDateTime.getHours() == h && currentDateTime.getMinutes() < min)) {
currentDateTime.setHours(h);
currentDateTime.setMinutes(min);
currentDateTime.setSeconds(0);
var outputInputDate = currentDateTime.dateFormat(inputParams.config.format);
var outputHiddenDate = currentDateTime.dateFormat(inputParams.config.format);
RSFormPro.jQueryCalendar.calendars[inputParams.formId][inputParams.calendarName].calendar.val(outputInputDate);
RSFormPro.jQueryCalendar.calendars[inputParams.formId][inputParams.calendarName].hiddenDate.val(outputHiddenDate);
}
}
if (params.rule == 'max') {
var timeParts = params.time.split(':');
var h = parseInt(timeParts[0]);
var min = parseInt(timeParts[1]);
if (currentDateTime.getHours() > h || (currentDateTime.getHours() == h && currentDateTime.getMinutes() > min)) {
currentDateTime.setHours(h);
currentDateTime.setMinutes(min);
currentDateTime.setSeconds(0);
var outputInputDate = currentDateTime.dateFormat(inputParams.config.format);
var outputHiddenDate = currentDateTime.dateFormat(inputParams.config.format);
RSFormPro.jQueryCalendar.calendars[inputParams.formId][inputParams.calendarName].calendar.val(outputInputDate);
RSFormPro.jQueryCalendar.calendars[inputParams.formId][inputParams.calendarName].hiddenDate.val(outputHiddenDate);
}
}
} else {
var minTime = typeof inputParams.config.extra.minTime != 'undefined' ? inputParams.config.extra.minTime : false;
var maxTime = typeof inputParams.config.extra.maxTime != 'undefined' ? inputParams.config.extra.maxTime : false;
element.setOptions((params.rule == 'min' ? {minTime: minTime} : {maxTime: maxTime}));
}
},
stringToDate: function(date, withTime) {
var newDate = false;
if (typeof date != 'undefined' && date != '') {
if (!withTime) {
newDate = new Date.parseDate(date, 'MM/DD/YYYY');
} else {
var parts = date.split(' ');
if (parts.length == 2) {
newDate = new Date.parseDate(date, 'MM/DD/YYYY HH:mm');
} else {
newDate = RSFormPro.jQueryCalendar.stringToDate(date, false);
}
}
}
return newDate;
},
showCalendar: function(calendarId) {
var index = RSFormPro.jQueryCalendar.shownCalendars.indexOf(('cal'+calendarId));
if (index > -1) {
jQuery('#txtjQcal' + calendarId).datetimepicker('hide');
RSFormPro.jQueryCalendar.shownCalendars.splice(index, 1);
} else {
jQuery('#txtjQcal' + calendarId).datetimepicker('show');
}
},
hideAllPopupCalendars: function(formId) {
if (typeof RSFormPro.jQueryCalendar.calendars[formId] != 'undefined') {
jQuery.each(RSFormPro.jQueryCalendar.calendars[formId], function () {
if (!this.calendarInstance.getOptions('inline')) {
this.calendarInstance.trigger('close.xdsoft');
}
});
}
},
shownCalendars: []
};