BI.DynamicDateTimeSelect = BI.inherit(BI.Widget, { props: { baseCls: "bi-date-time-select" }, render: function () { var self = this; return { type: "bi.center_adapt", items: [{ type: "bi.vertical_adapt", items: [{ el: { type: "bi.number_editor", ref: function () { self.hour = this; }, validationChecker: function (v) { return BI.isNaturalNumber(v) && BI.parseInt(v) < 24; }, errorText: function (v) { if(BI.isNumeric(v)) { return BI.i18nText("BI-Basic_Input_From_To_Number", "\"00-23\""); } return BI.i18nText("BI-Numerical_Interval_Input_Data"); }, listeners: [{ eventName: BI.SignEditor.EVENT_CONFIRM, action: function () { var value = this.getValue(); self._checkHour(value); this.setValue(self._formatValueToDoubleDigit(value)); self.fireEvent(BI.DynamicDateTimeSelect.EVENT_CONFIRM); } }, { eventName: BI.SignEditor.EVENT_CHANGE, action: function () { var value = self._autoSwitch(this.getValue(), BI.DynamicDateTimeSelect.HOUR); this.setValue(value); } }], width: 60, height: 24 } }, { type: "bi.label", text: ":", width: 20 }, { type: "bi.number_editor", ref: function () { self.minute = this; }, validationChecker: function (v) { return BI.isNaturalNumber(v) && BI.parseInt(v) < 60; }, errorText: function (v) { if(BI.isNumeric(v)) { return BI.i18nText("BI-Basic_Input_From_To_Number", "\"00-59\""); } return BI.i18nText("BI-Numerical_Interval_Input_Data"); }, listeners: [{ eventName: BI.SignEditor.EVENT_CONFIRM, action: function () { var value = this.getValue(); self._checkMinute(value); this.setValue(self._formatValueToDoubleDigit(value), BI.DynamicDateTimeSelect.MINUTE); self.fireEvent(BI.DynamicDateTimeSelect.EVENT_CONFIRM); } }, { eventName: BI.SignEditor.EVENT_CHANGE, action: function () { var value = self._autoSwitch(this.getValue(), BI.DynamicDateTimeSelect.MINUTE); this.setValue(value); } }], width: 60, height: 24 }, { type: "bi.label", text: ":", width: 20 }, { type: "bi.number_editor", ref: function () { self.second = this; }, validationChecker: function (v) { return BI.isNaturalNumber(v) && BI.parseInt(v) < 60; }, errorText: function (v) { if(BI.isNumeric(v)) { return BI.i18nText("BI-Basic_Input_From_To_Number", "\"00-59\""); } return BI.i18nText("BI-Numerical_Interval_Input_Data"); }, listeners: [{ eventName: BI.SignEditor.EVENT_CONFIRM, action: function () { var value = this.getValue(); self._checkSecond(value); this.setValue(self._formatValueToDoubleDigit(value)); self.fireEvent(BI.DynamicDateTimeSelect.EVENT_CONFIRM); } }], width: 60, height: 24 }] }] }; }, _checkBorder: function (v) { v = v || {}; this._checkHour(v.hour); this._checkMinute(v.minute); this._checkSecond(v.second); }, _checkHour: function (value) { this.hour.setDownEnable(BI.parseInt(value) > 0); this.hour.setUpEnable(BI.parseInt(value) < 23); }, _checkMinute: function (value) { this.minute.setDownEnable(BI.parseInt(value) > 0); this.minute.setUpEnable(BI.parseInt(value) < 59); }, _checkSecond: function (value) { this.second.setDownEnable(BI.parseInt(value) > 0); this.second.setUpEnable(BI.parseInt(value) < 59); }, _autoSwitch: function (v, type) { var limit = 0; var value = v + ""; switch (type) { case BI.DynamicDateTimeSelect.HOUR: limit = 2; break; case BI.DynamicDateTimeSelect.MINUTE: limit = 5; break; default: break; } if(value.length === 1 && BI.parseInt(value) > limit) { value = "0" + value; } if (value.length === 2) { switch (type) { case BI.DynamicDateTimeSelect.HOUR: this.hour.isEditing() && this.minute.focus(); break; case BI.DynamicDateTimeSelect.MINUTE: this.minute.isEditing() && this.second.focus(); break; case BI.DynamicDateTimeSelect.SECOND: default: break; } } return value; }, _formatValueToDoubleDigit: function (v) { if(BI.isNull(v) || BI.isEmptyString(v)) { v = 0; } var value = BI.parseInt(v); if(value < 10) { value = "0" + value; } return value; }, _assertValue: function (v) { v = v || {}; v.hour = this._formatValueToDoubleDigit(v.hour) || "00"; v.minute = this._formatValueToDoubleDigit(v.minute) || "00"; v.second = this._formatValueToDoubleDigit(v.second) || "00"; return v; }, getValue: function () { return { hour: BI.parseInt(this.hour.getValue()), minute: BI.parseInt(this.minute.getValue()), second: BI.parseInt(this.second.getValue()) }; }, setValue: function (v) { v = this._assertValue(v); this.hour.setValue(v.hour); this.minute.setValue(v.minute); this.second.setValue(v.second); this._checkBorder(v); } }); BI.DynamicDateTimeSelect.EVENT_CONFIRM = "EVENT_CONFIRM"; BI.shortcut("bi.dynamic_date_time_select", BI.DynamicDateTimeSelect); BI.extend(BI.DynamicDateTimeSelect, { HOUR: 1, MINUTE: 2, SECOND: 3 });