/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; var InputWidgetHelper = { _uiBusy: false, handleEvent: function(aEvent) { this.handleClick(aEvent.target); }, handleClick: function(aTarget) { // if we're busy looking at a InputWidget we want to eat any clicks that // come to us, but not to process them if (this._uiBusy || !this.hasInputWidget(aTarget) || this._isDisabledElement(aTarget)) return; this._uiBusy = true; this.show(aTarget); this._uiBusy = false; }, show: function(aElement) { let type = aElement.getAttribute('type'); let p = new Prompt({ window: aElement.ownerDocument.defaultView, title: Strings.browser.GetStringFromName("inputWidgetHelper." + aElement.getAttribute('type')), buttons: [ Strings.browser.GetStringFromName("inputWidgetHelper.set"), Strings.browser.GetStringFromName("inputWidgetHelper.clear"), Strings.browser.GetStringFromName("inputWidgetHelper.cancel") ], }).addDatePicker({ value: aElement.value, type: type, min: aElement.min, max: aElement.max, }).show((function(data) { let changed = false; if (data.button == -1) { // This type is not supported with this android version. return; } if (data.button == 1) { // The user cleared the value. if (aElement.value != "") { aElement.value = ""; changed = true; } } else if (data.button == 0) { // Commit the new value. if (aElement.value != data[type]) { aElement.value = data[type + "0"]; changed = true; } } // Else the user canceled the input. if (changed) this.fireOnChange(aElement); }).bind(this)); }, hasInputWidget: function(aElement) { if (!aElement instanceof HTMLInputElement) return false; let type = aElement.getAttribute('type'); if (type == "date" || type == "datetime" || type == "datetime-local" || type == "week" || type == "month" || type == "time") { return true; } return false; }, fireOnChange: function(aElement) { let evt = aElement.ownerDocument.createEvent("Events"); evt.initEvent("change", true, true, aElement.defaultView, 0, false, false, false, false, null); setTimeout(function() { aElement.dispatchEvent(evt); }, 0); }, _isDisabledElement : function(aElement) { let currentElement = aElement; while (currentElement) { if (currentElement.disabled) return true; currentElement = currentElement.parentElement; } return false; } };