var __currCalendarBox = null; function DateText(node) { this.props = null; this.base = TextNode; this.base(node); this.isDateText = true; this.init = function() { this.setValue(this.props.value || this.props.defaultDate); }; this.setValue = function(value) { if (!value) return; var d = DateMgr.parseDate(value,this.props.valueFormat); var v = DateMgr.formatDate(d,this.props.displayFormat); this._setValue(v); }; }; function DateBox(node) { this.props = null; try { this.base = ProcessField; this.base(node); } catch (e) { this.base = MoreMotionObject; this.base(node); } this.isDateBox = true; this.wrapElements = function() { this.elm = this.node; var elms = this.node.parentNode.getElementsByTagName("input"); if (elms && elms.length) { for (var i = 0; i < elms.length; i++) { var elm = elms[i]; if (elm.name.startsWith("pbn_") || elm.name == this.name) { this.selm = elm; break; } } } }; this.wrapElements(); this.init = function() { var value = this.getIValue(); if (!value && this.props.defaultDate) { var d = DateMgr.parseDate(this.props.defaultDate,this.props.valueFormat); value = DateMgr.formatDate(d,this.props.submitFormat); this.setIValue(value); } this.setValue(value, this.props.valueFormat); }; this.changed = function() { if (this.elm.value == "") { this.selm.value = ""; return; } var cDate = DateMgr.parseDate(this.elm.value,this.props.displayFormat); if (cDate == "NaN") { alert( OMgr.resource("INVALID_DATE") ); this.elm.focus(); this.elm.select(); return false; } var fDate = DateMgr.parseDate(this.props.fromDate,"yyyy.mm.dd"); var tDate = DateMgr.parseDate(this.props.toDate,"yyyy.mm.dd"); if (cDate < fDate || cDate > tDate) { alert( OMgr.resource("DATE_OUT_OF_RANGE", DateMgr.formatDate(fDate,this.props.displayFormat), DateMgr.formatDate(tDate,this.props.displayFormat)) ); this.elm.focus(); this.elm.select(); return false; } this.selm.value = DateMgr.formatDate(cDate,this.props.submitFormat); this.elm.value = DateMgr.formatDate(cDate,this.props.displayFormat); this.setModified(); }; this.clear = function() { this.elm.value = ""; this.selm.value = ""; }; this.setValue = function(value, valueFormat) { if (value == "" && this.props.defaultDate == "") { this.elm.value = ""; this.selm.value = ""; return; } if (value == "") value = this.props.defaultDate; if (!value) return; var d = DateMgr.parseDate(value, valueFormat || this.props.submitFormat); this.elm.value = DateMgr.formatDate(d,this.props.displayFormat); this.selm.value = DateMgr.formatDate(d,this.props.submitFormat); }; this.getValue = function() { return this.selm.value; }; this.validate = function() { if (this.boolProp("nonBlank") && this.checkValueIsAvailable() == false) return false; if (this._validate(this.props.valErrorHandler) == false) return false; if (this.props.customValFunction && this.runCustomValidation() == false) return false; }; this.appendAjaxRequestParams = function(acc) { acc.add(this.selm.name,this.selm.value); }; this._validate = function(handler) { if (this.elm.value == "") return true; var cDate = DateMgr.parseDate(this.elm.value,this.props.displayFormat); if (cDate == "NaN") { return this.notify(this.elm, "INVALID_DATE", OMgr.resource("INVALID_DATE")); } var fDate = DateMgr.parseDate(this.props.fromDate,"yyyy.mm.dd"); var tDate = DateMgr.parseDate(this.props.toDate,"yyyy.mm.dd"); if (cDate < fDate || cDate > tDate) { var msg = OMgr.resource("DATE_OUT_OF_RANGE",DateMgr.formatDate(fDate,this.props.displayFormat), DateMgr.formatDate(tDate,this.props.displayFormat)); return this.notify(this.elm,"DATE_OUT_OF_RANGE",msg); } } }; function DateDialog(node) { this.props = null; try { this.base = ProcessField; this.base(node); this.needsValueCloning = true; } catch (e) { this.base = MoreMotionObject; this.base(node); } this.isDateDialog = true; this.wrapElements = function() { var elms = this.node.getElementsByTagName("select"); for (var i = 0; i < elms.length; i++) { var elm = elms[i]; if (elm.name == "__Year") this.yelm = elm; else if (elm.name == "__Month") this.melm = elm; else if (elm.name == "__Day") this.delm = elm; } elms = this.node.getElementsByTagName("input"); for (var i = 0; i < elms.length; i++) { var elm = elms[i]; if (elm.name == "__DayText") this.telm = elm; else if (elm.name == "__Work") this.welm = elm; else if (elm.name.startsWith("pbn_") || elm.name == this.name) this.selm = elm; } }; this.wrapElements(); this.init = function() { var value = this.getIValue(); if (!value && this.props.defaultDate) { var d = DateMgr.parseDate(this.props.defaultDate,this.props.valueFormat); value = DateMgr.formatDate(d,this.props.submitFormat); this.setIValue(value); } this.reformat(value); }; this.reformat = function(value) { var empty = !this._setValue(value || this.getIValue()); this.fillYearOptions(); this.fillMonthOptions(); this.fillDayOptions(); if (empty) this.setEmpty(); }; this.fillAll = function() { try { if (this.delm.value == "") this.delm.value = this.delm.options[1].value; if (this.melm.value == "") this.melm.value = this.melm.options[1].value; if (this.yelm.value == "") this.yelm.value = this.yelm.options[1].value; } catch (e) {} }; this.emptyAll = function() { this.delm.value = ""; this.melm.value = ""; this.yelm.value = ""; if (this.telm) this.telm.value = ""; this.selm.value = ""; this.welm.value = ""; }; this.updateDates = function(t,value) { if (value == "") { this.emptyAll(); return false; } else { this.fillAll(); } var theDate = new Date(); if (t == 0) theDate.setTime(value); else { theDate.setTime(this.welm.value); var y = theDate.getFullYear(); var m = theDate.getMonth(); var d = theDate.getDate(); if (t == 1) y = value; else if (t == 2) m = value; else d = value; if (d > DateMgr.nbrOfDays(y, m)) d = DateMgr.nbrOfDays(y, m); theDate = new Date(y,m,d); } this.welm.value = theDate.getTime(); this.selm.value = DateMgr.formatDate(theDate,this.props.submitFormat); if (this.telm != null) this.telm.value = DateResource.days[theDate.getDay()]; this.isEmpty = false; return true; }; this.setYear = function(value) { this.updateDates(1,value); }; this.setMonth = function(value) { this.updateDates(2,value); }; this.setDay = function(value) { this.updateDates(3,value); }; this.setDate = function(theDate) { if (theDate.getTime) this.updateDates(0,theDate.getTime); else this.updateDates(0,theDate); }; this.getDate = function() { return this.getCurrentDate(); }; this.getWeekDayAsString = function() { return DateResource.days[this.getCurrentDate().getDay()]; }; this.getDayAsString = function() { return DateResource.days[this.getCurrentDate().getDay()]; }; this.getMonthAsString = function() { return DateResource.months[this.getCurrentDate().getMonth()]; }; this.setEmpty = function() { this.selm.value = ""; this.welm.value = ""; this.delm.value = ""; this.melm.value = ""; this.yelm.value = ""; if (this.telm) this.telm.value = ""; this.isEmpty = true; }; this.getCurrentDate = function() { var theDate = new Date(); theDate.setTime(this.welm.value); return theDate; } this.fillDayOptions = function() { for (var i = this.delm.options.length; i >= 0; i--) this.delm.options[i] = null; var opt = new Option( "" ); opt.value = ""; this.delm.options[0] = opt; var cDate = this.getCurrentDate(); var cYear = cDate.getFullYear(); var cMonth = cDate.getMonth(); var cDay = cDate.getDate(); var fDate = DateMgr.parseDate(this.props.fromDate,"yyyy.mm.dd"); var tDate = DateMgr.parseDate(this.props.toDate,"yyyy.mm.dd"); var fYear = fDate.getFullYear(); var tYear = tDate.getFullYear(); var fd = ( (cYear == fYear) && (cMonth == fDate.getMonth()) ) ? fDate.getDate() : 1; var td = ( (cYear == tYear) && (cMonth == tDate.getMonth()) ) ? tDate.getDate() : DateMgr.nbrOfDays(cYear, cMonth); var firstDay = -1; var dayFound = false; var j = 0; for (var i = fd; i <= td; i++) { if (!this.props.excludeWeekends || !DateMgr.isWeekendDay(cYear, cMonth, i)) { if (firstDay == -1) firstDay = i; var opt = new Option( i ); opt.value = i; this.delm.options[++j] = opt; if (cDay == i) dayFound = true; } } if (!this.isEmpty) { if (dayFound) this.delm.value = cDay; else this.updateDates(3,firstDay); } } this.fillMonthOptions = function() { for (var i = this.melm.options.length; i >= 0; i--) this.melm.options[i] = null; var opt = new Option( "" ); opt.value = ""; this.melm.options[0] = opt; var cDate = this.getCurrentDate(); var cYear = cDate.getFullYear(); var cMonth = cDate.getMonth(); var fDate = DateMgr.parseDate(this.props.fromDate,"yyyy.mm.dd"); var tDate = DateMgr.parseDate(this.props.toDate,"yyyy.mm.dd"); var fYear = fDate.getFullYear(); var tYear = tDate.getFullYear(); var fm = (cYear == fYear) ? fDate.getMonth() : 0; var tm = (cYear == tYear) ? tDate.getMonth() : 11; if (!this.isEmpty) { if ( !( (fm <= cMonth) && (cMonth <= tm) ) ) { cMonth = tm; this.updateDates(2,cMonth); } } var j = 0; for (var i = fm; i <= tm; i++) { if (this.props.monthFormat == "Long Text") var opt = new Option( DateResource.months[i] ); else if (this.props.monthFormat == "Short Text") opt = new Option( DateResource.shortMonths[i] ); else opt = new Option( i+1 ); opt.value = i; j++; this.melm.options[j] = opt; } this.melm.value = cMonth; } this.fillYearOptions = function(id,sbmformat,fromdate,todate) { for (var i = this.yelm.options.length; i >= 0; i--) this.yelm.options[i] = null; var opt = new Option( "" ); opt.value = ""; this.yelm.options[0] = opt; var cYear = this.getCurrentDate().getFullYear(); var fDate = DateMgr.parseDate(this.props.fromDate,"yyyy.mm.dd"); var tDate = DateMgr.parseDate(this.props.toDate,"yyyy.mm.dd"); var fYear = fDate.getFullYear(); var tYear = tDate.getFullYear(); if (!this.isEmpty) { if ( !( (fYear <= cYear) && (cYear <= tYear) ) ) { cYear = fYear ; this.updateDates(1,cYear); } } var j = 0; for (var i = fYear; i <= tYear; i++) { var opt = new Option(i); opt.value = i; j++; this.yelm.options[j] = opt; } this.yelm.value = cYear; } this.dayChanged = function(hasFocus) { this.updateDates(3,this.delm.value); if (this.props.onDayChange) this.runHandler("onDayChange"); if (this.props.onChange) this.runHandler("onChange"); if (hasFocus) this.setModified(); } this.monthChanged = function(hasFocus) { if (this.updateDates(2,this.melm.value)) { this.fillDayOptions(); } if (this.props.onMonthChange) this.runHandler("onMonthChange"); if (this.props.onChange) this.runHandler("onChange"); if (hasFocus) this.setModified(); } this.yearChanged = function(hasFocus) { if (this.updateDates(1,this.yelm.value)) { this.fillMonthOptions(); this.fillDayOptions(); } if (this.props.onYearChange) this.runHandler("onYearChange"); if (this.props.onChange) this.runHandler("onChange"); if (hasFocus) this.setModified(); } this.clear = function() { this.setEmpty(); }; this.setValue = function(value) { this.reformat(value); }; this.getValue = function() { return this.selm.value; }; this._setValue = function(value) { var theDate; if (value == "") { if (!this.props.defaultDate) { this.setEmpty(); return false; } theDate = DateMgr.parseDate(this.props.defaultDate,this.props.valueFormat); } else { theDate = DateMgr.parseDate(value,this.props.valueFormat); if (theDate == "NaN") { alert( OMgr.resource("INVALID_DATE",value) ); return false; } } this.updateDates(0,theDate.getTime()); return true; }; this.validate = function() { if (this.boolProp("nonBlank") && this.checkValueIsAvailable(this.welm,this.delm) == false) return false; if (this.props.customValFunction && this.runCustomValidation() == false) return false; }; this.appendAjaxRequestParams = function(acc) { acc.add(this.selm.name,this.selm.value); }; }; function CalendarBox(node) { this.base = MoreMotionObject; this.base(node); this.isCalendarBox = true; this.datebox = null; this.CAL_FORMAT = "%Y.%m.%d %H:%M"; this.wrapElements = function() { var dboxNode = OMgr.findChildNode(this.node,null,"mo:type","DateBox"); if (dboxNode) { this.datebox = OMgr.getObject(dboxNode); } if (this.props.dateStatusHandler) { this.userDateStatusHandler = new EventHandler(this.props.dateStatusHandler,"dateStatusHandler"); } if (this.props.onSelectHandler) { this.userOnSelectHandler = new EventHandler(this.props.onSelectHandler,"onSelectHandler"); } }; this.wrapElements(); this.dateSelectHandler = function(cal, date) { if(this.userOnSelectHandler) { var userResult = this.userOnSelectHandler.run(cal, date); if(userResult) { return userResult; } } this.datebox.elm.value = DateMgr.convertDate(date,"yyyy.mm.dd hh:nn",this.datebox.props.displayFormat); this.datebox.selm.value = DateMgr.convertDate(date,"yyyy.mm.dd hh:nn",this.datebox.props.submitFormat); this.datebox.setModified(); if (!(cal.dateClicked && cal.singleClick)) { return false; } cal.callCloseHandler(); }; this.dateStatusHandler = function(date) { if(this.userDateStatusHandler) { var userResult = this.userDateStatusHandler.run(date); if(userResult) { return userResult; } } var minDate = date.getTime() < DateMgr.parseDate(this.datebox.props.fromDate,"yyyy.mm.dd").getTime(); var maxDate = date.getTime() > DateMgr.parseDate(this.datebox.props.toDate,"yyyy.mm.dd").getTime(); var valid = maxDate == true || minDate == true; return valid; }; this.show = function() { if (_dynarch_popupCalendar != null) { _dynarch_popupCalendar.hide(); } var initialDate = null; if (this.datebox.elm.value) { initialDate = DateMgr.parseDate(this.datebox.elm.value,this.datebox.props.displayFormat); } else { if(this.datebox.props.defaultDate) { initialDate = DateMgr.parseDate(this.datebox.props.defaultDate,"yyyy.mm.dd"); } else { initialDate = DateMgr.parseDate(this.datebox.props.fromDate,"yyyy.mm.dd"); } } if(initialDate < DateMgr.parseDate(this.datebox.props.fromDate,"yyyy.mm.dd")) { initialDate = DateMgr.parseDate(this.datebox.props.fromDate,"yyyy.mm.dd"); } var cal = new Calendar(1, initialDate, DateMgr.calendarSelectHandler, DateMgr.calendarCloseHandler); cal.setDateStatusHandler(DateMgr.calendarDateStatusHandler); cal.firstDayOfWeek = this.numberProp("firstDayOfWeek.charAt(0)"); cal.showsTime = this.boolProp("showTime"); cal.weekNumbers = this.boolProp("weekNumbers"); cal.time24 = this.boolProp("time24"); cal.showsOtherMonths = this.boolProp("showsOtherMonths"); cal.singleClick = this.boolProp("singleClick"); if(this.props.statusBarDateFormat) { cal.setTtDateFormat(this.props.statusBarDateFormat); } _dynarch_popupCalendar = cal; cal.setRange(DateMgr.parseDate(this.datebox.props.fromDate,"yyyy.mm.dd").getFullYear(),DateMgr.parseDate(this.datebox.props.toDate,"yyyy.mm.dd").getFullYear()); cal.create(); _dynarch_popupCalendar.setDateFormat(this.CAL_FORMAT); var showAt = this.props.showAt; if(showAt.startsWith("1.")) { var node = OMgr.getParentNode(this.datebox.node,"tr"); if (node) node = OMgr.findChildNode(node,null,"mo:type","DateBox"); _dynarch_popupCalendar.showAtElement(node, "Br"); } else if(showAt.startsWith("2.")) { var node = OMgr.getParentNode(this.datebox.node,"tr"); if (node) node = OMgr.findChildNode(node,null,"mo:type","CalendarOpener"); _dynarch_popupCalendar.showAtElement(node, "Br"); } else { var calX = showAt.before(":",null); var calY = showAt.after(":",null); if (calX && calY) _dynarch_popupCalendar.showAt(calX,calY); } return false; }; } function DateManager() { this.dateChanged = function(node) { var f = OMgr.getObject(node); if (f.changed) { f.changed(); } }; this.yearChanged = function(node) { var f = OMgr.getEnclosingObject(node); if (f) f.yearChanged(true); }; this.monthChanged = function(node) { var f = OMgr.getEnclosingObject(node); if (f) f.monthChanged(true); }; this.dayChanged = function(node) { var f = OMgr.getEnclosingObject(node); if (f) f.dayChanged(true); }; this.showCalendar = function(node) { var ccNode = OMgr.findParentNode(node,"mo:type","CalendarBox"); if (ccNode) { var cc = OMgr.getObject(ccNode); __currCalendarBox = cc; cc.show(); } }; this.calendarSelectHandler = function(cal, date) { __currCalendarBox.dateSelectHandler(cal,date); }; this.calendarCloseHandler = function(cal) { cal.hide(); _dynarch_popupCalendar = null; }; this.calendarDateStatusHandler = function(date) { if (__currCalendarBox) { return __currCalendarBox.dateStatusHandler(date); } }; this.parseDate = function(valueStr, formatStr) { var theDate = new Date(); var diffStr = ""; var i = valueStr.indexOf(" +"); if (i == -1) i = valueStr.indexOf(" -"); if (i > -1) { diffStr = valueStr.substring(i); valueStr = valueStr.substring(0,i); } if (valueStr == "today") valueStr = this.formatDate( new Date(), formatStr); else { if (( valueStr != "" && !isNaN(valueStr)) && valueStr.indexOf(".") == -1 && valueStr.length > 11 ) { theDate = new Date(); theDate.setTime(valueStr); valueStr = this.formatDate( theDate, formatStr ); } } if (formatStr == "Integer") { theDate.setTime(valueStr); return theDate; } if (formatStr == "Parse") { theDate.setTime(Date.parse(valueStr)); return theDate; } var yy = 1900; var mm = 1; var dd = 1; var hh = 0; var nn = 0; var ss = 0; var delimiters = new RegExp("[.:\\, \/\-]"); var formats = formatStr.split(delimiters); if (formats.length < 2) { var i = formatStr.indexOf("yyyy"); if (i > -1) { yy = parseInt(valueStr.substring(i,i+4),10); } else { i = formatStr.indexOf("yy"); if (i > -1) { yy = parseInt(valueStr.substring(i,i+2),10); if (yy < 30) yy = yy + 2000; else yy = yy + 1900; } } i = formatStr.indexOf("mm"); if (i > -1) { mm = parseInt(valueStr.substring(i,i+2),10); if (mm > 12) { return "NaN"; } } i = formatStr.indexOf("dd"); if (i > -1) { dd = parseInt(valueStr.substring(i,i+2),10); } i = formatStr.indexOf("hh"); if (i > -1) { hh = parseInt(valueStr.substring(i,i+2),10); } i = formatStr.indexOf("nn"); if (i > -1) { nn = parseInt(valueStr.substring(i,i+2),10); } i = formatStr.indexOf("ss"); if (i > -1) { ss = parseInt(valueStr.substring(i,i+2),10); } else { i = formatStr.indexOf("s"); if (i > -1) { ss = parseInt(valueStr.substring(i,i+1),10); } } } else { var values = valueStr.split(delimiters); for(var i = 0; i < values.length; i++) { var format = formats[i]; var f = format.substring(0,1); var value = values[i]; if ( (value == "") || isNaN(value) ) return "NaN"; var numval = parseInt(value,10); if (f == "m") { mm = numval; if (mm < 1 || mm > 12) return "NaN"; } else if (f == "d") { dd = numval; if (dd < 1 || dd > 31) return "NaN"; } else if (f == "h") { hh = numval; if (hh < 0 || hh > 23) return "NaN"; } else if (f == "n") { nn = numval; if (nn < 0 || nn > 59) return "NaN"; } else if (f == "s") ss = numval; else if (f == "y") { yy = numval; if (value.length < 4 ) { if (yy < 30) yy = yy + 2000; else yy = yy + 1900; } } } if (this.nbrOfDays(yy,mm-1) < dd) return "NaN"; } diffStr = diffStr.substring(1); if (diffStr != "") { var o = diffStr.substring(0,1); if (o == "+" || o == "-") { var l = diffStr.length; var t = diffStr.substring(l-1); if ("ymdhns".indexOf(t) > -1) { var v = diffStr.substring(1,l-1); if (v != "" && !isNaN(v)) { var s = t + t + "=" + t + t + o + v; eval(s); } } } } theDate = new Date(yy, mm - 1 , dd, hh, nn, ss, 0); return theDate; } this.formatDate = function(theDate, formatStr) { if (formatStr == "Integer") return theDate.getTime(); var r = ""; var f = ""; var p = ""; for (var i = 0; i < formatStr.length; i++) { var s = formatStr.substr(i,1); if ("dmyhns".indexOf(s) > -1) { if (s == p) f = f + s; else { if (f != "") r = r + this.getValueByFormat(theDate, f); f = s; } p = s; } else { p = ""; if (f != "") { r = r + this.getValueByFormat(theDate, f); f = ""; } r = r + s; } } if (f != "") r = r + this.getValueByFormat(theDate, f); return r; }; this.convertDate = function(value, iformat, oformat) { if (value == "") return ""; return this.formatDate( this.parseDate(value,iformat), oformat ); }; this.getValueByFormat = function(theDate, format) { if (format == "dddd") return DateResource.days[theDate.getDay()]; if (format == "ddd") { return DateResource.shortDays[theDate.getDay()]; } if (format == "dd") { var x = theDate.getDate(); return (x < 10) ? '0' + x : x; } if (format == "d") return theDate.getDate(); if (format == "mmmm") return DateResource.months[theDate.getMonth()]; if (format == "mmm") { return DateResource.shortMonths[theDate.getMonth()]; } if (format == "mm") { var x = theDate.getMonth() + 1; return (x < 10) ? '0' + x : x; } if (format == "m") return theDate.getMonth() + 1; if (format == "yyyy") return theDate.getFullYear(); if (format == "yy") { var x = theDate.getFullYear() + ""; return x.substr(2,4); } if (format == "hh") { var x = theDate.getHours(); return (x < 10) ? '0' + x : x; } if (format == "h") return theDate.getHours(); if (format == "nn") { var x = theDate.getMinutes(); return (x < 10) ? '0' + x : x; } if (format == "n") return theDate.getMinutes(); if (format == "ss") { x = theDate.getSeconds(); return (x < 10) ? '0' + x : x; } if (format == "s") return theDate.getSeconds(); return "??"; }; this.nbrOfDays = function(year, month) { var result = 31; if (month == 3 || month == 5 || month == 8 || month == 10) result = 30; if (month == 1 && (year/4) != Math.floor(year/4)) result = 28; if (month == 1 && (year/4) == Math.floor(year/4)) result = 29; return result; }; this.isWeekendDay = function(year, month, day) { var theDate; if (year.getTime) theDate = year; else theDate = new Date(year, month, day); var theDay = theDate.getDay(); return theDay == 0 || theDay == 6; }; }; var DateMgr = new DateManager();