summaryrefslogtreecommitdiff
path: root/lib/dijit/form
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2013-03-18 10:26:24 +0400
committerAndrew Dolgov <[email protected]>2013-03-18 10:26:26 +0400
commitf0cfe83e3725f9a3928da97a6e3085e79cb25309 (patch)
tree4b0af188defaa807c7bc6ff3a101b41c9166c463 /lib/dijit/form
parent9a2885da170ffd64358b99194095851a2d09c1b6 (diff)
upgrade dojo to 1.8.3 (refs #570)
Diffstat (limited to 'lib/dijit/form')
-rw-r--r--lib/dijit/form/Button.js2
-rw-r--r--lib/dijit/form/Button.js.uncompressed.js121
-rw-r--r--lib/dijit/form/CheckBox.js2
-rw-r--r--lib/dijit/form/CheckBox.js.uncompressed.js116
-rw-r--r--lib/dijit/form/ComboBox.js.uncompressed.js27
-rw-r--r--lib/dijit/form/ComboBoxMixin.js2
-rw-r--r--lib/dijit/form/ComboBoxMixin.js.uncompressed.js143
-rw-r--r--lib/dijit/form/ComboButton.js2
-rw-r--r--lib/dijit/form/ComboButton.js.uncompressed.js85
-rw-r--r--lib/dijit/form/CurrencyTextBox.js2
-rw-r--r--lib/dijit/form/CurrencyTextBox.js.uncompressed.js85
-rw-r--r--lib/dijit/form/DataList.js.uncompressed.js70
-rw-r--r--lib/dijit/form/DateTextBox.js.uncompressed.js28
-rw-r--r--lib/dijit/form/DropDownButton.js2
-rw-r--r--lib/dijit/form/DropDownButton.js.uncompressed.js99
-rw-r--r--lib/dijit/form/FilteringSelect.js2
-rw-r--r--lib/dijit/form/FilteringSelect.js.uncompressed.js234
-rw-r--r--lib/dijit/form/Form.js2
-rw-r--r--lib/dijit/form/Form.js.uncompressed.js163
-rw-r--r--lib/dijit/form/HorizontalRule.js.uncompressed.js69
-rw-r--r--lib/dijit/form/HorizontalRuleLabels.js2
-rw-r--r--lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js92
-rw-r--r--lib/dijit/form/HorizontalSlider.js2
-rw-r--r--lib/dijit/form/HorizontalSlider.js.uncompressed.js349
-rw-r--r--lib/dijit/form/MappedTextBox.js2
-rw-r--r--lib/dijit/form/MappedTextBox.js.uncompressed.js81
-rw-r--r--lib/dijit/form/MultiSelect.js2
-rw-r--r--lib/dijit/form/MultiSelect.js.uncompressed.js134
-rw-r--r--lib/dijit/form/NumberSpinner.js2
-rw-r--r--lib/dijit/form/NumberSpinner.js.uncompressed.js69
-rw-r--r--lib/dijit/form/NumberTextBox.js2
-rw-r--r--lib/dijit/form/NumberTextBox.js.uncompressed.js275
-rw-r--r--lib/dijit/form/RadioButton.js.uncompressed.js16
-rw-r--r--lib/dijit/form/RangeBoundTextBox.js2
-rw-r--r--lib/dijit/form/RangeBoundTextBox.js.uncompressed.js110
-rw-r--r--lib/dijit/form/Select.js2
-rw-r--r--lib/dijit/form/Select.js.uncompressed.js406
-rw-r--r--lib/dijit/form/SimpleTextarea.js2
-rw-r--r--lib/dijit/form/SimpleTextarea.js.uncompressed.js92
-rw-r--r--lib/dijit/form/Slider.js.uncompressed.js23
-rw-r--r--lib/dijit/form/TextBox.js2
-rw-r--r--lib/dijit/form/TextBox.js.uncompressed.js157
-rw-r--r--lib/dijit/form/Textarea.js.uncompressed.js42
-rw-r--r--lib/dijit/form/TimeTextBox.js2
-rw-r--r--lib/dijit/form/TimeTextBox.js.uncompressed.js79
-rw-r--r--lib/dijit/form/ToggleButton.js.uncompressed.js26
-rw-r--r--lib/dijit/form/ValidationTextBox.js2
-rw-r--r--lib/dijit/form/ValidationTextBox.js.uncompressed.js332
-rw-r--r--lib/dijit/form/VerticalRule.js.uncompressed.js28
-rw-r--r--lib/dijit/form/VerticalRuleLabels.js.uncompressed.js26
-rw-r--r--lib/dijit/form/VerticalSlider.js2
-rw-r--r--lib/dijit/form/VerticalSlider.js.uncompressed.js35
-rw-r--r--lib/dijit/form/_AutoCompleterMixin.js2
-rw-r--r--lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js581
-rw-r--r--lib/dijit/form/_ButtonMixin.js.uncompressed.js84
-rw-r--r--lib/dijit/form/_CheckBoxMixin.js2
-rw-r--r--lib/dijit/form/_CheckBoxMixin.js.uncompressed.js77
-rw-r--r--lib/dijit/form/_ComboBoxMenu.js2
-rw-r--r--lib/dijit/form/_ComboBoxMenu.js.uncompressed.js131
-rw-r--r--lib/dijit/form/_ComboBoxMenuMixin.js2
-rw-r--r--lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js189
-rw-r--r--lib/dijit/form/_DateTimeTextBox.js2
-rw-r--r--lib/dijit/form/_DateTimeTextBox.js.uncompressed.js260
-rw-r--r--lib/dijit/form/_ExpandingTextAreaMixin.js2
-rw-r--r--lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js130
-rw-r--r--lib/dijit/form/_FormMixin.js2
-rw-r--r--lib/dijit/form/_FormMixin.js.uncompressed.js456
-rw-r--r--lib/dijit/form/_FormSelectWidget.js2
-rw-r--r--lib/dijit/form/_FormSelectWidget.js.uncompressed.js707
-rw-r--r--lib/dijit/form/_FormValueMixin.js2
-rw-r--r--lib/dijit/form/_FormValueMixin.js.uncompressed.js89
-rw-r--r--lib/dijit/form/_FormValueWidget.js2
-rw-r--r--lib/dijit/form/_FormValueWidget.js.uncompressed.js51
-rw-r--r--lib/dijit/form/_FormWidget.js2
-rw-r--r--lib/dijit/form/_FormWidget.js.uncompressed.js71
-rw-r--r--lib/dijit/form/_FormWidgetMixin.js2
-rw-r--r--lib/dijit/form/_FormWidgetMixin.js.uncompressed.js227
-rw-r--r--lib/dijit/form/_ListBase.js2
-rw-r--r--lib/dijit/form/_ListBase.js.uncompressed.js135
-rw-r--r--lib/dijit/form/_ListMouseMixin.js2
-rw-r--r--lib/dijit/form/_ListMouseMixin.js.uncompressed.js79
-rw-r--r--lib/dijit/form/_RadioButtonMixin.js2
-rw-r--r--lib/dijit/form/_RadioButtonMixin.js.uncompressed.js71
-rw-r--r--lib/dijit/form/_SearchMixin.js2
-rw-r--r--lib/dijit/form/_SearchMixin.js.uncompressed.js264
-rw-r--r--lib/dijit/form/_Spinner.js2
-rw-r--r--lib/dijit/form/_Spinner.js.uncompressed.js160
-rw-r--r--lib/dijit/form/_TextBoxMixin.js2
-rw-r--r--lib/dijit/form/_TextBoxMixin.js.uncompressed.js474
-rw-r--r--lib/dijit/form/_ToggleButtonMixin.js2
-rw-r--r--lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js55
-rw-r--r--lib/dijit/form/nls/ComboBox.js.uncompressed.js40
-rw-r--r--lib/dijit/form/nls/Textarea.js.uncompressed.js43
-rw-r--r--lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/ar/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ar/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/az/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/az/Textarea.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/az/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/ca/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ca/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/cs/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/cs/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/da/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/da/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/da/validate.js2
-rw-r--r--lib/dijit/form/nls/da/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/de/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/de/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/de/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/el/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/el/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/el/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/es/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/es/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/es/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/fi/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/fi/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/fr/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/fr/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/he/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/he/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/he/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/hr/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/hr/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/hu/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/hu/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/it/ComboBox.js2
-rw-r--r--lib/dijit/form/nls/it/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/it/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/it/validate.js2
-rw-r--r--lib/dijit/form/nls/it/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/ja/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ja/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/kk/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/kk/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/ko/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ko/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/nb/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/nb/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/nl/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/nl/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/pl/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/pl/validate.js2
-rw-r--r--lib/dijit/form/nls/pl/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/pt/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/pt/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/ro/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ro/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/ru/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ru/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/sk/ComboBox.js2
-rw-r--r--lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/sk/Textarea.js2
-rw-r--r--lib/dijit/form/nls/sk/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/sk/validate.js2
-rw-r--r--lib/dijit/form/nls/sk/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/sl/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/sl/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/sv/ComboBox.js2
-rw-r--r--lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/sv/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/sv/validate.js2
-rw-r--r--lib/dijit/form/nls/sv/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/th/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/th/Textarea.js2
-rw-r--r--lib/dijit/form/nls/th/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/th/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/tr/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/tr/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/validate.js.uncompressed.js41
-rw-r--r--lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/zh/Textarea.js2
-rw-r--r--lib/dijit/form/nls/zh/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/zh/validate.js2
-rw-r--r--lib/dijit/form/nls/zh/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/templates/CheckBox.html2
-rw-r--r--lib/dijit/form/templates/ComboButton.html2
-rw-r--r--lib/dijit/form/templates/DropDownBox.html2
-rw-r--r--lib/dijit/form/templates/DropDownButton.html2
-rw-r--r--lib/dijit/form/templates/HorizontalSlider.html3
-rw-r--r--lib/dijit/form/templates/Select.html20
-rw-r--r--lib/dijit/form/templates/Spinner.html6
-rw-r--r--lib/dijit/form/templates/VerticalSlider.html7
207 files changed, 8785 insertions, 70 deletions
diff --git a/lib/dijit/form/Button.js b/lib/dijit/form/Button.js
index a0db441a4..0f2bb158c 100644
--- a/lib/dijit/form/Button.js
+++ b/lib/dijit/form/Button.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/Button.html":"<span class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" role=\"presentation\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#x25CF;</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\"\n\t\ttabIndex=\"-1\" role=\"presentation\" data-dojo-attach-point=\"valueNode\"\n/></span>\n"}});define("dijit/form/Button",["require","dojo/_base/declare","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/ready","./_FormWidget","./_ButtonMixin","dojo/text!./templates/Button.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){if(!_4.isAsync){_6(0,function(){var _a=["dijit/form/DropDownButton","dijit/form/ComboButton","dijit/form/ToggleButton"];_1(_a);});}return _2("dijit.form.Button",[_7,_8],{showLabel:true,iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitButton",templateString:_9,_setValueAttr:"valueNode",_onClick:function(e){var ok=this.inherited(arguments);if(ok){if(this.valueNode){this.valueNode.click();e.preventDefault();}}return ok;},_fillContent:function(_b){if(_b&&(!this.params||!("label" in this.params))){var _c=_5.trim(_b.innerHTML);if(_c){this.label=_c;}}},_setShowLabelAttr:function(_d){if(this.containerNode){_3.toggle(this.containerNode,"dijitDisplayNone",!_d);}this._set("showLabel",_d);},setLabel:function(_e){_4.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_e);},_setLabelAttr:function(_f){this.inherited(arguments);if(!this.showLabel&&!("title" in this.params)){this.titleNode.title=_5.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/Button.html":"<span class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" role=\"presentation\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#x25CF;</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\"\n\t\ttabIndex=\"-1\" role=\"presentation\" data-dojo-attach-point=\"valueNode\"\n/></span>\n"}});define("dijit/form/Button",["require","dojo/_base/declare","dojo/dom-class","dojo/has","dojo/_base/kernel","dojo/_base/lang","dojo/ready","./_FormWidget","./_ButtonMixin","dojo/text!./templates/Button.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){if(_4("dijit-legacy-requires")){_7(0,function(){var _b=["dijit/form/DropDownButton","dijit/form/ComboButton","dijit/form/ToggleButton"];_1(_b);});}return _2("dijit.form.Button",[_8,_9],{showLabel:true,iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitButton",templateString:_a,_setValueAttr:"valueNode",_onClick:function(e){var ok=this.inherited(arguments);if(ok){if(this.valueNode){this.valueNode.click();e.preventDefault();e.stopPropagation();}}return ok;},_fillContent:function(_c){if(_c&&(!this.params||!("label" in this.params))){var _d=_6.trim(_c.innerHTML);if(_d){this.label=_d;}}},_setShowLabelAttr:function(_e){if(this.containerNode){_3.toggle(this.containerNode,"dijitDisplayNone",!_e);}this._set("showLabel",_e);},setLabel:function(_f){_5.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_f);},_setLabelAttr:function(_10){this.inherited(arguments);if(!this.showLabel&&!("title" in this.params)){this.titleNode.title=_6.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/Button.js.uncompressed.js b/lib/dijit/form/Button.js.uncompressed.js
new file mode 100644
index 000000000..40bbbcf39
--- /dev/null
+++ b/lib/dijit/form/Button.js.uncompressed.js
@@ -0,0 +1,121 @@
+require({cache:{
+'url:dijit/form/templates/Button.html':"<span class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" role=\"presentation\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\"></span\n\t\t\t><span class=\"dijitReset dijitToggleButtonIconChar\">&#x25CF;</span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\"\n\t\ttabIndex=\"-1\" role=\"presentation\" data-dojo-attach-point=\"valueNode\"\n/></span>\n"}});
+define("dijit/form/Button", [
+ "require",
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.toggle
+ "dojo/has", // has("dijit-legacy-requires")
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.trim
+ "dojo/ready",
+ "./_FormWidget",
+ "./_ButtonMixin",
+ "dojo/text!./templates/Button.html"
+], function(require, declare, domClass, has, kernel, lang, ready, _FormWidget, _ButtonMixin, template){
+
+// module:
+// dijit/form/Button
+
+// Back compat w/1.6, remove for 2.0
+if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/form/DropDownButton", "dijit/form/ComboButton", "dijit/form/ToggleButton"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+return declare("dijit.form.Button", [_FormWidget, _ButtonMixin], {
+ // summary:
+ // Basically the same thing as a normal HTML button, but with special styling.
+ // description:
+ // Buttons can display a label, an icon, or both.
+ // A label should always be specified (through innerHTML) or the label
+ // attribute. It can be hidden via showLabel=false.
+ // example:
+ // | <button data-dojo-type="dijit/form/Button" onClick="...">Hello world</button>
+ //
+ // example:
+ // | var button1 = new Button({label: "hello world", onClick: foo});
+ // | dojo.body().appendChild(button1.domNode);
+
+ // showLabel: Boolean
+ // Set this to true to hide the label text and display only the icon.
+ // (If showLabel=false then iconClass must be specified.)
+ // Especially useful for toolbars.
+ // If showLabel=true, the label will become the title (a.k.a. tooltip/hint) of the icon.
+ //
+ // The exception case is for computers in high-contrast mode, where the label
+ // will still be displayed, since the icon doesn't appear.
+ showLabel: true,
+
+ // iconClass: String
+ // Class to apply to DOMNode in button to make it display an icon
+ iconClass: "dijitNoIcon",
+ _setIconClassAttr: { node: "iconNode", type: "class" },
+
+ baseClass: "dijitButton",
+
+ templateString: template,
+
+ // Map widget attributes to DOMNode attributes.
+ _setValueAttr: "valueNode",
+
+ _onClick: function(/*Event*/ e){
+ // summary:
+ // Internal function to handle click actions
+ var ok = this.inherited(arguments);
+ if(ok){
+ if(this.valueNode){
+ this.valueNode.click();
+ e.preventDefault(); // cancel BUTTON click and continue with hidden INPUT click
+ e.stopPropagation(); // avoid two events bubbling from Button widget
+ // leave ok = true so that subclasses can do what they need to do
+ }
+ }
+ return ok;
+ },
+
+ _fillContent: function(/*DomNode*/ source){
+ // Overrides _Templated._fillContent().
+ // If button label is specified as srcNodeRef.innerHTML rather than
+ // this.params.label, handle it here.
+ // TODO: remove the method in 2.0, parser will do it all for me
+ if(source && (!this.params || !("label" in this.params))){
+ var sourceLabel = lang.trim(source.innerHTML);
+ if(sourceLabel){
+ this.label = sourceLabel; // _applyAttributes will be called after buildRendering completes to update the DOM
+ }
+ }
+ },
+
+ _setShowLabelAttr: function(val){
+ if(this.containerNode){
+ domClass.toggle(this.containerNode, "dijitDisplayNone", !val);
+ }
+ this._set("showLabel", val);
+ },
+
+ setLabel: function(/*String*/ content){
+ // summary:
+ // Deprecated. Use set('label', ...) instead.
+ kernel.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0");
+ this.set("label", content);
+ },
+
+ _setLabelAttr: function(/*String*/ content){
+ // summary:
+ // Hook for set('label', ...) to work.
+ // description:
+ // Set the label (text) of the button; takes an HTML string.
+ // If the label is hidden (showLabel=false) then and no title has
+ // been specified, then label is also set as title attribute of icon.
+ this.inherited(arguments);
+ if(!this.showLabel && !("title" in this.params)){
+ this.titleNode.title = lang.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+ }
+ }
+});
+
+
+});
+
diff --git a/lib/dijit/form/CheckBox.js b/lib/dijit/form/CheckBox.js
index 1d0bcceaf..7f3924e54 100644
--- a/lib/dijit/form/CheckBox.js
+++ b/lib/dijit/form/CheckBox.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/CheckBox.html":"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n"}});define("dijit/form/CheckBox",["require","dojo/_base/declare","dojo/dom-attr","dojo/_base/kernel","dojo/query","dojo/ready","./ToggleButton","./_CheckBoxMixin","dojo/text!./templates/CheckBox.html","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){if(!_4.isAsync){_6(0,function(){var _a=["dijit/form/RadioButton"];_1(_a);});}return _2("dijit.form.CheckBox",[_7,_8],{templateString:_9,baseClass:"dijitCheckBox",_setValueAttr:function(_b,_c){if(typeof _b=="string"){this._set("value",_b);_3.set(this.focusNode,"value",_b);_b=true;}if(this._created){this.set("checked",_b,_c);}},_getValueAttr:function(){return (this.checked?this.value:false);},_setIconClassAttr:null,postMixInProperties:function(){this.inherited(arguments);this.checkedAttrSetting=this.checked?"checked":"";},_fillContent:function(){},_onFocus:function(){if(this.id){_5("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}this.inherited(arguments);},_onBlur:function(){if(this.id){_5("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}this.inherited(arguments);}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/CheckBox.html":"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" role=\"${type}\" aria-checked=\"false\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n"}});define("dijit/form/CheckBox",["require","dojo/_base/declare","dojo/dom-attr","dojo/has","dojo/query","dojo/ready","./ToggleButton","./_CheckBoxMixin","dojo/text!./templates/CheckBox.html","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){if(_4("dijit-legacy-requires")){_6(0,function(){var _a=["dijit/form/RadioButton"];_1(_a);});}return _2("dijit.form.CheckBox",[_7,_8],{templateString:_9,baseClass:"dijitCheckBox",_setValueAttr:function(_b,_c){if(typeof _b=="string"){this.inherited(arguments);_b=true;}if(this._created){this.set("checked",_b,_c);}},_getValueAttr:function(){return (this.checked?this.value:false);},_setIconClassAttr:null,postMixInProperties:function(){this.inherited(arguments);this.checkedAttrSetting=this.checked?"checked":"";},_fillContent:function(){},_onFocus:function(){if(this.id){_5("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}this.inherited(arguments);},_onBlur:function(){if(this.id){_5("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/CheckBox.js.uncompressed.js b/lib/dijit/form/CheckBox.js.uncompressed.js
new file mode 100644
index 000000000..4e65ca30a
--- /dev/null
+++ b/lib/dijit/form/CheckBox.js.uncompressed.js
@@ -0,0 +1,116 @@
+require({cache:{
+'url:dijit/form/templates/CheckBox.html':"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" role=\"${type}\" aria-checked=\"false\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n"}});
+define("dijit/form/CheckBox", [
+ "require",
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/has", // has("dijit-legacy-requires")
+ "dojo/query", // query
+ "dojo/ready",
+ "./ToggleButton",
+ "./_CheckBoxMixin",
+ "dojo/text!./templates/CheckBox.html",
+ "dojo/NodeList-dom" // NodeList.addClass/removeClass
+], function(require, declare, domAttr, has, query, ready, ToggleButton, _CheckBoxMixin, template){
+
+ // module:
+ // dijit/form/CheckBox
+
+ // Back compat w/1.6, remove for 2.0
+ if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/form/RadioButton"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+ }
+
+ return declare("dijit.form.CheckBox", [ToggleButton, _CheckBoxMixin], {
+ // summary:
+ // Same as an HTML checkbox, but with fancy styling.
+ //
+ // description:
+ // User interacts with real html inputs.
+ // On onclick (which occurs by mouse click, space-bar, or
+ // using the arrow keys to switch the selected radio button),
+ // we update the state of the checkbox/radio.
+ //
+ // There are two modes:
+ //
+ // 1. High contrast mode
+ // 2. Normal mode
+ //
+ // In case 1, the regular html inputs are shown and used by the user.
+ // In case 2, the regular html inputs are invisible but still used by
+ // the user. They are turned quasi-invisible and overlay the background-image.
+
+ templateString: template,
+
+ baseClass: "dijitCheckBox",
+
+ _setValueAttr: function(/*String|Boolean*/ newValue, /*Boolean*/ priorityChange){
+ // summary:
+ // Handler for value= attribute to constructor, and also calls to
+ // set('value', val).
+ // description:
+ // During initialization, just saves as attribute to the `<input type=checkbox>`.
+ //
+ // After initialization,
+ // when passed a boolean, controls whether or not the CheckBox is checked.
+ // If passed a string, changes the value attribute of the CheckBox (the one
+ // specified as "value" when the CheckBox was constructed
+ // (ex: `<input data-dojo-type="dijit/CheckBox" value="chicken">`).
+ //
+ // `widget.set('value', string)` will check the checkbox and change the value to the
+ // specified string.
+ //
+ // `widget.set('value', boolean)` will change the checked state.
+
+ if(typeof newValue == "string"){
+ this.inherited(arguments);
+ newValue = true;
+ }
+ if(this._created){
+ this.set('checked', newValue, priorityChange);
+ }
+ },
+ _getValueAttr: function(){
+ // summary:
+ // Hook so get('value') works.
+ // description:
+ // If the CheckBox is checked, returns the value attribute.
+ // Otherwise returns false.
+ return (this.checked ? this.value : false);
+ },
+
+ // Override behavior from Button, since we don't have an iconNode
+ _setIconClassAttr: null,
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+
+ // Need to set initial checked state as part of template, so that form submit works.
+ // domAttr.set(node, "checked", bool) doesn't work on IE until node has been attached
+ // to <body>, see #8666
+ this.checkedAttrSetting = this.checked ? "checked" : "";
+ },
+
+ _fillContent: function(){
+ // Override Button::_fillContent() since it doesn't make sense for CheckBox,
+ // since CheckBox doesn't even have a container
+ },
+
+ _onFocus: function(){
+ if(this.id){
+ query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");
+ }
+ this.inherited(arguments);
+ },
+
+ _onBlur: function(){
+ if(this.id){
+ query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");
+ }
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/form/ComboBox.js.uncompressed.js b/lib/dijit/form/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..b883af242
--- /dev/null
+++ b/lib/dijit/form/ComboBox.js.uncompressed.js
@@ -0,0 +1,27 @@
+define("dijit/form/ComboBox", [
+ "dojo/_base/declare", // declare
+ "./ValidationTextBox",
+ "./ComboBoxMixin"
+], function(declare, ValidationTextBox, ComboBoxMixin){
+
+ // module:
+ // dijit/form/ComboBox
+
+ return declare("dijit.form.ComboBox", [ValidationTextBox, ComboBoxMixin], {
+ // summary:
+ // Auto-completing text box
+ //
+ // description:
+ // The drop down box's values are populated from an class called
+ // a data provider, which returns a list of values based on the characters
+ // that the user has typed into the input box.
+ // If OPTION tags are used as the data provider via markup,
+ // then the OPTION tag's child text node is used as the widget value
+ // when selected. The OPTION tag's value attribute is ignored.
+ // To set the default value when using OPTION tags, specify the selected
+ // attribute on 1 of the child OPTION tags.
+ //
+ // Some of the options to the ComboBox are actually arguments to the data
+ // provider.
+ });
+});
diff --git a/lib/dijit/form/ComboBoxMixin.js b/lib/dijit/form/ComboBoxMixin.js
index 99f0efa04..f3c3df80b 100644
--- a/lib/dijit/form/ComboBoxMixin.js
+++ b/lib/dijit/form/ComboBoxMixin.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/DropDownBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});define("dijit/form/ComboBoxMixin",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/kernel","dojo/_base/lang","dojo/store/util/QueryResults","./_AutoCompleterMixin","./_ComboBoxMenu","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.ComboBoxMixin",[_8,_6],{dropDownClass:_7,hasDownArrow:true,templateString:_9,baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},_setHasDownArrowAttr:function(_a){this._set("hasDownArrow",_a);this._buttonNode.style.display=_a?"":"none";},_showResultList:function(){this.displayMessage("");this.inherited(arguments);},_setStoreAttr:function(_b){if(!_b.get){_4.mixin(_b,{_oldAPI:true,get:function(id){var _c=new _2();this.fetchItemByIdentity({identity:id,onItem:function(_d){_c.resolve(_d);},onError:function(_e){_c.reject(_e);}});return _c.promise;},query:function(_f,_10){var _11=new _2(function(){_12.abort&&_12.abort();});var _12=this.fetch(_4.mixin({query:_f,onBegin:function(_13){_11.total=_13;},onComplete:function(_14){_11.resolve(_14);},onError:function(_15){_11.reject(_15);}},_10));return _5(_11);}});}this._set("store",_b);},postMixInProperties:function(){if(this.params.store){this._setStoreAttr(this.params.store);}this.inherited(arguments);if(!this.params.store){var _16=this.declaredClass;_4.mixin(this.store,{getValue:function(_17,_18){_3.deprecated(_16+".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly","","2.0");return _17[_18];},getLabel:function(_19){_3.deprecated(_16+".store.getLabel(item) is deprecated for builtin store. Use item.label directly","","2.0");return _19.name;},fetch:function(_1a){_3.deprecated(_16+".store.fetch() is deprecated for builtin store.","Use store.query()","2.0");var _1b=["dojo/data/ObjectStore"];require(_1b,_4.hitch(this,function(_1c){new _1c({objectStore:this}).fetch(_1a);}));}});}}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/DropDownBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"button presentation\" aria-hidden=\"true\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});define("dijit/form/ComboBoxMixin",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/kernel","dojo/_base/lang","dojo/store/util/QueryResults","./_AutoCompleterMixin","./_ComboBoxMenu","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.ComboBoxMixin",[_8,_6],{dropDownClass:_7,hasDownArrow:true,templateString:_9,baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},_setHasDownArrowAttr:function(_a){this._set("hasDownArrow",_a);this._buttonNode.style.display=_a?"":"none";},_showResultList:function(){this.displayMessage("");this.inherited(arguments);},_setStoreAttr:function(_b){if(!_b.get){_4.mixin(_b,{_oldAPI:true,get:function(id){var _c=new _2();this.fetchItemByIdentity({identity:id,onItem:function(_d){_c.resolve(_d);},onError:function(_e){_c.reject(_e);}});return _c.promise;},query:function(_f,_10){var _11=new _2(function(){_12.abort&&_12.abort();});_11.total=new _2();var _12=this.fetch(_4.mixin({query:_f,onBegin:function(_13){_11.total.resolve(_13);},onComplete:function(_14){_11.resolve(_14);},onError:function(_15){_11.reject(_15);}},_10));return _5(_11);}});}this._set("store",_b);},postMixInProperties:function(){var _16=this.params.store||this.store;if(_16){this._setStoreAttr(_16);}this.inherited(arguments);if(!this.params.store&&!this.store._oldAPI){var _17=this.declaredClass;_4.mixin(this.store,{getValue:function(_18,_19){_3.deprecated(_17+".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly","","2.0");return _18[_19];},getLabel:function(_1a){_3.deprecated(_17+".store.getLabel(item) is deprecated for builtin store. Use item.label directly","","2.0");return _1a.name;},fetch:function(_1b){_3.deprecated(_17+".store.fetch() is deprecated for builtin store.","Use store.query()","2.0");var _1c=["dojo/data/ObjectStore"];require(_1c,_4.hitch(this,function(_1d){new _1d({objectStore:this}).fetch(_1b);}));}});}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/ComboBoxMixin.js.uncompressed.js b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js
new file mode 100644
index 000000000..bafccb44b
--- /dev/null
+++ b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js
@@ -0,0 +1,143 @@
+require({cache:{
+'url:dijit/form/templates/DropDownBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"button presentation\" aria-hidden=\"true\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});
+define("dijit/form/ComboBoxMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred",
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.mixin
+ "dojo/store/util/QueryResults",
+ "./_AutoCompleterMixin",
+ "./_ComboBoxMenu",
+ "../_HasDropDown",
+ "dojo/text!./templates/DropDownBox.html"
+], function(declare, Deferred, kernel, lang, QueryResults, _AutoCompleterMixin, _ComboBoxMenu, _HasDropDown, template){
+
+
+ // module:
+ // dijit/form/ComboBoxMixin
+
+ return declare("dijit.form.ComboBoxMixin", [_HasDropDown, _AutoCompleterMixin], {
+ // summary:
+ // Provides main functionality of ComboBox widget
+
+ // dropDownClass: [protected extension] Function String
+ // Dropdown widget class used to select a date/time.
+ // Subclasses should specify this.
+ dropDownClass: _ComboBoxMenu,
+
+ // hasDownArrow: Boolean
+ // Set this textbox to have a down arrow button, to display the drop down list.
+ // Defaults to true.
+ hasDownArrow: true,
+
+ templateString: template,
+
+ baseClass: "dijitTextBox dijitComboBox",
+
+ /*=====
+ // store: [const] dojo/store/api/Store|dojo/data/api/Read
+ // Reference to data provider object used by this ComboBox.
+ //
+ // Should be dojo/store/api/Store, but dojo/data/api/Read supported
+ // for backwards compatibility.
+ store: null,
+ =====*/
+
+ // Set classes like dijitDownArrowButtonHover depending on
+ // mouse action over button node
+ cssStateNodes: {
+ "_buttonNode": "dijitDownArrowButton"
+ },
+
+ _setHasDownArrowAttr: function(/*Boolean*/ val){
+ this._set("hasDownArrow", val);
+ this._buttonNode.style.display = val ? "" : "none";
+ },
+
+ _showResultList: function(){
+ // hide the tooltip
+ this.displayMessage("");
+ this.inherited(arguments);
+ },
+
+ _setStoreAttr: function(store){
+ // For backwards-compatibility, accept dojo.data store in addition to dojo/store/api/Store. Remove in 2.0.
+ if(!store.get){
+ lang.mixin(store, {
+ _oldAPI: true,
+ get: function(id){
+ // summary:
+ // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity.
+ // Like dojo/store/DataStore.get() except returns native item.
+ var deferred = new Deferred();
+ this.fetchItemByIdentity({
+ identity: id,
+ onItem: function(object){
+ deferred.resolve(object);
+ },
+ onError: function(error){
+ deferred.reject(error);
+ }
+ });
+ return deferred.promise;
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects. Like dojo/store/DataStore.query()
+ // except returned Deferred contains array of native items.
+ var deferred = new Deferred(function(){ fetchHandle.abort && fetchHandle.abort(); });
+ deferred.total = new Deferred();
+ var fetchHandle = this.fetch(lang.mixin({
+ query: query,
+ onBegin: function(count){
+ deferred.total.resolve(count);
+ },
+ onComplete: function(results){
+ deferred.resolve(results);
+ },
+ onError: function(error){
+ deferred.reject(error);
+ }
+ }, options));
+ return QueryResults(deferred);
+ }
+ });
+ }
+ this._set("store", store);
+ },
+
+ postMixInProperties: function(){
+ // Since _setValueAttr() depends on this.store, _setStoreAttr() needs to execute first.
+ // Unfortunately, without special code, it ends up executing second.
+ var store = this.params.store || this.store;
+ if(store){
+ this._setStoreAttr(store);
+ }
+
+ this.inherited(arguments);
+
+ // User may try to access this.store.getValue() etc. in a custom labelFunc() function.
+ // It's not available with the new data store for handling inline <option> tags, so add it.
+ if(!this.params.store && !this.store._oldAPI){
+ var clazz = this.declaredClass;
+ lang.mixin(this.store, {
+ getValue: function(item, attr){
+ kernel.deprecated(clazz + ".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly", "", "2.0");
+ return item[attr];
+ },
+ getLabel: function(item){
+ kernel.deprecated(clazz + ".store.getLabel(item) is deprecated for builtin store. Use item.label directly", "", "2.0");
+ return item.name;
+ },
+ fetch: function(args){
+ kernel.deprecated(clazz + ".store.fetch() is deprecated for builtin store.", "Use store.query()", "2.0");
+ var shim = ["dojo/data/ObjectStore"]; // indirection so it doesn't get rolled into a build
+ require(shim, lang.hitch(this, function(ObjectStore){
+ new ObjectStore({objectStore: this}).fetch(args);
+ }));
+ }
+ });
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/ComboButton.js b/lib/dijit/form/ComboButton.js
index 7fd288454..4c036b1df 100644
--- a/lib/dijit/form/ComboButton.js
+++ b/lib/dijit/form/ComboButton.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/ComboButton.html":"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" data-dojo-attach-point=\"buttonNode\" data-dojo-attach-event=\"ondijitclick:_onClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" data-dojo-attach-point=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdata-dojo-attach-point=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdata-dojo-attach-event=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">&#9660;</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" data-dojo-attach-point=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"}});define("dijit/form/ComboButton",["dojo/_base/declare","dojo/_base/event","dojo/keys","../focus","./DropDownButton","dojo/text!./templates/ComboButton.html"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.form.ComboButton",_5,{templateString:_6,_setIdAttr:"",_setTabIndexAttr:["focusNode","titleNode"],_setTitleAttr:"titleNode",optionsTitle:"",baseClass:"dijitComboButton",cssStateNodes:{"buttonNode":"dijitButtonNode","titleNode":"dijitButtonContents","_popupStateNode":"dijitDownArrowButton"},_focusedNode:null,_onButtonKeyPress:function(_7){if(_7.charOrCode==_3[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){_4.focus(this._popupStateNode);_2.stop(_7);}},_onArrowKeyPress:function(_8){if(_8.charOrCode==_3[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){_4.focus(this.titleNode);_2.stop(_8);}},focus:function(_9){if(!this.disabled){_4.focus(_9=="start"?this.titleNode:this._popupStateNode);}}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/ComboButton.html":"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" data-dojo-attach-point=\"buttonNode\" data-dojo-attach-event=\"ondijitclick:_onClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" data-dojo-attach-point=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdata-dojo-attach-point=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdata-dojo-attach-event=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">&#9660;</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" data-dojo-attach-point=\"valueNode\" role=\"presentation\"\n\t\t/></td></tr></tbody\n></table>\n"}});define("dijit/form/ComboButton",["dojo/_base/declare","dojo/_base/event","dojo/keys","../focus","./DropDownButton","dojo/text!./templates/ComboButton.html"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.form.ComboButton",_5,{templateString:_6,_setIdAttr:"",_setTabIndexAttr:["focusNode","titleNode"],_setTitleAttr:"titleNode",optionsTitle:"",baseClass:"dijitComboButton",cssStateNodes:{"buttonNode":"dijitButtonNode","titleNode":"dijitButtonContents","_popupStateNode":"dijitDownArrowButton"},_focusedNode:null,_onButtonKeyPress:function(_7){if(_7.charOrCode==_3[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){_4.focus(this._popupStateNode);_2.stop(_7);}},_onArrowKeyPress:function(_8){if(_8.charOrCode==_3[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){_4.focus(this.titleNode);_2.stop(_8);}},focus:function(_9){if(!this.disabled){_4.focus(_9=="start"?this.titleNode:this._popupStateNode);}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/ComboButton.js.uncompressed.js b/lib/dijit/form/ComboButton.js.uncompressed.js
new file mode 100644
index 000000000..7805c20e7
--- /dev/null
+++ b/lib/dijit/form/ComboButton.js.uncompressed.js
@@ -0,0 +1,85 @@
+require({cache:{
+'url:dijit/form/templates/ComboButton.html':"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tcellspacing='0' cellpadding='0' role=\"presentation\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\" data-dojo-attach-point=\"buttonNode\" data-dojo-attach-event=\"ondijitclick:_onClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" data-dojo-attach-point=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" data-dojo-attach-point=\"containerNode\" role=\"presentation\"></div\n\t\t></div\n\t\t></td\n\t\t><td id=\"${id}_arrow\" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'\n\t\t\tdata-dojo-attach-point=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdata-dojo-attach-event=\"onkeypress:_onArrowKeyPress\"\n\t\t\ttitle=\"${optionsTitle}\"\n\t\t\trole=\"button\" aria-haspopup=\"true\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">&#9660;</div\n\t\t></td\n\t\t><td style=\"display:none !important;\"\n\t\t\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" data-dojo-attach-point=\"valueNode\" role=\"presentation\"\n\t\t/></td></tr></tbody\n></table>\n"}});
+define("dijit/form/ComboButton", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "../focus", // focus.focus()
+ "./DropDownButton",
+ "dojo/text!./templates/ComboButton.html"
+], function(declare, event, keys, focus, DropDownButton, template){
+
+// module:
+// dijit/form/ComboButton
+
+return declare("dijit.form.ComboButton", DropDownButton, {
+ // summary:
+ // A combination button and drop-down button.
+ // Users can click one side to "press" the button, or click an arrow
+ // icon to display the drop down.
+ //
+ // example:
+ // | <button data-dojo-type="dijit/form/ComboButton" onClick="...">
+ // | <span>Hello world</span>
+ // | <div data-dojo-type="dijit/Menu">...</div>
+ // | </button>
+ //
+ // example:
+ // | var button1 = new ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"});
+ // | dojo.body().appendChild(button1.domNode);
+ //
+
+ templateString: template,
+
+ // Map widget attributes to DOMNode attributes.
+ _setIdAttr: "", // override _FormWidgetMixin which puts id on the focusNode
+ _setTabIndexAttr: ["focusNode", "titleNode"],
+ _setTitleAttr: "titleNode",
+
+ // optionsTitle: String
+ // Text that describes the options menu (accessibility)
+ optionsTitle: "",
+
+ baseClass: "dijitComboButton",
+
+ // Set classes like dijitButtonContentsHover or dijitArrowButtonActive depending on
+ // mouse action over specified node
+ cssStateNodes: {
+ "buttonNode": "dijitButtonNode",
+ "titleNode": "dijitButtonContents",
+ "_popupStateNode": "dijitDownArrowButton"
+ },
+
+ _focusedNode: null,
+
+ _onButtonKeyPress: function(/*Event*/ evt){
+ // summary:
+ // Handler for right arrow key when focus is on left part of button
+ if(evt.charOrCode == keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){
+ focus.focus(this._popupStateNode);
+ event.stop(evt);
+ }
+ },
+
+ _onArrowKeyPress: function(/*Event*/ evt){
+ // summary:
+ // Handler for left arrow key when focus is on right part of button
+ if(evt.charOrCode == keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){
+ focus.focus(this.titleNode);
+ event.stop(evt);
+ }
+ },
+
+ focus: function(/*String*/ position){
+ // summary:
+ // Focuses this widget to according to position, if specified,
+ // otherwise on arrow node
+ // position:
+ // "start" or "end"
+ if(!this.disabled){
+ focus.focus(position == "start" ? this.titleNode : this._popupStateNode);
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/CurrencyTextBox.js b/lib/dijit/form/CurrencyTextBox.js
index 1eca54193..08485969d 100644
--- a/lib/dijit/form/CurrencyTextBox.js
+++ b/lib/dijit/form/CurrencyTextBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/CurrencyTextBox",["dojo/currency","dojo/_base/declare","dojo/_base/lang","./NumberTextBox"],function(_1,_2,_3,_4){return _2("dijit.form.CurrencyTextBox",_4,{currency:"",baseClass:"dijitTextBox dijitCurrencyTextBox",regExpGen:function(_5){return "("+(this.focused?this.inherited(arguments,[_3.mixin({},_5,this.editOptions)])+"|":"")+_1.regexp(_5)+")";},_formatter:_1.format,_parser:_1.parse,parse:function(_6,_7){var v=this.inherited(arguments);if(isNaN(v)&&/\d+/.test(_6)){v=_3.hitch(_3.mixin({},this,{_parser:_4.prototype._parser}),"inherited")(arguments);}return v;},_setConstraintsAttr:function(_8){if(!_8.currency&&this.currency){_8.currency=this.currency;}this.inherited(arguments,[_1._mixInDefaults(_3.mixin(_8,{exponent:false}))]);}});}); \ No newline at end of file
+define("dijit/form/CurrencyTextBox",["dojo/currency","dojo/_base/declare","dojo/_base/lang","./NumberTextBox"],function(_1,_2,_3,_4){return _2("dijit.form.CurrencyTextBox",_4,{currency:"",baseClass:"dijitTextBox dijitCurrencyTextBox",pattern:function(_5){return "("+(this.focused?this.inherited(arguments,[_3.mixin({},_5,this.editOptions)])+"|":"")+_1.regexp(_5)+")";},_formatter:_1.format,_parser:_1.parse,parse:function(_6,_7){var v=this.inherited(arguments);if(isNaN(v)&&/\d+/.test(_6)){v=_3.hitch(_3.mixin({},this,{_parser:_4.prototype._parser}),"inherited")(arguments);}return v;},_setConstraintsAttr:function(_8){if(!_8.currency&&this.currency){_8.currency=this.currency;}this.inherited(arguments,[_1._mixInDefaults(_3.mixin(_8,{exponent:false}))]);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/CurrencyTextBox.js.uncompressed.js b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js
new file mode 100644
index 000000000..fb13899a5
--- /dev/null
+++ b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js
@@ -0,0 +1,85 @@
+define("dijit/form/CurrencyTextBox", [
+ "dojo/currency", // currency._mixInDefaults currency.format currency.parse currency.regexp
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.hitch
+ "./NumberTextBox"
+], function(currency, declare, lang, NumberTextBox){
+
+ // module:
+ // dijit/form/CurrencyTextBox
+
+ /*=====
+ var __Constraints = declare([NumberTextBox.__Constraints, currency.__FormatOptions, currency.__ParseOptions], {
+ // summary:
+ // Specifies both the rules on valid/invalid values (minimum, maximum,
+ // number of required decimal places), and also formatting options for
+ // displaying the value when the field is not focused (currency symbol,
+ // etc.)
+ // description:
+ // Follows the pattern of `dijit/form/NumberTextBox.__Constraints`.
+ // In general developers won't need to set this parameter
+ // example:
+ // To ensure that the user types in the cents (for example, 1.00 instead of just 1):
+ // | {fractional:true}
+ });
+ =====*/
+
+ return declare("dijit.form.CurrencyTextBox", NumberTextBox, {
+ // summary:
+ // A validating currency textbox
+ // description:
+ // CurrencyTextBox is similar to `dijit/form/NumberTextBox` but has a few
+ // extra features related to currency:
+ //
+ // 1. After specifying the currency type (american dollars, euros, etc.) it automatically
+ // sets parse/format options such as how many decimal places to show.
+ // 2. The currency mark (dollar sign, euro mark, etc.) is displayed when the field is blurred
+ // but erased during editing, so that the user can just enter a plain number.
+
+ // currency: [const] String
+ // the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+ currency: "",
+
+ /*=====
+ // constraints: __Constraints
+ // Despite the name, this parameter specifies both constraints on the input
+ // (including minimum/maximum allowed values) as well as
+ // formatting options.
+ constraints: {},
+ ======*/
+
+ baseClass: "dijitTextBox dijitCurrencyTextBox",
+
+ // Override pattern ValidationTextBox.pattern.... we use a reg-ex generating function rather
+ // than a straight regexp to deal with locale (plus formatting options too?)
+ pattern: function(constraints){
+ // if focused, accept either currency data or NumberTextBox format
+ return '(' + (this.focused ? this.inherited(arguments, [ lang.mixin({}, constraints, this.editOptions) ]) + '|' : '')
+ + currency.regexp(constraints) + ')';
+ },
+
+ // Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45"
+ _formatter: currency.format,
+
+ _parser: currency.parse,
+
+ parse: function(/*String*/ value, /*Object*/ constraints){
+ // summary:
+ // Parses string value as a Currency, according to the constraints object
+ // tags:
+ // protected extension
+ var v = this.inherited(arguments);
+ if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse
+ v = lang.hitch(lang.mixin({}, this, { _parser: NumberTextBox.prototype._parser }), "inherited")(arguments);
+ }
+ return v;
+ },
+
+ _setConstraintsAttr: function(/*Object*/ constraints){
+ if(!constraints.currency && this.currency){
+ constraints.currency = this.currency;
+ }
+ this.inherited(arguments, [ currency._mixInDefaults(lang.mixin(constraints, { exponent: false })) ]); // get places
+ }
+ });
+});
diff --git a/lib/dijit/form/DataList.js.uncompressed.js b/lib/dijit/form/DataList.js.uncompressed.js
new file mode 100644
index 000000000..2b2e062cf
--- /dev/null
+++ b/lib/dijit/form/DataList.js.uncompressed.js
@@ -0,0 +1,70 @@
+define("dijit/form/DataList", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.byId
+ "dojo/_base/lang", // lang.trim
+ "dojo/query", // query
+ "dojo/store/Memory",
+ "../registry" // registry.add registry.remove
+], function(declare, dom, lang, query, MemoryStore, registry){
+
+ // module:
+ // dijit/form/DataList
+
+ function toItem(/*DOMNode*/ option){
+ // summary:
+ // Convert `<option>` node to hash
+ return {
+ id: option.value,
+ value: option.value,
+ name: lang.trim(option.innerText || option.textContent || '')
+ };
+ }
+
+ return declare("dijit.form.DataList", MemoryStore, {
+ // summary:
+ // Inefficient but small data store specialized for inlined data via OPTION tags
+ //
+ // description:
+ // Provides a store for inlined data like:
+ //
+ // | <datalist>
+ // | <option value="AL">Alabama</option>
+ // | ...
+
+ constructor: function(params, srcNodeRef){
+ // summary:
+ // Create the widget.
+ // params: Object|null
+ // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)
+ // and functions, typically callbacks like onClick.
+ // The hash can contain any of the widget's properties, excluding read-only properties.
+ // srcNodeRef: DOMNode|String
+ // Attach widget to this DOM node.
+
+ // store pointer to original DOM tree
+ this.domNode = dom.byId(srcNodeRef);
+
+ lang.mixin(this, params);
+ if(this.id){
+ registry.add(this); // add to registry so it can be easily found by id
+ }
+ this.domNode.style.display = "none";
+
+ this.inherited(arguments, [{
+ data: query("option", this.domNode).map(toItem)
+ }]);
+ },
+
+ destroy: function(){
+ registry.remove(this.id);
+ },
+
+ fetchSelectedItem: function(){
+ // summary:
+ // Get the option marked as selected, like `<option selected>`.
+ // Not part of dojo.data API.
+ var option = query("> option[selected]", this.domNode)[0] || query("> option", this.domNode)[0];
+ return option && toItem(option);
+ }
+ });
+});
diff --git a/lib/dijit/form/DateTextBox.js.uncompressed.js b/lib/dijit/form/DateTextBox.js.uncompressed.js
new file mode 100644
index 000000000..41b56bdeb
--- /dev/null
+++ b/lib/dijit/form/DateTextBox.js.uncompressed.js
@@ -0,0 +1,28 @@
+define("dijit/form/DateTextBox", [
+ "dojo/_base/declare", // declare
+ "../Calendar",
+ "./_DateTimeTextBox"
+], function(declare, Calendar, _DateTimeTextBox){
+
+ // module:
+ // dijit/form/DateTextBox
+
+ return declare("dijit.form.DateTextBox", _DateTimeTextBox, {
+ // summary:
+ // A validating, serializable, range-bound date text box with a drop down calendar
+ // example:
+ // | new DateTextBox({value: new Date(2009, 0, 20)})
+ // example:
+ // | <input data-dojo-type='dijit/form/DateTextBox' value='2009-01-20'>
+
+ baseClass: "dijitTextBox dijitComboBox dijitDateTextBox",
+ popupClass: Calendar,
+ _selector: "date",
+
+ // value: Date
+ // The value of this widget as a JavaScript Date object, with only year/month/day specified.
+ // If specified in markup, use the format specified in `stamp.fromISOString`.
+ // set("value", ...) accepts either a Date object or a string.
+ value: new Date("") // value.toString()="NaN"
+ });
+});
diff --git a/lib/dijit/form/DropDownButton.js b/lib/dijit/form/DropDownButton.js
index 4d224ef08..3153fc9a0 100644
--- a/lib/dijit/form/DropDownButton.js
+++ b/lib/dijit/form/DropDownButton.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/DropDownButton.html":"<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" data-dojo-attach-point=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdata-dojo-attach-point=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">&#9660;</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-point=\"valueNode\"\n/></span>\n"}});define("dijit/form/DropDownButton",["dojo/_base/declare","dojo/_base/lang","dojo/query","../registry","../popup","./Button","../_Container","../_HasDropDown","dojo/text!./templates/DropDownButton.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.DropDownButton",[_6,_7,_8],{baseClass:"dijitDropDownButton",templateString:_9,_fillContent:function(){if(this.srcNodeRef){var _a=_3("*",this.srcNodeRef);this.inherited(arguments,[_a[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _b=_3("[widgetId]",this.dropDownContainer)[0];this.dropDown=_4.byNode(_b);delete this.dropDownContainer;}if(this.dropDown){_5.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _c=this.dropDown;return (!!_c&&(!_c.href||_c.isLoaded));},loadDropDown:function(_d){var _e=this.dropDown;var _f=_e.on("load",_2.hitch(this,function(){_f.remove();_d();}));_e.refresh();},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/DropDownButton.html":"<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" data-dojo-attach-point=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdata-dojo-attach-point=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">&#9660;</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-point=\"valueNode\" role=\"presentation\"\n/></span>\n"}});define("dijit/form/DropDownButton",["dojo/_base/declare","dojo/_base/lang","dojo/query","../registry","../popup","./Button","../_Container","../_HasDropDown","dojo/text!./templates/DropDownButton.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.DropDownButton",[_6,_7,_8],{baseClass:"dijitDropDownButton",templateString:_9,_fillContent:function(){if(this.srcNodeRef){var _a=_3("*",this.srcNodeRef);this.inherited(arguments,[_a[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _b=_3("[widgetId]",this.dropDownContainer)[0];this.dropDown=_4.byNode(_b);delete this.dropDownContainer;}if(this.dropDown){_5.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _c=this.dropDown;return (!!_c&&(!_c.href||_c.isLoaded));},loadDropDown:function(_d){var _e=this.dropDown;var _f=_e.on("load",_2.hitch(this,function(){_f.remove();_d();}));_e.refresh();},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/DropDownButton.js.uncompressed.js b/lib/dijit/form/DropDownButton.js.uncompressed.js
new file mode 100644
index 000000000..007e924d7
--- /dev/null
+++ b/lib/dijit/form/DropDownButton.js.uncompressed.js
@@ -0,0 +1,99 @@
+require({cache:{
+'url:dijit/form/templates/DropDownButton.html':"<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdata-dojo-attach-event=\"ondijitclick:_onClick\" data-dojo-attach-point=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdata-dojo-attach-point=\"focusNode,titleNode,_arrowWrapperNode\"\n\t\t\trole=\"button\" aria-haspopup=\"true\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\"\n\t\t\t\tdata-dojo-attach-point=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdata-dojo-attach-point=\"containerNode,_popupStateNode\"\n\t\t\t\tid=\"${id}_label\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonInner\"></span\n\t\t\t><span class=\"dijitReset dijitInline dijitArrowButtonChar\">&#9660;</span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-point=\"valueNode\" role=\"presentation\"\n/></span>\n"}});
+define("dijit/form/DropDownButton", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // hitch
+ "dojo/query", // query
+ "../registry", // registry.byNode
+ "../popup", // dijit.popup2.hide
+ "./Button",
+ "../_Container",
+ "../_HasDropDown",
+ "dojo/text!./templates/DropDownButton.html"
+], function(declare, lang, query, registry, popup, Button, _Container, _HasDropDown, template){
+
+// module:
+// dijit/form/DropDownButton
+
+
+return declare("dijit.form.DropDownButton", [Button, _Container, _HasDropDown], {
+ // summary:
+ // A button with a drop down
+ //
+ // example:
+ // | <button data-dojo-type="dijit/form/DropDownButton">
+ // | Hello world
+ // | <div data-dojo-type="dijit/Menu">...</div>
+ // | </button>
+ //
+ // example:
+ // | var button1 = new DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) });
+ // | win.body().appendChild(button1);
+ //
+
+ baseClass : "dijitDropDownButton",
+
+ templateString: template,
+
+ _fillContent: function(){
+ // Overrides Button._fillContent().
+ //
+ // My inner HTML contains both the button contents and a drop down widget, like
+ // <DropDownButton> <span>push me</span> <Menu> ... </Menu> </DropDownButton>
+ // The first node is assumed to be the button content. The widget is the popup.
+
+ if(this.srcNodeRef){ // programatically created buttons might not define srcNodeRef
+ //FIXME: figure out how to filter out the widget and use all remaining nodes as button
+ // content, not just nodes[0]
+ var nodes = query("*", this.srcNodeRef);
+ this.inherited(arguments, [nodes[0]]);
+
+ // save pointer to srcNode so we can grab the drop down widget after it's instantiated
+ this.dropDownContainer = this.srcNodeRef;
+ }
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ // the child widget from srcNodeRef is the dropdown widget. Insert it in the page DOM,
+ // make it invisible, and store a reference to pass to the popup code.
+ if(!this.dropDown && this.dropDownContainer){
+ var dropDownNode = query("[widgetId]", this.dropDownContainer)[0];
+ this.dropDown = registry.byNode(dropDownNode);
+ delete this.dropDownContainer;
+ }
+ if(this.dropDown){
+ popup.hide(this.dropDown);
+ }
+
+ this.inherited(arguments);
+ },
+
+ isLoaded: function(){
+ // Returns whether or not we are loaded - if our dropdown has an href,
+ // then we want to check that.
+ var dropDown = this.dropDown;
+ return (!!dropDown && (!dropDown.href || dropDown.isLoaded));
+ },
+
+ loadDropDown: function(/*Function*/ callback){
+ // Default implementation assumes that drop down already exists,
+ // but hasn't loaded it's data (ex: ContentPane w/href).
+ // App must override if the drop down is lazy-created.
+ var dropDown = this.dropDown;
+ var handler = dropDown.on("load", lang.hitch(this, function(){
+ handler.remove();
+ callback();
+ }));
+ dropDown.refresh(); // tell it to load
+ },
+
+ isFocusable: function(){
+ // Overridden so that focus is handled by the _HasDropDown mixin, not by
+ // the _FormWidget mixin.
+ return this.inherited(arguments) && !this._mouseDown;
+ }
+});
+
+});
diff --git a/lib/dijit/form/FilteringSelect.js b/lib/dijit/form/FilteringSelect.js
index 5cffa0df8..de6808f27 100644
--- a/lib/dijit/form/FilteringSelect.js
+++ b/lib/dijit/form/FilteringSelect.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/FilteringSelect",["dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/_base/lang","./MappedTextBox","./ComboBoxMixin"],function(_1,_2,_3,_4,_5,_6){return _2("dijit.form.FilteringSelect",[_5,_6],{required:true,_lastDisplayedValue:"",_isValidSubset:function(){return this._opened;},isValid:function(){return !!this.item||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_7,_8,_9,_a){if((_8&&_8[this.searchAttr]!==this._lastQuery)||(!_8&&_7.length&&this.store.getIdentity(_7[0])!=this._lastQuery)){return;}if(!_7.length){this.set("value","",_a||(_a===undefined&&!this.focused),this.textbox.value,null);}else{this.set("item",_7[0],_a);}},_openResultList:function(_b,_c,_d){if(_c[this.searchAttr]!==this._lastQuery){return;}this.inherited(arguments);if(this.item===undefined){this.validate(true);}},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_e,_f,_10,_11){if(!this._onChangeActive){_f=null;}if(_11===undefined){if(_e===null||_e===""){_e="";if(!_4.isString(_10)){this._setDisplayedValueAttr(_10||"",_f);return;}}var _12=this;this._lastQuery=_e;_3.when(this.store.get(_e),function(_13){_12._callbackSetLabel(_13?[_13]:[],undefined,undefined,_f);});}else{this.valueNode.value=_e;this.inherited(arguments);}},_setItemAttr:function(_14,_15,_16){this.inherited(arguments);this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(_17){return _17.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_18,_19){if(_18==null){_18="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_19=false;}if(this.store){this.closeDropDown();var _1a=_4.clone(this.query);var qs=this._getDisplayQueryString(_18),q;if(this.store._oldAPI){q=qs;}else{q=_1.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_1a[this.searchAttr]=q;this.textbox.value=_18;this._lastDisplayedValue=_18;this._set("displayedValue",_18);var _1b=this;var _1c={ignoreCase:this.ignoreCase,deep:true};_4.mixin(_1c,this.fetchProperties);this._fetchHandle=this.store.query(_1a,_1c);_3.when(this._fetchHandle,function(_1d){_1b._fetchHandle=null;_1b._callbackSetLabel(_1d||[],_1a,_1c,_19);},function(err){_1b._fetchHandle=null;if(!_1b._cancelingQuery){console.error("dijit.form.FilteringSelect: "+err.toString());}});}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});}); \ No newline at end of file
+define("dijit/form/FilteringSelect",["dojo/data/util/filter","dojo/_base/declare","dojo/_base/lang","dojo/when","./MappedTextBox","./ComboBoxMixin"],function(_1,_2,_3,_4,_5,_6){return _2("dijit.form.FilteringSelect",[_5,_6],{required:true,_lastDisplayedValue:"",_isValidSubset:function(){return this._opened;},isValid:function(){return !!this.item||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_7,_8,_9,_a){if((_8&&_8[this.searchAttr]!==this._lastQuery)||(!_8&&_7.length&&this.store.getIdentity(_7[0])!=this._lastQuery)){return;}if(!_7.length){this.set("value","",_a||(_a===undefined&&!this.focused),this.textbox.value,null);}else{this.set("item",_7[0],_a);}},_openResultList:function(_b,_c,_d){if(_c[this.searchAttr]!==this._lastQuery){return;}this.inherited(arguments);if(this.item===undefined){this.validate(true);}},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_e,_f,_10,_11){if(!this._onChangeActive){_f=null;}if(_11===undefined){if(_e===null||_e===""){_e="";if(!_3.isString(_10)){this._setDisplayedValueAttr(_10||"",_f);return;}}var _12=this;this._lastQuery=_e;_4(this.store.get(_e),function(_13){_12._callbackSetLabel(_13?[_13]:[],undefined,undefined,_f);});}else{this.valueNode.value=_e;this.inherited(arguments);}},_setItemAttr:function(_14,_15,_16){this.inherited(arguments);this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(_17){return _17.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_18,_19){if(_18==null){_18="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_19=false;}if(this.store){this.closeDropDown();var _1a=_3.clone(this.query);var qs=this._getDisplayQueryString(_18),q;if(this.store._oldAPI){q=qs;}else{q=_1.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_1a[this.searchAttr]=q;this.textbox.value=_18;this._lastDisplayedValue=_18;this._set("displayedValue",_18);var _1b=this;var _1c={ignoreCase:this.ignoreCase,deep:true};_3.mixin(_1c,this.fetchProperties);this._fetchHandle=this.store.query(_1a,_1c);_4(this._fetchHandle,function(_1d){_1b._fetchHandle=null;_1b._callbackSetLabel(_1d||[],_1a,_1c,_19);},function(err){_1b._fetchHandle=null;if(!_1b._cancelingQuery){console.error("dijit.form.FilteringSelect: "+err.toString());}});}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/FilteringSelect.js.uncompressed.js b/lib/dijit/form/FilteringSelect.js.uncompressed.js
new file mode 100644
index 000000000..84ad938c8
--- /dev/null
+++ b/lib/dijit/form/FilteringSelect.js.uncompressed.js
@@ -0,0 +1,234 @@
+define("dijit/form/FilteringSelect", [
+ "dojo/data/util/filter", // filter.patternToRegExp
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.mixin
+ "dojo/when",
+ "./MappedTextBox",
+ "./ComboBoxMixin"
+], function(filter, declare, lang, when, MappedTextBox, ComboBoxMixin){
+
+ // module:
+ // dijit/form/FilteringSelect
+
+ return declare("dijit.form.FilteringSelect", [MappedTextBox, ComboBoxMixin], {
+ // summary:
+ // An enhanced version of the HTML SELECT tag, populated dynamically
+ //
+ // description:
+ // An enhanced version of the HTML SELECT tag, populated dynamically. It works
+ // very nicely with very large data sets because it can load and page data as needed.
+ // It also resembles ComboBox, but does not allow values outside of the provided ones.
+ // If OPTION tags are used as the data provider via markup, then the
+ // OPTION tag's child text node is used as the displayed value when selected
+ // while the OPTION tag's value attribute is used as the widget value on form submit.
+ // To set the default value when using OPTION tags, specify the selected
+ // attribute on 1 of the child OPTION tags.
+ //
+ // Similar features:
+ //
+ // - There is a drop down list of possible values.
+ // - You can only enter a value from the drop down list. (You can't
+ // enter an arbitrary value.)
+ // - The value submitted with the form is the hidden value (ex: CA),
+ // not the displayed value a.k.a. label (ex: California)
+ //
+ // Enhancements over plain HTML version:
+ //
+ // - If you type in some text then it will filter down the list of
+ // possible values in the drop down list.
+ // - List can be specified either as a static list or via a javascript
+ // function (that can get the list from a server)
+
+ // required: Boolean
+ // True (default) if user is required to enter a value into this field.
+ required: true,
+
+ _lastDisplayedValue: "",
+
+ _isValidSubset: function(){
+ return this._opened;
+ },
+
+ isValid: function(){
+ // Overrides ValidationTextBox.isValid()
+ return !!this.item || (!this.required && this.get('displayedValue') == ""); // #5974
+ },
+
+ _refreshState: function(){
+ if(!this.searchTimer){ // state will be refreshed after results are returned
+ this.inherited(arguments);
+ }
+ },
+
+ _callbackSetLabel: function(
+ /*Array*/ result,
+ /*Object*/ query,
+ /*Object*/ options,
+ /*Boolean?*/ priorityChange){
+ // summary:
+ // Callback from dojo.store after lookup of user entered value finishes
+
+ // setValue does a synchronous lookup,
+ // so it calls _callbackSetLabel directly,
+ // and so does not pass dataObject
+ // still need to test against _lastQuery in case it came too late
+ if((query && query[this.searchAttr] !== this._lastQuery) || (!query && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){
+ return;
+ }
+ if(!result.length){
+ //#3268: don't modify display value on bad input
+ //#3285: change CSS to indicate error
+ this.set("value", '', priorityChange || (priorityChange === undefined && !this.focused), this.textbox.value, null);
+ }else{
+ this.set('item', result[0], priorityChange);
+ }
+ },
+
+ _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){
+ // Callback when a data store query completes.
+ // Overrides ComboBox._openResultList()
+
+ // #3285: tap into search callback to see if user's query resembles a match
+ if(query[this.searchAttr] !== this._lastQuery){
+ return;
+ }
+ this.inherited(arguments);
+
+ if(this.item === undefined){ // item == undefined for keyboard search
+ // If the search returned no items that means that the user typed
+ // in something invalid (and they can't make it valid by typing more characters),
+ // so flag the FilteringSelect as being in an invalid state
+ this.validate(true);
+ }
+ },
+
+ _getValueAttr: function(){
+ // summary:
+ // Hook for get('value') to work.
+
+ // don't get the textbox value but rather the previously set hidden value.
+ // Use this.valueNode.value which isn't always set for other MappedTextBox widgets until blur
+ return this.valueNode.value;
+ },
+
+ _getValueField: function(){
+ // Overrides ComboBox._getValueField()
+ return "value";
+ },
+
+ _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){
+ // summary:
+ // Hook so set('value', value) works.
+ // description:
+ // Sets the value of the select.
+ // Also sets the label to the corresponding value by reverse lookup.
+ if(!this._onChangeActive){ priorityChange = null; }
+
+ if(item === undefined){
+ if(value === null || value === ''){
+ value = '';
+ if(!lang.isString(displayedValue)){
+ this._setDisplayedValueAttr(displayedValue||'', priorityChange);
+ return;
+ }
+ }
+
+ var self = this;
+ this._lastQuery = value;
+ when(this.store.get(value), function(item){
+ self._callbackSetLabel(item? [item] : [], undefined, undefined, priorityChange);
+ });
+ }else{
+ this.valueNode.value = value;
+ this.inherited(arguments);
+ }
+ },
+
+ _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
+ // summary:
+ // Set the displayed valued in the input box, and the hidden value
+ // that gets submitted, based on a dojo.data store item.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // set('item', value)
+ // tags:
+ // private
+ this.inherited(arguments);
+ this._lastDisplayedValue = this.textbox.value;
+ },
+
+ _getDisplayQueryString: function(/*String*/ text){
+ return text.replace(/([\\\*\?])/g, "\\$1");
+ },
+
+ _setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){
+ // summary:
+ // Hook so set('displayedValue', label) works.
+ // description:
+ // Sets textbox to display label. Also performs reverse lookup
+ // to set the hidden value. label should corresponding to item.searchAttr.
+
+ if(label == null){ label = ''; }
+
+ // This is called at initialization along with every custom setter.
+ // Usually (or always?) the call can be ignored. If it needs to be
+ // processed then at least make sure that the XHR request doesn't trigger an onChange()
+ // event, even if it returns after creation has finished
+ if(!this._created){
+ if(!("displayedValue" in this.params)){
+ return;
+ }
+ priorityChange = false;
+ }
+
+ // Do a reverse lookup to map the specified displayedValue to the hidden value.
+ // Note that if there's a custom labelFunc() this code
+ if(this.store){
+ this.closeDropDown();
+ var query = lang.clone(this.query); // #6196: populate query with user-specifics
+
+ // Generate query
+ var qs = this._getDisplayQueryString(label), q;
+ if(this.store._oldAPI){
+ // remove this branch for 2.0
+ q = qs;
+ }else{
+ // Query on searchAttr is a regex for benefit of dojo/store/Memory,
+ // but with a toString() method to help dojo/store/JsonRest.
+ // Search string like "Co*" converted to regex like /^Co.*$/i.
+ q = filter.patternToRegExp(qs, this.ignoreCase);
+ q.toString = function(){ return qs; };
+ }
+ this._lastQuery = query[this.searchAttr] = q;
+
+ // If the label is not valid, the callback will never set it,
+ // so the last valid value will get the warning textbox. Set the
+ // textbox value now so that the impending warning will make
+ // sense to the user
+ this.textbox.value = label;
+ this._lastDisplayedValue = label;
+ this._set("displayedValue", label); // for watch("displayedValue") notification
+ var _this = this;
+ var options = {
+ ignoreCase: this.ignoreCase,
+ deep: true
+ };
+ lang.mixin(options, this.fetchProperties);
+ this._fetchHandle = this.store.query(query, options);
+ when(this._fetchHandle, function(result){
+ _this._fetchHandle = null;
+ _this._callbackSetLabel(result || [], query, options, priorityChange);
+ }, function(err){
+ _this._fetchHandle = null;
+ if(!_this._cancelingQuery){ // don't treat canceled query as an error
+ console.error('dijit.form.FilteringSelect: ' + err.toString());
+ }
+ });
+ }
+ },
+
+ undo: function(){
+ this.set('displayedValue', this._lastDisplayedValue);
+ }
+ });
+});
diff --git a/lib/dijit/form/Form.js b/lib/dijit/form/Form.js
index e38a2ec8c..d3e3410d4 100644
--- a/lib/dijit/form/Form.js
+++ b/lib/dijit/form/Form.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/Form",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/kernel","dojo/_base/sniff","../_Widget","../_TemplatedMixin","./_FormMixin","../layout/_ContentPaneResizeMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.Form",[_6,_7,_8,_9],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(){},onExecute:function(){},_setEncTypeAttr:function(_a){this.encType=_a;_2.set(this.domNode,"encType",_a);if(_5("ie")){this.domNode.encoding=_a;}},reset:function(e){var _b={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(_b)===false)&&_b.returnValue){this.inherited(arguments,[]);}},onReset:function(){return true;},_onReset:function(e){this.reset(e);_3.stop(e);return false;},_onSubmit:function(e){var fp=this.constructor.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){_4.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){_3.stop(e);}},onSubmit:function(){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});}); \ No newline at end of file
+define("dijit/form/Form",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/kernel","dojo/sniff","../_Widget","../_TemplatedMixin","./_FormMixin","../layout/_ContentPaneResizeMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form.Form",[_6,_7,_8,_9],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(){},onExecute:function(){},_setEncTypeAttr:function(_a){this.encType=_a;_2.set(this.domNode,"encType",_a);if(_5("ie")){this.domNode.encoding=_a;}},reset:function(e){var _b={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(_b)===false)&&_b.returnValue){this.inherited(arguments,[]);}},onReset:function(){return true;},_onReset:function(e){this.reset(e);_3.stop(e);return false;},_onSubmit:function(e){var fp=this.constructor.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){_4.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){_3.stop(e);}},onSubmit:function(){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/Form.js.uncompressed.js b/lib/dijit/form/Form.js.uncompressed.js
new file mode 100644
index 000000000..0a3b7eb71
--- /dev/null
+++ b/lib/dijit/form/Form.js.uncompressed.js
@@ -0,0 +1,163 @@
+define("dijit/form/Form", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/sniff", // has("ie")
+ "../_Widget",
+ "../_TemplatedMixin",
+ "./_FormMixin",
+ "../layout/_ContentPaneResizeMixin"
+], function(declare, domAttr, event, kernel, has, _Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin){
+
+ // module:
+ // dijit/form/Form
+
+
+ return declare("dijit.form.Form", [_Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin], {
+ // summary:
+ // Widget corresponding to HTML form tag, for validation and serialization
+ //
+ // example:
+ // | <form data-dojo-type="dijit/form/Form" id="myForm">
+ // | Name: <input type="text" name="name" />
+ // | </form>
+ // | myObj = {name: "John Doe"};
+ // | dijit.byId('myForm').set('value', myObj);
+ // |
+ // | myObj=dijit.byId('myForm').get('value');
+
+ // HTML <FORM> attributes
+
+ // name: String?
+ // Name of form for scripting.
+ name: "",
+
+ // action: String?
+ // Server-side form handler.
+ action: "",
+
+ // method: String?
+ // HTTP method used to submit the form, either "GET" or "POST".
+ method: "",
+
+ // encType: String?
+ // Encoding type for the form, ex: application/x-www-form-urlencoded.
+ encType: "",
+
+ // accept-charset: String?
+ // List of supported charsets.
+ "accept-charset": "",
+
+ // accept: String?
+ // List of MIME types for file upload.
+ accept: "",
+
+ // target: String?
+ // Target frame for the document to be opened in.
+ target: "",
+
+ templateString: "<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",
+
+ postMixInProperties: function(){
+ // Setup name=foo string to be referenced from the template (but only if a name has been specified)
+ // Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8660
+ this.nameAttrSetting = this.name ? ("name='" + this.name + "'") : "";
+ this.inherited(arguments);
+ },
+
+ execute: function(/*Object*/ /*===== formContents =====*/){
+ // summary:
+ // Deprecated: use submit()
+ // tags:
+ // deprecated
+ },
+
+ onExecute: function(){
+ // summary:
+ // Deprecated: use onSubmit()
+ // tags:
+ // deprecated
+ },
+
+ _setEncTypeAttr: function(/*String*/ value){
+ this.encType = value;
+ domAttr.set(this.domNode, "encType", value);
+ if(has("ie")){ this.domNode.encoding = value; }
+ },
+
+ reset: function(/*Event?*/ e){
+ // summary:
+ // restores all widget values back to their init values,
+ // calls onReset() which can cancel the reset by returning false
+
+ // create fake event so we can know if preventDefault() is called
+ var faux = {
+ returnValue: true, // the IE way
+ preventDefault: function(){ // not IE
+ this.returnValue = false;
+ },
+ stopPropagation: function(){},
+ currentTarget: e ? e.target : this.domNode,
+ target: e ? e.target : this.domNode
+ };
+ // if return value is not exactly false, and haven't called preventDefault(), then reset
+ if(!(this.onReset(faux) === false) && faux.returnValue){
+ this.inherited(arguments, []);
+ }
+ },
+
+ onReset: function(/*Event?*/ /*===== e =====*/){
+ // summary:
+ // Callback when user resets the form. This method is intended
+ // to be over-ridden. When the `reset` method is called
+ // programmatically, the return value from `onReset` is used
+ // to compute whether or not resetting should proceed
+ // tags:
+ // callback
+ return true; // Boolean
+ },
+
+ _onReset: function(e){
+ this.reset(e);
+ event.stop(e);
+ return false;
+ },
+
+ _onSubmit: function(e){
+ var fp = this.constructor.prototype;
+ // TODO: remove this if statement beginning with 2.0
+ if(this.execute != fp.execute || this.onExecute != fp.onExecute){
+ kernel.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0");
+ this.onExecute();
+ this.execute(this.getValues());
+ }
+ if(this.onSubmit(e) === false){ // only exactly false stops submit
+ event.stop(e);
+ }
+ },
+
+ onSubmit: function(/*Event?*/ /*===== e =====*/){
+ // summary:
+ // Callback when user submits the form.
+ // description:
+ // This method is intended to be over-ridden, but by default it checks and
+ // returns the validity of form elements. When the `submit`
+ // method is called programmatically, the return value from
+ // `onSubmit` is used to compute whether or not submission
+ // should proceed
+ // tags:
+ // extension
+
+ return this.isValid(); // Boolean
+ },
+
+ submit: function(){
+ // summary:
+ // programmatically submit form if and only if the `onSubmit` returns true
+ if(!(this.onSubmit() === false)){
+ this.containerNode.submit();
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/HorizontalRule.js.uncompressed.js b/lib/dijit/form/HorizontalRule.js.uncompressed.js
new file mode 100644
index 000000000..6e9577ddc
--- /dev/null
+++ b/lib/dijit/form/HorizontalRule.js.uncompressed.js
@@ -0,0 +1,69 @@
+define("dijit/form/HorizontalRule", [
+ "dojo/_base/declare", // declare
+ "../_Widget",
+ "../_TemplatedMixin"
+], function(declare, _Widget, _TemplatedMixin){
+
+// module:
+// dijit/form/HorizontalRule
+
+
+return declare("dijit.form.HorizontalRule", [_Widget, _TemplatedMixin], {
+ // summary:
+ // Hash marks for `dijit/form/HorizontalSlider`
+
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerH"></div>',
+
+ // count: Integer
+ // Number of hash marks to generate
+ count: 3,
+
+ // container: String
+ // For HorizontalSlider, this is either "topDecoration" or "bottomDecoration",
+ // and indicates whether this rule goes above or below the slider.
+ container: "containerNode",
+
+ // ruleStyle: String
+ // CSS style to apply to individual hash marks
+ ruleStyle: "",
+
+ _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkH" style="left:',
+ _positionSuffix: '%;',
+ _suffix: '"></div>',
+
+ _genHTML: function(pos){
+ return this._positionPrefix + pos + this._positionSuffix + this.ruleStyle + this._suffix;
+ },
+
+ // _isHorizontal: [protected extension] Boolean
+ // VerticalRule will override this...
+ _isHorizontal: true,
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ var innerHTML;
+ if(this.count == 1){
+ innerHTML = this._genHTML(50, 0);
+ }else{
+ var i;
+ var interval = 100 / (this.count-1);
+ if(!this._isHorizontal || this.isLeftToRight()){
+ innerHTML = this._genHTML(0, 0);
+ for(i=1; i < this.count-1; i++){
+ innerHTML += this._genHTML(interval*i, i);
+ }
+ innerHTML += this._genHTML(100, this.count-1);
+ }else{
+ innerHTML = this._genHTML(100, 0);
+ for(i=1; i < this.count-1; i++){
+ innerHTML += this._genHTML(100-interval*i, i);
+ }
+ innerHTML += this._genHTML(0, this.count-1);
+ }
+ }
+ this.domNode.innerHTML = innerHTML;
+ }
+});
+
+});
diff --git a/lib/dijit/form/HorizontalRuleLabels.js b/lib/dijit/form/HorizontalRuleLabels.js
index be95ba019..6d0fd658e 100644
--- a/lib/dijit/form/HorizontalRuleLabels.js
+++ b/lib/dijit/form/HorizontalRuleLabels.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/HorizontalRuleLabels",["dojo/_base/declare","dojo/number","dojo/query","./HorizontalRule"],function(_1,_2,_3,_4){return _1("dijit.form.HorizontalRuleLabels",_4,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH\"></div>",labelStyle:"",labels:[],numericMargin:0,minimum:0,maximum:1,constraints:{pattern:"#%"},_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerH\" style=\"left:",_labelPrefix:"\"><div class=\"dijitRuleLabel dijitRuleLabelH\">",_suffix:"</div></div>",_calcPosition:function(_5){return _5;},_genHTML:function(_6,_7){return this._positionPrefix+this._calcPosition(_6)+this._positionSuffix+this.labelStyle+this._labelPrefix+this.labels[_7]+this._suffix;},getLabels:function(){var _8=this.labels;if(!_8.length){_8=_3("> li",this.srcNodeRef).map(function(_9){return String(_9.innerHTML);});}this.srcNodeRef.innerHTML="";if(!_8.length&&this.count>1){var _a=this.minimum;var _b=(this.maximum-_a)/(this.count-1);for(var i=0;i<this.count;i++){_8.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":_2.format(_a,this.constraints));_a+=_b;}}return _8;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});}); \ No newline at end of file
+define("dijit/form/HorizontalRuleLabels",["dojo/_base/declare","dojo/number","dojo/query","./HorizontalRule"],function(_1,_2,_3,_4){return _1("dijit.form.HorizontalRuleLabels",_4,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH\"></div>",labelStyle:"",labels:[],numericMargin:0,minimum:0,maximum:1,constraints:{pattern:"#%"},_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerH\" style=\"left:",_labelPrefix:"\"><div class=\"dijitRuleLabel dijitRuleLabelH\">",_suffix:"</div></div>",_calcPosition:function(_5){return _5;},_genHTML:function(_6,_7){return this._positionPrefix+this._calcPosition(_6)+this._positionSuffix+this.labelStyle+this._labelPrefix+this.labels[_7]+this._suffix;},getLabels:function(){var _8=this.labels;if(!_8.length&&this.srcNodeRef){_8=_3("> li",this.srcNodeRef).map(function(_9){return String(_9.innerHTML);});}if(!_8.length&&this.count>1){var _a=this.minimum;var _b=(this.maximum-_a)/(this.count-1);for(var i=0;i<this.count;i++){_8.push((i<this.numericMargin||i>=(this.count-this.numericMargin))?"":_2.format(_a,this.constraints));_a+=_b;}}return _8;},postMixInProperties:function(){this.inherited(arguments);this.labels=this.getLabels();this.count=this.labels.length;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js
new file mode 100644
index 000000000..f8f418748
--- /dev/null
+++ b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js
@@ -0,0 +1,92 @@
+define("dijit/form/HorizontalRuleLabels", [
+ "dojo/_base/declare", // declare
+ "dojo/number", // number.format
+ "dojo/query", // query
+ "./HorizontalRule"
+], function(declare, number, query, HorizontalRule){
+
+// module:
+// dijit/form/HorizontalRuleLabels
+
+return declare("dijit.form.HorizontalRuleLabels", HorizontalRule, {
+ // summary:
+ // Labels for `dijit/form/HorizontalSlider`
+
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerH dijitRuleLabelsContainer dijitRuleLabelsContainerH"></div>',
+
+ // labelStyle: String
+ // CSS style to apply to individual text labels
+ labelStyle: "",
+
+ // labels: String[]?
+ // Array of text labels to render - evenly spaced from left-to-right or bottom-to-top.
+ // Alternately, minimum and maximum can be specified, to get numeric labels.
+ labels: [],
+
+ // numericMargin: Integer
+ // Number of generated numeric labels that should be rendered as '' on the ends when labels[] are not specified
+ numericMargin: 0,
+
+ // numericMinimum: Integer
+ // Leftmost label value for generated numeric labels when labels[] are not specified
+ minimum: 0,
+
+ // numericMaximum: Integer
+ // Rightmost label value for generated numeric labels when labels[] are not specified
+ maximum: 1,
+
+ // constraints: Object
+ // pattern, places, lang, et al (see dojo.number) for generated numeric labels when labels[] are not specified
+ constraints: {pattern:"#%"},
+
+ _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerH" style="left:',
+ _labelPrefix: '"><div class="dijitRuleLabel dijitRuleLabelH">',
+ _suffix: '</div></div>',
+
+ _calcPosition: function(pos){
+ // summary:
+ // Returns the value to be used in HTML for the label as part of the left: attribute
+ // tags:
+ // protected extension
+ return pos;
+ },
+
+ _genHTML: function(pos, ndx){
+ return this._positionPrefix + this._calcPosition(pos) + this._positionSuffix + this.labelStyle + this._labelPrefix + this.labels[ndx] + this._suffix;
+ },
+
+ getLabels: function(){
+ // summary:
+ // Overridable function to return array of labels to use for this slider.
+ // Can specify a getLabels() method instead of a labels[] array, or min/max attributes.
+ // tags:
+ // protected extension
+
+ // if the labels array was not specified directly, then see if <li> children were
+ var labels = this.labels;
+ if(!labels.length && this.srcNodeRef){
+ // for markup creation, labels are specified as child elements
+ labels = query("> li", this.srcNodeRef).map(function(node){
+ return String(node.innerHTML);
+ });
+ }
+ // if the labels were not specified directly and not as <li> children, then calculate numeric labels
+ if(!labels.length && this.count > 1){
+ var start = this.minimum;
+ var inc = (this.maximum - start) / (this.count-1);
+ for(var i=0; i < this.count; i++){
+ labels.push((i < this.numericMargin || i >= (this.count-this.numericMargin)) ? '' : number.format(start, this.constraints));
+ start += inc;
+ }
+ }
+ return labels;
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.labels = this.getLabels();
+ this.count = this.labels.length;
+ }
+});
+
+});
diff --git a/lib/dijit/form/HorizontalSlider.js b/lib/dijit/form/HorizontalSlider.js
index cc2563171..90e26d5a2 100644
--- a/lib/dijit/form/HorizontalSlider.js
+++ b/lib/dijit/form/HorizontalSlider.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/HorizontalSlider.html":"<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" data-dojo-attach-event=\"press:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"}});define("dijit/form/HorizontalSlider",["dojo/_base/array","dojo/_base/declare","dojo/dnd/move","dojo/_base/event","dojo/_base/fx","dojo/dom-geometry","dojo/dom-style","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/dnd/Moveable","dojo/dnd/Mover","dojo/query","../registry","../focus","../typematic","./Button","./_FormValueWidget","../_Container","dojo/text!./templates/HorizontalSlider.html"],function(_1,_2,_3,_4,fx,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13){var _14=_2("dijit.form._SliderMover",_b,{onMouseMove:function(e){var _15=this.widget;var _16=_15._abspos;if(!_16){_16=_15._abspos=_5.position(_15.sliderBarContainer,true);_15._setPixelValue_=_8.hitch(_15,"_setPixelValue");_15._isReversed_=_15._isReversed();}var _17=e[_15._mousePixelCoord]-_16[_15._startingPixelCoord];_15._setPixelValue_(_15._isReversed_?(_16[_15._pixelCount]-_17):_17,_16[_15._pixelCount],false);},destroy:function(e){_b.prototype.destroy.apply(this,arguments);var _18=this.widget;_18._abspos=null;_18._setValueAttr(_18.value,true);}});var _19=_2("dijit.form.HorizontalSlider",[_11,_12],{templateString:_13,value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:_d.defaultDuration,_setIdAttr:"",baseClass:"dijitSlider",cssStateNodes:{incrementButton:"dijitSliderIncrementButton",decrementButton:"dijitSliderDecrementButton",focusNode:"dijitSliderThumb"},_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_handleOffsetCoord:"left",_progressPixelSize:"width",_onKeyUp:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}this._setValueAttr(this.value,true);},_onKeyPress:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}switch(e.charOrCode){case _7.HOME:this._setValueAttr(this.minimum,false);break;case _7.END:this._setValueAttr(this.maximum,false);break;case ((this._descending||this.isLeftToRight())?_7.RIGHT_ARROW:_7.LEFT_ARROW):case (this._descending===false?_7.DOWN_ARROW:_7.UP_ARROW):case (this._descending===false?_7.PAGE_DOWN:_7.PAGE_UP):this.increment(e);break;case ((this._descending||this.isLeftToRight())?_7.LEFT_ARROW:_7.RIGHT_ARROW):case (this._descending===false?_7.UP_ARROW:_7.DOWN_ARROW):case (this._descending===false?_7.PAGE_UP:_7.PAGE_DOWN):this.decrement(e);break;default:return;}_4.stop(e);},_onHandleClick:function(e){if(this.disabled||this.readOnly){return;}if(!_9("ie")){_e.focus(this.sliderHandle);}_4.stop(e);},_isReversed:function(){return !this.isLeftToRight();},_onBarClick:function(e){if(this.disabled||this.readOnly||!this.clickSelect){return;}_e.focus(this.sliderHandle);_4.stop(e);var _1a=_5.position(this.sliderBarContainer,true);var _1b=e[this._mousePixelCoord]-_1a[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_1a[this._pixelCount]-_1b):_1b,_1a[this._pixelCount],true);this._movable.onMouseDown(e);},_setPixelValue:function(_1c,_1d,_1e){if(this.disabled||this.readOnly){return;}var _1f=this.discreteValues;if(_1f<=1||_1f==Infinity){_1f=_1d;}_1f--;var _20=_1d/_1f;var _21=Math.round(_1c/_20);this._setValueAttr(Math.max(Math.min((this.maximum-this.minimum)*_21/_1f+this.minimum,this.maximum),this.minimum),_1e);},_setValueAttr:function(_22,_23){this._set("value",_22);this.valueNode.value=_22;this.focusNode.setAttribute("aria-valuenow",_22);this.inherited(arguments);var _24=(_22-this.minimum)/(this.maximum-this.minimum);var _25=(this._descending===false)?this.remainingBar:this.progressBar;var _26=(this._descending===false)?this.progressBar:this.remainingBar;if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}if(_23&&this.slideDuration>0&&_25.style[this._progressPixelSize]){var _27=this;var _28={};var _29=parseFloat(_25.style[this._progressPixelSize]);var _2a=this.slideDuration*(_24-_29/100);if(_2a==0){return;}if(_2a<0){_2a=0-_2a;}_28[this._progressPixelSize]={start:_29,end:_24*100,units:"%"};this._inProgressAnim=fx.animateProperty({node:_25,duration:_2a,onAnimate:function(v){_26.style[_27._progressPixelSize]=(100-parseFloat(v[_27._progressPixelSize]))+"%";},onEnd:function(){delete _27._inProgressAnim;},properties:_28});this._inProgressAnim.play();}else{_25.style[this._progressPixelSize]=(_24*100)+"%";_26.style[this._progressPixelSize]=((1-_24)*100)+"%";}},_bumpValue:function(_2b,_2c){if(this.disabled||this.readOnly){return;}var s=_6.getComputedStyle(this.sliderBarContainer);var c=_5.getContentBox(this.sliderBarContainer,s);var _2d=this.discreteValues;if(_2d<=1||_2d==Infinity){_2d=c[this._pixelCount];}_2d--;var _2e=(this.value-this.minimum)*_2d/(this.maximum-this.minimum)+_2b;if(_2e<0){_2e=0;}if(_2e>_2d){_2e=_2d;}_2e=_2e*(this.maximum-this.minimum)/_2d+this.minimum;this._setValueAttr(_2e,_2c);},_onClkBumper:function(val){if(this.disabled||this.readOnly||!this.clickSelect){return;}this._setValueAttr(val,true);},_onClkIncBumper:function(){this._onClkBumper(this._descending===false?this.minimum:this.maximum);},_onClkDecBumper:function(){this._onClkBumper(this._descending===false?this.maximum:this.minimum);},decrement:function(e){this._bumpValue(e.charOrCode==_7.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.charOrCode==_7.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){_4.stop(evt);var _2f=!_9("mozilla");var _30=evt[(_2f?"wheelDelta":"detail")]*(_2f?1:-1);this._bumpValue(_30<0?-1:1,true);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),function(_31){if(this[_31.container]!=this.containerNode){this[_31.container].appendChild(_31.domNode);}},this);this.inherited(arguments);},_typematicCallback:function(_32,_33,e){if(_32==-1){this._setValueAttr(this.value,true);}else{this[(_33==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);}},buildRendering:function(){this.inherited(arguments);if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";}var _34=_c("label[for=\""+this.id+"\"]");if(_34.length){_34[0].id=(this.id+"_label");this.focusNode.setAttribute("aria-labelledby",_34[0].id);}this.focusNode.setAttribute("aria-valuemin",this.minimum);this.focusNode.setAttribute("aria-valuemax",this.maximum);},postCreate:function(){this.inherited(arguments);if(this.showButtons){this._connects.push(_f.addMouseListener(this.decrementButton,this,"_typematicCallback",25,500));this._connects.push(_f.addMouseListener(this.incrementButton,this,"_typematicCallback",25,500));}this.connect(this.domNode,!_9("mozilla")?"onmousewheel":"DOMMouseScroll","_mouseWheeled");var _35=_2(_14,{widget:this});this._movable=new _a(this.sliderHandle,{mover:_35});this._layoutHackIE7();},destroy:function(){this._movable.destroy();if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}this._supportingWidgets=_d.findWidgets(this.domNode);this.inherited(arguments);}});_19._Mover=_14;return _19;}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/HorizontalSlider.html":"<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\trole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" data-dojo-attach-event=\"press:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"}});define("dijit/form/HorizontalSlider",["dojo/_base/array","dojo/_base/declare","dojo/dnd/move","dojo/_base/event","dojo/_base/fx","dojo/dom-geometry","dojo/dom-style","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/dnd/Moveable","dojo/dnd/Mover","dojo/query","dojo/mouse","../registry","../focus","../typematic","./Button","./_FormValueWidget","../_Container","dojo/text!./templates/HorizontalSlider.html"],function(_1,_2,_3,_4,fx,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14){var _15=_2("dijit.form._SliderMover",_b,{onMouseMove:function(e){var _16=this.widget;var _17=_16._abspos;if(!_17){_17=_16._abspos=_5.position(_16.sliderBarContainer,true);_16._setPixelValue_=_8.hitch(_16,"_setPixelValue");_16._isReversed_=_16._isReversed();}var _18=e[_16._mousePixelCoord]-_17[_16._startingPixelCoord];_16._setPixelValue_(_16._isReversed_?(_17[_16._pixelCount]-_18):_18,_17[_16._pixelCount],false);},destroy:function(e){_b.prototype.destroy.apply(this,arguments);var _19=this.widget;_19._abspos=null;_19._setValueAttr(_19.value,true);}});var _1a=_2("dijit.form.HorizontalSlider",[_12,_13],{templateString:_14,value:0,showButtons:true,minimum:0,maximum:100,discreteValues:Infinity,pageIncrement:2,clickSelect:true,slideDuration:_e.defaultDuration,_setIdAttr:"",baseClass:"dijitSlider",cssStateNodes:{incrementButton:"dijitSliderIncrementButton",decrementButton:"dijitSliderDecrementButton",focusNode:"dijitSliderThumb"},_mousePixelCoord:"pageX",_pixelCount:"w",_startingPixelCoord:"x",_handleOffsetCoord:"left",_progressPixelSize:"width",_onKeyUp:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}this._setValueAttr(this.value,true);},_onKeyPress:function(e){if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){return;}switch(e.charOrCode){case _7.HOME:this._setValueAttr(this.minimum,false);break;case _7.END:this._setValueAttr(this.maximum,false);break;case ((this._descending||this.isLeftToRight())?_7.RIGHT_ARROW:_7.LEFT_ARROW):case (this._descending===false?_7.DOWN_ARROW:_7.UP_ARROW):case (this._descending===false?_7.PAGE_DOWN:_7.PAGE_UP):this.increment(e);break;case ((this._descending||this.isLeftToRight())?_7.LEFT_ARROW:_7.RIGHT_ARROW):case (this._descending===false?_7.UP_ARROW:_7.DOWN_ARROW):case (this._descending===false?_7.PAGE_UP:_7.PAGE_DOWN):this.decrement(e);break;default:return;}_4.stop(e);},_onHandleClick:function(e){if(this.disabled||this.readOnly){return;}if(!_9("ie")){_f.focus(this.sliderHandle);}_4.stop(e);},_isReversed:function(){return !this.isLeftToRight();},_onBarClick:function(e){if(this.disabled||this.readOnly||!this.clickSelect){return;}_f.focus(this.sliderHandle);_4.stop(e);var _1b=_5.position(this.sliderBarContainer,true);var _1c=e[this._mousePixelCoord]-_1b[this._startingPixelCoord];this._setPixelValue(this._isReversed()?(_1b[this._pixelCount]-_1c):_1c,_1b[this._pixelCount],true);this._movable.onMouseDown(e);},_setPixelValue:function(_1d,_1e,_1f){if(this.disabled||this.readOnly){return;}var _20=this.discreteValues;if(_20<=1||_20==Infinity){_20=_1e;}_20--;var _21=_1e/_20;var _22=Math.round(_1d/_21);this._setValueAttr(Math.max(Math.min((this.maximum-this.minimum)*_22/_20+this.minimum,this.maximum),this.minimum),_1f);},_setValueAttr:function(_23,_24){this._set("value",_23);this.valueNode.value=_23;this.focusNode.setAttribute("aria-valuenow",_23);this.inherited(arguments);var _25=(_23-this.minimum)/(this.maximum-this.minimum);var _26=(this._descending===false)?this.remainingBar:this.progressBar;var _27=(this._descending===false)?this.progressBar:this.remainingBar;if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}if(_24&&this.slideDuration>0&&_26.style[this._progressPixelSize]){var _28=this;var _29={};var _2a=parseFloat(_26.style[this._progressPixelSize]);var _2b=this.slideDuration*(_25-_2a/100);if(_2b==0){return;}if(_2b<0){_2b=0-_2b;}_29[this._progressPixelSize]={start:_2a,end:_25*100,units:"%"};this._inProgressAnim=fx.animateProperty({node:_26,duration:_2b,onAnimate:function(v){_27.style[_28._progressPixelSize]=(100-parseFloat(v[_28._progressPixelSize]))+"%";},onEnd:function(){delete _28._inProgressAnim;},properties:_29});this._inProgressAnim.play();}else{_26.style[this._progressPixelSize]=(_25*100)+"%";_27.style[this._progressPixelSize]=((1-_25)*100)+"%";}},_bumpValue:function(_2c,_2d){if(this.disabled||this.readOnly){return;}var s=_6.getComputedStyle(this.sliderBarContainer);var c=_5.getContentBox(this.sliderBarContainer,s);var _2e=this.discreteValues;if(_2e<=1||_2e==Infinity){_2e=c[this._pixelCount];}_2e--;var _2f=(this.value-this.minimum)*_2e/(this.maximum-this.minimum)+_2c;if(_2f<0){_2f=0;}if(_2f>_2e){_2f=_2e;}_2f=_2f*(this.maximum-this.minimum)/_2e+this.minimum;this._setValueAttr(_2f,_2d);},_onClkBumper:function(val){if(this.disabled||this.readOnly||!this.clickSelect){return;}this._setValueAttr(val,true);},_onClkIncBumper:function(){this._onClkBumper(this._descending===false?this.minimum:this.maximum);},_onClkDecBumper:function(){this._onClkBumper(this._descending===false?this.maximum:this.minimum);},decrement:function(e){this._bumpValue(e.charOrCode==_7.PAGE_DOWN?-this.pageIncrement:-1);},increment:function(e){this._bumpValue(e.charOrCode==_7.PAGE_UP?this.pageIncrement:1);},_mouseWheeled:function(evt){_4.stop(evt);this._bumpValue(evt.wheelDelta<0?-1:1,true);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),function(_30){if(this[_30.container]!=this.containerNode){this[_30.container].appendChild(_30.domNode);}},this);this.inherited(arguments);},_typematicCallback:function(_31,_32,e){if(_31==-1){this._setValueAttr(this.value,true);}else{this[(_32==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);}},buildRendering:function(){this.inherited(arguments);if(this.showButtons){this.incrementButton.style.display="";this.decrementButton.style.display="";}var _33=_c("label[for=\""+this.id+"\"]");if(_33.length){if(!_33[0].id){_33[0].id=this.id+"_label";}this.focusNode.setAttribute("aria-labelledby",_33[0].id);}this.focusNode.setAttribute("aria-valuemin",this.minimum);this.focusNode.setAttribute("aria-valuemax",this.maximum);},postCreate:function(){this.inherited(arguments);if(this.showButtons){this.own(_10.addMouseListener(this.decrementButton,this,"_typematicCallback",25,500),_10.addMouseListener(this.incrementButton,this,"_typematicCallback",25,500));}this.connect(this.domNode,_d.wheel,"_mouseWheeled");var _34=_2(_15,{widget:this});this._movable=new _a(this.sliderHandle,{mover:_34});this._layoutHackIE7();},destroy:function(){this._movable.destroy();if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){this._inProgressAnim.stop(true);}this.inherited(arguments);}});_1a._Mover=_15;return _1a;}); \ No newline at end of file
diff --git a/lib/dijit/form/HorizontalSlider.js.uncompressed.js b/lib/dijit/form/HorizontalSlider.js.uncompressed.js
new file mode 100644
index 000000000..571ef835c
--- /dev/null
+++ b/lib/dijit/form/HorizontalSlider.js.uncompressed.js
@@ -0,0 +1,349 @@
+require({cache:{
+'url:dijit/form/templates/HorizontalSlider.html':"<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\trole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"topDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderDecrementIconH\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" data-dojo-attach-event=\"press:_onBarClick\"></div\n\t\t\t></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td data-dojo-attach-point=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"}});
+define("dijit/form/HorizontalSlider", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dnd/move",
+ "dojo/_base/event", // event.stop
+ "dojo/_base/fx", // fx.animateProperty
+ "dojo/dom-geometry", // domGeometry.position
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/keys", // keys.DOWN_ARROW keys.END keys.HOME keys.LEFT_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.RIGHT_ARROW keys.UP_ARROW
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("ie") has("mozilla")
+ "dojo/dnd/Moveable", // Moveable
+ "dojo/dnd/Mover", // Mover Mover.prototype.destroy.apply
+ "dojo/query", // query
+ "dojo/mouse", // mouse.wheel
+ "../registry", // registry.findWidgets
+ "../focus", // focus.focus()
+ "../typematic",
+ "./Button",
+ "./_FormValueWidget",
+ "../_Container",
+ "dojo/text!./templates/HorizontalSlider.html"
+], function(array, declare, move, event, fx, domGeometry, domStyle, keys, lang, has, Moveable, Mover, query, mouse,
+ registry, focus, typematic, Button, _FormValueWidget, _Container, template){
+
+// module:
+// dijit/form/HorizontalSlider
+
+
+var _SliderMover = declare("dijit.form._SliderMover", Mover, {
+ onMouseMove: function(e){
+ var widget = this.widget;
+ var abspos = widget._abspos;
+ if(!abspos){
+ abspos = widget._abspos = domGeometry.position(widget.sliderBarContainer, true);
+ widget._setPixelValue_ = lang.hitch(widget, "_setPixelValue");
+ widget._isReversed_ = widget._isReversed();
+ }
+ var pixelValue = e[widget._mousePixelCoord] - abspos[widget._startingPixelCoord];
+ widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false);
+ },
+
+ destroy: function(e){
+ Mover.prototype.destroy.apply(this, arguments);
+ var widget = this.widget;
+ widget._abspos = null;
+ widget._setValueAttr(widget.value, true);
+ }
+});
+
+var HorizontalSlider = declare("dijit.form.HorizontalSlider", [_FormValueWidget, _Container], {
+ // summary:
+ // A form widget that allows one to select a value with a horizontally draggable handle
+
+ templateString: template,
+
+ // Overrides FormValueWidget.value to indicate numeric value
+ value: 0,
+
+ // showButtons: [const] Boolean
+ // Show increment/decrement buttons at the ends of the slider?
+ showButtons: true,
+
+ // minimum: [const] Integer
+ // The minimum value the slider can be set to.
+ minimum: 0,
+
+ // maximum: [const] Integer
+ // The maximum value the slider can be set to.
+ maximum: 100,
+
+ // discreteValues: Integer
+ // If specified, indicates that the slider handle has only 'discreteValues' possible positions,
+ // and that after dragging the handle, it will snap to the nearest possible position.
+ // Thus, the slider has only 'discreteValues' possible values.
+ //
+ // For example, if minimum=10, maxiumum=30, and discreteValues=3, then the slider handle has
+ // three possible positions, representing values 10, 20, or 30.
+ //
+ // If discreteValues is not specified or if it's value is higher than the number of pixels
+ // in the slider bar, then the slider handle can be moved freely, and the slider's value will be
+ // computed/reported based on pixel position (in this case it will likely be fractional,
+ // such as 123.456789).
+ discreteValues: Infinity,
+
+ // pageIncrement: Integer
+ // If discreteValues is also specified, this indicates the amount of clicks (ie, snap positions)
+ // that the slider handle is moved via pageup/pagedown keys.
+ // If discreteValues is not specified, it indicates the number of pixels.
+ pageIncrement: 2,
+
+ // clickSelect: Boolean
+ // If clicking the slider bar changes the value or not
+ clickSelect: true,
+
+ // slideDuration: Number
+ // The time in ms to take to animate the slider handle from 0% to 100%,
+ // when clicking the slider bar to make the handle move.
+ slideDuration: registry.defaultDuration,
+
+ // Map widget attributes to DOMNode attributes.
+ _setIdAttr: "", // Override _FormWidget which sends id to focusNode
+
+ baseClass: "dijitSlider",
+
+ // Apply CSS classes to up/down arrows and handle per mouse state
+ cssStateNodes: {
+ incrementButton: "dijitSliderIncrementButton",
+ decrementButton: "dijitSliderDecrementButton",
+ focusNode: "dijitSliderThumb"
+ },
+
+ _mousePixelCoord: "pageX",
+ _pixelCount: "w",
+ _startingPixelCoord: "x",
+ _handleOffsetCoord: "left",
+ _progressPixelSize: "width",
+
+ _onKeyUp: function(/*Event*/ e){
+ if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; }
+ this._setValueAttr(this.value, true);
+ },
+
+ _onKeyPress: function(/*Event*/ e){
+ if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; }
+ switch(e.charOrCode){
+ case keys.HOME:
+ this._setValueAttr(this.minimum, false);
+ break;
+ case keys.END:
+ this._setValueAttr(this.maximum, false);
+ break;
+ // this._descending === false: if ascending vertical (min on top)
+ // (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical
+ case ((this._descending || this.isLeftToRight()) ? keys.RIGHT_ARROW : keys.LEFT_ARROW):
+ case (this._descending === false ? keys.DOWN_ARROW : keys.UP_ARROW):
+ case (this._descending === false ? keys.PAGE_DOWN : keys.PAGE_UP):
+ this.increment(e);
+ break;
+ case ((this._descending || this.isLeftToRight()) ? keys.LEFT_ARROW : keys.RIGHT_ARROW):
+ case (this._descending === false ? keys.UP_ARROW : keys.DOWN_ARROW):
+ case (this._descending === false ? keys.PAGE_UP : keys.PAGE_DOWN):
+ this.decrement(e);
+ break;
+ default:
+ return;
+ }
+ event.stop(e);
+ },
+
+ _onHandleClick: function(e){
+ if(this.disabled || this.readOnly){ return; }
+ if(!has("ie")){
+ // make sure you get focus when dragging the handle
+ // (but don't do on IE because it causes a flicker on mouse up (due to blur then focus)
+ focus.focus(this.sliderHandle);
+ }
+ event.stop(e);
+ },
+
+ _isReversed: function(){
+ // summary:
+ // Returns true if direction is from right to left
+ // tags:
+ // protected extension
+ return !this.isLeftToRight();
+ },
+
+ _onBarClick: function(e){
+ if(this.disabled || this.readOnly || !this.clickSelect){ return; }
+ focus.focus(this.sliderHandle);
+ event.stop(e);
+ var abspos = domGeometry.position(this.sliderBarContainer, true);
+ var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord];
+ this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true);
+ this._movable.onMouseDown(e);
+ },
+
+ _setPixelValue: function(/*Number*/ pixelValue, /*Number*/ maxPixels, /*Boolean?*/ priorityChange){
+ if(this.disabled || this.readOnly){ return; }
+ var count = this.discreteValues;
+ if(count <= 1 || count == Infinity){ count = maxPixels; }
+ count--;
+ var pixelsPerValue = maxPixels / count;
+ var wholeIncrements = Math.round(pixelValue / pixelsPerValue);
+ this._setValueAttr(Math.max(Math.min((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, this.maximum), this.minimum), priorityChange);
+ },
+
+ _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
+ // summary:
+ // Hook so set('value', value) works.
+ this._set("value", value);
+ this.valueNode.value = value;
+ this.focusNode.setAttribute("aria-valuenow", value);
+ this.inherited(arguments);
+ var percent = (value - this.minimum) / (this.maximum - this.minimum);
+ var progressBar = (this._descending === false) ? this.remainingBar : this.progressBar;
+ var remainingBar = (this._descending === false) ? this.progressBar : this.remainingBar;
+ if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){
+ this._inProgressAnim.stop(true);
+ }
+ if(priorityChange && this.slideDuration > 0 && progressBar.style[this._progressPixelSize]){
+ // animate the slider
+ var _this = this;
+ var props = {};
+ var start = parseFloat(progressBar.style[this._progressPixelSize]);
+ var duration = this.slideDuration * (percent-start/100);
+ if(duration == 0){ return; }
+ if(duration < 0){ duration = 0 - duration; }
+ props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" };
+ this._inProgressAnim = fx.animateProperty({ node: progressBar, duration: duration,
+ onAnimate: function(v){
+ remainingBar.style[_this._progressPixelSize] = (100 - parseFloat(v[_this._progressPixelSize])) + "%";
+ },
+ onEnd: function(){
+ delete _this._inProgressAnim;
+ },
+ properties: props
+ });
+ this._inProgressAnim.play();
+ }else{
+ progressBar.style[this._progressPixelSize] = (percent*100) + "%";
+ remainingBar.style[this._progressPixelSize] = ((1-percent)*100) + "%";
+ }
+ },
+
+ _bumpValue: function(signedChange, /*Boolean?*/ priorityChange){
+ if(this.disabled || this.readOnly){ return; }
+ var s = domStyle.getComputedStyle(this.sliderBarContainer);
+ var c = domGeometry.getContentBox(this.sliderBarContainer, s);
+ var count = this.discreteValues;
+ if(count <= 1 || count == Infinity){ count = c[this._pixelCount]; }
+ count--;
+ var value = (this.value - this.minimum) * count / (this.maximum - this.minimum) + signedChange;
+ if(value < 0){ value = 0; }
+ if(value > count){ value = count; }
+ value = value * (this.maximum - this.minimum) / count + this.minimum;
+ this._setValueAttr(value, priorityChange);
+ },
+
+ _onClkBumper: function(val){
+ if(this.disabled || this.readOnly || !this.clickSelect){ return; }
+ this._setValueAttr(val, true);
+ },
+
+ _onClkIncBumper: function(){
+ this._onClkBumper(this._descending === false ? this.minimum : this.maximum);
+ },
+
+ _onClkDecBumper: function(){
+ this._onClkBumper(this._descending === false ? this.maximum : this.minimum);
+ },
+
+ decrement: function(/*Event*/ e){
+ // summary:
+ // Decrement slider
+ // tags:
+ // private
+ this._bumpValue(e.charOrCode == keys.PAGE_DOWN ? -this.pageIncrement : -1);
+ },
+
+ increment: function(/*Event*/ e){
+ // summary:
+ // Increment slider
+ // tags:
+ // private
+ this._bumpValue(e.charOrCode == keys.PAGE_UP ? this.pageIncrement : 1);
+ },
+
+ _mouseWheeled: function(/*Event*/ evt){
+ // summary:
+ // Event handler for mousewheel where supported
+ event.stop(evt);
+ this._bumpValue(evt.wheelDelta < 0 ? -1 : 1, true); // negative scroll acts like a decrement
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ array.forEach(this.getChildren(), function(child){
+ if(this[child.container] != this.containerNode){
+ this[child.container].appendChild(child.domNode);
+ }
+ }, this);
+
+ this.inherited(arguments);
+ },
+
+ _typematicCallback: function(/*Number*/ count, /*Object*/ button, /*Event*/ e){
+ if(count == -1){
+ this._setValueAttr(this.value, true);
+ }else{
+ this[(button == (this._descending? this.incrementButton : this.decrementButton)) ? "decrement" : "increment"](e);
+ }
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ if(this.showButtons){
+ this.incrementButton.style.display="";
+ this.decrementButton.style.display="";
+ }
+
+ // find any associated label element and add to slider focusnode.
+ var label = query('label[for="'+this.id+'"]');
+ if(label.length){
+ if(!label[0].id){ label[0].id = this.id + "_label"; }
+ this.focusNode.setAttribute("aria-labelledby", label[0].id);
+ }
+
+ this.focusNode.setAttribute("aria-valuemin", this.minimum);
+ this.focusNode.setAttribute("aria-valuemax", this.maximum);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ if(this.showButtons){
+ this.own(
+ typematic.addMouseListener(this.decrementButton, this, "_typematicCallback", 25, 500),
+ typematic.addMouseListener(this.incrementButton, this, "_typematicCallback", 25, 500)
+ );
+ }
+ this.connect(this.domNode, mouse.wheel, "_mouseWheeled");
+
+ // define a custom constructor for a SliderMover that points back to me
+ var mover = declare(_SliderMover, {
+ widget: this
+ });
+ this._movable = new Moveable(this.sliderHandle, {mover: mover});
+
+ this._layoutHackIE7();
+ },
+
+ destroy: function(){
+ this._movable.destroy();
+ if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){
+ this._inProgressAnim.stop(true);
+ }
+ this.inherited(arguments);
+ }
+});
+
+HorizontalSlider._Mover = _SliderMover; // for monkey patching
+
+return HorizontalSlider;
+});
diff --git a/lib/dijit/form/MappedTextBox.js b/lib/dijit/form/MappedTextBox.js
index ecd78995c..3dd3730e1 100644
--- a/lib/dijit/form/MappedTextBox.js
+++ b/lib/dijit/form/MappedTextBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/MappedTextBox",["dojo/_base/declare","dojo/dom-construct","./ValidationTextBox"],function(_1,_2,_3){return _1("dijit.form.MappedTextBox",_3,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},_setNameAttr:null,serialize:function(_4){return _4.toString?_4.toString():"";},toString:function(){var _5=this.filter(this.get("value"));return _5!=null?(typeof _5=="string"?_5:this.serialize(_5,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=_2.place("<input type='hidden'"+(this.name?" name='"+this.name.replace(/'/g,"&quot;")+"'":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/MappedTextBox",["dojo/_base/declare","dojo/dom-construct","./ValidationTextBox"],function(_1,_2,_3){return _1("dijit.form.MappedTextBox",_3,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},_setNameAttr:null,serialize:function(_4){return _4.toString?_4.toString():"";},toString:function(){var _5=this.filter(this.get("value"));return _5!=null?(typeof _5=="string"?_5:this.serialize(_5,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=_2.place("<input type='hidden'"+(this.name?" name=\""+this.name.replace(/"/g,"&quot;")+"\"":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/MappedTextBox.js.uncompressed.js b/lib/dijit/form/MappedTextBox.js.uncompressed.js
new file mode 100644
index 000000000..1f9ed7509
--- /dev/null
+++ b/lib/dijit/form/MappedTextBox.js.uncompressed.js
@@ -0,0 +1,81 @@
+define("dijit/form/MappedTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.place
+ "./ValidationTextBox"
+], function(declare, domConstruct, ValidationTextBox){
+
+ // module:
+ // dijit/form/MappedTextBox
+
+ return declare("dijit.form.MappedTextBox", ValidationTextBox, {
+ // summary:
+ // A dijit/form/ValidationTextBox subclass which provides a base class for widgets that have
+ // a visible formatted display value, and a serializable
+ // value in a hidden input field which is actually sent to the server.
+ // description:
+ // The visible display may
+ // be locale-dependent and interactive. The value sent to the server is stored in a hidden
+ // input field which uses the `name` attribute declared by the original widget. That value sent
+ // to the server is defined by the dijit/form/MappedTextBox.serialize() method and is typically
+ // locale-neutral.
+ // tags:
+ // protected
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+
+ // we want the name attribute to go to the hidden <input>, not the displayed <input>,
+ // so override _FormWidget.postMixInProperties() setting of nameAttrSetting
+ this.nameAttrSetting = "";
+ },
+
+ // Override default behavior to assign name to focusNode
+ _setNameAttr: null,
+
+ serialize: function(val /*=====, options =====*/){
+ // summary:
+ // Overridable function used to convert the get('value') result to a canonical
+ // (non-localized) string. For example, will print dates in ISO format, and
+ // numbers the same way as they are represented in javascript.
+ // val: anything
+ // options: Object?
+ // tags:
+ // protected extension
+ return val.toString ? val.toString() : ""; // String
+ },
+
+ toString: function(){
+ // summary:
+ // Returns widget as a printable string using the widget's value
+ // tags:
+ // protected
+ var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized
+ return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String
+ },
+
+ validate: function(){
+ // Overrides `dijit/form/TextBox.validate`
+ this.valueNode.value = this.toString();
+ return this.inherited(arguments);
+ },
+
+ buildRendering: function(){
+ // Overrides `dijit/_TemplatedMixin/buildRendering`
+
+ this.inherited(arguments);
+
+ // Create a hidden <input> node with the serialized value used for submit
+ // (as opposed to the displayed value).
+ // Passing in name as markup rather than calling domConstruct.create() with an attrs argument
+ // to make query(input[name=...]) work on IE. (see #8660)
+ this.valueNode = domConstruct.place("<input type='hidden'" + (this.name ? ' name="' + this.name.replace(/"/g, "&quot;") + '"' : "") + "/>", this.textbox, "after");
+ },
+
+ reset: function(){
+ // Overrides `dijit/form/ValidationTextBox.reset` to
+ // reset the hidden textbox value to ''
+ this.valueNode.value = '';
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/form/MultiSelect.js b/lib/dijit/form/MultiSelect.js
index da76fed00..823b071b5 100644
--- a/lib/dijit/form/MultiSelect.js
+++ b/lib/dijit/form/MultiSelect.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/MultiSelect",["dojo/_base/array","dojo/_base/declare","dojo/dom-geometry","dojo/query","./_FormValueWidget"],function(_1,_2,_3,_4,_5){return _2("dijit.form.MultiSelect",_5,{size:7,templateString:"<select multiple='true' ${!nameAttrSetting} data-dojo-attach-point='containerNode,focusNode' data-dojo-attach-event='onchange: _onChange'></select>",addSelected:function(_6){_6.getSelected().forEach(function(n){this.containerNode.appendChild(n);this.domNode.scrollTop=this.domNode.offsetHeight;var _7=_6.domNode.scrollTop;_6.domNode.scrollTop=0;_6.domNode.scrollTop=_7;},this);this._set("value",this.get("value"));},getSelected:function(){return _4("option",this.containerNode).filter(function(n){return n.selected;});},_getValueAttr:function(){return _1.map(this.getSelected(),function(n){return n.value;});},multiple:true,_setValueAttr:function(_8,_9){_4("option",this.containerNode).forEach(function(n){n.selected=(_1.indexOf(_8,n.value)!=-1);});this.inherited(arguments);},invertSelection:function(_a){var _b=[];_4("option",this.containerNode).forEach(function(n){if(!n.selected){_b.push(n.value);}});this._setValueAttr(_b,!(_a===false||_a==null));},_onChange:function(){this._handleOnChange(this.get("value"),true);},resize:function(_c){if(_c){_3.setMarginBox(this.domNode,_c);}},postCreate:function(){this._set("value",this.get("value"));this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/MultiSelect",["dojo/_base/array","dojo/_base/declare","dojo/dom-geometry","dojo/query","./_FormValueWidget"],function(_1,_2,_3,_4,_5){return _2("dijit.form.MultiSelect",_5,{size:7,templateString:"<select multiple='true' ${!nameAttrSetting} data-dojo-attach-point='containerNode,focusNode' data-dojo-attach-event='onchange: _onChange'></select>",addSelected:function(_6){_6.getSelected().forEach(function(n){if(this.restoreOriginalText){n.text=this.enforceTextDirWithUcc(this.restoreOriginalText(n),n.text);}this.containerNode.appendChild(n);this.domNode.scrollTop=this.domNode.offsetHeight;var _7=_6.domNode.scrollTop;_6.domNode.scrollTop=0;_6.domNode.scrollTop=_7;},this);this._set("value",this.get("value"));},getSelected:function(){return _4("option",this.containerNode).filter(function(n){return n.selected;});},_getValueAttr:function(){return _1.map(this.getSelected(),function(n){return n.value;});},multiple:true,_setValueAttr:function(_8,_9){_4("option",this.containerNode).forEach(function(n){n.selected=(_1.indexOf(_8,n.value)!=-1);});this.inherited(arguments);},invertSelection:function(_a){var _b=[];_4("option",this.containerNode).forEach(function(n){if(!n.selected){_b.push(n.value);}});this._setValueAttr(_b,!(_a===false||_a==null));},_onChange:function(){this._handleOnChange(this.get("value"),true);},resize:function(_c){if(_c){_3.setMarginBox(this.domNode,_c);}},postCreate:function(){this._set("value",this.get("value"));this.inherited(arguments);},_setTextDirAttr:function(_d){if((this.textDir!=_d||!this._created)&&this.enforceTextDirWithUcc){this._set("textDir",_d);_4("option",this.containerNode).forEach(function(_e){if(!this._created&&_e.value===_e.text){_e.value=_e.text;}_e.text=this.enforceTextDirWithUcc(_e,_e.originalText||_e.text);},this);}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/MultiSelect.js.uncompressed.js b/lib/dijit/form/MultiSelect.js.uncompressed.js
new file mode 100644
index 000000000..4686e5c75
--- /dev/null
+++ b/lib/dijit/form/MultiSelect.js.uncompressed.js
@@ -0,0 +1,134 @@
+define("dijit/form/MultiSelect", [
+ "dojo/_base/array", // array.indexOf, array.map
+ "dojo/_base/declare", // declare
+ "dojo/dom-geometry", // domGeometry.setMarginBox
+ "dojo/query", // query
+ "./_FormValueWidget"
+], function(array, declare, domGeometry, query, _FormValueWidget){
+
+// module:
+// dijit/form/MultiSelect
+
+return declare("dijit.form.MultiSelect", _FormValueWidget, {
+ // summary:
+ // Widget version of a `<select multiple=true>` element,
+ // for selecting multiple options.
+
+ // size: Number
+ // Number of elements to display on a page
+ // NOTE: may be removed in version 2.0, since elements may have variable height;
+ // set the size via style="..." or CSS class names instead.
+ size: 7,
+
+ templateString: "<select multiple='true' ${!nameAttrSetting} data-dojo-attach-point='containerNode,focusNode' data-dojo-attach-event='onchange: _onChange'></select>",
+
+ addSelected: function(/*dijit/form/MultiSelect*/ select){
+ // summary:
+ // Move the selected nodes of a passed Select widget
+ // instance to this Select widget.
+ //
+ // example:
+ // | // move all the selected values from "bar" to "foo"
+ // | dijit.byId("foo").addSelected(dijit.byId("bar"));
+
+ select.getSelected().forEach(function(n){
+ if(this.restoreOriginalText){
+ n.text = this.enforceTextDirWithUcc(this.restoreOriginalText(n), n.text);
+ }
+ this.containerNode.appendChild(n);
+ // scroll to bottom to see item
+ // cannot use scrollIntoView since <option> tags don't support all attributes
+ // does not work on IE due to a bug where <select> always shows scrollTop = 0
+ this.domNode.scrollTop = this.domNode.offsetHeight; // overshoot will be ignored
+ // scrolling the source select is trickier esp. on safari who forgets to change the scrollbar size
+ var oldscroll = select.domNode.scrollTop;
+ select.domNode.scrollTop = 0;
+ select.domNode.scrollTop = oldscroll;
+ },this);
+ this._set('value', this.get('value'));
+ },
+
+ getSelected: function(){
+ // summary:
+ // Access the NodeList of the selected options directly
+ return query("option",this.containerNode).filter(function(n){
+ return n.selected; // Boolean
+ }); // dojo/NodeList
+ },
+
+ _getValueAttr: function(){
+ // summary:
+ // Hook so get('value') works.
+ // description:
+ // Returns an array of the selected options' values.
+
+ // Don't call getSelect.map() because it doesn't return a real array,
+ // and that messes up dojo.toJson() calls like in the Form.html test
+ return array.map(this.getSelected(), function(n){
+ return n.value;
+ });
+ },
+
+ multiple: true, // for Form
+
+ _setValueAttr: function(/*Array*/ values, /*Boolean?*/ priorityChange){
+ // summary:
+ // Hook so set('value', values) works.
+ // description:
+ // Set the value(s) of this Select based on passed values
+ query("option",this.containerNode).forEach(function(n){
+ n.selected = (array.indexOf(values,n.value) != -1);
+ });
+ this.inherited(arguments);
+ },
+
+ invertSelection: function(/*Boolean?*/ onChange){
+ // summary:
+ // Invert the selection
+ // onChange: Boolean
+ // If false, onChange is not fired.
+ var val = [];
+ query("option",this.containerNode).forEach(function(n){
+ if(!n.selected){ val.push(n.value); }
+ });
+ this._setValueAttr(val, !(onChange === false || onChange == null));
+ },
+
+ _onChange: function(/*Event*/){
+ this._handleOnChange(this.get('value'), true);
+ },
+
+ // for layout widgets:
+ resize: function(/*Object*/ size){
+ if(size){
+ domGeometry.setMarginBox(this.domNode, size);
+ }
+ },
+
+ postCreate: function(){
+ this._set('value', this.get('value'));
+ this.inherited(arguments);
+ },
+
+ _setTextDirAttr: function(textDir){
+ // to insure the code executed only when _BidiSupport loaded, and only
+ // when there was a change in textDir
+ if((this.textDir != textDir || !this._created) && this.enforceTextDirWithUcc){
+ this._set("textDir", textDir);
+
+ query("option",this.containerNode).forEach(function(option){
+ // If the value wasn't defined explicitly, it the same object as
+ // option.text. Since the option.text will be modified (by wrapping of UCC)
+ // we want to save the original option.value for form submission.
+ if(!this._created && option.value === option.text){
+ option.value = option.text;
+ }
+ // apply the bidi support
+ option.text = this.enforceTextDirWithUcc(option, option.originalText || option.text);
+ },this);
+ }
+ }
+
+});
+
+});
diff --git a/lib/dijit/form/NumberSpinner.js b/lib/dijit/form/NumberSpinner.js
index 1f7dc1640..eb5053b90 100644
--- a/lib/dijit/form/NumberSpinner.js
+++ b/lib/dijit/form/NumberSpinner.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/NumberSpinner",["dojo/_base/declare","dojo/_base/event","dojo/keys","./_Spinner","./NumberTextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.NumberSpinner",[_4,_5.Mixin],{adjust:function(_6,_7){var tc=this.constraints,v=isNaN(_6),_8=!isNaN(tc.max),_9=!isNaN(tc.min);if(v&&_7!=0){_6=(_7>0)?_9?tc.min:_8?tc.max:0:_8?this.constraints.max:_9?tc.min:0;}var _a=_6+_7;if(v||isNaN(_a)){return _6;}if(_8&&(_a>tc.max)){_a=tc.max;}if(_9&&(_a<tc.min)){_a=tc.min;}return _a;},_onKeyPress:function(e){if((e.charOrCode==_3.HOME||e.charOrCode==_3.END)&&!(e.ctrlKey||e.altKey||e.metaKey)&&typeof this.get("value")!="undefined"){var _b=this.constraints[(e.charOrCode==_3.HOME?"min":"max")];if(typeof _b=="number"){this._setValueAttr(_b,false);}_2.stop(e);}}});}); \ No newline at end of file
+define("dijit/form/NumberSpinner",["dojo/_base/declare","dojo/_base/event","dojo/keys","./_Spinner","./NumberTextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.NumberSpinner",[_4,_5.Mixin],{baseClass:"dijitTextBox dijitSpinner dijitNumberTextBox",adjust:function(_6,_7){var tc=this.constraints,v=isNaN(_6),_8=!isNaN(tc.max),_9=!isNaN(tc.min);if(v&&_7!=0){_6=(_7>0)?_9?tc.min:_8?tc.max:0:_8?this.constraints.max:_9?tc.min:0;}var _a=_6+_7;if(v||isNaN(_a)){return _6;}if(_8&&(_a>tc.max)){_a=tc.max;}if(_9&&(_a<tc.min)){_a=tc.min;}return _a;},_onKeyPress:function(e){if((e.charOrCode==_3.HOME||e.charOrCode==_3.END)&&!(e.ctrlKey||e.altKey||e.metaKey)&&typeof this.get("value")!="undefined"){var _b=this.constraints[(e.charOrCode==_3.HOME?"min":"max")];if(typeof _b=="number"){this._setValueAttr(_b,false);}_2.stop(e);}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/NumberSpinner.js.uncompressed.js b/lib/dijit/form/NumberSpinner.js.uncompressed.js
new file mode 100644
index 000000000..87b417f40
--- /dev/null
+++ b/lib/dijit/form/NumberSpinner.js.uncompressed.js
@@ -0,0 +1,69 @@
+define("dijit/form/NumberSpinner", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys.END keys.HOME
+ "./_Spinner",
+ "./NumberTextBox"
+], function(declare, event, keys, _Spinner, NumberTextBox){
+
+// module:
+// dijit/form/NumberSpinner
+
+
+return declare("dijit.form.NumberSpinner", [_Spinner, NumberTextBox.Mixin], {
+ // summary:
+ // Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value
+ //
+ // description:
+ // A `dijit/form/NumberTextBox` extension to provide keyboard accessible value selection
+ // as well as icons for spinning direction. When using the keyboard, the typematic rules
+ // apply, meaning holding the key will gradually increase or decrease the value and
+ // accelerate.
+ //
+ // example:
+ // | new NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput");
+
+ baseClass: "dijitTextBox dijitSpinner dijitNumberTextBox",
+
+ adjust: function(/*Object*/ val, /*Number*/ delta){
+ // summary:
+ // Change Number val by the given amount
+ // tags:
+ // protected
+
+ var tc = this.constraints,
+ v = isNaN(val),
+ gotMax = !isNaN(tc.max),
+ gotMin = !isNaN(tc.min)
+ ;
+ if(v && delta != 0){ // blank or invalid value and they want to spin, so create defaults
+ val = (delta > 0) ?
+ gotMin ? tc.min : gotMax ? tc.max : 0 :
+ gotMax ? this.constraints.max : gotMin ? tc.min : 0
+ ;
+ }
+ var newval = val + delta;
+ if(v || isNaN(newval)){ return val; }
+ if(gotMax && (newval > tc.max)){
+ newval = tc.max;
+ }
+ if(gotMin && (newval < tc.min)){
+ newval = tc.min;
+ }
+ return newval;
+ },
+
+ _onKeyPress: function(e){
+ if((e.charOrCode == keys.HOME || e.charOrCode == keys.END) && !(e.ctrlKey || e.altKey || e.metaKey)
+ && typeof this.get('value') != 'undefined' /* gibberish, so HOME and END are default editing keys*/){
+ var value = this.constraints[(e.charOrCode == keys.HOME ? "min" : "max")];
+ if(typeof value == "number"){
+ this._setValueAttr(value, false);
+ }
+ // eat home or end key whether we change the value or not
+ event.stop(e);
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/NumberTextBox.js b/lib/dijit/form/NumberTextBox.js
index a7cdb8201..dc7210589 100644
--- a/lib/dijit/form/NumberTextBox.js
+++ b/lib/dijit/form/NumberTextBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/NumberTextBox",["dojo/_base/declare","dojo/_base/lang","dojo/number","./RangeBoundTextBox"],function(_1,_2,_3,_4){var _5=_1("dijit.form.NumberTextBoxMixin",null,{regExpGen:_3.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:_3.format,postMixInProperties:function(){this.inherited(arguments);this._set("type","text");},_setConstraintsAttr:function(_6){var _7=typeof _6.places=="number"?_6.places:0;if(_7){_7++;}if(typeof _6.max!="number"){_6.max=9*Math.pow(10,15-_7);}if(typeof _6.min!="number"){_6.min=-9*Math.pow(10,15-_7);}this.inherited(arguments,[_6]);if(this.focusNode&&this.focusNode.value&&!isNaN(this.value)){this.set("value",this.value);}},_onFocus:function(){if(this.disabled){return;}var _8=this.get("value");if(typeof _8=="number"&&!isNaN(_8)){var _9=this.format(_8,this.constraints);if(_9!==undefined){this.textbox.value=_9;}}this.inherited(arguments);},format:function(_a,_b){var _c=String(_a);if(typeof _a!="number"){return _c;}if(isNaN(_a)){return "";}if(!("rangeCheck" in this&&this.rangeCheck(_a,_b))&&_b.exponent!==false&&/\de[-+]?\d/i.test(_c)){return _c;}if(this.editOptions&&this.focused){_b=_2.mixin({},_b,this.editOptions);}return this._formatter(_a,_b);},_parser:_3.parse,parse:function(_d,_e){var v=this._parser(_d,_2.mixin({},_e,(this.editOptions&&this.focused)?this.editOptions:{}));if(this.editOptions&&this.focused&&isNaN(v)){v=this._parser(_d,_e);}return v;},_getDisplayedValueAttr:function(){var v=this.inherited(arguments);return isNaN(v)?this.textbox.value:v;},filter:function(_f){return (_f===null||_f===""||_f===undefined)?NaN:this.inherited(arguments);},serialize:function(_10,_11){return (typeof _10!="number"||isNaN(_10))?"":this.inherited(arguments);},_setBlurValue:function(){var val=_2.hitch(_2.mixin({},this,{focused:true}),"get")("value");this._setValueAttr(val,true);},_setValueAttr:function(_12,_13,_14){if(_12!==undefined&&_14===undefined){_14=String(_12);if(typeof _12=="number"){if(isNaN(_12)){_14="";}else{if(("rangeCheck" in this&&this.rangeCheck(_12,this.constraints))||this.constraints.exponent===false||!/\de[-+]?\d/i.test(_14)){_14=undefined;}}}else{if(!_12){_14="";_12=NaN;}else{_12=undefined;}}}this.inherited(arguments,[_12,_13,_14]);},_getValueAttr:function(){var v=this.inherited(arguments);if(isNaN(v)&&this.textbox.value!==""){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)&&(new RegExp("^"+_3._realNumberRegexp(_2.mixin({},this.constraints))+"$").test(this.textbox.value))){var n=Number(this.textbox.value);return isNaN(n)?undefined:n;}else{return undefined;}}else{return v;}},isValid:function(_15){if(!this.focused||this._isEmpty(this.textbox.value)){return this.inherited(arguments);}else{var v=this.get("value");if(!isNaN(v)&&this.rangeCheck(v,this.constraints)){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)){return true;}else{return this.inherited(arguments);}}else{return false;}}}});var _16=_1("dijit.form.NumberTextBox",[_4,_5],{baseClass:"dijitTextBox dijitNumberTextBox"});_16.Mixin=_5;return _16;}); \ No newline at end of file
+define("dijit/form/NumberTextBox",["dojo/_base/declare","dojo/_base/lang","dojo/number","./RangeBoundTextBox"],function(_1,_2,_3,_4){var _5=_1("dijit.form.NumberTextBoxMixin",null,{pattern:_3.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:_3.format,postMixInProperties:function(){this.inherited(arguments);this._set("type","text");},_setConstraintsAttr:function(_6){var _7=typeof _6.places=="number"?_6.places:0;if(_7){_7++;}if(typeof _6.max!="number"){_6.max=9*Math.pow(10,15-_7);}if(typeof _6.min!="number"){_6.min=-9*Math.pow(10,15-_7);}this.inherited(arguments,[_6]);if(this.focusNode&&this.focusNode.value&&!isNaN(this.value)){this.set("value",this.value);}},_onFocus:function(){if(this.disabled){return;}var _8=this.get("value");if(typeof _8=="number"&&!isNaN(_8)){var _9=this.format(_8,this.constraints);if(_9!==undefined){this.textbox.value=_9;}}this.inherited(arguments);},format:function(_a,_b){var _c=String(_a);if(typeof _a!="number"){return _c;}if(isNaN(_a)){return "";}if(!("rangeCheck" in this&&this.rangeCheck(_a,_b))&&_b.exponent!==false&&/\de[-+]?\d/i.test(_c)){return _c;}if(this.editOptions&&this.focused){_b=_2.mixin({},_b,this.editOptions);}return this._formatter(_a,_b);},_parser:_3.parse,parse:function(_d,_e){var v=this._parser(_d,_2.mixin({},_e,(this.editOptions&&this.focused)?this.editOptions:{}));if(this.editOptions&&this.focused&&isNaN(v)){v=this._parser(_d,_e);}return v;},_getDisplayedValueAttr:function(){var v=this.inherited(arguments);return isNaN(v)?this.textbox.value:v;},filter:function(_f){return (_f==null||_f==="")?NaN:this.inherited(arguments);},serialize:function(_10,_11){return (typeof _10!="number"||isNaN(_10))?"":this.inherited(arguments);},_setBlurValue:function(){var val=_2.hitch(_2.mixin({},this,{focused:true}),"get")("value");this._setValueAttr(val,true);},_setValueAttr:function(_12,_13,_14){if(_12!==undefined&&_14===undefined){_14=String(_12);if(typeof _12=="number"){if(isNaN(_12)){_14="";}else{if(("rangeCheck" in this&&this.rangeCheck(_12,this.constraints))||this.constraints.exponent===false||!/\de[-+]?\d/i.test(_14)){_14=undefined;}}}else{if(!_12){_14="";_12=NaN;}else{_12=undefined;}}}this.inherited(arguments,[_12,_13,_14]);},_getValueAttr:function(){var v=this.inherited(arguments);if(isNaN(v)&&this.textbox.value!==""){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)&&(new RegExp("^"+_3._realNumberRegexp(_2.mixin({},this.constraints))+"$").test(this.textbox.value))){var n=Number(this.textbox.value);return isNaN(n)?undefined:n;}else{return undefined;}}else{return v;}},isValid:function(_15){if(!this.focused||this._isEmpty(this.textbox.value)){return this.inherited(arguments);}else{var v=this.get("value");if(!isNaN(v)&&this.rangeCheck(v,this.constraints)){if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)){return true;}else{return this.inherited(arguments);}}else{return false;}}}});var _16=_1("dijit.form.NumberTextBox",[_4,_5],{baseClass:"dijitTextBox dijitNumberTextBox"});_16.Mixin=_5;return _16;}); \ No newline at end of file
diff --git a/lib/dijit/form/NumberTextBox.js.uncompressed.js b/lib/dijit/form/NumberTextBox.js.uncompressed.js
new file mode 100644
index 000000000..6a7b7a24f
--- /dev/null
+++ b/lib/dijit/form/NumberTextBox.js.uncompressed.js
@@ -0,0 +1,275 @@
+define("dijit/form/NumberTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.hitch lang.mixin
+ "dojo/number", // number._realNumberRegexp number.format number.parse number.regexp
+ "./RangeBoundTextBox"
+], function(declare, lang, number, RangeBoundTextBox){
+
+ // module:
+ // dijit/form/NumberTextBox
+
+
+ var NumberTextBoxMixin = declare("dijit.form.NumberTextBoxMixin", null, {
+ // summary:
+ // A mixin for all number textboxes
+ // tags:
+ // protected
+
+ // Override ValidationTextBox.pattern.... we use a reg-ex generating function rather
+ // than a straight regexp to deal with locale (plus formatting options too?)
+ pattern: number.regexp,
+
+ /*=====
+ // constraints: NumberTextBox.__Constraints
+ // Despite the name, this parameter specifies both constraints on the input
+ // (including minimum/maximum allowed values) as well as
+ // formatting options like places (the number of digits to display after
+ // the decimal point).
+ constraints: {},
+ ======*/
+
+ // value: Number
+ // The value of this NumberTextBox as a Javascript Number (i.e., not a String).
+ // If the displayed value is blank, the value is NaN, and if the user types in
+ // an gibberish value (like "hello world"), the value is undefined
+ // (i.e. get('value') returns undefined).
+ //
+ // Symmetrically, set('value', NaN) will clear the displayed value,
+ // whereas set('value', undefined) will have no effect.
+ value: NaN,
+
+ // editOptions: [protected] Object
+ // Properties to mix into constraints when the value is being edited.
+ // This is here because we edit the number in the format "12345", which is
+ // different than the display value (ex: "12,345")
+ editOptions: { pattern: '#.######' },
+
+ /*=====
+ _formatter: function(value, options){
+ // summary:
+ // _formatter() is called by format(). It's the base routine for formatting a number,
+ // as a string, for example converting 12345 into "12,345".
+ // value: Number
+ // The number to be converted into a string.
+ // options: number.__FormatOptions?
+ // Formatting options
+ // tags:
+ // protected extension
+
+ return "12345"; // String
+ },
+ =====*/
+ _formatter: number.format,
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this._set("type", "text"); // in case type="number" was specified which messes up parse/format
+ },
+
+ _setConstraintsAttr: function(/*Object*/ constraints){
+ var places = typeof constraints.places == "number"? constraints.places : 0;
+ if(places){ places++; } // decimal rounding errors take away another digit of precision
+ if(typeof constraints.max != "number"){
+ constraints.max = 9 * Math.pow(10, 15-places);
+ }
+ if(typeof constraints.min != "number"){
+ constraints.min = -9 * Math.pow(10, 15-places);
+ }
+ this.inherited(arguments, [ constraints ]);
+ if(this.focusNode && this.focusNode.value && !isNaN(this.value)){
+ this.set('value', this.value);
+ }
+ },
+
+ _onFocus: function(){
+ if(this.disabled){ return; }
+ var val = this.get('value');
+ if(typeof val == "number" && !isNaN(val)){
+ var formattedValue = this.format(val, this.constraints);
+ if(formattedValue !== undefined){
+ this.textbox.value = formattedValue;
+ }
+ }
+ this.inherited(arguments);
+ },
+
+ format: function(/*Number*/ value, /*number.__FormatOptions*/ constraints){
+ // summary:
+ // Formats the value as a Number, according to constraints.
+ // tags:
+ // protected
+
+ var formattedValue = String(value);
+ if(typeof value != "number"){ return formattedValue; }
+ if(isNaN(value)){ return ""; }
+ // check for exponential notation that dojo/number.format() chokes on
+ if(!("rangeCheck" in this && this.rangeCheck(value, constraints)) && constraints.exponent !== false && /\de[-+]?\d/i.test(formattedValue)){
+ return formattedValue;
+ }
+ if(this.editOptions && this.focused){
+ constraints = lang.mixin({}, constraints, this.editOptions);
+ }
+ return this._formatter(value, constraints);
+ },
+
+ /*=====
+ _parser: function(value, constraints){
+ // summary:
+ // Parses the string value as a Number, according to constraints.
+ // value: String
+ // String representing a number
+ // constraints: number.__ParseOptions
+ // Formatting options
+ // tags:
+ // protected
+
+ return 123.45; // Number
+ },
+ =====*/
+ _parser: number.parse,
+
+ parse: function(/*String*/ value, /*number.__FormatOptions*/ constraints){
+ // summary:
+ // Replaceable function to convert a formatted string to a number value
+ // tags:
+ // protected extension
+
+ var v = this._parser(value, lang.mixin({}, constraints, (this.editOptions && this.focused) ? this.editOptions : {}));
+ if(this.editOptions && this.focused && isNaN(v)){
+ v = this._parser(value, constraints); // parse w/o editOptions: not technically needed but is nice for the user
+ }
+ return v;
+ },
+
+ _getDisplayedValueAttr: function(){
+ var v = this.inherited(arguments);
+ return isNaN(v) ? this.textbox.value : v;
+ },
+
+ filter: function(/*Number*/ value){
+ // summary:
+ // This is called with both the display value (string), and the actual value (a number).
+ // When called with the actual value it does corrections so that '' etc. are represented as NaN.
+ // Otherwise it dispatches to the superclass's filter() method.
+ //
+ // See `dijit/form/TextBox.filter()` for more details.
+ return (value == null /* or undefined */ || value === '') ? NaN : this.inherited(arguments); // set('value', null||''||undefined) should fire onChange(NaN)
+ },
+
+ serialize: function(/*Number*/ value, /*Object?*/ options){
+ // summary:
+ // Convert value (a Number) into a canonical string (ie, how the number literal is written in javascript/java/C/etc.)
+ // tags:
+ // protected
+ return (typeof value != "number" || isNaN(value)) ? '' : this.inherited(arguments);
+ },
+
+ _setBlurValue: function(){
+ var val = lang.hitch(lang.mixin({}, this, { focused: true }), "get")('value'); // parse with editOptions
+ this._setValueAttr(val, true);
+ },
+
+ _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // Hook so set('value', ...) works.
+ if(value !== undefined && formattedValue === undefined){
+ formattedValue = String(value);
+ if(typeof value == "number"){
+ if(isNaN(value)){ formattedValue = '' }
+ // check for exponential notation that number.format chokes on
+ else if(("rangeCheck" in this && this.rangeCheck(value, this.constraints)) || this.constraints.exponent === false || !/\de[-+]?\d/i.test(formattedValue)){
+ formattedValue = undefined; // lets format compute a real string value
+ }
+ }else if(!value){ // 0 processed in if branch above, ''|null|undefined flows through here
+ formattedValue = '';
+ value = NaN;
+ }else{ // non-numeric values
+ value = undefined;
+ }
+ }
+ this.inherited(arguments, [value, priorityChange, formattedValue]);
+ },
+
+ _getValueAttr: function(){
+ // summary:
+ // Hook so get('value') works.
+ // Returns Number, NaN for '', or undefined for unparseable text
+ var v = this.inherited(arguments); // returns Number for all values accepted by parse() or NaN for all other displayed values
+
+ // If the displayed value of the textbox is gibberish (ex: "hello world"), this.inherited() above
+ // returns NaN; this if() branch converts the return value to undefined.
+ // Returning undefined prevents user text from being overwritten when doing _setValueAttr(_getValueAttr()).
+ // A blank displayed value is still returned as NaN.
+ if(isNaN(v) && this.textbox.value !== ''){
+ if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value) && (new RegExp("^"+number._realNumberRegexp(lang.mixin({}, this.constraints))+"$").test(this.textbox.value))){ // check for exponential notation that parse() rejected (erroneously?)
+ var n = Number(this.textbox.value);
+ return isNaN(n) ? undefined : n; // return exponential Number or undefined for random text (may not be possible to do with the above RegExp check)
+ }else{
+ return undefined; // gibberish
+ }
+ }else{
+ return v; // Number or NaN for ''
+ }
+ },
+
+ isValid: function(/*Boolean*/ isFocused){
+ // Overrides dijit/form/RangeBoundTextBox.isValid() to check that the editing-mode value is valid since
+ // it may not be formatted according to the regExp validation rules
+ if(!this.focused || this._isEmpty(this.textbox.value)){
+ return this.inherited(arguments);
+ }else{
+ var v = this.get('value');
+ if(!isNaN(v) && this.rangeCheck(v, this.constraints)){
+ if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value)){ // exponential, parse doesn't like it
+ return true; // valid exponential number in range
+ }else{
+ return this.inherited(arguments);
+ }
+ }else{
+ return false;
+ }
+ }
+ }
+ });
+
+ var NumberTextBox = declare("dijit.form.NumberTextBox", [RangeBoundTextBox, NumberTextBoxMixin], {
+ // summary:
+ // A TextBox for entering numbers, with formatting and range checking
+ // description:
+ // NumberTextBox is a textbox for entering and displaying numbers, supporting
+ // the following main features:
+ //
+ // 1. Enforce minimum/maximum allowed values (as well as enforcing that the user types
+ // a number rather than a random string)
+ // 2. NLS support (altering roles of comma and dot as "thousands-separator" and "decimal-point"
+ // depending on locale).
+ // 3. Separate modes for editing the value and displaying it, specifically that
+ // the thousands separator character (typically comma) disappears when editing
+ // but reappears after the field is blurred.
+ // 4. Formatting and constraints regarding the number of places (digits after the decimal point)
+ // allowed on input, and number of places displayed when blurred (see `constraints` parameter).
+
+ baseClass: "dijitTextBox dijitNumberTextBox"
+ });
+
+ NumberTextBox.Mixin = NumberTextBoxMixin; // for monkey patching
+
+ /*=====
+ NumberTextBox.__Constraints = declare([RangeBoundTextBox.__Constraints, number.__FormatOptions, number.__ParseOptions], {
+ // summary:
+ // Specifies both the rules on valid/invalid values (minimum, maximum,
+ // number of required decimal places), and also formatting options for
+ // displaying the value when the field is not focused.
+ // example:
+ // Minimum/maximum:
+ // To specify a field between 0 and 120:
+ // | {min:0,max:120}
+ // To specify a field that must be an integer:
+ // | {fractional:false}
+ // To specify a field where 0 to 3 decimal places are allowed on input:
+ // | {places:'0,3'}
+ });
+ =====*/
+
+ return NumberTextBox;
+});
diff --git a/lib/dijit/form/RadioButton.js.uncompressed.js b/lib/dijit/form/RadioButton.js.uncompressed.js
new file mode 100644
index 000000000..a7f723bd0
--- /dev/null
+++ b/lib/dijit/form/RadioButton.js.uncompressed.js
@@ -0,0 +1,16 @@
+define("dijit/form/RadioButton", [
+ "dojo/_base/declare", // declare
+ "./CheckBox",
+ "./_RadioButtonMixin"
+], function(declare, CheckBox, _RadioButtonMixin){
+
+ // module:
+ // dijit/form/RadioButton
+
+ return declare("dijit.form.RadioButton", [CheckBox, _RadioButtonMixin], {
+ // summary:
+ // Same as an HTML radio, but with fancy styling.
+
+ baseClass: "dijitRadio"
+ });
+});
diff --git a/lib/dijit/form/RangeBoundTextBox.js b/lib/dijit/form/RangeBoundTextBox.js
index fc57a034b..4c8e13aad 100644
--- a/lib/dijit/form/RangeBoundTextBox.js
+++ b/lib/dijit/form/RangeBoundTextBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/RangeBoundTextBox",["dojo/_base/declare","dojo/i18n","./MappedTextBox"],function(_1,_2,_3){return _1("dijit.form.RangeBoundTextBox",_3,{rangeMessage:"",rangeCheck:function(_4,_5){return ("min" in _5?(this.compare(_4,_5.min)>=0):true)&&("max" in _5?(this.compare(_4,_5.max)<=0):true);},isInRange:function(){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var _6=this.get("value");var _7=false;var _8=false;if("min" in this.constraints){var _9=this.constraints.min;_9=this.compare(_6,((typeof _9=="number")&&_9>=0&&_6!=0)?0:_9);_7=(typeof _9=="number")&&_9<0;}if("max" in this.constraints){var _a=this.constraints.max;_a=this.compare(_6,((typeof _a!="number")||_a>0)?_a:0);_8=(typeof _a=="number")&&_a>0;}return _7||_8;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_b){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_b));},getErrorMessage:function(_c){var v=this.get("value");if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_c)){return this.rangeMessage;}return this.inherited(arguments);},postMixInProperties:function(){this.inherited(arguments);if(!this.rangeMessage){this.messages=_2.getLocalization("dijit.form","validate",this.lang);this.rangeMessage=this.messages.rangeMessage;}},_setConstraintsAttr:function(_d){this.inherited(arguments);if(this.focusNode){if(this.constraints.min!==undefined){this.focusNode.setAttribute("aria-valuemin",this.constraints.min);}else{this.focusNode.removeAttribute("aria-valuemin");}if(this.constraints.max!==undefined){this.focusNode.setAttribute("aria-valuemax",this.constraints.max);}else{this.focusNode.removeAttribute("aria-valuemax");}}},_setValueAttr:function(_e,_f){this.focusNode.setAttribute("aria-valuenow",_e);this.inherited(arguments);},applyTextDir:function(){}});}); \ No newline at end of file
+define("dijit/form/RangeBoundTextBox",["dojo/_base/declare","dojo/i18n","./MappedTextBox"],function(_1,_2,_3){var _4=_1("dijit.form.RangeBoundTextBox",_3,{rangeMessage:"",rangeCheck:function(_5,_6){return ("min" in _6?(this.compare(_5,_6.min)>=0):true)&&("max" in _6?(this.compare(_5,_6.max)<=0):true);},isInRange:function(){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var _7=this.get("value");if(_7==null){return false;}var _8=false;if("min" in this.constraints){var _9=this.constraints.min;_8=this.compare(_7,((typeof _9=="number")&&_9>=0&&_7!=0)?0:_9)<0;}if(!_8&&("max" in this.constraints)){var _a=this.constraints.max;_8=this.compare(_7,((typeof _a!="number")||_a>0)?_a:0)>0;}return _8;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_b){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_b));},getErrorMessage:function(_c){var v=this.get("value");if(v!=null&&v!==""&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_c)){return this.rangeMessage;}return this.inherited(arguments);},postMixInProperties:function(){this.inherited(arguments);if(!this.rangeMessage){this.messages=_2.getLocalization("dijit.form","validate",this.lang);this.rangeMessage=this.messages.rangeMessage;}},applyTextDir:function(){}});return _4;}); \ No newline at end of file
diff --git a/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js
new file mode 100644
index 000000000..f617df512
--- /dev/null
+++ b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js
@@ -0,0 +1,110 @@
+define("dijit/form/RangeBoundTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/i18n", // i18n.getLocalization
+ "./MappedTextBox"
+], function(declare, i18n, MappedTextBox){
+
+ // module:
+ // dijit/form/RangeBoundTextBox
+
+
+ var RangeBoundTextBox = declare("dijit.form.RangeBoundTextBox", MappedTextBox, {
+ // summary:
+ // Base class for textbox form widgets which defines a range of valid values.
+
+ // rangeMessage: String
+ // The message to display if value is out-of-range
+ rangeMessage: "",
+
+ /*=====
+ // constraints: RangeBoundTextBox.__Constraints
+ constraints: {},
+ ======*/
+
+ rangeCheck: function(/*Number*/ primitive, /*dijit/form/RangeBoundTextBox.__Constraints*/ constraints){
+ // summary:
+ // Overridable function used to validate the range of the numeric input value.
+ // tags:
+ // protected
+ return ("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) &&
+ ("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean
+ },
+
+ isInRange: function(/*Boolean*/ /*===== isFocused =====*/){
+ // summary:
+ // Tests if the value is in the min/max range specified in constraints
+ // tags:
+ // protected
+ return this.rangeCheck(this.get('value'), this.constraints);
+ },
+
+ _isDefinitelyOutOfRange: function(){
+ // summary:
+ // Returns true if the value is out of range and will remain
+ // out of range even if the user types more characters
+ var val = this.get('value');
+ if(val == null){ return false; } // not yet valid enough to compare to
+ var outOfRange = false;
+ if("min" in this.constraints){
+ var min = this.constraints.min;
+ outOfRange = this.compare(val, ((typeof min == "number") && min >= 0 && val != 0) ? 0 : min) < 0;
+ }
+ if(!outOfRange && ("max" in this.constraints)){
+ var max = this.constraints.max;
+ outOfRange = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0) > 0;
+ }
+ return outOfRange;
+ },
+
+ _isValidSubset: function(){
+ // summary:
+ // Overrides `dijit/form/ValidationTextBox._isValidSubset()`.
+ // Returns true if the input is syntactically valid, and either within
+ // range or could be made in range by more typing.
+ return this.inherited(arguments) && !this._isDefinitelyOutOfRange();
+ },
+
+ isValid: function(/*Boolean*/ isFocused){
+ // Overrides dijit/form/ValidationTextBox.isValid() to check that the value is also in range.
+ return this.inherited(arguments) &&
+ ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean
+ },
+
+ getErrorMessage: function(/*Boolean*/ isFocused){
+ // Overrides dijit/form/ValidationTextBox.getErrorMessage() to print "out of range" message if appropriate
+ var v = this.get('value');
+ if(v != null /* and !undefined */ && v !== '' && (typeof v != "number" || !isNaN(v)) && !this.isInRange(isFocused)){ // don't check isInRange w/o a real value
+ return this.rangeMessage; // String
+ }
+ return this.inherited(arguments);
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ if(!this.rangeMessage){
+ this.messages = i18n.getLocalization("dijit.form", "validate", this.lang);
+ this.rangeMessage = this.messages.rangeMessage;
+ }
+ },
+
+ applyTextDir: function(/*===== element, text =====*/){
+ // summary:
+ // The function overridden in the _BidiSupport module,
+ // originally used for setting element.dir according to this.textDir.
+ // In this case does nothing.
+ // element: Object
+ // text: String
+ // tags:
+ // protected.
+ }
+ });
+ /*=====
+ RangeBoundTextBox.__Constraints = declare(null, {
+ // min: Number
+ // Minimum signed value. Default is -Infinity
+ // max: Number
+ // Maximum signed value. Default is +Infinity
+ });
+ =====*/
+ return RangeBoundTextBox;
+});
diff --git a/lib/dijit/form/Select.js b/lib/dijit/form/Select.js
index 8322b015e..4fcf7e711 100644
--- a/lib/dijit/form/Select.js
+++ b/lib/dijit/form/Select.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/Select.html":"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdata-dojo-attach-point=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitArrowButtonInner\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitArrowButtonChar\" role=\"presentation\">&#9660;</div\n\t\t></td\n\t></tr></tbody\n></table>\n"}});define("dijit/form/Select",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/event","dojo/i18n","dojo/_base/lang","./_FormSelectWidget","../_HasDropDown","../Menu","../MenuItem","../MenuSeparator","../Tooltip","dojo/text!./templates/Select.html","dojo/i18n!./nls/validate"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit.form._SelectMenu",_c,{buildRendering:function(){this.inherited(arguments);var o=(this.menuTableNode=this.domNode);var n=(this.domNode=_5.create("div",{style:{overflowX:"hidden",overflowY:"scroll"}}));if(o.parentNode){o.parentNode.replaceChild(n,o);}_4.remove(o,"dijitMenuTable");n.className=o.className+" dijitSelectMenu";o.className="dijitReset dijitMenuTable";o.setAttribute("role","listbox");n.setAttribute("role","presentation");n.appendChild(o);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_7.stop);},resize:function(mb){if(mb){_6.setMarginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});var _12=_2("dijit.form.Select",[_a,_b],{baseClass:"dijitSelect",templateString:_10,required:false,state:"",message:"",tooltipPosition:[],emptyLabel:"&#160;",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex||0;this.value=this.options[si>=0?si:0].value;}this.dropDown=new _11({id:this.id+"_menu"});_4.add(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_13){if(!_13.value&&!_13.label){return new _e();}else{var _14=_9.hitch(this,"_setValueAttr",_13);var _15=new _d({option:_13,label:_13.label||this.emptyLabel,onClick:_14,disabled:_13.disabled||false});_15.focusNode.setAttribute("role","listitem");return _15;}},_addOptionItem:function(_16){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_16));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_17){if(_17===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{_1.forEach(this._getChildren(),function(_18){_18.destroyRecursive();});var _19=new _d({label:"&#160;"});this.dropDown.addChild(_19);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_1a){this.inherited(arguments);_3.set(this.valueNode,"value",this.get("value"));this.validate(this.focused);},_setDisabledAttr:function(_1b){this.inherited(arguments);this.validate(this.focused);},_setRequiredAttr:function(_1c){this._set("required",_1c);this.focusNode.setAttribute("aria-required",_1c);this.validate(this.focused);},_setDisplay:function(_1d){var lbl=_1d||this.emptyLabel;this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+lbl+"</span>";this.focusNode.setAttribute("aria-valuetext",lbl);},validate:function(_1e){var _1f=this.disabled||this.isValid(_1e);this._set("state",_1f?"":"Incomplete");this.focusNode.setAttribute("aria-invalid",_1f?"false":"true");var _20=_1f?"":this._missingMsg;if(_20&&this.focused&&this._hasBeenBlurred){_f.show(_20,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_f.hide(this.domNode);}this._set("message",_20);return _1f;},isValid:function(){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);_f.hide(this.domNode);this.validate(this.focused);},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=_8.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_7.stop);},_setStyleAttr:function(_21){this.inherited(arguments);_4.toggle(this.domNode,this.baseClass+"FixedWidth",!!this.domNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_22){this._loadChildren(true);this._isLoaded=true;_22();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_23){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_23);delete this.dropDown;}this.inherited(arguments);},_onFocus:function(){this.validate(true);this.inherited(arguments);},_onBlur:function(){_f.hide(this.domNode);this.inherited(arguments);}});_12._Menu=_11;return _12;}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/Select.html":"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdata-dojo-attach-point=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"listbox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitInputField dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitValidationContainer\"\n\t\t\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t/></div\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td\n\t\t><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer\"\n\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\n\t\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t${_buttonInputDisabled}\n\t\t/></td\n\t></tr></tbody\n></table>\n"}});define("dijit/form/Select",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/_base/event","dojo/i18n","dojo/_base/lang","dojo/sniff","./_FormSelectWidget","../_HasDropDown","../Menu","../MenuItem","../MenuSeparator","../Tooltip","dojo/text!./templates/Select.html","dojo/i18n!./nls/validate"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit.form._SelectMenu",_c,{autoFocus:true,buildRendering:function(){this.inherited(arguments);var o=(this.menuTableNode=this.domNode);var n=(this.domNode=this.ownerDocument.createElement("div"));n.style.cssText="overflow-x: hidden; overflow-y: scroll";if(o.parentNode){o.parentNode.replaceChild(n,o);}_4.remove(o,"dijitMenuTable");n.className=o.className+" dijitSelectMenu";o.className="dijitReset dijitMenuTable";o.setAttribute("role","listbox");n.setAttribute("role","presentation");n.appendChild(o);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onselectstart",_6.stop);},focus:function(){var _12=false,val=this.parentWidget.value;if(_8.isArray(val)){val=val[val.length-1];}if(val){_1.forEach(this.parentWidget._getChildren(),function(_13){if(_13.option&&(val===_13.option.value)){_12=true;this.focusChild(_13,false);}},this);}if(!_12){this.inherited(arguments);}},resize:function(mb){if(mb){_5.setMarginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});var _14=_2("dijit.form.Select",[_a,_b],{baseClass:"dijitSelect dijitValidationTextBox",templateString:_10,_buttonInputDisabled:_9("ie")?"disabled":"",required:false,state:"",message:"",tooltipPosition:[],emptyLabel:"&#160;",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex||0;this.value=this.options[si>=0?si:0].value;}this.dropDown=new _11({id:this.id+"_menu",parentWidget:this});_4.add(this.dropDown.domNode,this.baseClass.replace(/\s+|$/g,"Menu "));},_getMenuItemForOption:function(_15){if(!_15.value&&!_15.label){return new _e({ownerDocument:this.ownerDocument});}else{var _16=_8.hitch(this,"_setValueAttr",_15);var _17=new _d({option:_15,label:_15.label||this.emptyLabel,onClick:_16,ownerDocument:this.ownerDocument,dir:this.dir,disabled:_15.disabled||false});_17.focusNode.setAttribute("role","option");return _17;}},_addOptionItem:function(_18){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_18));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_19){if(_19===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{_1.forEach(this._getChildren(),function(_1a){_1a.destroyRecursive();});var _1b=new _d({ownerDocument:this.ownerDocument,label:this.emptyLabel});this.dropDown.addChild(_1b);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value,false);}},_refreshState:function(){if(this._started){this.validate(this.focused);}},startup:function(){this.inherited(arguments);this._refreshState();},_setValueAttr:function(_1c){this.inherited(arguments);_3.set(this.valueNode,"value",this.get("value"));this._refreshState();},_setDisabledAttr:function(_1d){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_1e){this._set("required",_1e);this.focusNode.setAttribute("aria-required",_1e);this._refreshState();},_setOptionsAttr:function(_1f){this._isLoaded=false;this._set("options",_1f);},_setDisplay:function(_20){var lbl=_20||this.emptyLabel;this.containerNode.innerHTML="<span role=\"option\" class=\"dijitReset dijitInline "+this.baseClass.replace(/\s+|$/g,"Label ")+"\">"+lbl+"</span>";},validate:function(_21){var _22=this.disabled||this.isValid(_21);this._set("state",_22?"":(this._hasBeenBlurred?"Error":"Incomplete"));this.focusNode.setAttribute("aria-invalid",_22?"false":"true");var _23=_22?"":this._missingMsg;if(_23&&this.focused&&this._hasBeenBlurred){_f.show(_23,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_f.hide(this.domNode);}this._set("message",_23);return _22;},isValid:function(){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);_f.hide(this.domNode);this._refreshState();},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=_7.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onselectstart",_6.stop);this.domNode.setAttribute("aria-expanded","false");if(_9("ie")<9){this.defer(function(){try{var s=domStyle.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _24=this.domNode.getElementsByTagName("INPUT");if(_24){for(var i=0;i<_24.length;i++){_24[i].style.fontFamily=ff;}}}}}catch(e){}});}},_setStyleAttr:function(_25){this.inherited(arguments);_4.toggle(this.domNode,this.baseClass.replace(/\s+|$/g,"FixedWidth "),!!this.domNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_26){this._loadChildren(true);this._isLoaded=true;_26();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},destroy:function(_27){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_27);delete this.dropDown;}this.inherited(arguments);},_onFocus:function(){this.validate(true);this.inherited(arguments);},_onBlur:function(){_f.hide(this.domNode);this.inherited(arguments);this.validate(false);}});_14._Menu=_11;return _14;}); \ No newline at end of file
diff --git a/lib/dijit/form/Select.js.uncompressed.js b/lib/dijit/form/Select.js.uncompressed.js
new file mode 100644
index 000000000..43c45960a
--- /dev/null
+++ b/lib/dijit/form/Select.js.uncompressed.js
@@ -0,0 +1,406 @@
+require({cache:{
+'url:dijit/form/templates/Select.html':"<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdata-dojo-attach-point=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"listbox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents\" role=\"presentation\"\n\t\t\t><div class=\"dijitReset dijitInputField dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitValidationContainer\"\n\t\t\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t/></div\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td\n\t\t><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer\"\n\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\n\t\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t${_buttonInputDisabled}\n\t\t/></td\n\t></tr></tbody\n></table>\n"}});
+define("dijit/form/Select", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.add domClass.remove domClass.toggle
+ "dojo/dom-geometry", // domGeometry.setMarginBox
+ "dojo/_base/event", // event.stop
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("ie")
+ "./_FormSelectWidget",
+ "../_HasDropDown",
+ "../Menu",
+ "../MenuItem",
+ "../MenuSeparator",
+ "../Tooltip",
+ "dojo/text!./templates/Select.html",
+ "dojo/i18n!./nls/validate"
+], function(array, declare, domAttr, domClass, domGeometry, event, i18n, lang, has,
+ _FormSelectWidget, _HasDropDown, Menu, MenuItem, MenuSeparator, Tooltip, template){
+
+// module:
+// dijit/form/Select
+
+
+var _SelectMenu = declare("dijit.form._SelectMenu", Menu, {
+ // summary:
+ // An internally-used menu for dropdown that allows us a vertical scrollbar
+
+ // Override Menu.autoFocus setting so that opening a Select highlights the current value.
+ autoFocus: true,
+
+ buildRendering: function(){
+ // summary:
+ // Stub in our own changes, so that our domNode is not a table
+ // otherwise, we won't respond correctly to heights/overflows
+ this.inherited(arguments);
+ var o = (this.menuTableNode = this.domNode);
+ var n = (this.domNode = this.ownerDocument.createElement("div"));
+ n.style.cssText = "overflow-x: hidden; overflow-y: scroll";
+ if(o.parentNode){
+ o.parentNode.replaceChild(n, o);
+ }
+ domClass.remove(o, "dijitMenuTable");
+ n.className = o.className + " dijitSelectMenu";
+ o.className = "dijitReset dijitMenuTable";
+ o.setAttribute("role", "listbox");
+ n.setAttribute("role", "presentation");
+ n.appendChild(o);
+ },
+
+ postCreate: function(){
+ // summary:
+ // stop mousemove from selecting text on IE to be consistent with other browsers
+
+ this.inherited(arguments);
+
+ this.connect(this.domNode, "onselectstart", event.stop);
+ },
+
+
+ focus: function(){
+ // summary:
+ // Overridden so that the previously selected value will be focused instead of only the first item
+ var found = false,
+ val = this.parentWidget.value;
+ if(lang.isArray(val)){
+ val = val[val.length-1];
+ }
+ if(val){ // if focus selected
+ array.forEach(this.parentWidget._getChildren(), function(child){
+ if(child.option && (val === child.option.value)){ // find menu item widget with this value
+ found = true;
+ this.focusChild(child, false); // focus previous selection
+ }
+ }, this);
+ }
+ if(!found){
+ this.inherited(arguments); // focus first item by default
+ }
+ },
+
+ resize: function(/*Object*/ mb){
+ // summary:
+ // Overridden so that we are able to handle resizing our
+ // internal widget. Note that this is not a "full" resize
+ // implementation - it only works correctly if you pass it a
+ // marginBox.
+ //
+ // mb: Object
+ // The margin box to set this dropdown to.
+ if(mb){
+ domGeometry.setMarginBox(this.domNode, mb);
+ if("w" in mb){
+ // We've explicitly set the wrapper <div>'s width, so set <table> width to match.
+ // 100% is safer than a pixel value because there may be a scroll bar with
+ // browser/OS specific width.
+ this.menuTableNode.style.width = "100%";
+ }
+ }
+ }
+});
+
+var Select = declare("dijit.form.Select", [_FormSelectWidget, _HasDropDown], {
+ // summary:
+ // This is a "styleable" select box - it is basically a DropDownButton which
+ // can take a `<select>` as its input.
+
+ baseClass: "dijitSelect dijitValidationTextBox",
+
+ templateString: template,
+
+ _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events
+
+ // required: Boolean
+ // Can be true or false, default is false.
+ required: false,
+
+ // state: [readonly] String
+ // "Incomplete" if this select is required but unset (i.e. blank value), "" otherwise
+ state: "",
+
+ // message: String
+ // Currently displayed error/prompt message
+ message: "",
+
+ // tooltipPosition: String[]
+ // See description of `dijit/Tooltip.defaultPosition` for details on this parameter.
+ tooltipPosition: [],
+
+ // emptyLabel: string
+ // What to display in an "empty" dropdown
+ emptyLabel: "&#160;", // &nbsp;
+
+ // _isLoaded: Boolean
+ // Whether or not we have been loaded
+ _isLoaded: false,
+
+ // _childrenLoaded: Boolean
+ // Whether or not our children have been loaded
+ _childrenLoaded: false,
+
+ _fillContent: function(){
+ // summary:
+ // Set the value to be the first, or the selected index
+ this.inherited(arguments);
+ // set value from selected option
+ if(this.options.length && !this.value && this.srcNodeRef){
+ var si = this.srcNodeRef.selectedIndex || 0; // || 0 needed for when srcNodeRef is not a SELECT
+ this.value = this.options[si >= 0 ? si : 0].value;
+ }
+ // Create the dropDown widget
+ this.dropDown = new _SelectMenu({ id: this.id + "_menu", parentWidget: this });
+ domClass.add(this.dropDown.domNode, this.baseClass.replace(/\s+|$/g, "Menu "));
+ },
+
+ _getMenuItemForOption: function(/*_FormSelectWidget.__SelectOption*/ option){
+ // summary:
+ // For the given option, return the menu item that should be
+ // used to display it. This can be overridden as needed
+ if(!option.value && !option.label){
+ // We are a separator (no label set for it)
+ return new MenuSeparator({ownerDocument: this.ownerDocument});
+ }else{
+ // Just a regular menu option
+ var click = lang.hitch(this, "_setValueAttr", option);
+ var item = new MenuItem({
+ option: option,
+ label: option.label || this.emptyLabel,
+ onClick: click,
+ ownerDocument: this.ownerDocument,
+ dir: this.dir,
+ disabled: option.disabled || false
+ });
+ item.focusNode.setAttribute("role", "option");
+ return item;
+ }
+ },
+
+ _addOptionItem: function(/*_FormSelectWidget.__SelectOption*/ option){
+ // summary:
+ // For the given option, add an option to our dropdown.
+ // If the option doesn't have a value, then a separator is added
+ // in that place.
+ if(this.dropDown){
+ this.dropDown.addChild(this._getMenuItemForOption(option));
+ }
+ },
+
+ _getChildren: function(){
+ if(!this.dropDown){
+ return [];
+ }
+ return this.dropDown.getChildren();
+ },
+
+ _loadChildren: function(/*Boolean*/ loadMenuItems){
+ // summary:
+ // Resets the menu and the length attribute of the button - and
+ // ensures that the label is appropriately set.
+ // loadMenuItems: Boolean
+ // actually loads the child menu items - we only do this when we are
+ // populating for showing the dropdown.
+
+ if(loadMenuItems === true){
+ // this.inherited destroys this.dropDown's child widgets (MenuItems).
+ // Avoid this.dropDown (Menu widget) having a pointer to a destroyed widget (which will cause
+ // issues later in _setSelected). (see #10296)
+ if(this.dropDown){
+ delete this.dropDown.focusedChild;
+ }
+ if(this.options.length){
+ this.inherited(arguments);
+ }else{
+ // Drop down menu is blank but add one blank entry just so something appears on the screen
+ // to let users know that they are no choices (mimicing native select behavior)
+ array.forEach(this._getChildren(), function(child){ child.destroyRecursive(); });
+ var item = new MenuItem({
+ ownerDocument: this.ownerDocument,
+ label: this.emptyLabel
+ });
+ this.dropDown.addChild(item);
+ }
+ }else{
+ this._updateSelection();
+ }
+
+ this._isLoaded = false;
+ this._childrenLoaded = true;
+
+ if(!this._loadingStore){
+ // Don't call this if we are loading - since we will handle it later
+ this._setValueAttr(this.value, false);
+ }
+ },
+
+ _refreshState: function(){
+ if(this._started){
+ this.validate(this.focused);
+ }
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ this._refreshState(); // after all _set* methods have run
+ },
+
+ _setValueAttr: function(value){
+ this.inherited(arguments);
+ domAttr.set(this.valueNode, "value", this.get("value"));
+ this._refreshState(); // to update this.state
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ value){
+ this.inherited(arguments);
+ this._refreshState(); // to update this.state
+ },
+
+ _setRequiredAttr: function(/*Boolean*/ value){
+ this._set("required", value);
+ this.focusNode.setAttribute("aria-required", value);
+ this._refreshState(); // to update this.state
+ },
+
+ _setOptionsAttr: function(/*Array*/ options){
+ this._isLoaded = false;
+ this._set('options', options);
+ },
+
+ _setDisplay: function(/*String*/ newDisplay){
+ // summary:
+ // sets the display for the given value (or values)
+ var lbl = newDisplay || this.emptyLabel;
+ this.containerNode.innerHTML = '<span role="option" class="dijitReset dijitInline ' + this.baseClass.replace(/\s+|$/g, "Label ")+'">' + lbl + '</span>';
+ },
+
+ validate: function(/*Boolean*/ isFocused){
+ // summary:
+ // Called by oninit, onblur, and onkeypress, and whenever required/disabled state changes
+ // description:
+ // Show missing or invalid messages if appropriate, and highlight textbox field.
+ // Used when a select is initially set to no value and the user is required to
+ // set the value.
+
+ var isValid = this.disabled || this.isValid(isFocused);
+ this._set("state", isValid ? "" : (this._hasBeenBlurred ? "Error" : "Incomplete"));
+ this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");
+ var message = isValid ? "" : this._missingMsg;
+ if(message && this.focused && this._hasBeenBlurred){
+ Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
+ }else{
+ Tooltip.hide(this.domNode);
+ }
+ this._set("message", message);
+ return isValid;
+ },
+
+ isValid: function(/*Boolean*/ /*===== isFocused =====*/){
+ // summary:
+ // Whether or not this is a valid value. The only way a Select
+ // can be invalid is when it's required but nothing is selected.
+ return (!this.required || this.value === 0 || !(/^\s*$/.test(this.value || ""))); // handle value is null or undefined
+ },
+
+ reset: function(){
+ // summary:
+ // Overridden so that the state will be cleared.
+ this.inherited(arguments);
+ Tooltip.hide(this.domNode);
+ this._refreshState(); // to update this.state
+ },
+
+ postMixInProperties: function(){
+ // summary:
+ // set the missing message
+ this.inherited(arguments);
+ this._missingMsg = i18n.getLocalization("dijit.form", "validate", this.lang).missingMessage;
+ },
+
+ postCreate: function(){
+ // summary:
+ // stop mousemove from selecting text on IE to be consistent with other browsers
+
+ this.inherited(arguments);
+
+ this.connect(this.domNode, "onselectstart", event.stop);
+ this.domNode.setAttribute("aria-expanded", "false");
+
+ if(has("ie") < 9){
+ // IE INPUT tag fontFamily has to be set directly using STYLE
+ // the defer gives IE a chance to render the TextBox and to deal with font inheritance
+ this.defer(function(){
+ try{
+ var s = domStyle.getComputedStyle(this.domNode); // can throw an exception if widget is immediately destroyed
+ if(s){
+ var ff = s.fontFamily;
+ if(ff){
+ var inputs = this.domNode.getElementsByTagName("INPUT");
+ if(inputs){
+ for(var i=0; i < inputs.length; i++){
+ inputs[i].style.fontFamily = ff;
+ }
+ }
+ }
+ }
+ }catch(e){/*when used in a Dialog, and this is called before the dialog is
+ shown, s.fontFamily would trigger "Invalid Argument" error.*/}
+ });
+ }
+ },
+
+ _setStyleAttr: function(/*String||Object*/ value){
+ this.inherited(arguments);
+ domClass.toggle(this.domNode, this.baseClass.replace(/\s+|$/g, "FixedWidth "), !!this.domNode.style.width);
+ },
+
+ isLoaded: function(){
+ return this._isLoaded;
+ },
+
+ loadDropDown: function(/*Function*/ loadCallback){
+ // summary:
+ // populates the menu
+ this._loadChildren(true);
+ this._isLoaded = true;
+ loadCallback();
+ },
+
+ closeDropDown: function(){
+ // overriding _HasDropDown.closeDropDown()
+ this.inherited(arguments);
+
+ if(this.dropDown && this.dropDown.menuTableNode){
+ // Erase possible width: 100% setting from _SelectMenu.resize().
+ // Leaving it would interfere with the next openDropDown() call, which
+ // queries the natural size of the drop down.
+ this.dropDown.menuTableNode.style.width = "";
+ }
+ },
+
+ destroy: function(preserveDom){
+ if(this.dropDown && !this.dropDown._destroyed){
+ this.dropDown.destroyRecursive(preserveDom);
+ delete this.dropDown;
+ }
+ this.inherited(arguments);
+ },
+
+ _onFocus: function(){
+ this.validate(true); // show tooltip if second focus of required tooltip, but no selection
+ this.inherited(arguments);
+ },
+
+ _onBlur: function(){
+ Tooltip.hide(this.domNode);
+ this.inherited(arguments);
+ this.validate(false);
+ }
+});
+
+Select._Menu = _SelectMenu; // for monkey patching
+
+return Select;
+});
diff --git a/lib/dijit/form/SimpleTextarea.js b/lib/dijit/form/SimpleTextarea.js
index 41c701937..5bb90f9be 100644
--- a/lib/dijit/form/SimpleTextarea.js
+++ b/lib/dijit/form/SimpleTextarea.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/SimpleTextarea",["dojo/_base/declare","dojo/dom-class","dojo/_base/sniff","dojo/_base/window","./TextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.SimpleTextarea",_5,{baseClass:"dijitTextBox dijitTextArea",rows:"3",cols:"20",templateString:"<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){if(!this.value&&this.srcNodeRef){this.value=this.srcNodeRef.value;}this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);if(_3("ie")&&this.cols){_2.add(this.textbox,"dijitTextAreaCols");}},filter:function(_6){if(_6){_6=_6.replace(/\r/g,"");}return this.inherited(arguments);},_onInput:function(e){if(this.maxLength){var _7=parseInt(this.maxLength);var _8=this.textbox.value.replace(/\r/g,"");var _9=_8.length-_7;if(_9>0){var _a=this.textbox;if(_a.selectionStart){var _b=_a.selectionStart;var cr=0;if(_3("opera")){cr=(this.textbox.value.substring(0,_b).match(/\r/g)||[]).length;}this.textbox.value=_8.substring(0,_b-_9-cr)+_8.substring(_b-cr);_a.setSelectionRange(_b-_9,_b-_9);}else{if(_4.doc.selection){_a.focus();var _c=_4.doc.selection.createRange();_c.moveStart("character",-_9);_c.text="";_c.select();}}}}this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/SimpleTextarea",["dojo/_base/declare","dojo/dom-class","dojo/sniff","./TextBox"],function(_1,_2,_3,_4){return _1("dijit.form.SimpleTextarea",_4,{baseClass:"dijitTextBox dijitTextArea",rows:"3",cols:"20",templateString:"<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){if(!this.value&&this.srcNodeRef){this.value=this.srcNodeRef.value;}this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);if(_3("ie")&&this.cols){_2.add(this.textbox,"dijitTextAreaCols");}},filter:function(_5){if(_5){_5=_5.replace(/\r/g,"");}return this.inherited(arguments);},_onInput:function(e){if(this.maxLength){var _6=parseInt(this.maxLength);var _7=this.textbox.value.replace(/\r/g,"");var _8=_7.length-_6;if(_8>0){var _9=this.textbox;if(_9.selectionStart){var _a=_9.selectionStart;var cr=0;if(_3("opera")){cr=(this.textbox.value.substring(0,_a).match(/\r/g)||[]).length;}this.textbox.value=_7.substring(0,_a-_8-cr)+_7.substring(_a-cr);_9.setSelectionRange(_a-_8,_a-_8);}else{if(this.ownerDocument.selection){_9.focus();var _b=this.ownerDocument.selection.createRange();_b.moveStart("character",-_8);_b.text="";_b.select();}}}}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/SimpleTextarea.js.uncompressed.js b/lib/dijit/form/SimpleTextarea.js.uncompressed.js
new file mode 100644
index 000000000..f3a9cf2e8
--- /dev/null
+++ b/lib/dijit/form/SimpleTextarea.js.uncompressed.js
@@ -0,0 +1,92 @@
+define("dijit/form/SimpleTextarea", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add
+ "dojo/sniff", // has("ie") has("opera")
+ "./TextBox"
+], function(declare, domClass, has, TextBox){
+
+// module:
+// dijit/form/SimpleTextarea
+
+
+return declare("dijit.form.SimpleTextarea", TextBox, {
+ // summary:
+ // A simple textarea that degrades, and responds to
+ // minimal LayoutContainer usage, and works with dijit/form/Form.
+ // Doesn't automatically size according to input, like Textarea.
+ //
+ // example:
+ // | <textarea data-dojo-type="dijit/form/SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea>
+ //
+ // example:
+ // | new SimpleTextarea({ rows:20, cols:30 }, "foo");
+
+ baseClass: "dijitTextBox dijitTextArea",
+
+ // rows: Number
+ // The number of rows of text.
+ rows: "3",
+
+ // rows: Number
+ // The number of characters per line.
+ cols: "20",
+
+ templateString: "<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>",
+
+ postMixInProperties: function(){
+ // Copy value from srcNodeRef, unless user specified a value explicitly (or there is no srcNodeRef)
+ // TODO: parser will handle this in 2.0
+ if(!this.value && this.srcNodeRef){
+ this.value = this.srcNodeRef.value;
+ }
+ this.inherited(arguments);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ if(has("ie") && this.cols){ // attribute selectors is not supported in IE6
+ domClass.add(this.textbox, "dijitTextAreaCols");
+ }
+ },
+
+ filter: function(/*String*/ value){
+ // Override TextBox.filter to deal with newlines... specifically (IIRC) this is for IE which writes newlines
+ // as \r\n instead of just \n
+ if(value){
+ value = value.replace(/\r/g,"");
+ }
+ return this.inherited(arguments);
+ },
+
+ _onInput: function(/*Event?*/ e){
+ // Override TextBox._onInput() to enforce maxLength restriction
+ if(this.maxLength){
+ var maxLength = parseInt(this.maxLength);
+ var value = this.textbox.value.replace(/\r/g,'');
+ var overflow = value.length - maxLength;
+ if(overflow > 0){
+ var textarea = this.textbox;
+ if(textarea.selectionStart){
+ var pos = textarea.selectionStart;
+ var cr = 0;
+ if(has("opera")){
+ cr = (this.textbox.value.substring(0,pos).match(/\r/g) || []).length;
+ }
+ this.textbox.value = value.substring(0,pos-overflow-cr)+value.substring(pos-cr);
+ textarea.setSelectionRange(pos-overflow, pos-overflow);
+ }else if(this.ownerDocument.selection){ //IE
+ textarea.focus();
+ var range = this.ownerDocument.selection.createRange();
+ // delete overflow characters
+ range.moveStart("character", -overflow);
+ range.text = '';
+ // show cursor
+ range.select();
+ }
+ }
+ }
+ this.inherited(arguments);
+ }
+});
+
+});
diff --git a/lib/dijit/form/Slider.js.uncompressed.js b/lib/dijit/form/Slider.js.uncompressed.js
new file mode 100644
index 000000000..1fb7bdfcf
--- /dev/null
+++ b/lib/dijit/form/Slider.js.uncompressed.js
@@ -0,0 +1,23 @@
+define("dijit/form/Slider", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "./HorizontalSlider",
+ "./VerticalSlider",
+ "./HorizontalRule",
+ "./VerticalRule",
+ "./HorizontalRuleLabels",
+ "./VerticalRuleLabels"
+], function(kernel){
+
+ // module:
+ // dijit/form/Slider
+
+ kernel.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself", "", "2.0");
+
+ /*=====
+ return {
+ // summary:
+ // Rollup of all the the Slider related widgets
+ // For back-compat, remove for 2.0
+ };
+ =====*/
+});
diff --git a/lib/dijit/form/TextBox.js b/lib/dijit/form/TextBox.js
index 54d5b1de3..e49b2edc9 100644
--- a/lib/dijit/form/TextBox.js
+++ b/lib/dijit/form/TextBox.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/TextBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});define("dijit/form/TextBox",["dojo/_base/declare","dojo/dom-construct","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","./_FormValueWidget","./_TextBoxMixin","dojo/text!./templates/TextBox.html",".."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){var _c=_1([_8,_9],{templateString:_a,_singleNodeTemplate:"<input class=\"dijit dijitReset dijitLeft dijitInputField\" data-dojo-attach-point=\"textbox,focusNode\" autocomplete=\"off\" type=\"${type}\" ${!nameAttrSetting} />",_buttonInputDisabled:_6("ie")?"disabled":"",baseClass:"dijitTextBox",postMixInProperties:function(){var _d=this.type.toLowerCase();if(this.templateString&&this.templateString.toLowerCase()=="input"||((_d=="hidden"||_d=="file")&&this.templateString==this.constructor.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},_onInput:function(e){this.inherited(arguments);if(this.intermediateChanges){var _e=this;setTimeout(function(){_e._handleOnChange(_e.get("value"),false);},0);}},_setPlaceHolderAttr:function(v){this._set("placeHolder",v);if(!this._phspan){this._attachPoints.push("_phspan");this._phspan=_2.create("span",{className:"dijitPlaceHolder dijitInputField"},this.textbox,"after");}this._phspan.innerHTML="";this._phspan.appendChild(document.createTextNode(v));this._updatePlaceHolder();},_updatePlaceHolder:function(){if(this._phspan){this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none";}},_setValueAttr:function(_f,_10,_11){this.inherited(arguments);this._updatePlaceHolder();},getDisplayedValue:function(){_4.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.","","2.0");return this.get("displayedValue");},setDisplayedValue:function(_12){_4.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_12);},_onBlur:function(e){if(this.disabled){return;}this.inherited(arguments);this._updatePlaceHolder();},_onFocus:function(by){if(this.disabled||this.readOnly){return;}this.inherited(arguments);this._updatePlaceHolder();}});if(_6("ie")){_c=_1(_c,{declaredClass:"dijit.form.TextBox",_isTextSelected:function(){var _13=_7.doc.selection.createRange();var _14=_13.parentElement();return _14==this.textbox&&_13.text.length==0;},postCreate:function(){this.inherited(arguments);setTimeout(_5.hitch(this,function(){try{var s=_3.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _15=this.domNode.getElementsByTagName("INPUT");if(_15){for(var i=0;i<_15.length;i++){_15[i].style.fontFamily=ff;}}}}}catch(e){}}),0);}});_b._setSelectionRange=_9._setSelectionRange=function(_16,_17,_18){if(_16.createTextRange){var r=_16.createTextRange();r.collapse(true);r.moveStart("character",-99999);r.moveStart("character",_17);r.moveEnd("character",_18-_17);r.select();}};}else{if(_6("mozilla")){_c=_1(_c,{declaredClass:"dijit.form.TextBox",_onBlur:function(e){this.inherited(arguments);if(this.selectOnClick){this.textbox.selectionStart=this.textbox.selectionEnd=undefined;}}});}else{_c.prototype.declaredClass="dijit.form.TextBox";}}_5.setObject("dijit.form.TextBox",_c);return _c;}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/TextBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});define("dijit/form/TextBox",["dojo/_base/declare","dojo/dom-construct","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","dojo/sniff","./_FormValueWidget","./_TextBoxMixin","dojo/text!./templates/TextBox.html","../main"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){var _b=_1("dijit.form.TextBox",[_7,_8],{templateString:_9,_singleNodeTemplate:"<input class=\"dijit dijitReset dijitLeft dijitInputField\" data-dojo-attach-point=\"textbox,focusNode\" autocomplete=\"off\" type=\"${type}\" ${!nameAttrSetting} />",_buttonInputDisabled:_6("ie")?"disabled":"",baseClass:"dijitTextBox",postMixInProperties:function(){var _c=this.type.toLowerCase();if(this.templateString&&this.templateString.toLowerCase()=="input"||((_c=="hidden"||_c=="file")&&this.templateString==this.constructor.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},postCreate:function(){this.inherited(arguments);if(_6("ie")<9){this.defer(function(){try{var s=_3.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _d=this.domNode.getElementsByTagName("INPUT");if(_d){for(var i=0;i<_d.length;i++){_d[i].style.fontFamily=ff;}}}}}catch(e){}});}},_onInput:function(e){this.inherited(arguments);if(this.intermediateChanges){this.defer(function(){this._handleOnChange(this.get("value"),false);});}},_setPlaceHolderAttr:function(v){this._set("placeHolder",v);if(!this._phspan){this._attachPoints.push("_phspan");this._phspan=_2.create("span",{onmousedown:function(e){e.preventDefault();},className:"dijitPlaceHolder dijitInputField"},this.textbox,"after");}this._phspan.innerHTML="";this._phspan.appendChild(this._phspan.ownerDocument.createTextNode(v));this._updatePlaceHolder();},_updatePlaceHolder:function(){if(this._phspan){this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none";}},_setValueAttr:function(_e,_f,_10){this.inherited(arguments);this._updatePlaceHolder();},getDisplayedValue:function(){_4.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use get('displayedValue') instead.","","2.0");return this.get("displayedValue");},setDisplayedValue:function(_11){_4.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_11);},_onBlur:function(e){if(this.disabled){return;}this.inherited(arguments);this._updatePlaceHolder();if(_6("mozilla")){if(this.selectOnClick){this.textbox.selectionStart=this.textbox.selectionEnd=undefined;}}},_onFocus:function(by){if(this.disabled||this.readOnly){return;}this.inherited(arguments);this._updatePlaceHolder();}});if(_6("ie")){_b.prototype._isTextSelected=function(){var _12=this.ownerDocument.selection.createRange();var _13=_12.parentElement();return _13==this.textbox&&_12.text.length>0;};_a._setSelectionRange=_8._setSelectionRange=function(_14,_15,_16){if(_14.createTextRange){var r=_14.createTextRange();r.collapse(true);r.moveStart("character",-99999);r.moveStart("character",_15);r.moveEnd("character",_16-_15);r.select();}};}return _b;}); \ No newline at end of file
diff --git a/lib/dijit/form/TextBox.js.uncompressed.js b/lib/dijit/form/TextBox.js.uncompressed.js
new file mode 100644
index 000000000..656a1ac14
--- /dev/null
+++ b/lib/dijit/form/TextBox.js.uncompressed.js
@@ -0,0 +1,157 @@
+require({cache:{
+'url:dijit/form/templates/TextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\" id=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});
+define("dijit/form/TextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.create
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("ie") has("mozilla")
+ "./_FormValueWidget",
+ "./_TextBoxMixin",
+ "dojo/text!./templates/TextBox.html",
+ "../main" // to export dijit._setSelectionRange, remove in 2.0
+], function(declare, domConstruct, domStyle, kernel, lang, has,
+ _FormValueWidget, _TextBoxMixin, template, dijit){
+
+ // module:
+ // dijit/form/TextBox
+
+ var TextBox = declare("dijit.form.TextBox", [_FormValueWidget, _TextBoxMixin], {
+ // summary:
+ // A base class for textbox form inputs
+
+ templateString: template,
+ _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" data-dojo-attach-point="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />',
+
+ _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events
+
+ baseClass: "dijitTextBox",
+
+ postMixInProperties: function(){
+ var type = this.type.toLowerCase();
+ if(this.templateString && this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == this.constructor.prototype.templateString)){
+ this.templateString = this._singleNodeTemplate;
+ }
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ if(has("ie") < 9){
+ // IE INPUT tag fontFamily has to be set directly using STYLE
+ // the defer gives IE a chance to render the TextBox and to deal with font inheritance
+ this.defer(function(){
+ try{
+ var s = domStyle.getComputedStyle(this.domNode); // can throw an exception if widget is immediately destroyed
+ if(s){
+ var ff = s.fontFamily;
+ if(ff){
+ var inputs = this.domNode.getElementsByTagName("INPUT");
+ if(inputs){
+ for(var i=0; i < inputs.length; i++){
+ inputs[i].style.fontFamily = ff;
+ }
+ }
+ }
+ }
+ }catch(e){/*when used in a Dialog, and this is called before the dialog is
+ shown, s.fontFamily would trigger "Invalid Argument" error.*/}
+ });
+ }
+ },
+
+ _onInput: function(e){
+ this.inherited(arguments);
+ if(this.intermediateChanges){ // _TextBoxMixin uses onInput
+ // allow the key to post to the widget input box
+ this.defer(function(){ this._handleOnChange(this.get('value'), false); });
+ }
+ },
+
+ _setPlaceHolderAttr: function(v){
+ this._set("placeHolder", v);
+ if(!this._phspan){
+ this._attachPoints.push('_phspan');
+ // dijitInputField class gives placeHolder same padding as the input field
+ // parent node already has dijitInputField class but it doesn't affect this <span>
+ // since it's position: absolute.
+ this._phspan = domConstruct.create('span',{ onmousedown:function(e){ e.preventDefault(); }, className:'dijitPlaceHolder dijitInputField'},this.textbox,'after');
+ }
+ this._phspan.innerHTML="";
+ this._phspan.appendChild(this._phspan.ownerDocument.createTextNode(v));
+ this._updatePlaceHolder();
+ },
+
+ _updatePlaceHolder: function(){
+ if(this._phspan){
+ this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none";
+ }
+ },
+
+ _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ this.inherited(arguments);
+ this._updatePlaceHolder();
+ },
+
+ getDisplayedValue: function(){
+ // summary:
+ // Deprecated. Use get('displayedValue') instead.
+ // tags:
+ // deprecated
+ kernel.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use get('displayedValue') instead.", "", "2.0");
+ return this.get('displayedValue');
+ },
+
+ setDisplayedValue: function(/*String*/ value){
+ // summary:
+ // Deprecated. Use set('displayedValue', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.", "", "2.0");
+ this.set('displayedValue', value);
+ },
+
+ _onBlur: function(e){
+ if(this.disabled){ return; }
+ this.inherited(arguments);
+ this._updatePlaceHolder();
+
+ if(has("mozilla")){
+ if(this.selectOnClick){
+ // clear selection so that the next mouse click doesn't reselect
+ this.textbox.selectionStart = this.textbox.selectionEnd = undefined;
+ }
+ }
+ },
+
+ _onFocus: function(/*String*/ by){
+ if(this.disabled || this.readOnly){ return; }
+ this.inherited(arguments);
+ this._updatePlaceHolder();
+ }
+ });
+
+ if(has("ie")){
+ TextBox.prototype._isTextSelected = function(){
+ var range = this.ownerDocument.selection.createRange();
+ var parent = range.parentElement();
+ return parent == this.textbox && range.text.length > 0;
+ };
+
+ // Overrides definition of _setSelectionRange from _TextBoxMixin (TODO: move to _TextBoxMixin.js?)
+ dijit._setSelectionRange = _TextBoxMixin._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){
+ if(element.createTextRange){
+ var r = element.createTextRange();
+ r.collapse(true);
+ r.moveStart("character", -99999); // move to 0
+ r.moveStart("character", start); // delta from 0 is the correct position
+ r.moveEnd("character", stop-start);
+ r.select();
+ }
+ }
+ }
+
+ return TextBox;
+});
diff --git a/lib/dijit/form/Textarea.js.uncompressed.js b/lib/dijit/form/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..c3c738bdd
--- /dev/null
+++ b/lib/dijit/form/Textarea.js.uncompressed.js
@@ -0,0 +1,42 @@
+define("dijit/form/Textarea", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-style", // domStyle.set
+ "./_ExpandingTextAreaMixin",
+ "./SimpleTextarea"
+], function(declare, domStyle, _ExpandingTextAreaMixin, SimpleTextarea){
+
+// module:
+// dijit/form/Textarea
+
+
+return declare("dijit.form.Textarea", [SimpleTextarea, _ExpandingTextAreaMixin], {
+ // summary:
+ // A textarea widget that adjusts it's height according to the amount of data.
+ //
+ // description:
+ // A textarea that dynamically expands/contracts (changing it's height) as
+ // the user types, to display all the text without requiring a scroll bar.
+ //
+ // Takes nearly all the parameters (name, value, etc.) that a vanilla textarea takes.
+ // Rows is not supported since this widget adjusts the height.
+ //
+ // example:
+ // | <textarea data-dojo-type="dijit/form/TextArea">...</textarea>
+
+
+ // TODO: for 2.0, rename this to ExpandingTextArea, and rename SimpleTextarea to TextArea
+
+ baseClass: "dijitTextBox dijitTextArea dijitExpandingTextArea",
+
+ // Override SimpleTextArea.cols to default to width:100%, for backward compatibility
+ cols: "",
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // tweak textarea style to reduce browser differences
+ domStyle.set(this.textbox, { overflowY: 'hidden', overflowX: 'auto', boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' });
+ }
+});
+
+});
diff --git a/lib/dijit/form/TimeTextBox.js b/lib/dijit/form/TimeTextBox.js
index 90b3f279d..18496f1f1 100644
--- a/lib/dijit/form/TimeTextBox.js
+++ b/lib/dijit/form/TimeTextBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/TimeTextBox",["dojo/_base/declare","dojo/keys","dojo/_base/lang","../_TimePicker","./_DateTimeTextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.TimeTextBox",_5,{baseClass:"dijitTextBox dijitComboBox dijitTimeTextBox",popupClass:_4,_selector:"time",value:new Date(""),_onKey:function(_6){if(this.disabled||this.readOnly){return;}this.inherited(arguments);switch(_6.keyCode){case _2.ENTER:case _2.TAB:case _2.ESCAPE:case _2.DOWN_ARROW:case _2.UP_ARROW:break;default:setTimeout(_3.hitch(this,function(){var _7=this.get("displayedValue");this.filterString=(_7&&!this.parse(_7,this.constraints))?_7.toLowerCase():"";if(this._opened){this.closeDropDown();}this.openDropDown();}),0);}}});}); \ No newline at end of file
+define("dijit/form/TimeTextBox",["dojo/_base/declare","dojo/keys","dojo/_base/lang","../_TimePicker","./_DateTimeTextBox"],function(_1,_2,_3,_4,_5){return _1("dijit.form.TimeTextBox",_5,{baseClass:"dijitTextBox dijitComboBox dijitTimeTextBox",popupClass:_4,_selector:"time",value:new Date(""),_onKey:function(_6){if(this.disabled||this.readOnly){return;}this.inherited(arguments);switch(_6.keyCode){case _2.ENTER:case _2.TAB:case _2.ESCAPE:case _2.DOWN_ARROW:case _2.UP_ARROW:break;default:this.defer(function(){var _7=this.get("displayedValue");this.filterString=(_7&&!this.parse(_7,this.constraints))?_7.toLowerCase():"";if(this._opened){this.closeDropDown();}this.openDropDown();});}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/TimeTextBox.js.uncompressed.js b/lib/dijit/form/TimeTextBox.js.uncompressed.js
new file mode 100644
index 000000000..ba81e1acd
--- /dev/null
+++ b/lib/dijit/form/TimeTextBox.js.uncompressed.js
@@ -0,0 +1,79 @@
+define("dijit/form/TimeTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE keys.TAB keys.UP_ARROW
+ "dojo/_base/lang", // lang.hitch
+ "../_TimePicker",
+ "./_DateTimeTextBox"
+], function(declare, keys, lang, _TimePicker, _DateTimeTextBox){
+
+ // module:
+ // dijit/form/TimeTextBox
+
+
+ /*=====
+ var __Constraints = declare([_DateTimeTextBox.__Constraints, _TimePicker.__Constraints], {
+ });
+ =====*/
+
+ return declare("dijit.form.TimeTextBox", _DateTimeTextBox, {
+ // summary:
+ // A validating, serializable, range-bound time text box with a drop down time picker
+
+ baseClass: "dijitTextBox dijitComboBox dijitTimeTextBox",
+ popupClass: _TimePicker,
+ _selector: "time",
+
+/*=====
+ // constraints: __Constraints
+ constraints:{},
+=====*/
+
+ // value: Date
+ // The value of this widget as a JavaScript Date object. Note that the date portion implies time zone and daylight savings rules.
+ //
+ // Example:
+ // | new dijit/form/TimeTextBox({value: stamp.fromISOString("T12:59:59", new Date())})
+ //
+ // When passed to the parser in markup, must be specified according to locale-independent
+ // `stamp.fromISOString` format.
+ //
+ // Example:
+ // | <input data-dojo-type='dijit/form/TimeTextBox' value='T12:34:00'>
+ value: new Date(""), // value.toString()="NaN"
+ //FIXME: in markup, you have no control over daylight savings
+
+ _onKey: function(evt){
+ if(this.disabled || this.readOnly){ return; }
+ this.inherited(arguments);
+
+ // If the user has backspaced or typed some numbers, then filter the result list
+ // by what they typed. Maybe there's a better way to detect this, like _handleOnChange()?
+ switch(evt.keyCode){
+ case keys.ENTER:
+ case keys.TAB:
+ case keys.ESCAPE:
+ case keys.DOWN_ARROW:
+ case keys.UP_ARROW:
+ // these keys have special meaning
+ break;
+ default:
+ // defer() because the keystroke hasn't yet appeared in the <input>,
+ // so the get('displayedValue') call below won't give the result we want.
+ this.defer(function(){
+ // set this.filterString to the filter to apply to the drop down list;
+ // it will be used in openDropDown()
+ var val = this.get('displayedValue');
+ this.filterString = (val && !this.parse(val, this.constraints)) ? val.toLowerCase() : "";
+
+ // close the drop down and reopen it, in order to filter the items shown in the list
+ // and also since the drop down may need to be repositioned if the number of list items has changed
+ // and it's being displayed above the <input>
+ if(this._opened){
+ this.closeDropDown();
+ }
+ this.openDropDown();
+ });
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/ToggleButton.js.uncompressed.js b/lib/dijit/form/ToggleButton.js.uncompressed.js
new file mode 100644
index 000000000..5cffd4f78
--- /dev/null
+++ b/lib/dijit/form/ToggleButton.js.uncompressed.js
@@ -0,0 +1,26 @@
+define("dijit/form/ToggleButton", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "./Button",
+ "./_ToggleButtonMixin"
+], function(declare, kernel, Button, _ToggleButtonMixin){
+
+ // module:
+ // dijit/form/ToggleButton
+
+
+ return declare("dijit.form.ToggleButton", [Button, _ToggleButtonMixin], {
+ // summary:
+ // A templated button widget that can be in two states (checked or not).
+ // Can be base class for things like tabs or checkbox or radio buttons.
+
+ baseClass: "dijitToggleButton",
+
+ setChecked: function(/*Boolean*/ checked){
+ // summary:
+ // Deprecated. Use set('checked', true/false) instead.
+ kernel.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0");
+ this.set('checked', checked);
+ }
+ });
+});
diff --git a/lib/dijit/form/ValidationTextBox.js b/lib/dijit/form/ValidationTextBox.js
index 5ca837ac1..4cbba1fb9 100644
--- a/lib/dijit/form/ValidationTextBox.js
+++ b/lib/dijit/form/ValidationTextBox.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/ValidationTextBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});define("dijit/form/ValidationTextBox",["dojo/_base/declare","dojo/i18n","./TextBox","../Tooltip","dojo/text!./templates/ValidationTextBox.html","dojo/i18n!./nls/validate"],function(_1,_2,_3,_4,_5){return _1("dijit.form.ValidationTextBox",_3,{templateString:_5,baseClass:"dijitTextBox dijitValidationTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",missingMessage:"$_unset_$",message:"",constraints:{},regExp:".*",regExpGen:function(){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this.focused);},validator:function(_6,_7){return (new RegExp("^(?:"+this.regExpGen(_7)+")"+(this.required?"":"?")+"$")).test(_6)&&(!this.required||!this._isEmpty(_6))&&(this._isEmpty(_6)||this.parse(_6,_7)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_8){return (this.trim?/^\s*$/:/^$/).test(_8);},getErrorMessage:function(){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_9){var _a="";var _b=this.disabled||this.isValid(_9);if(_b){this._maskValidSubsetError=true;}var _c=this._isEmpty(this.textbox.value);var _d=!_b&&_9&&this._isValidSubset();this._set("state",_b?"":(((((!this._hasBeenBlurred||_9)&&_c)||_d)&&this._maskValidSubsetError)?"Incomplete":"Error"));this.focusNode.setAttribute("aria-invalid",_b?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_9&&_d;_a=this.getErrorMessage(_9);}else{if(this.state=="Incomplete"){_a=this.getPromptMessage(_9);this._maskValidSubsetError=!this._hasBeenBlurred||_9;}else{if(_c){_a=this.getPromptMessage(_9);}}}this.set("message",_a);return _b;},displayMessage:function(_e){if(_e&&this.focused){_4.show(_e,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_4.hide(this.domNode);}},_refreshState:function(){this.validate(this.focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_f){if(!_f.locale&&this.lang){_f.locale=this.lang;}this._set("constraints",_f);this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _10="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_10+=re;break;case ")":_10+="|$)";break;default:_10+="(?:"+re+"|$)";break;}});}try{"".search(_10);}catch(e){_10=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_10+")$";},postMixInProperties:function(){this.inherited(arguments);this.messages=_2.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}if(!this.invalidMessage){this.invalidMessage=this.promptMessage;}if(this.missingMessage=="$_unset_$"){this.missingMessage=this.messages.missingMessage;}if(!this.missingMessage){this.missingMessage=this.invalidMessage;}this._setConstraintsAttr(this.constraints);},_setDisabledAttr:function(_11){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_12){this._set("required",_12);this.focusNode.setAttribute("aria-required",_12);this._refreshState();},_setMessageAttr:function(_13){this._set("message",_13);this.displayMessage(_13);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/ValidationTextBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});define("dijit/form/ValidationTextBox",["dojo/_base/declare","dojo/_base/kernel","dojo/i18n","./TextBox","../Tooltip","dojo/text!./templates/ValidationTextBox.html","dojo/i18n!./nls/validate"],function(_1,_2,_3,_4,_5,_6){var _7;return _7=_1("dijit.form.ValidationTextBox",_4,{templateString:_6,required:false,promptMessage:"",invalidMessage:"$_unset_$",missingMessage:"$_unset_$",message:"",constraints:{},pattern:".*",regExp:"",regExpGen:function(){},state:"",tooltipPosition:[],_deprecateRegExp:function(_8,_9){if(_9!=_7.prototype[_8]){_2.deprecated("ValidationTextBox id="+this.id+", set('"+_8+"', ...) is deprecated. Use set('pattern', ...) instead.","","2.0");this.set("pattern",_9);}},_setRegExpGenAttr:function(_a){this._deprecateRegExp("regExpGen",_a);this.regExpGen=this._getPatternAttr;},_setRegExpAttr:function(_b){this._deprecateRegExp("regExp",_b);},_setValueAttr:function(){this.inherited(arguments);this.validate(this.focused);},validator:function(_c,_d){return (new RegExp("^(?:"+this._getPatternAttr(_d)+")"+(this.required?"":"?")+"$")).test(_c)&&(!this.required||!this._isEmpty(_c))&&(this._isEmpty(_c)||this.parse(_c,_d)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_e){return (this.trim?/^\s*$/:/^$/).test(_e);},getErrorMessage:function(){var _f=this.invalidMessage=="$_unset_$"?this.messages.invalidMessage:!this.invalidMessage?this.promptMessage:this.invalidMessage;var _10=this.missingMessage=="$_unset_$"?this.messages.missingMessage:!this.missingMessage?_f:this.missingMessage;return (this.required&&this._isEmpty(this.textbox.value))?_10:_f;},getPromptMessage:function(){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_11){var _12="";var _13=this.disabled||this.isValid(_11);if(_13){this._maskValidSubsetError=true;}var _14=this._isEmpty(this.textbox.value);var _15=!_13&&_11&&this._isValidSubset();this._set("state",_13?"":(((((!this._hasBeenBlurred||_11)&&_14)||_15)&&(this._maskValidSubsetError||(_15&&!this._hasBeenBlurred&&_11)))?"Incomplete":"Error"));this.focusNode.setAttribute("aria-invalid",_13?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_11&&_15;_12=this.getErrorMessage(_11);}else{if(this.state=="Incomplete"){_12=this.getPromptMessage(_11);this._maskValidSubsetError=!this._hasBeenBlurred||_11;}else{if(_14){_12=this.getPromptMessage(_11);}}}this.set("message",_12);return _13;},displayMessage:function(_16){if(_16&&this.focused){_5.show(_16,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_5.hide(this.domNode);}},_refreshState:function(){if(this._created){this.validate(this.focused);}this.inherited(arguments);},constructor:function(_17){this.constraints={};this.baseClass+=" dijitValidationTextBox";},startup:function(){this.inherited(arguments);this._refreshState();},_setConstraintsAttr:function(_18){if(!_18.locale&&this.lang){_18.locale=this.lang;}this._set("constraints",_18);this._refreshState();},_setPatternAttr:function(_19){this._set("pattern",_19);},_getPatternAttr:function(_1a){var p=this.pattern;var _1b=(typeof p).toLowerCase();if(_1b=="function"){p=this.pattern(_1a||this.constraints);}if(p!=this._lastRegExp){var _1c="";this._lastRegExp=p;if(p!=".*"){p.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_1c+=re;break;case ")":_1c+="|$)";break;default:_1c+="(?:"+re+"|$)";break;}});}try{"".search(_1c);}catch(e){_1c=this.pattern;console.warn("RegExp error in "+this.declaredClass+": "+this.pattern);}this._partialre="^(?:"+_1c+")$";}return p;},postMixInProperties:function(){this.inherited(arguments);this.messages=_3.getLocalization("dijit.form","validate",this.lang);this._setConstraintsAttr(this.constraints);},_setDisabledAttr:function(_1d){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_1e){this._set("required",_1e);this.focusNode.setAttribute("aria-required",_1e);this._refreshState();},_setMessageAttr:function(_1f){this._set("message",_1f);this.displayMessage(_1f);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/ValidationTextBox.js.uncompressed.js b/lib/dijit/form/ValidationTextBox.js.uncompressed.js
new file mode 100644
index 000000000..b03b29ac2
--- /dev/null
+++ b/lib/dijit/form/ValidationTextBox.js.uncompressed.js
@@ -0,0 +1,332 @@
+require({cache:{
+'url:dijit/form/templates/ValidationTextBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class=\"dijitReset dijitInputInner\" data-dojo-attach-point='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"}});
+define("dijit/form/ValidationTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/i18n", // i18n.getLocalization
+ "./TextBox",
+ "../Tooltip",
+ "dojo/text!./templates/ValidationTextBox.html",
+ "dojo/i18n!./nls/validate"
+], function(declare, kernel, i18n, TextBox, Tooltip, template){
+
+ // module:
+ // dijit/form/ValidationTextBox
+
+
+ /*=====
+ var __Constraints = {
+ // locale: String
+ // locale used for validation, picks up value from this widget's lang attribute
+ // _flags_: anything
+ // various flags passed to pattern function
+ };
+ =====*/
+
+ var ValidationTextBox;
+ return ValidationTextBox = declare("dijit.form.ValidationTextBox", TextBox, {
+ // summary:
+ // Base class for textbox widgets with the ability to validate content of various types and provide user feedback.
+
+ templateString: template,
+
+ // required: Boolean
+ // User is required to enter data into this field.
+ required: false,
+
+ // promptMessage: String
+ // If defined, display this hint string immediately on focus to the textbox, if empty.
+ // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input).
+ // Think of this like a tooltip that tells the user what to do, not an error message
+ // that tells the user what they've done wrong.
+ //
+ // Message disappears when user starts typing.
+ promptMessage: "",
+
+ // invalidMessage: String
+ // The message to display if value is invalid.
+ // The translated string value is read from the message file by default.
+ // Set to "" to use the promptMessage instead.
+ invalidMessage: "$_unset_$",
+
+ // missingMessage: String
+ // The message to display if value is empty and the field is required.
+ // The translated string value is read from the message file by default.
+ // Set to "" to use the invalidMessage instead.
+ missingMessage: "$_unset_$",
+
+ // message: String
+ // Currently error/prompt message.
+ // When using the default tooltip implementation, this will only be
+ // displayed when the field is focused.
+ message: "",
+
+ // constraints: __Constraints
+ // user-defined object needed to pass parameters to the validator functions
+ constraints: {},
+
+ // pattern: [extension protected] String|Function(constraints) returning a string.
+ // This defines the regular expression used to validate the input.
+ // Do not add leading ^ or $ characters since the widget adds these.
+ // A function may be used to generate a valid pattern when dependent on constraints or other runtime factors.
+ // set('pattern', String|Function).
+ pattern: ".*",
+
+ // regExp: Deprecated [extension protected] String. Use "pattern" instead.
+ regExp: "",
+
+ regExpGen: function(/*__Constraints*/ /*===== constraints =====*/){
+ // summary:
+ // Deprecated. Use set('pattern', Function) instead.
+ },
+
+ // state: [readonly] String
+ // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error)
+ state: "",
+
+ // tooltipPosition: String[]
+ // See description of `dijit/Tooltip.defaultPosition` for details on this parameter.
+ tooltipPosition: [],
+
+ _deprecateRegExp: function(attr, value){
+ if(value != ValidationTextBox.prototype[attr]){
+ kernel.deprecated("ValidationTextBox id="+this.id+", set('" + attr + "', ...) is deprecated. Use set('pattern', ...) instead.", "", "2.0");
+ this.set('pattern', value);
+ }
+ },
+ _setRegExpGenAttr: function(/*Function*/ newFcn){
+ this._deprecateRegExp("regExpGen", newFcn);
+ this.regExpGen = this._getPatternAttr; // backward compat with this.regExpGen(this.constraints)
+ },
+ _setRegExpAttr: function(/*String*/ value){
+ this._deprecateRegExp("regExp", value);
+ },
+
+ _setValueAttr: function(){
+ // summary:
+ // Hook so set('value', ...) works.
+ this.inherited(arguments);
+ this.validate(this.focused);
+ },
+
+ validator: function(/*anything*/ value, /*__Constraints*/ constraints){
+ // summary:
+ // Overridable function used to validate the text input against the regular expression.
+ // tags:
+ // protected
+ return (new RegExp("^(?:" + this._getPatternAttr(constraints) + ")"+(this.required?"":"?")+"$")).test(value) &&
+ (!this.required || !this._isEmpty(value)) &&
+ (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean
+ },
+
+ _isValidSubset: function(){
+ // summary:
+ // Returns true if the value is either already valid or could be made valid by appending characters.
+ // This is used for validation while the user [may be] still typing.
+ return this.textbox.value.search(this._partialre) == 0;
+ },
+
+ isValid: function(/*Boolean*/ /*===== isFocused =====*/){
+ // summary:
+ // Tests if value is valid.
+ // Can override with your own routine in a subclass.
+ // tags:
+ // protected
+ return this.validator(this.textbox.value, this.constraints);
+ },
+
+ _isEmpty: function(value){
+ // summary:
+ // Checks for whitespace
+ return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean
+ },
+
+ getErrorMessage: function(/*Boolean*/ /*===== isFocused =====*/){
+ // summary:
+ // Return an error message to show if appropriate
+ // tags:
+ // protected
+ var invalid = this.invalidMessage == "$_unset_$" ? this.messages.invalidMessage :
+ !this.invalidMessage ? this.promptMessage : this.invalidMessage;
+ var missing = this.missingMessage == "$_unset_$" ? this.messages.missingMessage :
+ !this.missingMessage ? invalid : this.missingMessage;
+ return (this.required && this._isEmpty(this.textbox.value)) ? missing : invalid; // String
+ },
+
+ getPromptMessage: function(/*Boolean*/ /*===== isFocused =====*/){
+ // summary:
+ // Return a hint message to show when widget is first focused
+ // tags:
+ // protected
+ return this.promptMessage; // String
+ },
+
+ _maskValidSubsetError: true,
+ validate: function(/*Boolean*/ isFocused){
+ // summary:
+ // Called by oninit, onblur, and onkeypress.
+ // description:
+ // Show missing or invalid messages if appropriate, and highlight textbox field.
+ // tags:
+ // protected
+ var message = "";
+ var isValid = this.disabled || this.isValid(isFocused);
+ if(isValid){ this._maskValidSubsetError = true; }
+ var isEmpty = this._isEmpty(this.textbox.value);
+ var isValidSubset = !isValid && isFocused && this._isValidSubset();
+ this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && (this._maskValidSubsetError || (isValidSubset && !this._hasBeenBlurred && isFocused))) ? "Incomplete" : "Error"));
+ this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true");
+
+ if(this.state == "Error"){
+ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus
+ message = this.getErrorMessage(isFocused);
+ }else if(this.state == "Incomplete"){
+ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete
+ this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused
+ }else if(isEmpty){
+ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text
+ }
+ this.set("message", message);
+
+ return isValid;
+ },
+
+ displayMessage: function(/*String*/ message){
+ // summary:
+ // Overridable method to display validation errors/hints.
+ // By default uses a tooltip.
+ // tags:
+ // extension
+ if(message && this.focused){
+ Tooltip.show(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
+ }else{
+ Tooltip.hide(this.domNode);
+ }
+ },
+
+ _refreshState: function(){
+ // Overrides TextBox._refreshState()
+ if(this._created){
+ this.validate(this.focused);
+ }
+ this.inherited(arguments);
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(params /*===== , srcNodeRef =====*/){
+ // summary:
+ // Create the widget.
+ // params: Object|null
+ // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)
+ // and functions, typically callbacks like onClick.
+ // The hash can contain any of the widget's properties, excluding read-only properties.
+ // srcNodeRef: DOMNode|String?
+ // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree.
+
+ this.constraints = {};
+ this.baseClass += ' dijitValidationTextBox';
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ this._refreshState(); // after all _set* methods have run
+ },
+
+ _setConstraintsAttr: function(/*__Constraints*/ constraints){
+ if(!constraints.locale && this.lang){
+ constraints.locale = this.lang;
+ }
+ this._set("constraints", constraints);
+ this._refreshState();
+ },
+
+ _setPatternAttr: function(/*String|Function*/ pattern){
+ this._set("pattern", pattern); // don't set on INPUT to avoid native HTML5 validation
+ },
+
+ _getPatternAttr: function(/*__Constraints*/ constraints){
+ // summary:
+ // Hook to get the current regExp and to compute the partial validation RE.
+ var p = this.pattern;
+ var type = (typeof p).toLowerCase();
+ if(type == "function"){
+ p = this.pattern(constraints || this.constraints);
+ }
+ if(p != this._lastRegExp){
+ var partialre = "";
+ this._lastRegExp = p;
+ // parse the regexp and produce a new regexp that matches valid subsets
+ // if the regexp is .* then there's no use in matching subsets since everything is valid
+ if(p != ".*"){
+ p.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,
+ function(re){
+ switch(re.charAt(0)){
+ case '{':
+ case '+':
+ case '?':
+ case '*':
+ case '^':
+ case '$':
+ case '|':
+ case '(':
+ partialre += re;
+ break;
+ case ")":
+ partialre += "|$)";
+ break;
+ default:
+ partialre += "(?:"+re+"|$)";
+ break;
+ }
+ });
+ }
+ try{ // this is needed for now since the above regexp parsing needs more test verification
+ "".search(partialre);
+ }catch(e){ // should never be here unless the original RE is bad or the parsing is bad
+ partialre = this.pattern;
+ console.warn('RegExp error in ' + this.declaredClass + ': ' + this.pattern);
+ } // should never be here unless the original RE is bad or the parsing is bad
+ this._partialre = "^(?:" + partialre + ")$";
+ }
+ return p;
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.messages = i18n.getLocalization("dijit.form", "validate", this.lang);
+ this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ value){
+ this.inherited(arguments); // call FormValueWidget._setDisabledAttr()
+ this._refreshState();
+ },
+
+ _setRequiredAttr: function(/*Boolean*/ value){
+ this._set("required", value);
+ this.focusNode.setAttribute("aria-required", value);
+ this._refreshState();
+ },
+
+ _setMessageAttr: function(/*String*/ message){
+ this._set("message", message);
+ this.displayMessage(message);
+ },
+
+ reset:function(){
+ // Overrides dijit/form/TextBox.reset() by also
+ // hiding errors about partial matches
+ this._maskValidSubsetError = true;
+ this.inherited(arguments);
+ },
+
+ _onBlur: function(){
+ // the message still exists but for back-compat, and to erase the tooltip
+ // (if the message is being displayed as a tooltip), call displayMessage('')
+ this.displayMessage('');
+
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/form/VerticalRule.js.uncompressed.js b/lib/dijit/form/VerticalRule.js.uncompressed.js
new file mode 100644
index 000000000..c7203286b
--- /dev/null
+++ b/lib/dijit/form/VerticalRule.js.uncompressed.js
@@ -0,0 +1,28 @@
+define("dijit/form/VerticalRule", [
+ "dojo/_base/declare", // declare
+ "./HorizontalRule"
+], function(declare, HorizontalRule){
+
+ // module:
+ // dijit/form/VerticalRule
+
+ return declare("dijit.form.VerticalRule", HorizontalRule, {
+ // summary:
+ // Hash marks for the `dijit/form/VerticalSlider`
+
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerV"></div>',
+ _positionPrefix: '<div class="dijitRuleMark dijitRuleMarkV" style="top:',
+
+ /*=====
+ // container: String
+ // This is either "leftDecoration" or "rightDecoration",
+ // to indicate whether this rule goes to the left or to the right of the slider.
+ // Note that on RTL system, "leftDecoration" would actually go to the right, and vice-versa.
+ container: "",
+ =====*/
+
+ // Overrides HorizontalRule._isHorizontal
+ _isHorizontal: false
+
+ });
+});
diff --git a/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js
new file mode 100644
index 000000000..c5a1839cb
--- /dev/null
+++ b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js
@@ -0,0 +1,26 @@
+define("dijit/form/VerticalRuleLabels", [
+ "dojo/_base/declare", // declare
+ "./HorizontalRuleLabels"
+], function(declare, HorizontalRuleLabels){
+
+ // module:
+ // dijit/form/VerticalRuleLabels
+
+ return declare("dijit.form.VerticalRuleLabels", HorizontalRuleLabels, {
+ // summary:
+ // Labels for the `dijit/form/VerticalSlider`
+
+ templateString: '<div class="dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV"></div>',
+
+ _positionPrefix: '<div class="dijitRuleLabelContainer dijitRuleLabelContainerV" style="top:',
+ _labelPrefix: '"><span class="dijitRuleLabel dijitRuleLabelV">',
+
+ _calcPosition: function(pos){
+ // Overrides HorizontalRuleLabel._calcPosition()
+ return 100-pos;
+ },
+
+ // needed to prevent labels from being reversed in RTL mode
+ _isHorizontal: false
+ });
+});
diff --git a/lib/dijit/form/VerticalSlider.js b/lib/dijit/form/VerticalSlider.js
index aae7524fb..77ee3cf4e 100644
--- a/lib/dijit/form/VerticalSlider.js
+++ b/lib/dijit/form/VerticalSlider.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/VerticalSlider.html":"<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td data-dojo-attach-point=\"leftDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" data-dojo-attach-event=\"press:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\" valuemin=\"${minimum}\" valuemax=\"${maximum}\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td data-dojo-attach-point=\"containerNode,rightDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"}});define("dijit/form/VerticalSlider",["dojo/_base/declare","./HorizontalSlider","dojo/text!./templates/VerticalSlider.html"],function(_1,_2,_3){return _1("dijit.form.VerticalSlider",_2,{templateString:_3,_mousePixelCoord:"pageY",_pixelCount:"h",_startingPixelCoord:"y",_handleOffsetCoord:"top",_progressPixelSize:"height",_descending:true,_isReversed:function(){return this._descending;}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/VerticalSlider.html":"<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\trole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td data-dojo-attach-point=\"leftDecoration\" class=\"dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" data-dojo-attach-event=\"press:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td data-dojo-attach-point=\"containerNode,rightDecoration\" class=\"dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"}});define("dijit/form/VerticalSlider",["dojo/_base/declare","./HorizontalSlider","dojo/text!./templates/VerticalSlider.html"],function(_1,_2,_3){return _1("dijit.form.VerticalSlider",_2,{templateString:_3,_mousePixelCoord:"pageY",_pixelCount:"h",_startingPixelCoord:"y",_handleOffsetCoord:"top",_progressPixelSize:"height",_descending:true,_isReversed:function(){return this._descending;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/VerticalSlider.js.uncompressed.js b/lib/dijit/form/VerticalSlider.js.uncompressed.js
new file mode 100644
index 000000000..297d50fbb
--- /dev/null
+++ b/lib/dijit/form/VerticalSlider.js.uncompressed.js
@@ -0,0 +1,35 @@
+require({cache:{
+'url:dijit/form/templates/VerticalSlider.html':"<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" data-dojo-attach-event=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\trole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderIncrementIconV\" style=\"display:none\" data-dojo-attach-point=\"decrementButton\"><span class=\"dijitSliderButtonInner\">+</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper\" data-dojo-attach-event=\"press:_onClkIncBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td data-dojo-attach-point=\"leftDecoration\" class=\"dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input data-dojo-attach-point=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" data-dojo-attach-point=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" data-dojo-attach-event=\"press:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" data-dojo-attach-point=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" data-dojo-attach-event=\"press:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div data-dojo-attach-point=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" data-dojo-attach-event=\"press:_onHandleClick\" role=\"slider\"></div\n\t\t\t\t\t></div\n\t\t\t\t></div\n\t\t\t></center\n\t\t></td\n\t\t><td data-dojo-attach-point=\"containerNode,rightDecoration\" class=\"dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><center><div class=\"dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper\" data-dojo-attach-event=\"press:_onClkDecBumper\"></div></center\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\"></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n\t\t\t><div class=\"dijitSliderDecrementIconV\" style=\"display:none\" data-dojo-attach-point=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"}});
+define("dijit/form/VerticalSlider", [
+ "dojo/_base/declare", // declare
+ "./HorizontalSlider",
+ "dojo/text!./templates/VerticalSlider.html"
+], function(declare, HorizontalSlider, template){
+
+ // module:
+ // dijit/form/VerticalSlider
+
+ return declare("dijit.form.VerticalSlider", HorizontalSlider, {
+ // summary:
+ // A form widget that allows one to select a value with a vertically draggable handle
+
+ templateString: template,
+ _mousePixelCoord: "pageY",
+ _pixelCount: "h",
+ _startingPixelCoord: "y",
+ _handleOffsetCoord: "top",
+ _progressPixelSize: "height",
+
+ // _descending: Boolean
+ // Specifies if the slider values go from high-on-top (true), or low-on-top (false)
+ // TODO: expose this in 1.2 - the css progress/remaining bar classes need to be reversed
+ _descending: true,
+
+ _isReversed: function(){
+ // summary:
+ // Overrides HorizontalSlider._isReversed.
+ // Indicates if values are high on top (with low numbers on the bottom).
+ return this._descending;
+ }
+ });
+});
diff --git a/lib/dijit/form/_AutoCompleterMixin.js b/lib/dijit/form/_AutoCompleterMixin.js
index 2487e0277..e812f7688 100644
--- a/lib/dijit/form/_AutoCompleterMixin.js
+++ b/lib/dijit/form/_AutoCompleterMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_AutoCompleterMixin",["dojo/_base/connect","dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/dom-attr","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/query","dojo/regexp","dojo/_base/sniff","dojo/string","dojo/_base/window","./DataList","../registry","./_TextBoxMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){return _3("dijit.form._AutoCompleterMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,maxHeight:-1,_stopClickEvents:false,_getCaretPos:function(_11){var pos=0;if(typeof (_11.selectionStart)=="number"){pos=_11.selectionStart;}else{if(_b("ie")){var tr=_d.doc.selection.createRange().duplicate();var ntr=_11.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_12,_13){_13=parseInt(_13);_10.selectInputText(_12,_13,_13);},_setDisabledAttr:function(_14){this.inherited(arguments);this.domNode.setAttribute("aria-disabled",_14);},_abortQuery:function(){if(this.searchTimer){clearTimeout(this.searchTimer);this.searchTimer=null;}if(this._fetchHandle){if(this._fetchHandle.cancel){this._cancelingQuery=true;this._fetchHandle.cancel();this._cancelingQuery=false;}this._fetchHandle=null;}},_onInput:function(evt){this.inherited(arguments);if(evt.charOrCode==229){this._onKey(evt);}},_onKey:function(evt){if(this.disabled||this.readOnly){return;}var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==_7.SHIFT){return;}var _15=false;var pw=this.dropDown;var _16=null;this._prev_key_backspace=false;this._abortQuery();this.inherited(arguments);if(this._opened){_16=pw.getHighlightedOption();}switch(key){case _7.PAGE_DOWN:case _7.DOWN_ARROW:case _7.PAGE_UP:case _7.UP_ARROW:if(this._opened){this._announceOption(_16);}_6.stop(evt);break;case _7.ENTER:if(_16){if(_16==pw.nextButton){this._nextSearch(1);_6.stop(evt);break;}else{if(_16==pw.previousButton){this._nextSearch(-1);_6.stop(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}if(this._opened||this._fetchHandle){_6.stop(evt);}case _7.TAB:var _17=this.get("displayedValue");if(pw&&(_17==pw._messages["previousMessage"]||_17==pw._messages["nextMessage"])){break;}if(_16){this._selectOption(_16);}case _7.ESCAPE:if(this._opened){this._lastQuery=null;this.closeDropDown();}break;case " ":if(_16){_6.stop(evt);this._selectOption(_16);this.closeDropDown();}else{_15=true;}break;case _7.DELETE:case _7.BACKSPACE:this._prev_key_backspace=true;_15=true;break;default:_15=typeof key=="string"||key==229;}if(_15){this.item=undefined;this.searchTimer=setTimeout(_8.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(_18){var fn=this.focusNode;_10.selectInputText(fn,fn.value.length);var _19=this.ignoreCase?"toLowerCase":"substr";if(_18[_19](0).indexOf(this.focusNode.value[_19](0))==0){var _1a=this.autoComplete?this._getCaretPos(fn):fn.value.length;if((_1a+1)>fn.value.length){fn.value=_18;_10.selectInputText(fn,_1a);}}else{fn.value=_18;_10.selectInputText(fn);}},_openResultList:function(_1b,_1c,_1d){this._fetchHandle=null;if(this.disabled||this.readOnly||(_1c[this.searchAttr]!==this._lastQuery)){return;}var _1e=this.dropDown.getHighlightedOption();this.dropDown.clearResultList();if(!_1b.length&&_1d.start==0){this.closeDropDown();return;}var _1f=this.dropDown.createOptions(_1b,_1d,_8.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_1d.direction){if(1==_1d.direction){this.dropDown.highlightFirstOption();}else{if(-1==_1d.direction){this.dropDown.highlightLastOption();}}if(_1e){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_1c[this.searchAttr].toString())){this._announceOption(_1f[1]);}}},_showResultList:function(){this.closeDropDown(true);this.openDropDown();this.domNode.setAttribute("aria-expanded","true");},loadDropDown:function(){this._startSearchAll();},isLoaded:function(){return false;},closeDropDown:function(){this._abortQuery();if(this._opened){this.inherited(arguments);this.domNode.setAttribute("aria-expanded","false");this.focusNode.removeAttribute("aria-activedescendant");}},_setBlurValue:function(){var _20=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_20==pw._messages["previousMessage"]||_20==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_20);}else{if(this.value!=this._lastValueReported){this._handleOnChange(this.value,true);}this._refreshState();}}},_setItemAttr:function(_21,_22,_23){var _24="";if(_21){if(!_23){_23=this.store._oldAPI?this.store.getValue(_21,this.searchAttr):_21[this.searchAttr];}_24=this._getValueField()!=this.searchAttr?this.store.getIdentity(_21):_23;}this.set("value",_24,_22,_23,_21);},_announceOption:function(_25){if(!_25){return;}var _26;if(_25==this.dropDown.nextButton||_25==this.dropDown.previousButton){_26=_25.innerHTML;this.item=undefined;this.value="";}else{_26=(this.store._oldAPI?this.store.getValue(_25.item,this.searchAttr):_25.item[this.searchAttr]).toString();this.set("item",_25.item,false,_26);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);this.focusNode.setAttribute("aria-activedescendant",_5.get(_25,"id"));this._autoCompleteText(_26);},_selectOption:function(_27){this.closeDropDown();if(_27){this._announceOption(_27);}this._setCaretPos(this.focusNode,this.focusNode.value.length);this._handleOnChange(this.value,true);},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_getQueryString:function(_28){return _c.substitute(this.queryExpr,[_28]);},_startSearch:function(key){if(!this.dropDown){var _29=this.id+"_popup",_2a=_8.isString(this.dropDownClass)?_8.getObject(this.dropDownClass,false):this.dropDownClass;this.dropDown=new _2a({onChange:_8.hitch(this,this._selectOption),id:_29,dir:this.dir,textDir:this.textDir});this.focusNode.removeAttribute("aria-activedescendant");this.textbox.setAttribute("aria-owns",_29);}this._lastInput=key;var _2b=_8.clone(this.query);var _2c={start:0,count:this.pageSize,queryOptions:{ignoreCase:this.ignoreCase,deep:true}};_8.mixin(_2c,this.fetchProperties);var qs=this._getQueryString(key),q;if(this.store._oldAPI){q=qs;}else{q=_2.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_2b[this.searchAttr]=q;var _2d=this,_2e=function(){var _2f=_2d._fetchHandle=_2d.store.query(_2b,_2c);_4.when(_2f,function(res){_2d._fetchHandle=null;res.total=_2f.total;_2d._openResultList(res,_2b,_2c);},function(err){_2d._fetchHandle=null;if(!_2d._cancelingQuery){console.error(_2d.declaredClass+" "+err.toString());_2d.closeDropDown();}});};this.searchTimer=setTimeout(_8.hitch(this,function(_30,_31){this.searchTimer=null;_2e();this._nextSearch=this.dropDown.onPage=function(_32){_2c.start+=_2c.count*_32;_2c.direction=_32;_2e();_31.focus();};},_2b,this),this.searchDelay);},_getValueField:function(){return this.searchAttr;},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _33=this.srcNodeRef;var _34=this.list;if(_34){this.store=_f.byId(_34);}else{this.store=new _e({},_33);}if(!("value" in this.params)){var _35=(this.item=this.store.fetchSelectedItem());if(_35){var _36=this._getValueField();this.value=this.store._oldAPI?this.store.getValue(_35,_36):_35[_36];}}}this.inherited(arguments);},postCreate:function(){var _37=_9("label[for=\""+this.id+"\"]");if(_37.length){_37[0].id=(this.id+"_label");this.domNode.setAttribute("aria-labelledby",_37[0].id);}this.inherited(arguments);},_getMenuLabelFromItem:function(_38){var _39=this.labelFunc(_38,this.store),_3a=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_39=this.doHighlight(_39,this._escapeHtml(this._lastInput));_3a="html";}return {html:_3a=="html",label:_39};},doHighlight:function(_3b,_3c){var _3d=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");_3c=_a.escapeString(_3c);return this._escapeHtml(_3b).replace(new RegExp((i==0?"^":"")+"("+_3c+")"+(i==(this.queryExpr.length-4)?"$":""),_3d),"<span class=\"dijitComboBoxHighlightMatch\">$1</span>");},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");return str;},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(_3e,_3f){return (_3f._oldAPI?_3f.getValue(_3e,this.labelAttr||this.searchAttr):_3e[this.labelAttr||this.searchAttr]).toString();},_setValueAttr:function(_40,_41,_42,_43){this._set("item",_43||null);if(!_40){_40="";}this.inherited(arguments);},_setTextDirAttr:function(_44){this.inherited(arguments);if(this.dropDown){this.dropDown._set("textDir",_44);}}});}); \ No newline at end of file
+define("dijit/form/_AutoCompleterMixin",["dojo/data/util/filter","dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/query","dojo/regexp","dojo/sniff","dojo/string","./DataList","../registry","./_TextBoxMixin","./_SearchMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e){return _2("dijit.form._AutoCompleterMixin",_e,{item:null,autoComplete:true,highlightMatch:"first",labelAttr:"",labelType:"text",maxHeight:-1,_stopClickEvents:false,_getCaretPos:function(_f){var pos=0;if(typeof (_f.selectionStart)=="number"){pos=_f.selectionStart;}else{if(_9("ie")){var tr=_f.ownerDocument.selection.createRange().duplicate();var ntr=_f.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_10,_11){_11=parseInt(_11);_d.selectInputText(_10,_11,_11);},_setDisabledAttr:function(_12){this.inherited(arguments);this.domNode.setAttribute("aria-disabled",_12?"true":"false");},_onKey:function(evt){if(evt.charCode>=32){return;}var key=evt.charCode||evt.keyCode;if(key==_5.ALT||key==_5.CTRL||key==_5.META||key==_5.SHIFT){return;}var pw=this.dropDown;var _13=null;this._abortQuery();this.inherited(arguments);if(evt.altKey||evt.ctrlKey||evt.metaKey){return;}if(this._opened){_13=pw.getHighlightedOption();}switch(key){case _5.PAGE_DOWN:case _5.DOWN_ARROW:case _5.PAGE_UP:case _5.UP_ARROW:if(this._opened){this._announceOption(_13);}_4.stop(evt);break;case _5.ENTER:if(_13){if(_13==pw.nextButton){this._nextSearch(1);_4.stop(evt);break;}else{if(_13==pw.previousButton){this._nextSearch(-1);_4.stop(evt);break;}}_4.stop(evt);}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}case _5.TAB:var _14=this.get("displayedValue");if(pw&&(_14==pw._messages["previousMessage"]||_14==pw._messages["nextMessage"])){break;}if(_13){this._selectOption(_13);}case _5.ESCAPE:if(this._opened){this._lastQuery=null;this.closeDropDown();}break;}},_autoCompleteText:function(_15){var fn=this.focusNode;_d.selectInputText(fn,fn.value.length);var _16=this.ignoreCase?"toLowerCase":"substr";if(_15[_16](0).indexOf(this.focusNode.value[_16](0))==0){var _17=this.autoComplete?this._getCaretPos(fn):fn.value.length;if((_17+1)>fn.value.length){fn.value=_15;_d.selectInputText(fn,_17);}}else{fn.value=_15;_d.selectInputText(fn);}},_openResultList:function(_18,_19,_1a){var _1b=this.dropDown.getHighlightedOption();this.dropDown.clearResultList();if(!_18.length&&_1a.start==0){this.closeDropDown();return;}this._nextSearch=this.dropDown.onPage=_6.hitch(this,function(_1c){_18.nextPage(_1c!==-1);this.focus();});this.dropDown.createOptions(_18,_1a,_6.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if("direction" in _1a){if(_1a.direction){this.dropDown.highlightFirstOption();}else{if(!_1a.direction){this.dropDown.highlightLastOption();}}if(_1b){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_19[this.searchAttr].toString())){this._announceOption(this.dropDown.containerNode.firstChild.nextSibling);}}},_showResultList:function(){this.closeDropDown(true);this.openDropDown();this.domNode.setAttribute("aria-expanded","true");},loadDropDown:function(){this._startSearchAll();},isLoaded:function(){return false;},closeDropDown:function(){this._abortQuery();if(this._opened){this.inherited(arguments);this.domNode.setAttribute("aria-expanded","false");this.focusNode.removeAttribute("aria-activedescendant");}},_setBlurValue:function(){var _1d=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_1d==pw._messages["previousMessage"]||_1d==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_1d);}else{if(this.value!=this._lastValueReported){this._handleOnChange(this.value,true);}this._refreshState();}}},_setItemAttr:function(_1e,_1f,_20){var _21="";if(_1e){if(!_20){_20=this.store._oldAPI?this.store.getValue(_1e,this.searchAttr):_1e[this.searchAttr];}_21=this._getValueField()!=this.searchAttr?this.store.getIdentity(_1e):_20;}this.set("value",_21,_1f,_20,_1e);},_announceOption:function(_22){if(!_22){return;}var _23;if(_22==this.dropDown.nextButton||_22==this.dropDown.previousButton){_23=_22.innerHTML;this.item=undefined;this.value="";}else{var _24=this.dropDown.items[_22.getAttribute("item")];_23=(this.store._oldAPI?this.store.getValue(_24,this.searchAttr):_24[this.searchAttr]).toString();this.set("item",_24,false,_23);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);this.focusNode.setAttribute("aria-activedescendant",_3.get(_22,"id"));this._autoCompleteText(_23);},_selectOption:function(_25){this.closeDropDown();if(_25){this._announceOption(_25);}this._setCaretPos(this.focusNode,this.focusNode.value.length);this._handleOnChange(this.value,true);},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this.item=undefined;this.inherited(arguments);},_startSearch:function(key){if(!this.dropDown){var _26=this.id+"_popup",_27=_6.isString(this.dropDownClass)?_6.getObject(this.dropDownClass,false):this.dropDownClass;this.dropDown=new _27({onChange:_6.hitch(this,this._selectOption),id:_26,dir:this.dir,textDir:this.textDir});this.focusNode.removeAttribute("aria-activedescendant");this.textbox.setAttribute("aria-owns",_26);}this._lastInput=key;this.inherited(arguments);},_getValueField:function(){return this.searchAttr;},postMixInProperties:function(){this.inherited(arguments);if(!this.store){var _28=this.srcNodeRef;this.store=new _b({},_28);if(!("value" in this.params)){var _29=(this.item=this.store.fetchSelectedItem());if(_29){var _2a=this._getValueField();this.value=this.store._oldAPI?this.store.getValue(_29,_2a):_29[_2a];}}}},postCreate:function(){var _2b=_7("label[for=\""+this.id+"\"]");if(_2b.length){if(!_2b[0].id){_2b[0].id=this.id+"_label";}this.domNode.setAttribute("aria-labelledby",_2b[0].id);}this.inherited(arguments);this.connect(this,"onSearch","_openResultList");},_getMenuLabelFromItem:function(_2c){var _2d=this.labelFunc(_2c,this.store),_2e=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_2d=this.doHighlight(_2d,this._lastInput);_2e="html";}return {html:_2e=="html",label:_2d};},doHighlight:function(_2f,_30){var _31=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");_30=_8.escapeString(_30);return this._escapeHtml(_2f.replace(new RegExp((i==0?"^":"")+"("+_30+")"+(i==(this.queryExpr.length-4)?"$":""),_31),"\uffff$1\uffff")).replace(/\uFFFF([^\uFFFF]+)\uFFFF/g,"<span class=\"dijitComboBoxHighlightMatch\">$1</span>");},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");return str;},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(_32,_33){return (_33._oldAPI?_33.getValue(_32,this.labelAttr||this.searchAttr):_32[this.labelAttr||this.searchAttr]).toString();},_setValueAttr:function(_34,_35,_36,_37){this._set("item",_37||null);if(_34==null){_34="";}this.inherited(arguments);},_setTextDirAttr:function(_38){this.inherited(arguments);if(this.dropDown){this.dropDown._set("textDir",_38);}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js
new file mode 100644
index 000000000..edbc137a2
--- /dev/null
+++ b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js
@@ -0,0 +1,581 @@
+define("dijit/form/_AutoCompleterMixin", [
+ "dojo/data/util/filter", // patternToRegExp
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.get
+ "dojo/_base/event", // event.stop
+ "dojo/keys",
+ "dojo/_base/lang", // lang.clone lang.hitch
+ "dojo/query", // query
+ "dojo/regexp", // regexp.escapeString
+ "dojo/sniff", // has("ie")
+ "dojo/string", // string.substitute
+ "./DataList",
+ "../registry", // registry.byId
+ "./_TextBoxMixin", // defines _TextBoxMixin.selectInputText
+ "./_SearchMixin"
+], function(filter, declare, domAttr, event, keys, lang, query, regexp, has, string,
+ DataList, registry, _TextBoxMixin, SearchMixin){
+
+ // module:
+ // dijit/form/_AutoCompleterMixin
+
+ return declare("dijit.form._AutoCompleterMixin", SearchMixin, {
+ // summary:
+ // A mixin that implements the base functionality for `dijit/form/ComboBox`/`dijit/form/FilteringSelect`
+ // description:
+ // All widgets that mix in dijit/form/_AutoCompleterMixin must extend `dijit/form/_FormValueWidget`.
+ // tags:
+ // protected
+
+ // item: Object
+ // This is the item returned by the dojo/store/api/Store implementation that
+ // provides the data for this ComboBox, it's the currently selected item.
+ item: null,
+
+ // autoComplete: Boolean
+ // If user types in a partial string, and then tab out of the `<input>` box,
+ // automatically copy the first entry displayed in the drop down list to
+ // the `<input>` field
+ autoComplete: true,
+
+ // highlightMatch: String
+ // One of: "first", "all" or "none".
+ //
+ // If the ComboBox/FilteringSelect opens with the search results and the searched
+ // string can be found, it will be highlighted. If set to "all"
+ // then will probably want to change `queryExpr` parameter to '*${0}*'
+ //
+ // Highlighting is only performed when `labelType` is "text", so as to not
+ // interfere with any HTML markup an HTML label might contain.
+ highlightMatch: "first",
+
+ // labelAttr: String?
+ // The entries in the drop down list come from this attribute in the
+ // dojo.data items.
+ // If not specified, the searchAttr attribute is used instead.
+ labelAttr: "",
+
+ // labelType: String
+ // Specifies how to interpret the labelAttr in the data store items.
+ // Can be "html" or "text".
+ labelType: "text",
+
+ // Flags to _HasDropDown to limit height of drop down to make it fit in viewport
+ maxHeight: -1,
+
+ // For backwards compatibility let onClick events propagate, even clicks on the down arrow button
+ _stopClickEvents: false,
+
+ _getCaretPos: function(/*DomNode*/ element){
+ // khtml 3.5.2 has selection* methods as does webkit nightlies from 2005-06-22
+ var pos = 0;
+ if(typeof(element.selectionStart) == "number"){
+ // FIXME: this is totally borked on Moz < 1.3. Any recourse?
+ pos = element.selectionStart;
+ }else if(has("ie")){
+ // in the case of a mouse click in a popup being handled,
+ // then the win.doc.selection is not the textarea, but the popup
+ // var r = win.doc.selection.createRange();
+ // hack to get IE 6 to play nice. What a POS browser.
+ var tr = element.ownerDocument.selection.createRange().duplicate();
+ var ntr = element.createTextRange();
+ tr.move("character",0);
+ ntr.move("character",0);
+ try{
+ // If control doesn't have focus, you get an exception.
+ // Seems to happen on reverse-tab, but can also happen on tab (seems to be a race condition - only happens sometimes).
+ // There appears to be no workaround for this - googled for quite a while.
+ ntr.setEndPoint("EndToEnd", tr);
+ pos = String(ntr.text).replace(/\r/g,"").length;
+ }catch(e){
+ // If focus has shifted, 0 is fine for caret pos.
+ }
+ }
+ return pos;
+ },
+
+ _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){
+ location = parseInt(location);
+ _TextBoxMixin.selectInputText(element, location, location);
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ value){
+ // Additional code to set disabled state of ComboBox node.
+ // Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr().
+ this.inherited(arguments);
+ this.domNode.setAttribute("aria-disabled", value ? "true" : "false");
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary:
+ // Handles keyboard events
+
+ if(evt.charCode >= 32){ return; } // alphanumeric reserved for searching
+
+ var key = evt.charCode || evt.keyCode;
+
+ // except for cutting/pasting case - ctrl + x/v
+ if(key == keys.ALT || key == keys.CTRL || key == keys.META || key == keys.SHIFT){
+ return; // throw out spurious events
+ }
+
+ var pw = this.dropDown;
+ var highlighted = null;
+ this._abortQuery();
+
+ // _HasDropDown will do some of the work:
+ //
+ // 1. when drop down is not yet shown:
+ // - if user presses the down arrow key, call loadDropDown()
+ // 2. when drop down is already displayed:
+ // - on ESC key, call closeDropDown()
+ // - otherwise, call dropDown.handleKey() to process the keystroke
+ this.inherited(arguments);
+
+ if(evt.altKey || evt.ctrlKey || evt.metaKey){ return; } // don't process keys with modifiers - but we want shift+TAB
+
+ if(this._opened){
+ highlighted = pw.getHighlightedOption();
+ }
+ switch(key){
+ case keys.PAGE_DOWN:
+ case keys.DOWN_ARROW:
+ case keys.PAGE_UP:
+ case keys.UP_ARROW:
+ // Keystroke caused ComboBox_menu to move to a different item.
+ // Copy new item to <input> box.
+ if(this._opened){
+ this._announceOption(highlighted);
+ }
+ event.stop(evt);
+ break;
+
+ case keys.ENTER:
+ // prevent submitting form if user presses enter. Also
+ // prevent accepting the value if either Next or Previous
+ // are selected
+ if(highlighted){
+ // only stop event on prev/next
+ if(highlighted == pw.nextButton){
+ this._nextSearch(1);
+ event.stop(evt); // prevent submit
+ break;
+ }else if(highlighted == pw.previousButton){
+ this._nextSearch(-1);
+ event.stop(evt); // prevent submit
+ break;
+ }
+ event.stop(evt); // prevent submit if ENTER was to choose an item
+ }else{
+ // Update 'value' (ex: KY) according to currently displayed text
+ this._setBlurValue(); // set value if needed
+ this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting
+ }
+ // fall through
+
+ case keys.TAB:
+ var newvalue = this.get('displayedValue');
+ // if the user had More Choices selected fall into the
+ // _onBlur handler
+ if(pw && (
+ newvalue == pw._messages["previousMessage"] ||
+ newvalue == pw._messages["nextMessage"])
+ ){
+ break;
+ }
+ if(highlighted){
+ this._selectOption(highlighted);
+ }
+ // fall through
+
+ case keys.ESCAPE:
+ if(this._opened){
+ this._lastQuery = null; // in case results come back later
+ this.closeDropDown();
+ }
+ break;
+ }
+ },
+
+ _autoCompleteText: function(/*String*/ text){
+ // summary:
+ // Fill in the textbox with the first item from the drop down
+ // list, and highlight the characters that were
+ // auto-completed. For example, if user typed "CA" and the
+ // drop down list appeared, the textbox would be changed to
+ // "California" and "ifornia" would be highlighted.
+
+ var fn = this.focusNode;
+
+ // IE7: clear selection so next highlight works all the time
+ _TextBoxMixin.selectInputText(fn, fn.value.length);
+ // does text autoComplete the value in the textbox?
+ var caseFilter = this.ignoreCase? 'toLowerCase' : 'substr';
+ if(text[caseFilter](0).indexOf(this.focusNode.value[caseFilter](0)) == 0){
+ var cpos = this.autoComplete ? this._getCaretPos(fn) : fn.value.length;
+ // only try to extend if we added the last character at the end of the input
+ if((cpos+1) > fn.value.length){
+ // only add to input node as we would overwrite Capitalisation of chars
+ // actually, that is ok
+ fn.value = text;//.substr(cpos);
+ // visually highlight the autocompleted characters
+ _TextBoxMixin.selectInputText(fn, cpos);
+ }
+ }else{
+ // text does not autoComplete; replace the whole value and highlight
+ fn.value = text;
+ _TextBoxMixin.selectInputText(fn);
+ }
+ },
+
+ _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){
+ // summary:
+ // Callback when a search completes.
+ // description:
+ // 1. generates drop-down list and calls _showResultList() to display it
+ // 2. if this result list is from user pressing "more choices"/"previous choices"
+ // then tell screen reader to announce new option
+ var wasSelected = this.dropDown.getHighlightedOption();
+ this.dropDown.clearResultList();
+ if(!results.length && options.start == 0){ // if no results and not just the previous choices button
+ this.closeDropDown();
+ return;
+ }
+ this._nextSearch = this.dropDown.onPage = lang.hitch(this, function(direction){
+ results.nextPage(direction !== -1);
+ this.focus();
+ });
+
+ // Fill in the textbox with the first item from the drop down list,
+ // and highlight the characters that were auto-completed. For
+ // example, if user typed "CA" and the drop down list appeared, the
+ // textbox would be changed to "California" and "ifornia" would be
+ // highlighted.
+
+ this.dropDown.createOptions(
+ results,
+ options,
+ lang.hitch(this, "_getMenuLabelFromItem")
+ );
+
+ // show our list (only if we have content, else nothing)
+ this._showResultList();
+
+ // #4091:
+ // tell the screen reader that the paging callback finished by
+ // shouting the next choice
+ if("direction" in options){
+ if(options.direction){
+ this.dropDown.highlightFirstOption();
+ }else if(!options.direction){
+ this.dropDown.highlightLastOption();
+ }
+ if(wasSelected){
+ this._announceOption(this.dropDown.getHighlightedOption());
+ }
+ }else if(this.autoComplete && !this._prev_key_backspace
+ // when the user clicks the arrow button to show the full list,
+ // startSearch looks for "*".
+ // it does not make sense to autocomplete
+ // if they are just previewing the options available.
+ && !/^[*]+$/.test(query[this.searchAttr].toString())){
+ this._announceOption(this.dropDown.containerNode.firstChild.nextSibling); // 1st real item
+ }
+ },
+
+ _showResultList: function(){
+ // summary:
+ // Display the drop down if not already displayed, or if it is displayed, then
+ // reposition it if necessary (reposition may be necessary if drop down's height changed).
+ this.closeDropDown(true);
+ this.openDropDown();
+ this.domNode.setAttribute("aria-expanded", "true");
+ },
+
+ loadDropDown: function(/*Function*/ /*===== callback =====*/){
+ // Overrides _HasDropDown.loadDropDown().
+ // This is called when user has pressed button icon or pressed the down arrow key
+ // to open the drop down.
+ this._startSearchAll();
+ },
+
+ isLoaded: function(){
+ // signal to _HasDropDown that it needs to call loadDropDown() to load the
+ // drop down asynchronously before displaying it
+ return false;
+ },
+
+ closeDropDown: function(){
+ // Overrides _HasDropDown.closeDropDown(). Closes the drop down (assuming that it's open).
+ // This method is the callback when the user types ESC or clicking
+ // the button icon while the drop down is open. It's also called by other code.
+ this._abortQuery();
+ if(this._opened){
+ this.inherited(arguments);
+ this.domNode.setAttribute("aria-expanded", "false");
+ this.focusNode.removeAttribute("aria-activedescendant");
+ }
+ },
+
+ _setBlurValue: function(){
+ // if the user clicks away from the textbox OR tabs away, set the
+ // value to the textbox value
+ // #4617:
+ // if value is now more choices or previous choices, revert
+ // the value
+ var newvalue = this.get('displayedValue');
+ var pw = this.dropDown;
+ if(pw && (
+ newvalue == pw._messages["previousMessage"] ||
+ newvalue == pw._messages["nextMessage"]
+ )
+ ){
+ this._setValueAttr(this._lastValueReported, true);
+ }else if(typeof this.item == "undefined"){
+ // Update 'value' (ex: KY) according to currently displayed text
+ this.item = null;
+ this.set('displayedValue', newvalue);
+ }else{
+ if(this.value != this._lastValueReported){
+ this._handleOnChange(this.value, true);
+ }
+ this._refreshState();
+ }
+ },
+
+ _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
+ // summary:
+ // Set the displayed valued in the input box, and the hidden value
+ // that gets submitted, based on a dojo.data store item.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // set('item', value)
+ // tags:
+ // private
+ var value = '';
+ if(item){
+ if(!displayedValue){
+ displayedValue = this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API)
+ this.store.getValue(item, this.searchAttr) : item[this.searchAttr];
+ }
+ value = this._getValueField() != this.searchAttr ? this.store.getIdentity(item) : displayedValue;
+ }
+ this.set('value', value, priorityChange, displayedValue, item);
+ },
+
+ _announceOption: function(/*Node*/ node){
+ // summary:
+ // a11y code that puts the highlighted option in the textbox.
+ // This way screen readers will know what is happening in the
+ // menu.
+
+ if(!node){
+ return;
+ }
+ // pull the text value from the item attached to the DOM node
+ var newValue;
+ if(node == this.dropDown.nextButton ||
+ node == this.dropDown.previousButton){
+ newValue = node.innerHTML;
+ this.item = undefined;
+ this.value = '';
+ }else{
+ var item = this.dropDown.items[node.getAttribute("item")];
+ newValue = (this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API)
+ this.store.getValue(item, this.searchAttr) : item[this.searchAttr]).toString();
+ this.set('item', item, false, newValue);
+ }
+ // get the text that the user manually entered (cut off autocompleted text)
+ this.focusNode.value = this.focusNode.value.substring(0, this._lastInput.length);
+ // set up ARIA activedescendant
+ this.focusNode.setAttribute("aria-activedescendant", domAttr.get(node, "id"));
+ // autocomplete the rest of the option to announce change
+ this._autoCompleteText(newValue);
+ },
+
+ _selectOption: function(/*DomNode*/ target){
+ // summary:
+ // Menu callback function, called when an item in the menu is selected.
+ this.closeDropDown();
+ if(target){
+ this._announceOption(target);
+ }
+ this._setCaretPos(this.focusNode, this.focusNode.value.length);
+ this._handleOnChange(this.value, true);
+ },
+
+ _startSearchAll: function(){
+ this._startSearch('');
+ },
+
+ _startSearchFromInput: function(){
+ this.item = undefined; // undefined means item needs to be set
+ this.inherited(arguments);
+ },
+
+ _startSearch: function(/*String*/ key){
+ // summary:
+ // Starts a search for elements matching key (key=="" means to return all items),
+ // and calls _openResultList() when the search completes, to display the results.
+ if(!this.dropDown){
+ var popupId = this.id + "_popup",
+ dropDownConstructor = lang.isString(this.dropDownClass) ?
+ lang.getObject(this.dropDownClass, false) : this.dropDownClass;
+ this.dropDown = new dropDownConstructor({
+ onChange: lang.hitch(this, this._selectOption),
+ id: popupId,
+ dir: this.dir,
+ textDir: this.textDir
+ });
+ this.focusNode.removeAttribute("aria-activedescendant");
+ this.textbox.setAttribute("aria-owns",popupId); // associate popup with textbox
+ }
+ this._lastInput = key; // Store exactly what was entered by the user.
+ this.inherited(arguments);
+ },
+
+ _getValueField: function(){
+ // summary:
+ // Helper for postMixInProperties() to set this.value based on data inlined into the markup.
+ // Returns the attribute name in the item (in dijit/form/_ComboBoxDataStore) to use as the value.
+ return this.searchAttr;
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ if(!this.store){
+ var srcNodeRef = this.srcNodeRef;
+ // if user didn't specify store, then assume there are option tags
+ this.store = new DataList({}, srcNodeRef);
+
+ // if there is no value set and there is an option list, set
+ // the value to the first value to be consistent with native Select
+ // Firefox and Safari set value
+ // IE6 and Opera set selectedIndex, which is automatically set
+ // by the selected attribute of an option tag
+ // IE6 does not set value, Opera sets value = selectedIndex
+ if(!("value" in this.params)){
+ var item = (this.item = this.store.fetchSelectedItem());
+ if(item){
+ var valueField = this._getValueField();
+ // remove getValue() for 2.0 (old dojo.data API)
+ this.value = this.store._oldAPI ? this.store.getValue(item, valueField) : item[valueField];
+ }
+ }
+ }
+ },
+
+ postCreate: function(){
+ // summary:
+ // Subclasses must call this method from their postCreate() methods
+ // tags:
+ // protected
+
+ // find any associated label element and add to ComboBox node.
+ var label=query('label[for="'+this.id+'"]');
+ if(label.length){
+ if(!label[0].id){ label[0].id = this.id + "_label"; }
+ this.domNode.setAttribute("aria-labelledby", label[0].id);
+
+ }
+ this.inherited(arguments);
+ this.connect(this, "onSearch", "_openResultList");
+ },
+
+ _getMenuLabelFromItem: function(/*Item*/ item){
+ var label = this.labelFunc(item, this.store),
+ labelType = this.labelType;
+ // If labelType is not "text" we don't want to screw any markup ot whatever.
+ if(this.highlightMatch != "none" && this.labelType == "text" && this._lastInput){
+ label = this.doHighlight(label, this._lastInput);
+ labelType = "html";
+ }
+ return {html: labelType == "html", label: label};
+ },
+
+ doHighlight: function(/*String*/ label, /*String*/ find){
+ // summary:
+ // Highlights the string entered by the user in the menu. By default this
+ // highlights the first occurrence found. Override this method
+ // to implement your custom highlighting.
+ // tags:
+ // protected
+
+ var
+ // Add (g)lobal modifier when this.highlightMatch == "all" and (i)gnorecase when this.ignoreCase == true
+ modifiers = (this.ignoreCase ? "i" : "") + (this.highlightMatch == "all" ? "g" : ""),
+ i = this.queryExpr.indexOf("${0}");
+ find = regexp.escapeString(find); // escape regexp special chars
+ //If < appears in label, and user presses t, we don't want to highlight the t in the escaped "&lt;"
+ //first find out every occurences of "find", wrap each occurence in a pair of "\uFFFF" characters (which
+ //should not appear in any string). then html escape the whole string, and replace '\uFFFF" with the
+ //HTML highlight markup.
+ return this._escapeHtml(label.replace(
+ new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers),
+ '\uFFFF$1\uFFFF')).replace(
+ /\uFFFF([^\uFFFF]+)\uFFFF/g, '<span class="dijitComboBoxHighlightMatch">$1</span>'
+ ); // returns String, (almost) valid HTML (entities encoded)
+ },
+
+ _escapeHtml: function(/*String*/ str){
+ // TODO Should become dojo.html.entities(), when exists use instead
+ // summary:
+ // Adds escape sequences for special characters in XML: `&<>"'`
+ str = String(str).replace(/&/gm, "&amp;").replace(/</gm, "&lt;")
+ .replace(/>/gm, "&gt;").replace(/"/gm, "&quot;"); //balance"
+ return str; // string
+ },
+
+ reset: function(){
+ // Overrides the _FormWidget.reset().
+ // Additionally reset the .item (to clean up).
+ this.item = null;
+ this.inherited(arguments);
+ },
+
+ labelFunc: function(item, store){
+ // summary:
+ // Computes the label to display based on the dojo.data store item.
+ // item: Object
+ // The item from the store
+ // store: dojo/store/api/Store
+ // The store.
+ // returns:
+ // The label that the ComboBox should display
+ // tags:
+ // private
+
+ // Use toString() because XMLStore returns an XMLItem whereas this
+ // method is expected to return a String (#9354).
+ // Remove getValue() for 2.0 (old dojo.data API)
+ return (store._oldAPI ? store.getValue(item, this.labelAttr || this.searchAttr) :
+ item[this.labelAttr || this.searchAttr]).toString(); // String
+ },
+
+ _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){
+ // summary:
+ // Hook so set('value', value) works.
+ // description:
+ // Sets the value of the select.
+ this._set("item", item||null); // value not looked up in store
+ if(value == null /* or undefined */){ value = ''; } // null translates to blank
+ this.inherited(arguments);
+ },
+ _setTextDirAttr: function(/*String*/ textDir){
+ // summary:
+ // Setter for textDir, needed for the dropDown's textDir update.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // set('textDir', value)
+ // tags:
+ // private
+ this.inherited(arguments);
+ // update the drop down also (_ComboBoxMenuMixin)
+ if(this.dropDown){
+ this.dropDown._set("textDir", textDir);
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/_ButtonMixin.js.uncompressed.js b/lib/dijit/form/_ButtonMixin.js.uncompressed.js
new file mode 100644
index 000000000..a38465804
--- /dev/null
+++ b/lib/dijit/form/_ButtonMixin.js.uncompressed.js
@@ -0,0 +1,84 @@
+define("dijit/form/_ButtonMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/_base/event", // event.stop
+ "../registry" // registry.byNode
+], function(declare, dom, event, registry){
+
+// module:
+// dijit/form/_ButtonMixin
+
+return declare("dijit.form._ButtonMixin", null, {
+ // summary:
+ // A mixin to add a thin standard API wrapper to a normal HTML button
+ // description:
+ // A label should always be specified (through innerHTML) or the label attribute.
+ //
+ // Attach points:
+ //
+ // - focusNode (required): this node receives focus
+ // - valueNode (optional): this node's value gets submitted with FORM elements
+ // - containerNode (optional): this node gets the innerHTML assignment for label
+ // example:
+ // | <button data-dojo-type="dijit/form/Button" onClick="...">Hello world</button>
+ // example:
+ // | var button1 = new Button({label: "hello world", onClick: foo});
+ // | dojo.body().appendChild(button1.domNode);
+
+ // label: HTML String
+ // Content to display in button.
+ label: "",
+
+ // type: [const] String
+ // Type of button (submit, reset, button, checkbox, radio)
+ type: "button",
+
+ _onClick: function(/*Event*/ e){
+ // summary:
+ // Internal function to handle click actions
+ if(this.disabled){
+ event.stop(e);
+ return false;
+ }
+ var preventDefault = this.onClick(e) === false; // user click actions
+ if(!preventDefault && this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a non-form widget needs to be signalled
+ for(var node=this.domNode; node.parentNode; node=node.parentNode){
+ var widget=registry.byNode(node);
+ if(widget && typeof widget._onSubmit == "function"){
+ widget._onSubmit(e);
+ preventDefault = true;
+ break;
+ }
+ }
+ }
+ if(preventDefault){
+ e.preventDefault();
+ }
+ return !preventDefault;
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ dom.setSelectable(this.focusNode, false);
+ },
+
+ onClick: function(/*Event*/ /*===== e =====*/){
+ // summary:
+ // Callback for when button is clicked.
+ // If type="submit", return true to perform submit, or false to cancel it.
+ // type:
+ // callback
+ return true; // Boolean
+ },
+
+ _setLabelAttr: function(/*String*/ content){
+ // summary:
+ // Hook for set('label', ...) to work.
+ // description:
+ // Set the label (text) of the button; takes an HTML string.
+ this._set("label", content);
+ (this.containerNode||this.focusNode).innerHTML = content;
+ }
+});
+
+});
diff --git a/lib/dijit/form/_CheckBoxMixin.js b/lib/dijit/form/_CheckBoxMixin.js
index da6d96a2d..6d1cb635b 100644
--- a/lib/dijit/form/_CheckBoxMixin.js
+++ b/lib/dijit/form/_CheckBoxMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_CheckBoxMixin",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event"],function(_1,_2,_3){return _1("dijit.form._CheckBoxMixin",null,{type:"checkbox",value:"on",readOnly:false,_aria_attr:"aria-checked",_setReadOnlyAttr:function(_4){this._set("readOnly",_4);_2.set(this.focusNode,"readOnly",_4);this.focusNode.setAttribute("aria-readonly",_4);},_setLabelAttr:undefined,postMixInProperties:function(){if(this.value==""){this.value="on";}this.inherited(arguments);},reset:function(){this.inherited(arguments);this._set("value",this.params.value||"on");_2.set(this.focusNode,"value",this.value);},_onClick:function(e){if(this.readOnly){_3.stop(e);return false;}return this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/_CheckBoxMixin",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event"],function(_1,_2,_3){return _1("dijit.form._CheckBoxMixin",null,{type:"checkbox",value:"on",readOnly:false,_aria_attr:"aria-checked",_setReadOnlyAttr:function(_4){this._set("readOnly",_4);_2.set(this.focusNode,"readOnly",_4);},_setLabelAttr:undefined,_getSubmitValue:function(_5){return !_5&&_5!==0?"on":_5;},_setValueAttr:function(_6){_6=this._getSubmitValue(_6);this._set("value",_6);_2.set(this.focusNode,"value",_6);},reset:function(){this.inherited(arguments);this._set("value",this.params.value||"on");_2.set(this.focusNode,"value",this.value);},_onClick:function(e){if(this.readOnly){_3.stop(e);return false;}return this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js b/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js
new file mode 100644
index 000000000..7bcaa4b1c
--- /dev/null
+++ b/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js
@@ -0,0 +1,77 @@
+define("dijit/form/_CheckBoxMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/event" // event.stop
+], function(declare, domAttr, event){
+
+ // module:
+ // dijit/form/_CheckBoxMixin
+
+ return declare("dijit.form._CheckBoxMixin", null, {
+ // summary:
+ // Mixin to provide widget functionality corresponding to an HTML checkbox
+ //
+ // description:
+ // User interacts with real html inputs.
+ // On onclick (which occurs by mouse click, space-bar, or
+ // using the arrow keys to switch the selected radio button),
+ // we update the state of the checkbox/radio.
+ //
+
+ // type: [private] String
+ // type attribute on `<input>` node.
+ // Overrides `dijit/form/Button.type`. Users should not change this value.
+ type: "checkbox",
+
+ // value: String
+ // As an initialization parameter, equivalent to value field on normal checkbox
+ // (if checked, the value is passed as the value when form is submitted).
+ value: "on",
+
+ // readOnly: Boolean
+ // Should this widget respond to user input?
+ // In markup, this is specified as "readOnly".
+ // Similar to disabled except readOnly form values are submitted.
+ readOnly: false,
+
+ // aria-pressed for toggle buttons, and aria-checked for checkboxes
+ _aria_attr: "aria-checked",
+
+ _setReadOnlyAttr: function(/*Boolean*/ value){
+ this._set("readOnly", value);
+ domAttr.set(this.focusNode, 'readOnly', value);
+ },
+
+ // Override dijit/form/Button._setLabelAttr() since we don't even have a containerNode.
+ // Normally users won't try to set label, except when CheckBox or RadioButton is the child of a dojox/layout/TabContainer
+ _setLabelAttr: undefined,
+
+ _getSubmitValue: function(/*String*/ value){
+ return !value && value !== 0 ? "on" : value;
+ },
+
+ _setValueAttr: function(newValue){
+ newValue = this._getSubmitValue(newValue); // "on" to match browser native behavior when value unspecified
+ this._set("value", newValue);
+ domAttr.set(this.focusNode, "value", newValue);
+ },
+
+ reset: function(){
+ this.inherited(arguments);
+ // Handle unlikely event that the <input type=checkbox> value attribute has changed
+ this._set("value", this.params.value || "on");
+ domAttr.set(this.focusNode, 'value', this.value);
+ },
+
+ _onClick: function(/*Event*/ e){
+ // summary:
+ // Internal function to handle click actions - need to check
+ // readOnly, since button no longer does that check.
+ if(this.readOnly){
+ event.stop(e);
+ return false;
+ }
+ return this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/form/_ComboBoxMenu.js b/lib/dijit/form/_ComboBoxMenu.js
index 419e28c54..3f07fd5af 100644
--- a/lib/dijit/form/_ComboBoxMenu.js
+++ b/lib/dijit/form/_ComboBoxMenu.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_ComboBoxMenu",["dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/keys","../_WidgetBase","../_TemplatedMixin","./_ComboBoxMenuMixin","./_ListMouseMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form._ComboBoxMenu",[_6,_7,_9,_8],{templateString:"<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;'>"+"<div class='dijitMenuItem dijitMenuPreviousButton' data-dojo-attach-point='previousButton' role='option'></div>"+"<div class='dijitMenuItem dijitMenuNextButton' data-dojo-attach-point='nextButton' role='option'></div>"+"</div>",baseClass:"dijitComboBoxMenu",postCreate:function(){this.inherited(arguments);if(!this.isLeftToRight()){_2.add(this.previousButton,"dijitMenuItemRtl");_2.add(this.nextButton,"dijitMenuItemRtl");}},_createMenuItem:function(){return _3.create("div",{"class":"dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"),role:"option"});},onHover:function(_a){_2.add(_a,"dijitMenuItemHover");},onUnhover:function(_b){_2.remove(_b,"dijitMenuItemHover");},onSelect:function(_c){_2.add(_c,"dijitMenuItemSelected");},onDeselect:function(_d){_2.remove(_d,"dijitMenuItemSelected");},_page:function(up){var _e=0;var _f=this.domNode.scrollTop;var _10=_4.get(this.domNode,"height");if(!this.getHighlightedOption()){this.selectNextNode();}while(_e<_10){var _11=this.getHighlightedOption();if(up){if(!_11.previousSibling||_11.previousSibling.style.display=="none"){break;}this.selectPreviousNode();}else{if(!_11.nextSibling||_11.nextSibling.style.display=="none"){break;}this.selectNextNode();}var _12=this.domNode.scrollTop;_e+=(_12-_f)*(up?-1:1);_f=_12;}},handleKey:function(evt){switch(evt.charOrCode){case _5.DOWN_ARROW:this.selectNextNode();return false;case _5.PAGE_DOWN:this._page(false);return false;case _5.UP_ARROW:this.selectPreviousNode();return false;case _5.PAGE_UP:this._page(true);return false;default:return true;}}});}); \ No newline at end of file
+define("dijit/form/_ComboBoxMenu",["dojo/_base/declare","dojo/dom-class","dojo/dom-style","dojo/keys","../_WidgetBase","../_TemplatedMixin","./_ComboBoxMenuMixin","./_ListMouseMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _1("dijit.form._ComboBoxMenu",[_5,_6,_8,_7],{templateString:"<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;' role='listbox'>"+"<div class='dijitMenuItem dijitMenuPreviousButton' data-dojo-attach-point='previousButton' role='option'></div>"+"<div class='dijitMenuItem dijitMenuNextButton' data-dojo-attach-point='nextButton' role='option'></div>"+"</div>",baseClass:"dijitComboBoxMenu",postCreate:function(){this.inherited(arguments);if(!this.isLeftToRight()){_2.add(this.previousButton,"dijitMenuItemRtl");_2.add(this.nextButton,"dijitMenuItemRtl");}},_createMenuItem:function(){var _9=this.ownerDocument.createElement("div");_9.className="dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl");_9.setAttribute("role","option");return _9;},onHover:function(_a){_2.add(_a,"dijitMenuItemHover");},onUnhover:function(_b){_2.remove(_b,"dijitMenuItemHover");},onSelect:function(_c){_2.add(_c,"dijitMenuItemSelected");},onDeselect:function(_d){_2.remove(_d,"dijitMenuItemSelected");},_page:function(up){var _e=0;var _f=this.domNode.scrollTop;var _10=_3.get(this.domNode,"height");if(!this.getHighlightedOption()){this.selectNextNode();}while(_e<_10){var _11=this.getHighlightedOption();if(up){if(!_11.previousSibling||_11.previousSibling.style.display=="none"){break;}this.selectPreviousNode();}else{if(!_11.nextSibling||_11.nextSibling.style.display=="none"){break;}this.selectNextNode();}var _12=this.domNode.scrollTop;_e+=(_12-_f)*(up?-1:1);_f=_12;}},handleKey:function(evt){switch(evt.keyCode){case _4.DOWN_ARROW:this.selectNextNode();return false;case _4.PAGE_DOWN:this._page(false);return false;case _4.UP_ARROW:this.selectPreviousNode();return false;case _4.PAGE_UP:this._page(true);return false;default:return true;}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js
new file mode 100644
index 000000000..c7ed63b9c
--- /dev/null
+++ b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js
@@ -0,0 +1,131 @@
+define("dijit/form/_ComboBoxMenu", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-style", // domStyle.get
+ "dojo/keys", // keys.DOWN_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.UP_ARROW
+ "../_WidgetBase",
+ "../_TemplatedMixin",
+ "./_ComboBoxMenuMixin",
+ "./_ListMouseMixin"
+], function(declare, domClass, domStyle, keys,
+ _WidgetBase, _TemplatedMixin, _ComboBoxMenuMixin, _ListMouseMixin){
+
+
+ // module:
+ // dijit/form/_ComboBoxMenu
+
+ return declare("dijit.form._ComboBoxMenu",[_WidgetBase, _TemplatedMixin, _ListMouseMixin, _ComboBoxMenuMixin], {
+ // summary:
+ // Focus-less menu for internal use in `dijit/form/ComboBox`
+ // Abstract methods that must be defined externally:
+ //
+ // - onChange: item was explicitly chosen (mousedown somewhere on the menu and mouseup somewhere on the menu)
+ // - onPage: next(1) or previous(-1) button pressed
+ // tags:
+ // private
+
+ templateString: "<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;' role='listbox'>"
+ +"<div class='dijitMenuItem dijitMenuPreviousButton' data-dojo-attach-point='previousButton' role='option'></div>"
+ +"<div class='dijitMenuItem dijitMenuNextButton' data-dojo-attach-point='nextButton' role='option'></div>"
+ +"</div>",
+
+ baseClass: "dijitComboBoxMenu",
+
+ postCreate: function(){
+ this.inherited(arguments);
+ if(!this.isLeftToRight()){
+ domClass.add(this.previousButton, "dijitMenuItemRtl");
+ domClass.add(this.nextButton, "dijitMenuItemRtl");
+ }
+ },
+
+ _createMenuItem: function(){
+ // note: not using domConstruct.create() because need to specify document
+ var item = this.ownerDocument.createElement("div");
+ item.className = "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl");
+ item.setAttribute("role", "option");
+ return item;
+ },
+
+ onHover: function(/*DomNode*/ node){
+ // summary:
+ // Add hover CSS
+ domClass.add(node, "dijitMenuItemHover");
+ },
+
+ onUnhover: function(/*DomNode*/ node){
+ // summary:
+ // Remove hover CSS
+ domClass.remove(node, "dijitMenuItemHover");
+ },
+
+ onSelect: function(/*DomNode*/ node){
+ // summary:
+ // Add selected CSS
+ domClass.add(node, "dijitMenuItemSelected");
+ },
+
+ onDeselect: function(/*DomNode*/ node){
+ // summary:
+ // Remove selected CSS
+ domClass.remove(node, "dijitMenuItemSelected");
+ },
+
+ _page: function(/*Boolean*/ up){
+ // summary:
+ // Handles page-up and page-down keypresses
+
+ var scrollamount = 0;
+ var oldscroll = this.domNode.scrollTop;
+ var height = domStyle.get(this.domNode, "height");
+ // if no item is highlighted, highlight the first option
+ if(!this.getHighlightedOption()){
+ this.selectNextNode();
+ }
+ while(scrollamount<height){
+ var highlighted_option = this.getHighlightedOption();
+ if(up){
+ // stop at option 1
+ if(!highlighted_option.previousSibling ||
+ highlighted_option.previousSibling.style.display == "none"){
+ break;
+ }
+ this.selectPreviousNode();
+ }else{
+ // stop at last option
+ if(!highlighted_option.nextSibling ||
+ highlighted_option.nextSibling.style.display == "none"){
+ break;
+ }
+ this.selectNextNode();
+ }
+ // going backwards
+ var newscroll = this.domNode.scrollTop;
+ scrollamount += (newscroll-oldscroll)*(up ? -1:1);
+ oldscroll = newscroll;
+ }
+ },
+
+ handleKey: function(evt){
+ // summary:
+ // Handle keystroke event forwarded from ComboBox, returning false if it's
+ // a keystroke I recognize and process, true otherwise.
+ switch(evt.keyCode){
+ case keys.DOWN_ARROW:
+ this.selectNextNode();
+ return false;
+ case keys.PAGE_DOWN:
+ this._page(false);
+ return false;
+ case keys.UP_ARROW:
+ this.selectPreviousNode();
+ return false;
+ case keys.PAGE_UP:
+ this._page(true);
+ return false;
+ default:
+ return true;
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/_ComboBoxMenuMixin.js b/lib/dijit/form/_ComboBoxMenuMixin.js
index 1dd299902..6b9d60a4b 100644
--- a/lib/dijit/form/_ComboBoxMenuMixin.js
+++ b/lib/dijit/form/_ComboBoxMenuMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_ComboBoxMenuMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/i18n","dojo/_base/window","dojo/i18n!./nls/ComboBox"],function(_1,_2,_3,_4,_5){return _2("dijit.form._ComboBoxMenuMixin",null,{_messages:null,postMixInProperties:function(){this.inherited(arguments);this._messages=_4.getLocalization("dijit.form","ComboBox",this.lang);},buildRendering:function(){this.inherited(arguments);this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];},_setValueAttr:function(_6){this.value=_6;this.onChange(_6);},onClick:function(_7){if(_7==this.previousButton){this._setSelectedAttr(null);this.onPage(-1);}else{if(_7==this.nextButton){this._setSelectedAttr(null);this.onPage(1);}else{this.onChange(_7);}}},onChange:function(){},onPage:function(){},onClose:function(){this._setSelectedAttr(null);},_createOption:function(_8,_9){var _a=this._createMenuItem();var _b=_9(_8);if(_b.html){_a.innerHTML=_b.label;}else{_a.appendChild(_5.doc.createTextNode(_b.label));}if(_a.innerHTML==""){_a.innerHTML="&#160;";}this.applyTextDir(_a,(_a.innerText||_a.textContent||""));_a.item=_8;return _a;},createOptions:function(_c,_d,_e){this.previousButton.style.display=(_d.start==0)?"none":"";_3.set(this.previousButton,"id",this.id+"_prev");_1.forEach(_c,function(_f,i){var _10=this._createOption(_f,_e);_3.set(_10,"id",this.id+i);this.nextButton.parentNode.insertBefore(_10,this.nextButton);},this);var _11=false;if(_c.total&&!_c.total.then&&_c.total!=-1){if((_d.start+_d.count)<_c.total){_11=true;}else{if((_d.start+_d.count)>_c.total&&_d.count==_c.length){_11=true;}}}else{if(_d.count==_c.length){_11=true;}}this.nextButton.style.display=_11?"":"none";_3.set(this.nextButton,"id",this.id+"_next");return this.containerNode.childNodes;},clearResultList:function(){var _12=this.containerNode;while(_12.childNodes.length>2){_12.removeChild(_12.childNodes[_12.childNodes.length-2]);}this._setSelectedAttr(null);},highlightFirstOption:function(){this.selectFirstNode();},highlightLastOption:function(){this.selectLastNode();},selectFirstNode:function(){this.inherited(arguments);if(this.getHighlightedOption()==this.previousButton){this.selectNextNode();}},selectLastNode:function(){this.inherited(arguments);if(this.getHighlightedOption()==this.nextButton){this.selectPreviousNode();}},getHighlightedOption:function(){return this._getSelectedAttr();}});}); \ No newline at end of file
+define("dijit/form/_ComboBoxMenuMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/i18n","dojo/i18n!./nls/ComboBox"],function(_1,_2,_3,_4){return _2("dijit.form._ComboBoxMenuMixin",null,{_messages:null,postMixInProperties:function(){this.inherited(arguments);this._messages=_4.getLocalization("dijit.form","ComboBox",this.lang);},buildRendering:function(){this.inherited(arguments);this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];},_setValueAttr:function(_5){this.value=_5;this.onChange(_5);},onClick:function(_6){if(_6==this.previousButton){this._setSelectedAttr(null);this.onPage(-1);}else{if(_6==this.nextButton){this._setSelectedAttr(null);this.onPage(1);}else{this.onChange(_6);}}},onChange:function(){},onPage:function(){},onClose:function(){this._setSelectedAttr(null);},_createOption:function(_7,_8){var _9=this._createMenuItem();var _a=_8(_7);if(_a.html){_9.innerHTML=_a.label;}else{_9.appendChild(_9.ownerDocument.createTextNode(_a.label));}if(_9.innerHTML==""){_9.innerHTML="&#160;";}this.applyTextDir(_9,(_9.innerText||_9.textContent||""));return _9;},createOptions:function(_b,_c,_d){this.items=_b;this.previousButton.style.display=(_c.start==0)?"none":"";_3.set(this.previousButton,"id",this.id+"_prev");_1.forEach(_b,function(_e,i){var _f=this._createOption(_e,_d);_f.setAttribute("item",i);_3.set(_f,"id",this.id+i);this.nextButton.parentNode.insertBefore(_f,this.nextButton);},this);var _10=false;if(_b.total&&!_b.total.then&&_b.total!=-1){if((_c.start+_c.count)<_b.total){_10=true;}else{if((_c.start+_c.count)>_b.total&&_c.count==_b.length){_10=true;}}}else{if(_c.count==_b.length){_10=true;}}this.nextButton.style.display=_10?"":"none";_3.set(this.nextButton,"id",this.id+"_next");},clearResultList:function(){var _11=this.containerNode;while(_11.childNodes.length>2){_11.removeChild(_11.childNodes[_11.childNodes.length-2]);}this._setSelectedAttr(null);},highlightFirstOption:function(){this.selectFirstNode();},highlightLastOption:function(){this.selectLastNode();},selectFirstNode:function(){this.inherited(arguments);if(this.getHighlightedOption()==this.previousButton){this.selectNextNode();}},selectLastNode:function(){this.inherited(arguments);if(this.getHighlightedOption()==this.nextButton){this.selectPreviousNode();}},getHighlightedOption:function(){return this.selected;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js
new file mode 100644
index 000000000..b386be715
--- /dev/null
+++ b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js
@@ -0,0 +1,189 @@
+define("dijit/form/_ComboBoxMenuMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/i18n!./nls/ComboBox"
+], function(array, declare, domAttr, i18n){
+
+// module:
+// dijit/form/_ComboBoxMenuMixin
+
+return declare( "dijit.form._ComboBoxMenuMixin", null, {
+ // summary:
+ // Focus-less menu for internal use in `dijit/form/ComboBox`
+ // tags:
+ // private
+
+ // _messages: Object
+ // Holds "next" and "previous" text for paging buttons on drop down
+ _messages: null,
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this._messages = i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // fill in template with i18n messages
+ this.previousButton.innerHTML = this._messages["previousMessage"];
+ this.nextButton.innerHTML = this._messages["nextMessage"];
+ },
+
+ _setValueAttr: function(/*Object*/ value){
+ this.value = value;
+ this.onChange(value);
+ },
+
+ onClick: function(/*DomNode*/ node){
+ if(node == this.previousButton){
+ this._setSelectedAttr(null);
+ this.onPage(-1);
+ }else if(node == this.nextButton){
+ this._setSelectedAttr(null);
+ this.onPage(1);
+ }else{
+ this.onChange(node);
+ }
+ },
+
+ // stubs
+ onChange: function(/*Number*/ /*===== direction =====*/){
+ // summary:
+ // Notifies ComboBox/FilteringSelect that user selected an option.
+ // tags:
+ // callback
+ },
+
+ onPage: function(/*Number*/ /*===== direction =====*/){
+ // summary:
+ // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page.
+ // tags:
+ // callback
+ },
+
+ onClose: function(){
+ // summary:
+ // Callback from dijit.popup code to this widget, notifying it that it closed
+ // tags:
+ // private
+ this._setSelectedAttr(null);
+ },
+
+ _createOption: function(/*Object*/ item, labelFunc){
+ // summary:
+ // Creates an option to appear on the popup menu subclassed by
+ // `dijit/form/FilteringSelect`.
+
+ var menuitem = this._createMenuItem();
+ var labelObject = labelFunc(item);
+ if(labelObject.html){
+ menuitem.innerHTML = labelObject.label;
+ }else{
+ menuitem.appendChild(
+ menuitem.ownerDocument.createTextNode(labelObject.label)
+ );
+ }
+ // #3250: in blank options, assign a normal height
+ if(menuitem.innerHTML == ""){
+ menuitem.innerHTML = "&#160;"; // &nbsp;
+ }
+
+ // update menuitem.dir if BidiSupport was required
+ this.applyTextDir(menuitem, (menuitem.innerText || menuitem.textContent || ""));
+
+ return menuitem;
+ },
+
+ createOptions: function(results, options, labelFunc){
+ // summary:
+ // Fills in the items in the drop down list
+ // results:
+ // Array of items
+ // options:
+ // The options to the query function of the store
+ //
+ // labelFunc:
+ // Function to produce a label in the drop down list from a dojo.data item
+
+ this.items = results;
+
+ // display "Previous . . ." button
+ this.previousButton.style.display = (options.start == 0) ? "none" : "";
+ domAttr.set(this.previousButton, "id", this.id + "_prev");
+ // create options using _createOption function defined by parent
+ // ComboBox (or FilteringSelect) class
+ // #2309:
+ // iterate over cache nondestructively
+ array.forEach(results, function(item, i){
+ var menuitem = this._createOption(item, labelFunc);
+ menuitem.setAttribute("item", i); // index to this.items; use indirection to avoid mem leak
+ domAttr.set(menuitem, "id", this.id + i);
+ this.nextButton.parentNode.insertBefore(menuitem, this.nextButton);
+ }, this);
+ // display "Next . . ." button
+ var displayMore = false;
+ // Try to determine if we should show 'more'...
+ if(results.total && !results.total.then && results.total != -1){
+ if((options.start + options.count) < results.total){
+ displayMore = true;
+ }else if((options.start + options.count) > results.total && options.count == results.length){
+ // Weird return from a data store, where a start + count > maxOptions
+ // implies maxOptions isn't really valid and we have to go into faking it.
+ // And more or less assume more if count == results.length
+ displayMore = true;
+ }
+ }else if(options.count == results.length){
+ //Don't know the size, so we do the best we can based off count alone.
+ //So, if we have an exact match to count, assume more.
+ displayMore = true;
+ }
+
+ this.nextButton.style.display = displayMore ? "" : "none";
+ domAttr.set(this.nextButton,"id", this.id + "_next");
+ },
+
+ clearResultList: function(){
+ // summary:
+ // Clears the entries in the drop down list, but of course keeps the previous and next buttons.
+ var container = this.containerNode;
+ while(container.childNodes.length > 2){
+ container.removeChild(container.childNodes[container.childNodes.length-2]);
+ }
+ this._setSelectedAttr(null);
+ },
+
+ highlightFirstOption: function(){
+ // summary:
+ // Highlight the first real item in the list (not Previous Choices).
+ this.selectFirstNode();
+ },
+
+ highlightLastOption: function(){
+ // summary:
+ // Highlight the last real item in the list (not More Choices).
+ this.selectLastNode();
+ },
+
+ selectFirstNode: function(){
+ this.inherited(arguments);
+ if(this.getHighlightedOption() == this.previousButton){
+ this.selectNextNode();
+ }
+ },
+
+ selectLastNode: function(){
+ this.inherited(arguments);
+ if(this.getHighlightedOption() == this.nextButton){
+ this.selectPreviousNode();
+ }
+ },
+
+ getHighlightedOption: function(){
+ return this.selected;
+ }
+});
+
+});
diff --git a/lib/dijit/form/_DateTimeTextBox.js b/lib/dijit/form/_DateTimeTextBox.js
index b79008509..dd1c17182 100644
--- a/lib/dijit/form/_DateTimeTextBox.js
+++ b/lib/dijit/form/_DateTimeTextBox.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/DropDownBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});define("dijit/form/_DateTimeTextBox",["dojo/date","dojo/date/locale","dojo/date/stamp","dojo/_base/declare","dojo/_base/lang","./RangeBoundTextBox","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_1,_2,_3,_4,_5,_6,_7,_8){new Date("X");var _9=_4("dijit.form._DateTimeTextBox",[_6,_7],{templateString:_8,hasDownArrow:true,openOnClick:true,regExpGen:_2.regexp,datePackage:_1,postMixInProperties:function(){this.inherited(arguments);this._set("type","text");},compare:function(_a,_b){var _c=this._isInvalidDate(_a);var _d=this._isInvalidDate(_b);return _c?(_d?0:-1):(_d?1:_1.compare(_a,_b,this._selector));},forceWidth:true,format:function(_e,_f){if(!_e){return "";}return this.dateLocaleModule.format(_e,_f);},"parse":function(_10,_11){return this.dateLocaleModule.parse(_10,_11)||(this._isEmpty(_10)?null:undefined);},serialize:function(val,_12){if(val.toGregorian){val=val.toGregorian();}return _3.toISOString(val,_12);},dropDownDefaultValue:new Date(),value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(_13){this.datePackage=_13.datePackage||this.datePackage;this.dateFuncObj=typeof this.datePackage=="string"?_5.getObject(this.datePackage,false):this.datePackage;this.dateClassObj=this.dateFuncObj.Date||Date;this.dateLocaleModule=_5.getObject("locale",false,this.dateFuncObj);this.regExpGen=this.dateLocaleModule.regexp;this._invalidDate=this.constructor.prototype.value.toString();},buildRendering:function(){this.inherited(arguments);if(!this.hasDownArrow){this._buttonNode.style.display="none";}if(this.openOnClick||!this.hasDownArrow){this._buttonNode=this.domNode;this.baseClass+=" dijitComboBoxOpenOnClick";}},_setConstraintsAttr:function(_14){_14.selector=this._selector;_14.fullYear=true;var _15=_3.fromISOString;if(typeof _14.min=="string"){_14.min=_15(_14.min);}if(typeof _14.max=="string"){_14.max=_15(_14.max);}this.inherited(arguments);},_isInvalidDate:function(_16){return !_16||isNaN(_16)||typeof _16!="object"||_16.toString()==this._invalidDate;},_setValueAttr:function(_17,_18,_19){if(_17!==undefined){if(typeof _17=="string"){_17=_3.fromISOString(_17);}if(this._isInvalidDate(_17)){_17=null;}if(_17 instanceof Date&&!(this.dateClassObj instanceof Date)){_17=new this.dateClassObj(_17);}}this.inherited(arguments);if(this.value instanceof Date){this.filterString="";}if(this.dropDown){this.dropDown.set("value",_17,false);}},_set:function(_1a,_1b){if(_1a=="value"&&this.value instanceof Date&&this.compare(_1b,this.value)==0){return;}this.inherited(arguments);},_setDropDownDefaultValueAttr:function(val){if(this._isInvalidDate(val)){val=new this.dateClassObj();}this.dropDownDefaultValue=val;},openDropDown:function(_1c){if(this.dropDown){this.dropDown.destroy();}var _1d=_5.isString(this.popupClass)?_5.getObject(this.popupClass,false):this.popupClass,_1e=this,_1f=this.get("value");this.dropDown=new _1d({onChange:function(_20){_1e.set("value",_20,true);},id:this.id+"_popup",dir:_1e.dir,lang:_1e.lang,value:_1f,currentFocus:!this._isInvalidDate(_1f)?_1f:this.dropDownDefaultValue,constraints:_1e.constraints,filterString:_1e.filterString,datePackage:_1e.datePackage,isDisabledDate:function(_21){return !_1e.rangeCheck(_21,_1e.constraints);}});this.inherited(arguments);},_getDisplayedValueAttr:function(){return this.textbox.value;},_setDisplayedValueAttr:function(_22,_23){this._setValueAttr(this.parse(_22,this.constraints),_23,_22);}});return _9;}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/DropDownBox.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"button presentation\" aria-hidden=\"true\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});define("dijit/form/_DateTimeTextBox",["dojo/date","dojo/date/locale","dojo/date/stamp","dojo/_base/declare","dojo/_base/lang","./RangeBoundTextBox","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_1,_2,_3,_4,_5,_6,_7,_8){new Date("X");var _9=_4("dijit.form._DateTimeTextBox",[_6,_7],{templateString:_8,hasDownArrow:true,cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},pattern:_2.regexp,datePackage:"",postMixInProperties:function(){this.inherited(arguments);this._set("type","text");},compare:function(_a,_b){var _c=this._isInvalidDate(_a);var _d=this._isInvalidDate(_b);return _c?(_d?0:-1):(_d?1:_1.compare(_a,_b,this._selector));},forceWidth:true,format:function(_e,_f){if(!_e){return "";}return this.dateLocaleModule.format(_e,_f);},"parse":function(_10,_11){return this.dateLocaleModule.parse(_10,_11)||(this._isEmpty(_10)?null:undefined);},serialize:function(val,_12){if(val.toGregorian){val=val.toGregorian();}return _3.toISOString(val,_12);},dropDownDefaultValue:new Date(),value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(_13){this.dateModule=_13.datePackage?_5.getObject(_13.datePackage,false):_1;this.dateClassObj=this.dateModule.Date||Date;this.dateLocaleModule=_13.datePackage?_5.getObject(_13.datePackage+".locale",false):_2;this._set("pattern",this.dateLocaleModule.regexp);this._invalidDate=this.constructor.prototype.value.toString();},buildRendering:function(){this.inherited(arguments);if(!this.hasDownArrow){this._buttonNode.style.display="none";}if(!this.hasDownArrow){this._buttonNode=this.domNode;this.baseClass+=" dijitComboBoxOpenOnClick";}},_setConstraintsAttr:function(_14){_14.selector=this._selector;_14.fullYear=true;var _15=_3.fromISOString;if(typeof _14.min=="string"){_14.min=_15(_14.min);}if(typeof _14.max=="string"){_14.max=_15(_14.max);}this.inherited(arguments);},_isInvalidDate:function(_16){return !_16||isNaN(_16)||typeof _16!="object"||_16.toString()==this._invalidDate;},_setValueAttr:function(_17,_18,_19){if(_17!==undefined){if(typeof _17=="string"){_17=_3.fromISOString(_17);}if(this._isInvalidDate(_17)){_17=null;}if(_17 instanceof Date&&!(this.dateClassObj instanceof Date)){_17=new this.dateClassObj(_17);}}this.inherited(arguments);if(this.value instanceof Date){this.filterString="";}if(this.dropDown){this.dropDown.set("value",_17,false);}},_set:function(_1a,_1b){if(_1a=="value"&&this.value instanceof Date&&this.compare(_1b,this.value)==0){return;}this.inherited(arguments);},_setDropDownDefaultValueAttr:function(val){if(this._isInvalidDate(val)){val=new this.dateClassObj();}this.dropDownDefaultValue=val;},openDropDown:function(_1c){if(this.dropDown){this.dropDown.destroy();}var _1d=_5.isString(this.popupClass)?_5.getObject(this.popupClass,false):this.popupClass,_1e=this,_1f=this.get("value");this.dropDown=new _1d({onChange:function(_20){_1e.set("value",_20,true);},id:this.id+"_popup",dir:_1e.dir,lang:_1e.lang,value:_1f,currentFocus:!this._isInvalidDate(_1f)?_1f:this.dropDownDefaultValue,constraints:_1e.constraints,filterString:_1e.filterString,datePackage:_1e.params.datePackage,isDisabledDate:function(_21){return !_1e.rangeCheck(_21,_1e.constraints);}});this.inherited(arguments);},_getDisplayedValueAttr:function(){return this.textbox.value;},_setDisplayedValueAttr:function(_22,_23){this._setValueAttr(this.parse(_22,this.constraints),_23,_22);}});return _9;}); \ No newline at end of file
diff --git a/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js
new file mode 100644
index 000000000..b95001288
--- /dev/null
+++ b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js
@@ -0,0 +1,260 @@
+require({cache:{
+'url:dijit/form/templates/DropDownBox.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdata-dojo-attach-point=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"button presentation\" aria-hidden=\"true\"\n\t\t\t${_buttonInputDisabled}\n\t/></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' ${!nameAttrSetting} type=\"text\" autocomplete=\"off\"\n\t\t\tdata-dojo-attach-point=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"}});
+define("dijit/form/_DateTimeTextBox", [
+ "dojo/date", // date date.compare
+ "dojo/date/locale", // locale.regexp
+ "dojo/date/stamp", // stamp.fromISOString stamp.toISOString
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.getObject
+ "./RangeBoundTextBox",
+ "../_HasDropDown",
+ "dojo/text!./templates/DropDownBox.html"
+], function(date, locale, stamp, declare, lang, RangeBoundTextBox, _HasDropDown, template){
+
+ // module:
+ // dijit/form/_DateTimeTextBox
+
+ new Date("X"); // workaround for #11279, new Date("") == NaN
+
+ var _DateTimeTextBox = declare("dijit.form._DateTimeTextBox", [RangeBoundTextBox, _HasDropDown], {
+ // summary:
+ // Base class for validating, serializable, range-bound date or time text box.
+
+ templateString: template,
+
+ // hasDownArrow: [const] Boolean
+ // Set this textbox to display a down arrow button, to open the drop down list.
+ hasDownArrow: true,
+
+ // Set classes like dijitDownArrowButtonHover depending on mouse action over button node
+ cssStateNodes: {
+ "_buttonNode": "dijitDownArrowButton"
+ },
+
+ /*=====
+ // constraints: _DateTimeTextBox.__Constraints
+ // Despite the name, this parameter specifies both constraints on the input
+ // (including starting/ending dates/times allowed) as well as
+ // formatting options like whether the date is displayed in long (ex: December 25, 2005)
+ // or short (ex: 12/25/2005) format. See `dijit/form/_DateTimeTextBox.__Constraints` for details.
+ constraints: {},
+ ======*/
+
+ // Override ValidationTextBox.pattern.... we use a reg-ex generating function rather
+ // than a straight regexp to deal with locale (plus formatting options too?)
+ pattern: locale.regexp,
+
+ // datePackage: String
+ // JavaScript namespace to find calendar routines. If unspecified, uses Gregorian calendar routines
+ // at dojo/date and dojo/date/locale.
+ datePackage: "",
+ // TODO: for 2.0, replace datePackage with dateModule and dateLocalModule attributes specifying MIDs,
+ // or alternately just get rid of this completely and tell user to use module ID remapping
+ // via require
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this._set("type", "text"); // in case type="date"|"time" was specified which messes up parse/format
+ },
+
+ // Override _FormWidget.compare() to work for dates/times
+ compare: function(/*Date*/ val1, /*Date*/ val2){
+ var isInvalid1 = this._isInvalidDate(val1);
+ var isInvalid2 = this._isInvalidDate(val2);
+ return isInvalid1 ? (isInvalid2 ? 0 : -1) : (isInvalid2 ? 1 : date.compare(val1, val2, this._selector));
+ },
+
+ // flag to _HasDropDown to make drop down Calendar width == <input> width
+ forceWidth: true,
+
+ format: function(/*Date*/ value, /*locale.__FormatOptions*/ constraints){
+ // summary:
+ // Formats the value as a Date, according to specified locale (second argument)
+ // tags:
+ // protected
+ if(!value){ return ''; }
+ return this.dateLocaleModule.format(value, constraints);
+ },
+
+ "parse": function(/*String*/ value, /*locale.__FormatOptions*/ constraints){
+ // summary:
+ // Parses as string as a Date, according to constraints
+ // tags:
+ // protected
+
+ return this.dateLocaleModule.parse(value, constraints) || (this._isEmpty(value) ? null : undefined); // Date
+ },
+
+ // Overrides ValidationTextBox.serialize() to serialize a date in canonical ISO format.
+ serialize: function(/*anything*/ val, /*Object?*/ options){
+ if(val.toGregorian){
+ val = val.toGregorian();
+ }
+ return stamp.toISOString(val, options);
+ },
+
+ // dropDownDefaultValue: Date
+ // The default value to focus in the popupClass widget when the textbox value is empty.
+ dropDownDefaultValue : new Date(),
+
+ // value: Date
+ // The value of this widget as a JavaScript Date object. Use get("value") / set("value", val) to manipulate.
+ // When passed to the parser in markup, must be specified according to `dojo/date/stamp.fromISOString()`
+ value: new Date(""), // value.toString()="NaN"
+
+ _blankValue: null, // used by filter() when the textbox is blank
+
+ // popupClass: [protected extension] String
+ // Name of the popup widget class used to select a date/time.
+ // Subclasses should specify this.
+ popupClass: "", // default is no popup = text only
+
+
+ // _selector: [protected extension] String
+ // Specifies constraints.selector passed to dojo.date functions, should be either
+ // "date" or "time".
+ // Subclass must specify this.
+ _selector: "",
+
+ constructor: function(params /*===== , srcNodeRef =====*/){
+ // summary:
+ // Create the widget.
+ // params: Object|null
+ // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)
+ // and functions, typically callbacks like onClick.
+ // The hash can contain any of the widget's properties, excluding read-only properties.
+ // srcNodeRef: DOMNode|String?
+ // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree
+
+ this.dateModule = params.datePackage ? lang.getObject(params.datePackage, false) : date;
+ this.dateClassObj = this.dateModule.Date || Date;
+ this.dateLocaleModule = params.datePackage ? lang.getObject(params.datePackage+".locale", false) : locale;
+ this._set('pattern', this.dateLocaleModule.regexp);
+ this._invalidDate = this.constructor.prototype.value.toString();
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ if(!this.hasDownArrow){
+ this._buttonNode.style.display = "none";
+ }
+
+ // If hasDownArrow is false, we basically just want to treat the whole widget as the
+ // button.
+ if(!this.hasDownArrow){
+ this._buttonNode = this.domNode;
+ this.baseClass += " dijitComboBoxOpenOnClick";
+ }
+ },
+
+ _setConstraintsAttr: function(/*Object*/ constraints){
+ constraints.selector = this._selector;
+ constraints.fullYear = true; // see #5465 - always format with 4-digit years
+ var fromISO = stamp.fromISOString;
+ if(typeof constraints.min == "string"){ constraints.min = fromISO(constraints.min); }
+ if(typeof constraints.max == "string"){ constraints.max = fromISO(constraints.max); }
+ this.inherited(arguments);
+ },
+
+ _isInvalidDate: function(/*Date*/ value){
+ // summary:
+ // Runs various tests on the value, checking for invalid conditions
+ // tags:
+ // private
+ return !value || isNaN(value) || typeof value != "object" || value.toString() == this._invalidDate;
+ },
+
+ _setValueAttr: function(/*Date|String*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // Sets the date on this textbox. Note: value can be a JavaScript Date literal or a string to be parsed.
+ if(value !== undefined){
+ if(typeof value == "string"){
+ value = stamp.fromISOString(value);
+ }
+ if(this._isInvalidDate(value)){
+ value = null;
+ }
+ if(value instanceof Date && !(this.dateClassObj instanceof Date)){
+ value = new this.dateClassObj(value);
+ }
+ }
+ this.inherited(arguments);
+ if(this.value instanceof Date){
+ this.filterString = "";
+ }
+ if(this.dropDown){
+ this.dropDown.set('value', value, false);
+ }
+ },
+
+ _set: function(attr, value){
+ // Avoid spurious watch() notifications when value is changed to new Date object w/the same value
+ if(attr == "value" && this.value instanceof Date && this.compare(value, this.value) == 0){
+ return;
+ }
+ this.inherited(arguments);
+ },
+
+ _setDropDownDefaultValueAttr: function(/*Date*/ val){
+ if(this._isInvalidDate(val)){
+ // convert null setting into today's date, since there needs to be *some* default at all times.
+ val = new this.dateClassObj();
+ }
+ this.dropDownDefaultValue = val;
+ },
+
+ openDropDown: function(/*Function*/ callback){
+ // rebuild drop down every time, so that constraints get copied (#6002)
+ if(this.dropDown){
+ this.dropDown.destroy();
+ }
+ var PopupProto = lang.isString(this.popupClass) ? lang.getObject(this.popupClass, false) : this.popupClass,
+ textBox = this,
+ value = this.get("value");
+ this.dropDown = new PopupProto({
+ onChange: function(value){
+ // this will cause InlineEditBox and other handlers to do stuff so make sure it's last
+ textBox.set('value', value, true);
+ },
+ id: this.id + "_popup",
+ dir: textBox.dir,
+ lang: textBox.lang,
+ value: value,
+ currentFocus: !this._isInvalidDate(value) ? value : this.dropDownDefaultValue,
+ constraints: textBox.constraints,
+ filterString: textBox.filterString, // for TimeTextBox, to filter times shown
+ datePackage: textBox.params.datePackage,
+ isDisabledDate: function(/*Date*/ date){
+ // summary:
+ // disables dates outside of the min/max of the _DateTimeTextBox
+ return !textBox.rangeCheck(date, textBox.constraints);
+ }
+ });
+
+ this.inherited(arguments);
+ },
+
+ _getDisplayedValueAttr: function(){
+ return this.textbox.value;
+ },
+
+ _setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
+ this._setValueAttr(this.parse(value, this.constraints), priorityChange, value);
+ }
+ });
+
+
+ /*=====
+ _DateTimeTextBox.__Constraints = declare([RangeBoundTextBox.__Constraints, locale.__FormatOptions], {
+ // summary:
+ // Specifies both the rules on valid/invalid values (first/last date/time allowed),
+ // and also formatting options for how the date/time is displayed.
+ // example:
+ // To restrict to dates within 2004, displayed in a long format like "December 25, 2005":
+ // | {min:'2004-01-01',max:'2004-12-31', formatLength:'long'}
+ });
+ =====*/
+
+ return _DateTimeTextBox;
+});
diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js b/lib/dijit/form/_ExpandingTextAreaMixin.js
index d5071e7ca..8d97659f3 100644
--- a/lib/dijit/form/_ExpandingTextAreaMixin.js
+++ b/lib/dijit/form/_ExpandingTextAreaMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_ExpandingTextAreaMixin",["dojo/_base/declare","dojo/dom-construct","dojo/_base/lang","dojo/_base/window"],function(_1,_2,_3,_4){var _5;return _1("dijit.form._ExpandingTextAreaMixin",null,{_setValueAttr:function(){this.inherited(arguments);this.resize();},postCreate:function(){this.inherited(arguments);var _6=this.textbox;if(_5==undefined){var te=_2.create("textarea",{rows:"5",cols:"20",value:" ",style:{zoom:1,overflow:"hidden",visibility:"hidden",position:"absolute",border:"0px solid black",padding:"0px"}},_4.body(),"last");_5=te.scrollHeight>=te.clientHeight;_4.body().removeChild(te);}this.connect(_6,"onscroll","_resizeLater");this.connect(_6,"onresize","_resizeLater");this.connect(_6,"onfocus","_resizeLater");_6.style.overflowY="hidden";this._estimateHeight();this._resizeLater();},_onInput:function(e){this.inherited(arguments);this.resize();},_estimateHeight:function(){var _7=this.textbox;_7.style.height="auto";_7.rows=(_7.value.match(/\n/g)||[]).length+2;},_resizeLater:function(){this.defer("resize");},resize:function(){function _8(){var _9=false;if(_a.value===""){_a.value=" ";_9=true;}var sh=_a.scrollHeight;if(_9){_a.value="";}return sh;};var _a=this.textbox;if(_a.style.overflowY=="hidden"){_a.scrollTop=0;}if(this.busyResizing){return;}this.busyResizing=true;if(_8()||_a.offsetHeight){var _b=_a.style.height;if(!(/px/.test(_b))){_b=_8();_a.rows=1;_a.style.height=_b+"px";}var _c=Math.max(Math.max(_a.offsetHeight,parseInt(_b))-_a.clientHeight,0)+_8();var _d=_c+"px";if(_d!=_a.style.height){_a.rows=1;_a.style.height=_d;}if(_5){var _e=_8(),_f=_e,_10=_a.style.minHeight,_11=4,_12;_a.style.minHeight=_d;_a.style.height="auto";while(_c>0){_a.style.minHeight=Math.max(_c-_11,4)+"px";_12=_8();var _13=_f-_12;_c-=_13;if(_13<_11){break;}_f=_12;_11<<=1;}_a.style.height=_c+"px";_a.style.minHeight=_10;}_a.style.overflowY=_8()>_a.clientHeight?"auto":"hidden";}else{this._estimateHeight();}this.busyResizing=false;}});}); \ No newline at end of file
+define("dijit/form/_ExpandingTextAreaMixin",["dojo/_base/declare","dojo/dom-construct","dojo/has","dojo/_base/lang","dojo/on","dojo/_base/window","../Viewport"],function(_1,_2,_3,_4,on,_5,_6){_3.add("textarea-needs-help-shrinking",function(){var _7=_5.body(),te=_2.create("textarea",{rows:"5",cols:"20",value:" ",style:{zoom:1,fontSize:"12px",height:"96px",overflow:"hidden",visibility:"hidden",position:"absolute",border:"5px solid white",margin:"0",padding:"0",boxSizing:"border-box",MsBoxSizing:"border-box",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box"}},_7,"last");var _8=te.scrollHeight>=te.clientHeight;_7.removeChild(te);return _8;});return _1("dijit.form._ExpandingTextAreaMixin",null,{_setValueAttr:function(){this.inherited(arguments);this.resize();},postCreate:function(){this.inherited(arguments);var _9=this.textbox;_9.style.overflowY="hidden";this.own(on(_9,"focus, resize",_4.hitch(this,"_resizeLater")));},startup:function(){this.inherited(arguments);this.own(_6.on("resize",_4.hitch(this,"_resizeLater")));this._resizeLater();},_onInput:function(e){this.inherited(arguments);this.resize();},_estimateHeight:function(){var _a=this.textbox;_a.rows=(_a.value.match(/\n/g)||[]).length+1;},_resizeLater:function(){this.defer("resize");},resize:function(){var _b=this.textbox;function _c(){var _d=false;if(_b.value===""){_b.value=" ";_d=true;}var sh=_b.scrollHeight;if(_d){_b.value="";}return sh;};if(_b.style.overflowY=="hidden"){_b.scrollTop=0;}if(this.busyResizing){return;}this.busyResizing=true;if(_c()||_b.offsetHeight){var _e=_c()+Math.max(_b.offsetHeight-_b.clientHeight,0);var _f=_e+"px";if(_f!=_b.style.height){_b.style.height=_f;_b.rows=1;}if(_3("textarea-needs-help-shrinking")){var _10=_c(),_11=_10,_12=_b.style.minHeight,_13=4,_14,_15=_b.scrollTop;_b.style.minHeight=_f;_b.style.height="auto";while(_e>0){_b.style.minHeight=Math.max(_e-_13,4)+"px";_14=_c();var _16=_11-_14;_e-=_16;if(_16<_13){break;}_11=_14;_13<<=1;}_b.style.height=_e+"px";_b.style.minHeight=_12;_b.scrollTop=_15;}_b.style.overflowY=_c()>_b.clientHeight?"auto":"hidden";if(_b.style.overflowY=="hidden"){_b.scrollTop=0;}}else{this._estimateHeight();}this.busyResizing=false;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js
new file mode 100644
index 000000000..382663e98
--- /dev/null
+++ b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js
@@ -0,0 +1,130 @@
+define("dijit/form/_ExpandingTextAreaMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.create
+ "dojo/has",
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/_base/window", // win.body
+ "../Viewport"
+], function(declare, domConstruct, has, lang, on, win, Viewport){
+
+ // module:
+ // dijit/form/_ExpandingTextAreaMixin
+
+ // feature detection, true for mozilla and webkit
+ has.add("textarea-needs-help-shrinking", function(){
+ var body = win.body(), // note: if multiple documents exist, doesn't matter which one we use
+ te = domConstruct.create('textarea', {
+ rows:"5",
+ cols:"20",
+ value: ' ',
+ style: {zoom:1, fontSize:"12px", height:"96px", overflow:'hidden', visibility:'hidden', position:'absolute', border:"5px solid white", margin:"0", padding:"0", boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' }
+ }, body, "last");
+ var needsHelpShrinking = te.scrollHeight >= te.clientHeight;
+ body.removeChild(te);
+ return needsHelpShrinking;
+ });
+
+ return declare("dijit.form._ExpandingTextAreaMixin", null, {
+ // summary:
+ // Mixin for textarea widgets to add auto-expanding capability
+
+ _setValueAttr: function(){
+ this.inherited(arguments);
+ this.resize();
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ var textarea = this.textbox;
+ textarea.style.overflowY = "hidden";
+ this.own(on(textarea, "focus, resize", lang.hitch(this, "_resizeLater")));
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ this.own(Viewport.on("resize", lang.hitch(this, "_resizeLater")));
+ this._resizeLater();
+ },
+
+ _onInput: function(e){
+ this.inherited(arguments);
+ this.resize();
+ },
+
+ _estimateHeight: function(){
+ // summary:
+ // Approximate the height when the textarea is invisible with the number of lines in the text.
+ // Fails when someone calls setValue with a long wrapping line, but the layout fixes itself when the user clicks inside so . . .
+ // In IE, the resize event is supposed to fire when the textarea becomes visible again and that will correct the size automatically.
+ //
+ var textarea = this.textbox;
+ // #rows = #newlines+1
+ textarea.rows = (textarea.value.match(/\n/g) || []).length + 1;
+ },
+
+ _resizeLater: function(){
+ this.defer("resize");
+ },
+
+ resize: function(){
+ // summary:
+ // Resizes the textarea vertically (should be called after a style/value change)
+
+ var textarea = this.textbox;
+
+ function textareaScrollHeight(){
+ var empty = false;
+ if(textarea.value === ''){
+ textarea.value = ' ';
+ empty = true;
+ }
+ var sh = textarea.scrollHeight;
+ if(empty){ textarea.value = ''; }
+ return sh;
+ }
+
+ if(textarea.style.overflowY == "hidden"){ textarea.scrollTop = 0; }
+ if(this.busyResizing){ return; }
+ this.busyResizing = true;
+ if(textareaScrollHeight() || textarea.offsetHeight){
+ var newH = textareaScrollHeight() + Math.max(textarea.offsetHeight - textarea.clientHeight, 0);
+ var newHpx = newH + "px";
+ if(newHpx != textarea.style.height){
+ textarea.style.height = newHpx;
+ textarea.rows = 1; // rows can act like a minHeight if not cleared
+ }
+ if(has("textarea-needs-help-shrinking")){
+ var origScrollHeight = textareaScrollHeight(),
+ newScrollHeight = origScrollHeight,
+ origMinHeight = textarea.style.minHeight,
+ decrement = 4, // not too fast, not too slow
+ thisScrollHeight,
+ origScrollTop = textarea.scrollTop;
+ textarea.style.minHeight = newHpx; // maintain current height
+ textarea.style.height = "auto"; // allow scrollHeight to change
+ while(newH > 0){
+ textarea.style.minHeight = Math.max(newH - decrement, 4) + "px";
+ thisScrollHeight = textareaScrollHeight();
+ var change = newScrollHeight - thisScrollHeight;
+ newH -= change;
+ if(change < decrement){
+ break; // scrollHeight didn't shrink
+ }
+ newScrollHeight = thisScrollHeight;
+ decrement <<= 1;
+ }
+ textarea.style.height = newH + "px";
+ textarea.style.minHeight = origMinHeight;
+ textarea.scrollTop = origScrollTop;
+ }
+ textarea.style.overflowY = textareaScrollHeight() > textarea.clientHeight ? "auto" : "hidden";
+ if(textarea.style.overflowY == "hidden"){ textarea.scrollTop = 0; }
+ }else{
+ // hidden content of unknown size
+ this._estimateHeight();
+ }
+ this.busyResizing = false;
+ }
+ });
+});
diff --git a/lib/dijit/form/_FormMixin.js b/lib/dijit/form/_FormMixin.js
index 770ec2471..78aea1c0c 100644
--- a/lib/dijit/form/_FormMixin.js
+++ b/lib/dijit/form/_FormMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_FormMixin",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/window"],function(_1,_2,_3,_4,_5){return _2("dijit.form._FormMixin",null,{state:"",_getDescendantFormWidgets:function(_6){var _7=[];_1.forEach(_6||this.getChildren(),function(_8){if("value" in _8){_7.push(_8);}else{_7=_7.concat(this._getDescendantFormWidgets(_8.getChildren()));}},this);return _7;},reset:function(){_1.forEach(this._getDescendantFormWidgets(),function(_9){if(_9.reset){_9.reset();}});},validate:function(){var _a=false;return _1.every(_1.map(this._getDescendantFormWidgets(),function(_b){_b._hasBeenBlurred=true;var _c=_b.disabled||!_b.validate||_b.validate();if(!_c&&!_a){_5.scrollIntoView(_b.containerNode||_b.domNode);_b.focus();_a=true;}return _c;}),function(_d){return _d;});},setValues:function(_e){_3.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");return this.set("value",_e);},_setValueAttr:function(_f){var map={};_1.forEach(this._getDescendantFormWidgets(),function(_10){if(!_10.name){return;}var _11=map[_10.name]||(map[_10.name]=[]);_11.push(_10);});for(var _12 in map){if(!map.hasOwnProperty(_12)){continue;}var _13=map[_12],_14=_4.getObject(_12,false,_f);if(_14===undefined){continue;}if(!_4.isArray(_14)){_14=[_14];}if(typeof _13[0].checked=="boolean"){_1.forEach(_13,function(w){w.set("value",_1.indexOf(_14,w.value)!=-1);});}else{if(_13[0].multiple){_13[0].set("value",_14);}else{_1.forEach(_13,function(w,i){w.set("value",_14[i]);});}}}},getValues:function(){_3.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};_1.forEach(this._getDescendantFormWidgets(),function(_15){var _16=_15.name;if(!_16||_15.disabled){return;}var _17=_15.get("value");if(typeof _15.checked=="boolean"){if(/Radio/.test(_15.declaredClass)){if(_17!==false){_4.setObject(_16,_17,obj);}else{_17=_4.getObject(_16,false,obj);if(_17===undefined){_4.setObject(_16,null,obj);}}}else{var ary=_4.getObject(_16,false,obj);if(!ary){ary=[];_4.setObject(_16,ary,obj);}if(_17!==false){ary.push(_17);}}}else{var _18=_4.getObject(_16,false,obj);if(typeof _18!="undefined"){if(_4.isArray(_18)){_18.push(_17);}else{_4.setObject(_16,[_18,_17],obj);}}else{_4.setObject(_16,_17,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(){},_getState:function(){var _19=_1.map(this._descendants,function(w){return w.get("state")||"";});return _1.indexOf(_19,"Error")>=0?"Error":_1.indexOf(_19,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){_1.forEach(this._childConnections||[],_4.hitch(this,"disconnect"));_1.forEach(this._childWatches||[],function(w){w.unwatch();});},connectChildren:function(_1a){var _1b=this;this.disconnectChildren();this._descendants=this._getDescendantFormWidgets();var set=_1a?function(_1c,val){_1b[_1c]=val;}:_4.hitch(this,"_set");set("value",this.get("value"));set("state",this._getState());var _1d=(this._childConnections=[]),_1e=(this._childWatches=[]);_1.forEach(_1.filter(this._descendants,function(_1f){return _1f.validate;}),function(_20){_1.forEach(["state","disabled"],function(_21){_1e.push(_20.watch(_21,function(){_1b.set("state",_1b._getState());}));});});var _22=function(){if(_1b._onChangeDelayTimer){clearTimeout(_1b._onChangeDelayTimer);}_1b._onChangeDelayTimer=setTimeout(function(){delete _1b._onChangeDelayTimer;_1b._set("value",_1b.get("value"));},10);};_1.forEach(_1.filter(this._descendants,function(_23){return _23.onChange;}),function(_24){_1d.push(_1b.connect(_24,"onChange",_22));_1e.push(_24.watch("disabled",_22));});},startup:function(){this.inherited(arguments);this.connectChildren(true);this.watch("state",function(_25,_26,_27){this.onValidStateChange(_27=="");});},destroy:function(){this.disconnectChildren();this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/_FormMixin",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/window"],function(_1,_2,_3,_4,on,_5){return _2("dijit.form._FormMixin",null,{state:"",_getDescendantFormWidgets:function(_6){var _7=[];_1.forEach(_6||this.getChildren(),function(_8){if("value" in _8){_7.push(_8);}else{_7=_7.concat(this._getDescendantFormWidgets(_8.getChildren()));}},this);return _7;},reset:function(){_1.forEach(this._getDescendantFormWidgets(),function(_9){if(_9.reset){_9.reset();}});},validate:function(){var _a=false;return _1.every(_1.map(this._getDescendantFormWidgets(),function(_b){_b._hasBeenBlurred=true;var _c=_b.disabled||!_b.validate||_b.validate();if(!_c&&!_a){_5.scrollIntoView(_b.containerNode||_b.domNode);_b.focus();_a=true;}return _c;}),function(_d){return _d;});},setValues:function(_e){_3.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");return this.set("value",_e);},_setValueAttr:function(_f){var map={};_1.forEach(this._getDescendantFormWidgets(),function(_10){if(!_10.name){return;}var _11=map[_10.name]||(map[_10.name]=[]);_11.push(_10);});for(var _12 in map){if(!map.hasOwnProperty(_12)){continue;}var _13=map[_12],_14=_4.getObject(_12,false,_f);if(_14===undefined){continue;}if(!_4.isArray(_14)){_14=[_14];}if(typeof _13[0].checked=="boolean"){_1.forEach(_13,function(w){w.set("value",_1.indexOf(_14,w.value)!=-1);});}else{if(_13[0].multiple){_13[0].set("value",_14);}else{_1.forEach(_13,function(w,i){w.set("value",_14[i]);});}}}},getValues:function(){_3.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};_1.forEach(this._getDescendantFormWidgets(),function(_15){var _16=_15.name;if(!_16||_15.disabled){return;}var _17=_15.get("value");if(typeof _15.checked=="boolean"){if(/Radio/.test(_15.declaredClass)){if(_17!==false){_4.setObject(_16,_17,obj);}else{_17=_4.getObject(_16,false,obj);if(_17===undefined){_4.setObject(_16,null,obj);}}}else{var ary=_4.getObject(_16,false,obj);if(!ary){ary=[];_4.setObject(_16,ary,obj);}if(_17!==false){ary.push(_17);}}}else{var _18=_4.getObject(_16,false,obj);if(typeof _18!="undefined"){if(_4.isArray(_18)){_18.push(_17);}else{_4.setObject(_16,[_18,_17],obj);}}else{_4.setObject(_16,_17,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(){},_getState:function(){var _19=_1.map(this._descendants,function(w){return w.get("state")||"";});return _1.indexOf(_19,"Error")>=0?"Error":_1.indexOf(_19,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){},connectChildren:function(_1a){this._descendants=this._getDescendantFormWidgets();_1.forEach(this._descendants,function(_1b){if(!_1b._started){_1b.startup();}});if(!_1a){this._onChildChange();}},_onChildChange:function(_1c){if(!_1c||_1c=="state"||_1c=="disabled"){this._set("state",this._getState());}if(!_1c||_1c=="value"||_1c=="disabled"||_1c=="checked"){if(this._onChangeDelayTimer){this._onChangeDelayTimer.remove();}this._onChangeDelayTimer=this.defer(function(){delete this._onChangeDelayTimer;this._set("value",this.get("value"));},10);}},startup:function(){this.inherited(arguments);this._descendants=this._getDescendantFormWidgets();this.value=this.get("value");this.state=this._getState();var _1d=this;this.own(on(this.containerNode,"attrmodified-state, attrmodified-disabled, attrmodified-value, attrmodified-checked",function(evt){if(evt.target==_1d.domNode){return;}_1d._onChildChange(evt.type.replace("attrmodified-",""));}));this.watch("state",function(_1e,_1f,_20){this.onValidStateChange(_20=="");});},destroy:function(){this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_FormMixin.js.uncompressed.js b/lib/dijit/form/_FormMixin.js.uncompressed.js
new file mode 100644
index 000000000..2218c0c20
--- /dev/null
+++ b/lib/dijit/form/_FormMixin.js.uncompressed.js
@@ -0,0 +1,456 @@
+define("dijit/form/_FormMixin", [
+ "dojo/_base/array", // array.every array.filter array.forEach array.indexOf array.map
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.hitch lang.isArray
+ "dojo/on",
+ "dojo/window" // winUtils.scrollIntoView
+], function(array, declare, kernel, lang, on, winUtils){
+
+ // module:
+ // dijit/form/_FormMixin
+
+ return declare("dijit.form._FormMixin", null, {
+ // summary:
+ // Mixin for containers of form widgets (i.e. widgets that represent a single value
+ // and can be children of a `<form>` node or `dijit/form/Form` widget)
+ // description:
+ // Can extract all the form widgets
+ // values and combine them into a single javascript object, or alternately
+ // take such an object and set the values for all the contained
+ // form widgets
+
+ /*=====
+ // value: Object
+ // Name/value hash for each child widget with a name and value.
+ // Child widgets without names are not part of the hash.
+ //
+ // If there are multiple child widgets w/the same name, value is an array,
+ // unless they are radio buttons in which case value is a scalar (since only
+ // one radio button can be checked at a time).
+ //
+ // If a child widget's name is a dot separated list (like a.b.c.d), it's a nested structure.
+ //
+ // Example:
+ // | { name: "John Smith", interests: ["sports", "movies"] }
+ =====*/
+
+ // state: [readonly] String
+ // Will be "Error" if one or more of the child widgets has an invalid value,
+ // "Incomplete" if not all of the required child widgets are filled in. Otherwise, "",
+ // which indicates that the form is ready to be submitted.
+ state: "",
+
+ // TODO:
+ // * Repeater
+ // * better handling for arrays. Often form elements have names with [] like
+ // * people[3].sex (for a list of people [{name: Bill, sex: M}, ...])
+
+
+ _getDescendantFormWidgets: function(/*dijit/_WidgetBase[]?*/ children){
+ // summary:
+ // Returns all form widget descendants, searching through non-form child widgets like BorderContainer
+ var res = [];
+ array.forEach(children || this.getChildren(), function(child){
+ if("value" in child){
+ res.push(child);
+ }else{
+ res = res.concat(this._getDescendantFormWidgets(child.getChildren()));
+ }
+ }, this);
+ return res;
+ },
+
+ reset: function(){
+ array.forEach(this._getDescendantFormWidgets(), function(widget){
+ if(widget.reset){
+ widget.reset();
+ }
+ });
+ },
+
+ validate: function(){
+ // summary:
+ // returns if the form is valid - same as isValid - but
+ // provides a few additional (ui-specific) features:
+ //
+ // 1. it will highlight any sub-widgets that are not valid
+ // 2. it will call focus() on the first invalid sub-widget
+ var didFocus = false;
+ return array.every(array.map(this._getDescendantFormWidgets(), function(widget){
+ // Need to set this so that "required" widgets get their
+ // state set.
+ widget._hasBeenBlurred = true;
+ var valid = widget.disabled || !widget.validate || widget.validate();
+ if(!valid && !didFocus){
+ // Set focus of the first non-valid widget
+ winUtils.scrollIntoView(widget.containerNode || widget.domNode);
+ widget.focus();
+ didFocus = true;
+ }
+ return valid;
+ }), function(item){ return item; });
+ },
+
+ setValues: function(val){
+ kernel.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0");
+ return this.set('value', val);
+ },
+ _setValueAttr: function(/*Object*/ obj){
+ // summary:
+ // Fill in form values from according to an Object (in the format returned by get('value'))
+
+ // generate map from name --> [list of widgets with that name]
+ var map = { };
+ array.forEach(this._getDescendantFormWidgets(), function(widget){
+ if(!widget.name){ return; }
+ var entry = map[widget.name] || (map[widget.name] = [] );
+ entry.push(widget);
+ });
+
+ for(var name in map){
+ if(!map.hasOwnProperty(name)){
+ continue;
+ }
+ var widgets = map[name], // array of widgets w/this name
+ values = lang.getObject(name, false, obj); // list of values for those widgets
+
+ if(values === undefined){
+ continue;
+ }
+ if(!lang.isArray(values)){
+ values = [ values ];
+ }
+ if(typeof widgets[0].checked == 'boolean'){
+ // for checkbox/radio, values is a list of which widgets should be checked
+ array.forEach(widgets, function(w){
+ w.set('value', array.indexOf(values, w.value) != -1);
+ });
+ }else if(widgets[0].multiple){
+ // it takes an array (e.g. multi-select)
+ widgets[0].set('value', values);
+ }else{
+ // otherwise, values is a list of values to be assigned sequentially to each widget
+ array.forEach(widgets, function(w, i){
+ w.set('value', values[i]);
+ });
+ }
+ }
+
+ /***
+ * TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets)
+
+ array.forEach(this.containerNode.elements, function(element){
+ if(element.name == ''){return}; // like "continue"
+ var namePath = element.name.split(".");
+ var myObj=obj;
+ var name=namePath[namePath.length-1];
+ for(var j=1,len2=namePath.length;j<len2;++j){
+ var p=namePath[j - 1];
+ // repeater support block
+ var nameA=p.split("[");
+ if(nameA.length > 1){
+ if(typeof(myObj[nameA[0]]) == "undefined"){
+ myObj[nameA[0]]=[ ];
+ } // if
+
+ nameIndex=parseInt(nameA[1]);
+ if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
+ myObj[nameA[0]][nameIndex] = { };
+ }
+ myObj=myObj[nameA[0]][nameIndex];
+ continue;
+ } // repeater support ends
+
+ if(typeof(myObj[p]) == "undefined"){
+ myObj=undefined;
+ break;
+ };
+ myObj=myObj[p];
+ }
+
+ if(typeof(myObj) == "undefined"){
+ return; // like "continue"
+ }
+ if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){
+ return; // like "continue"
+ }
+
+ // TODO: widget values (just call set('value', ...) on the widget)
+
+ // TODO: maybe should call dojo.getNodeProp() instead
+ switch(element.type){
+ case "checkbox":
+ element.checked = (name in myObj) &&
+ array.some(myObj[name], function(val){ return val == element.value; });
+ break;
+ case "radio":
+ element.checked = (name in myObj) && myObj[name] == element.value;
+ break;
+ case "select-multiple":
+ element.selectedIndex=-1;
+ array.forEach(element.options, function(option){
+ option.selected = array.some(myObj[name], function(val){ return option.value == val; });
+ });
+ break;
+ case "select-one":
+ element.selectedIndex="0";
+ array.forEach(element.options, function(option){
+ option.selected = option.value == myObj[name];
+ });
+ break;
+ case "hidden":
+ case "text":
+ case "textarea":
+ case "password":
+ element.value = myObj[name] || "";
+ break;
+ }
+ });
+ */
+
+ // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events
+ // which I am monitoring.
+ },
+
+ getValues: function(){
+ kernel.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.", "", "2.0");
+ return this.get('value');
+ },
+ _getValueAttr: function(){
+ // summary:
+ // Returns Object representing form values. See description of `value` for details.
+ // description:
+
+ // The value is updated into this.value every time a child has an onChange event,
+ // so in the common case this function could just return this.value. However,
+ // that wouldn't work when:
+ //
+ // 1. User presses return key to submit a form. That doesn't fire an onchange event,
+ // and even if it did it would come too late due to the defer(...) in _handleOnChange()
+ //
+ // 2. app for some reason calls this.get("value") while the user is typing into a
+ // form field. Not sure if that case needs to be supported or not.
+
+ // get widget values
+ var obj = { };
+ array.forEach(this._getDescendantFormWidgets(), function(widget){
+ var name = widget.name;
+ if(!name || widget.disabled){ return; }
+
+ // Single value widget (checkbox, radio, or plain <input> type widget)
+ var value = widget.get('value');
+
+ // Store widget's value(s) as a scalar, except for checkboxes which are automatically arrays
+ if(typeof widget.checked == 'boolean'){
+ if(/Radio/.test(widget.declaredClass)){
+ // radio button
+ if(value !== false){
+ lang.setObject(name, value, obj);
+ }else{
+ // give radio widgets a default of null
+ value = lang.getObject(name, false, obj);
+ if(value === undefined){
+ lang.setObject(name, null, obj);
+ }
+ }
+ }else{
+ // checkbox/toggle button
+ var ary=lang.getObject(name, false, obj);
+ if(!ary){
+ ary=[];
+ lang.setObject(name, ary, obj);
+ }
+ if(value !== false){
+ ary.push(value);
+ }
+ }
+ }else{
+ var prev=lang.getObject(name, false, obj);
+ if(typeof prev != "undefined"){
+ if(lang.isArray(prev)){
+ prev.push(value);
+ }else{
+ lang.setObject(name, [prev, value], obj);
+ }
+ }else{
+ // unique name
+ lang.setObject(name, value, obj);
+ }
+ }
+ });
+
+ /***
+ * code for plain input boxes (see also domForm.formToObject, can we use that instead of this code?
+ * but it doesn't understand [] notation, presumably)
+ var obj = { };
+ array.forEach(this.containerNode.elements, function(elm){
+ if(!elm.name) {
+ return; // like "continue"
+ }
+ var namePath = elm.name.split(".");
+ var myObj=obj;
+ var name=namePath[namePath.length-1];
+ for(var j=1,len2=namePath.length;j<len2;++j){
+ var nameIndex = null;
+ var p=namePath[j - 1];
+ var nameA=p.split("[");
+ if(nameA.length > 1){
+ if(typeof(myObj[nameA[0]]) == "undefined"){
+ myObj[nameA[0]]=[ ];
+ } // if
+ nameIndex=parseInt(nameA[1]);
+ if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){
+ myObj[nameA[0]][nameIndex] = { };
+ }
+ }else if(typeof(myObj[nameA[0]]) == "undefined"){
+ myObj[nameA[0]] = { }
+ } // if
+
+ if(nameA.length == 1){
+ myObj=myObj[nameA[0]];
+ }else{
+ myObj=myObj[nameA[0]][nameIndex];
+ } // if
+ } // for
+
+ if((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type == "radio" && elm.checked)){
+ if(name == name.split("[")[0]){
+ myObj[name]=elm.value;
+ }else{
+ // can not set value when there is no name
+ }
+ }else if(elm.type == "checkbox" && elm.checked){
+ if(typeof(myObj[name]) == 'undefined'){
+ myObj[name]=[ ];
+ }
+ myObj[name].push(elm.value);
+ }else if(elm.type == "select-multiple"){
+ if(typeof(myObj[name]) == 'undefined'){
+ myObj[name]=[ ];
+ }
+ for(var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){
+ if(elm.options[jdx].selected){
+ myObj[name].push(elm.options[jdx].value);
+ }
+ }
+ } // if
+ name=undefined;
+ }); // forEach
+ ***/
+ return obj;
+ },
+
+ isValid: function(){
+ // summary:
+ // Returns true if all of the widgets are valid.
+ // Deprecated, will be removed in 2.0. Use get("state") instead.
+
+ return this.state == "";
+ },
+
+ onValidStateChange: function(/*Boolean*/ /*===== isValid =====*/){
+ // summary:
+ // Stub function to connect to if you want to do something
+ // (like disable/enable a submit button) when the valid
+ // state changes on the form as a whole.
+ //
+ // Deprecated. Will be removed in 2.0. Use watch("state", ...) instead.
+ },
+
+ _getState: function(){
+ // summary:
+ // Compute what this.state should be based on state of children
+ var states = array.map(this._descendants, function(w){
+ return w.get("state") || "";
+ });
+
+ return array.indexOf(states, "Error") >= 0 ? "Error" :
+ array.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : "";
+ },
+
+ disconnectChildren: function(){
+ // summary:
+ // Deprecated method. Applications no longer need to call this. Remove for 2.0.
+ },
+
+ connectChildren: function(/*Boolean*/ inStartup){
+ // summary:
+ // You can call this function directly, ex. in the event that you
+ // programmatically add a widget to the form *after* the form has been
+ // initialized.
+
+ // TODO: rename for 2.0
+
+ this._descendants = this._getDescendantFormWidgets();
+
+ // To get notifications from children they need to be started. Children didn't used to need to be started,
+ // so for back-compat, start them here
+ array.forEach(this._descendants, function(child){
+ if(!child._started){ child.startup(); }
+ });
+
+ if(!inStartup){
+ this._onChildChange();
+ }
+ },
+
+ _onChildChange: function(/*String*/ attr){
+ // summary:
+ // Called when child's value or disabled state changes
+
+ // The unit tests expect state update to be synchronous, so update it immediately.
+ if(!attr || attr == "state" || attr == "disabled"){
+ this._set("state", this._getState());
+ }
+
+ // Use defer() to collapse value changes in multiple children into a single
+ // update to my value. Multiple updates will occur on:
+ // 1. Form.set()
+ // 2. Form.reset()
+ // 3. user selecting a radio button (which will de-select another radio button,
+ // causing two onChange events)
+ if(!attr || attr == "value" || attr == "disabled" || attr == "checked"){
+ if(this._onChangeDelayTimer){
+ this._onChangeDelayTimer.remove();
+ }
+ this._onChangeDelayTimer = this.defer(function(){
+ delete this._onChangeDelayTimer;
+ this._set("value", this.get("value"));
+ }, 10);
+ }
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+
+ // Set initial this.value and this.state. Don't emit watch() notifications.
+ this._descendants = this._getDescendantFormWidgets();
+ this.value = this.get("value");
+ this.state = this._getState();
+
+ // Initialize value and valid/invalid state tracking.
+ var self = this;
+ this.own(
+ on(
+ this.containerNode,
+ "attrmodified-state, attrmodified-disabled, attrmodified-value, attrmodified-checked",
+ function(evt){
+ if(evt.target == self.domNode){
+ return; // ignore events that I fire on myself because my children changed
+ }
+ self._onChildChange(evt.type.replace("attrmodified-", ""));
+ }
+ )
+ );
+
+ // Make state change call onValidStateChange(), will be removed in 2.0
+ this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); });
+ },
+
+ destroy: function(){
+ this.inherited(arguments);
+ }
+
+ });
+});
diff --git a/lib/dijit/form/_FormSelectWidget.js b/lib/dijit/form/_FormSelectWidget.js
index 994bc940b..2ca2fa4a4 100644
--- a/lib/dijit/form/_FormSelectWidget.js
+++ b/lib/dijit/form/_FormSelectWidget.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_FormSelectWidget",["dojo/_base/array","dojo/aspect","dojo/data/util/sorter","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/query","./_FormValueWidget"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _4("dijit.form._FormSelectWidget",_a,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_b){var _c=_b,_d=this.options||[],l=_d.length;if(_c===undefined){return _d;}if(_8.isArray(_c)){return _1.map(_c,"return this.getOptions(item);",this);}if(_8.isObject(_b)){if(!_1.some(this.options,function(o,_e){if(o===_c||(o.value&&o.value===_c.value)){_c=_e;return true;}return false;})){_c=-1;}}if(typeof _c=="string"){for(var i=0;i<l;i++){if(_d[i].value===_c){_c=i;break;}}}if(typeof _c=="number"&&_c>=0&&_c<l){return this.options[_c];}return null;},addOption:function(_f){if(!_8.isArray(_f)){_f=[_f];}_1.forEach(_f,function(i){if(i&&_8.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_10){if(!_8.isArray(_10)){_10=[_10];}var _11=this.getOptions(_10);_1.forEach(_11,function(i){if(i){this.options=_1.filter(this.options,function(_12){return (_12.value!==i.value||_12.label!==i.label);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_13){if(!_8.isArray(_13)){_13=[_13];}_1.forEach(_13,function(i){var _14=this.getOptions(i),k;if(_14){for(k in i){_14[k]=i[k];}}},this);this._loadChildren();},setStore:function(_15,_16,_17){var _18=this.store;_17=_17||{};if(_18!==_15){var h;while(h=this._notifyConnections.pop()){h.remove();}if(_15&&_15.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[_2.after(_15,"onNew",_8.hitch(this,"_onNewItem"),true),_2.after(_15,"onDelete",_8.hitch(this,"_onDeleteItem"),true),_2.after(_15,"onSet",_8.hitch(this,"_onSetItem"),true)];}this._set("store",_15);}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_15){this._loadingStore=true;_15.fetch(_8.delegate(_17,{onComplete:function(_19,_1a){if(this.sortByLabel&&!_17.sort&&_19.length){_19.sort(_3.createSortFunction([{attribute:_15.getLabelAttributes(_19[0])[0]}],_15));}if(_17.onFetch){_19=_17.onFetch.call(this,_19,_1a);}_1.forEach(_19,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_16);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_19);}this._fetchedWith=_1a;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);},scope:this}));}else{delete this._fetchedWith;}return _18;},_setValueAttr:function(_1b,_1c){if(this._loadingStore){this._pendingValue=_1b;return;}var _1d=this.getOptions()||[];if(!_8.isArray(_1b)){_1b=[_1b];}_1.forEach(_1b,function(i,idx){if(!_8.isObject(i)){i=i+"";}if(typeof i==="string"){_1b[idx]=_1.filter(_1d,function(_1e){return _1e.value===i;})[0]||{value:"",label:""};}},this);_1b=_1.filter(_1b,function(i){return i&&i.value;});if(!this.multiple&&(!_1b[0]||!_1b[0].value)&&_1d.length){_1b[0]=_1d[0];}_1.forEach(_1d,function(i){i.selected=_1.some(_1b,function(v){return v.value===i.value;});});var val=_1.map(_1b,function(i){return i.value;}),_1f=_1.map(_1b,function(i){return i.label;});this._set("value",this.multiple?val:val[0]);this._setDisplay(this.multiple?_1f:_1f[0]);this._updateSelection();this._handleOnChange(this.value,_1c);},_getDisplayedValueAttr:function(){var val=this.get("value");if(!_8.isArray(val)){val=[val];}var ret=_1.map(this.getOptions(val),function(v){if(v&&"label" in v){return v.label;}else{if(v){return v.value;}}return null;},this);return this.multiple?ret:ret[0];},_loadChildren:function(){if(this._loadingStore){return;}_1.forEach(this._getChildren(),function(_20){_20.destroyRecursive();});_1.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!_8.isArray(val)){val=[val];}if(val&&val[0]){_1.forEach(this._getChildren(),function(_21){var _22=_1.some(val,function(v){return _21.option&&(v===_21.option.value);});_6.toggle(_21.domNode,this.baseClass+"SelectedOption",_22);_21.domNode.setAttribute("aria-selected",_22);},this);}},_getValueFromOpts:function(){var _23=this.getOptions()||[];if(!this.multiple&&_23.length){var opt=_1.filter(_23,function(i){return i.selected;})[0];if(opt&&opt.value){return opt.value;}else{_23[0].selected=true;return _23[0].value;}}else{if(this.multiple){return _1.map(_1.filter(_23,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(_24,_25){if(!_25||!_25.parent){this._addOptionForItem(_24);}},_onDeleteItem:function(_26){var _27=this.store;this.removeOption(_27.getIdentity(_26));},_onSetItem:function(_28){this.updateOption(this._getOptionObjForItem(_28));},_getOptionObjForItem:function(_29){var _2a=this.store,_2b=_2a.getLabel(_29),_2c=(_2b?_2a.getIdentity(_29):null);return {value:_2c,label:_2b,item:_29};},_addOptionForItem:function(_2d){var _2e=this.store;if(!_2e.isItemLoaded(_2d)){_2e.loadItem({item:_2d,onItem:function(i){this._addOptionForItem(i);},scope:this});return;}var _2f=this._getOptionObjForItem(_2d);this.addOption(_2f);},constructor:function(_30){this._oValue=(_30||{}).value||null;this._notifyConnections=[];},buildRendering:function(){this.inherited(arguments);_5.setSelectable(this.focusNode,false);},_fillContent:function(){var _31=this.options;if(!_31){_31=this.options=this.srcNodeRef?_9("> *",this.srcNodeRef).map(function(_32){if(_32.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(_32.getAttribute("data-"+_7._scopeName+"-value")||_32.getAttribute("value")),label:String(_32.innerHTML),selected:_32.getAttribute("selected")||false,disabled:_32.getAttribute("disabled")||false};},this):[];}if(!this.value){this._set("value",this._getValueFromOpts());}else{if(this.multiple&&typeof this.value=="string"){this._set("value",this.value.split(","));}}},postCreate:function(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _33=this.store,_34={};_1.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_34[i]=this[i];}delete this[i];},this);if(_33&&_33.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_33,this._oValue,_34);}},destroy:function(){var h;while(h=this._notifyConnections.pop()){h.remove();}this.inherited(arguments);},_addOptionItem:function(){},_removeOptionItem:function(){},_setDisplay:function(){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(){},onSetStore:function(){}});}); \ No newline at end of file
+define("dijit/form/_FormSelectWidget",["dojo/_base/array","dojo/_base/Deferred","dojo/aspect","dojo/data/util/sorter","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/query","dojo/when","dojo/store/util/QueryResults","./_FormValueWidget"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d){var _e=_5("dijit.form._FormSelectWidget",_d,{multiple:false,options:null,store:null,query:null,queryOptions:null,labelAttr:"",onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,onLoadDeferred:null,getOptions:function(_f){var _10=_f,_11=this.options||[],l=_11.length;if(_10===undefined){return _11;}if(_9.isArray(_10)){return _1.map(_10,"return this.getOptions(item);",this);}if(_9.isObject(_f)){if(!_1.some(this.options,function(o,idx){if(o===_10||(o.value&&o.value===_10.value)){_10=idx;return true;}return false;})){_10=-1;}}if(typeof _10=="string"){for(var i=0;i<l;i++){if(_11[i].value===_10){_10=i;break;}}}if(typeof _10=="number"&&_10>=0&&_10<l){return this.options[_10];}return null;},addOption:function(_12){if(!_9.isArray(_12)){_12=[_12];}_1.forEach(_12,function(i){if(i&&_9.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_13){if(!_9.isArray(_13)){_13=[_13];}var _14=this.getOptions(_13);_1.forEach(_14,function(i){if(i){this.options=_1.filter(this.options,function(_15){return (_15.value!==i.value||_15.label!==i.label);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_16){if(!_9.isArray(_16)){_16=[_16];}_1.forEach(_16,function(i){var _17=this.getOptions(i),k;if(_17){for(k in i){_17[k]=i[k];}}},this);this._loadChildren();},setStore:function(_18,_19,_1a){var _1b=this.store;_1a=_1a||{};if(_1b!==_18){var h;while((h=this._notifyConnections.pop())){h.remove();}if(!_18.get){_9.mixin(_18,{_oldAPI:true,get:function(id){var _1c=new _2();this.fetchItemByIdentity({identity:id,onItem:function(_1d){_1c.resolve(_1d);},onError:function(_1e){_1c.reject(_1e);}});return _1c.promise;},query:function(_1f,_20){var _21=new _2(function(){if(_22.abort){_22.abort();}});_21.total=new _2();var _22=this.fetch(_9.mixin({query:_1f,onBegin:function(_23){_21.total.resolve(_23);},onComplete:function(_24){_21.resolve(_24);},onError:function(_25){_21.reject(_25);}},_20));return new _c(_21);}});if(_18.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[_3.after(_18,"onNew",_9.hitch(this,"_onNewItem"),true),_3.after(_18,"onDelete",_9.hitch(this,"_onDeleteItem"),true),_3.after(_18,"onSet",_9.hitch(this,"_onSetItem"),true)];}}this._set("store",_18);}if(this.options&&this.options.length){this.removeOption(this.options);}if(this._queryRes&&this._queryRes.close){this._queryRes.close();}if(_1a.query){this._set("query",_1a.query);this._set("queryOptions",_1a.queryOptions);}if(_18){this._loadingStore=true;this.onLoadDeferred=new _2();this._queryRes=_18.query(this.query,this.queryOptions);_b(this._queryRes,_9.hitch(this,function(_26){if(this.sortByLabel&&!_1a.sort&&_26.length){if(_26[0].getValue){_26.sort(_4.createSortFunction([{attribute:_18.getLabelAttributes(_26[0])[0]}],_18));}else{var _27=this.labelAttr;_26.sort(function(a,b){return a[_27]>b[_27]?1:b[_27]>a[_27]?-1:0;});}}if(_1a.onFetch){_26=_1a.onFetch.call(this,_26,_1a);}_1.forEach(_26,function(i){this._addOptionForItem(i);},this);if(this._queryRes.observe){this._queryRes.observe(_9.hitch(this,function(_28,_29,_2a){if(_29==_2a){this._onSetItem(_28);}else{if(_29!=-1){this._onDeleteItem(_28);}if(_2a!=-1){this._onNewItem(_28);}}}),true);}this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_19);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_26);}this.onLoadDeferred.resolve(true);this.onSetStore();}),function(err){console.error("dijit.form.Select: "+err.toString());this.onLoadDeferred.reject(err);});}return _1b;},_setValueAttr:function(_2b,_2c){if(!this._onChangeActive){_2c=null;}if(this._loadingStore){this._pendingValue=_2b;return;}var _2d=this.getOptions()||[];if(!_9.isArray(_2b)){_2b=[_2b];}_1.forEach(_2b,function(i,idx){if(!_9.isObject(i)){i=i+"";}if(typeof i==="string"){_2b[idx]=_1.filter(_2d,function(_2e){return _2e.value===i;})[0]||{value:"",label:""};}},this);_2b=_1.filter(_2b,function(i){return i&&i.value;});if(!this.multiple&&(!_2b[0]||!_2b[0].value)&&_2d.length){_2b[0]=_2d[0];}_1.forEach(_2d,function(i){i.selected=_1.some(_2b,function(v){return v.value===i.value;});});var val=_1.map(_2b,function(i){return i.value;}),_2f=_1.map(_2b,function(i){return i.label;});if(typeof val=="undefined"||typeof val[0]=="undefined"){return;}this._setDisplay(this.multiple?_2f:_2f[0]);this.inherited(arguments,[this.multiple?val:val[0],_2c]);this._updateSelection();},_getDisplayedValueAttr:function(){var val=this.get("value");if(!_9.isArray(val)){val=[val];}var ret=_1.map(this.getOptions(val),function(v){if(v&&"label" in v){return v.label;}else{if(v){return v.value;}}return null;},this);return this.multiple?ret:ret[0];},_loadChildren:function(){if(this._loadingStore){return;}_1.forEach(this._getChildren(),function(_30){_30.destroyRecursive();});_1.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!_9.isArray(val)){val=[val];}if(val&&val[0]){_1.forEach(this._getChildren(),function(_31){var _32=_1.some(val,function(v){return _31.option&&(v===_31.option.value);});_7.toggle(_31.domNode,this.baseClass.replace(/\s+|$/g,"SelectedOption "),_32);_31.domNode.setAttribute("aria-selected",_32?"true":"false");},this);}},_getValueFromOpts:function(){var _33=this.getOptions()||[];if(!this.multiple&&_33.length){var opt=_1.filter(_33,function(i){return i.selected;})[0];if(opt&&opt.value){return opt.value;}else{_33[0].selected=true;return _33[0].value;}}else{if(this.multiple){return _1.map(_1.filter(_33,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(_34,_35){if(!_35||!_35.parent){this._addOptionForItem(_34);}},_onDeleteItem:function(_36){var _37=this.store;this.removeOption(_37.getIdentity(_36));},_onSetItem:function(_38){this.updateOption(this._getOptionObjForItem(_38));},_getOptionObjForItem:function(_39){var _3a=this.store,_3b=(this.labelAttr&&this.labelAttr in _39)?_39[this.labelAttr]:_3a.getLabel(_39),_3c=(_3b?_3a.getIdentity(_39):null);return {value:_3c,label:_3b,item:_39};},_addOptionForItem:function(_3d){var _3e=this.store;if(_3e.isItemLoaded&&!_3e.isItemLoaded(_3d)){_3e.loadItem({item:_3d,onItem:function(i){this._addOptionForItem(i);},scope:this});return;}var _3f=this._getOptionObjForItem(_3d);this.addOption(_3f);},constructor:function(_40){this._oValue=(_40||{}).value||null;this._notifyConnections=[];},buildRendering:function(){this.inherited(arguments);_6.setSelectable(this.focusNode,false);},_fillContent:function(){if(!this.options){this.options=this.srcNodeRef?_a("> *",this.srcNodeRef).map(function(_41){if(_41.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(_41.getAttribute("data-"+_8._scopeName+"-value")||_41.getAttribute("value")),label:String(_41.innerHTML),selected:_41.getAttribute("selected")||false,disabled:_41.getAttribute("disabled")||false};},this):[];}if(!this.value){this._set("value",this._getValueFromOpts());}else{if(this.multiple&&typeof this.value=="string"){this._set("value",this.value.split(","));}}},postCreate:function(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");var _42=this.store;if(_42&&(_42.getIdentity||_42.getFeatures()["dojo.data.api.Identity"])){this.store=null;this.setStore(_42,this._oValue);}},startup:function(){this._loadChildren();this.inherited(arguments);},destroy:function(){var h;while((h=this._notifyConnections.pop())){h.remove();}if(this._queryRes&&this._queryRes.close){this._queryRes.close();}this.inherited(arguments);},_addOptionItem:function(){},_removeOptionItem:function(){},_setDisplay:function(){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(){},onSetStore:function(){}});return _e;}); \ No newline at end of file
diff --git a/lib/dijit/form/_FormSelectWidget.js.uncompressed.js b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js
new file mode 100644
index 000000000..4a40c51d0
--- /dev/null
+++ b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js
@@ -0,0 +1,707 @@
+define("dijit/form/_FormSelectWidget", [
+ "dojo/_base/array", // array.filter array.forEach array.map array.some
+ "dojo/_base/Deferred",
+ "dojo/aspect", // aspect.after
+ "dojo/data/util/sorter", // util.sorter.createSortFunction
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-class", // domClass.toggle
+ "dojo/_base/kernel", // _scopeName
+ "dojo/_base/lang", // lang.delegate lang.isArray lang.isObject lang.hitch
+ "dojo/query", // query
+ "dojo/when",
+ "dojo/store/util/QueryResults",
+ "./_FormValueWidget"
+], function(array, Deferred, aspect, sorter, declare, dom, domClass, kernel, lang, query, when,
+ QueryResults, _FormValueWidget){
+
+// module:
+// dijit/form/_FormSelectWidget
+
+/*=====
+var __SelectOption = {
+ // value: String
+ // The value of the option. Setting to empty (or missing) will
+ // place a separator at that location
+ // label: String
+ // The label for our option. It can contain html tags.
+ // selected: Boolean
+ // Whether or not we are a selected option
+ // disabled: Boolean
+ // Whether or not this specific option is disabled
+};
+=====*/
+
+var _FormSelectWidget = declare("dijit.form._FormSelectWidget", _FormValueWidget, {
+ // summary:
+ // Extends _FormValueWidget in order to provide "select-specific"
+ // values - i.e., those values that are unique to `<select>` elements.
+ // This also provides the mechanism for reading the elements from
+ // a store, if desired.
+
+ // multiple: [const] Boolean
+ // Whether or not we are multi-valued
+ multiple: false,
+
+ // options: __SelectOption[]
+ // The set of options for our select item. Roughly corresponds to
+ // the html `<option>` tag.
+ options: null,
+
+ // store: dojo/store/api/Store
+ // A store to use for getting our list of options - rather than reading them
+ // from the `<option>` html tags. Should support getIdentity().
+ // For back-compat store can also be a dojo/data/api/Identity.
+ store: null,
+
+ // query: object
+ // A query to use when fetching items from our store
+ query: null,
+
+ // queryOptions: object
+ // Query options to use when fetching from the store
+ queryOptions: null,
+
+ // labelAttr: String?
+ // The entries in the drop down list come from this attribute in the dojo.store items.
+ // If ``store`` is set, labelAttr must be set too, unless store is an old-style
+ // dojo.data store rather than a new dojo/store.
+ labelAttr: "",
+
+ // onFetch: Function
+ // A callback to do with an onFetch - but before any items are actually
+ // iterated over (i.e. to filter even further what you want to add)
+ onFetch: null,
+
+ // sortByLabel: Boolean
+ // Flag to sort the options returned from a store by the label of
+ // the store.
+ sortByLabel: true,
+
+
+ // loadChildrenOnOpen: Boolean
+ // By default loadChildren is called when the items are fetched from the
+ // store. This property allows delaying loadChildren (and the creation
+ // of the options/menuitems) until the user clicks the button to open the
+ // dropdown.
+ loadChildrenOnOpen: false,
+
+ // onLoadDeferred: [readonly] dojo.Deferred
+ // This is the `dojo.Deferred` returned by setStore().
+ // Calling onLoadDeferred.then() registers your
+ // callback to be called only once, when the prior setStore completes.
+ onLoadDeferred: null,
+
+ getOptions: function(/*anything*/ valueOrIdx){
+ // summary:
+ // Returns a given option (or options).
+ // valueOrIdx:
+ // If passed in as a string, that string is used to look up the option
+ // in the array of options - based on the value property.
+ // (See dijit/form/_FormSelectWidget.__SelectOption).
+ //
+ // If passed in a number, then the option with the given index (0-based)
+ // within this select will be returned.
+ //
+ // If passed in a dijit/form/_FormSelectWidget.__SelectOption, the same option will be
+ // returned if and only if it exists within this select.
+ //
+ // If passed an array, then an array will be returned with each element
+ // in the array being looked up.
+ //
+ // If not passed a value, then all options will be returned
+ //
+ // returns:
+ // The option corresponding with the given value or index. null
+ // is returned if any of the following are true:
+ //
+ // - A string value is passed in which doesn't exist
+ // - An index is passed in which is outside the bounds of the array of options
+ // - A dijit/form/_FormSelectWidget.__SelectOption is passed in which is not a part of the select
+
+ // NOTE: the compare for passing in a dijit/form/_FormSelectWidget.__SelectOption checks
+ // if the value property matches - NOT if the exact option exists
+ // NOTE: if passing in an array, null elements will be placed in the returned
+ // array when a value is not found.
+ var lookupValue = valueOrIdx, opts = this.options || [], l = opts.length;
+
+ if(lookupValue === undefined){
+ return opts; // __SelectOption[]
+ }
+ if(lang.isArray(lookupValue)){
+ return array.map(lookupValue, "return this.getOptions(item);", this); // __SelectOption[]
+ }
+ if(lang.isObject(valueOrIdx)){
+ // We were passed an option - so see if it's in our array (directly),
+ // and if it's not, try and find it by value.
+ if(!array.some(this.options, function(o, idx){
+ if(o === lookupValue ||
+ (o.value && o.value === lookupValue.value)){
+ lookupValue = idx;
+ return true;
+ }
+ return false;
+ })){
+ lookupValue = -1;
+ }
+ }
+ if(typeof lookupValue == "string"){
+ for(var i=0; i<l; i++){
+ if(opts[i].value === lookupValue){
+ lookupValue = i;
+ break;
+ }
+ }
+ }
+ if(typeof lookupValue == "number" && lookupValue >= 0 && lookupValue < l){
+ return this.options[lookupValue]; // __SelectOption
+ }
+ return null; // null
+ },
+
+ addOption: function(/*__SelectOption|__SelectOption[]*/ option){
+ // summary:
+ // Adds an option or options to the end of the select. If value
+ // of the option is empty or missing, a separator is created instead.
+ // Passing in an array of options will yield slightly better performance
+ // since the children are only loaded once.
+ if(!lang.isArray(option)){ option = [option]; }
+ array.forEach(option, function(i){
+ if(i && lang.isObject(i)){
+ this.options.push(i);
+ }
+ }, this);
+ this._loadChildren();
+ },
+
+ removeOption: function(/*String|__SelectOption|Number|Array*/ valueOrIdx){
+ // summary:
+ // Removes the given option or options. You can remove by string
+ // (in which case the value is removed), number (in which case the
+ // index in the options array is removed), or select option (in
+ // which case, the select option with a matching value is removed).
+ // You can also pass in an array of those values for a slightly
+ // better performance since the children are only loaded once.
+ if(!lang.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; }
+ var oldOpts = this.getOptions(valueOrIdx);
+ array.forEach(oldOpts, function(i){
+ // We can get null back in our array - if our option was not found. In
+ // that case, we don't want to blow up...
+ if(i){
+ this.options = array.filter(this.options, function(node){
+ return (node.value !== i.value || node.label !== i.label);
+ });
+ this._removeOptionItem(i);
+ }
+ }, this);
+ this._loadChildren();
+ },
+
+ updateOption: function(/*__SelectOption|__SelectOption[]*/ newOption){
+ // summary:
+ // Updates the values of the given option. The option to update
+ // is matched based on the value of the entered option. Passing
+ // in an array of new options will yield better performance since
+ // the children will only be loaded once.
+ if(!lang.isArray(newOption)){ newOption = [newOption]; }
+ array.forEach(newOption, function(i){
+ var oldOpt = this.getOptions(i), k;
+ if(oldOpt){
+ for(k in i){ oldOpt[k] = i[k]; }
+ }
+ }, this);
+ this._loadChildren();
+ },
+
+ setStore: function(store,
+ selectedValue,
+ fetchArgs){
+ // summary:
+ // Sets the store you would like to use with this select widget.
+ // The selected value is the value of the new store to set. This
+ // function returns the original store, in case you want to reuse
+ // it or something.
+ // store: dojo/store/api/Store
+ // The dojo.store you would like to use - it MUST implement getIdentity()
+ // and MAY implement observe().
+ // For backwards-compatibility this can also be a data.data store, in which case
+ // it MUST implement dojo/data/api/Identity,
+ // and MAY implement dojo/data/api/Notification.
+ // selectedValue: anything?
+ // The value that this widget should set itself to *after* the store
+ // has been loaded
+ // fetchArgs: Object?
+ // Hash of parameters to set filter on store, etc.
+ //
+ // - query: new value for Select.query,
+ // - queryOptions: new value for Select.queryOptions,
+ // - onFetch: callback function for each item in data (Deprecated)
+ var oStore = this.store;
+ fetchArgs = fetchArgs || {};
+
+ if(oStore !== store){
+ // Our store has changed, so cancel any listeners on old store (remove for 2.0)
+ var h;
+ while((h = this._notifyConnections.pop())){ h.remove(); }
+
+ // For backwards-compatibility, accept dojo.data store in addition to dojo.store.store. Remove in 2.0.
+ if(!store.get){
+ lang.mixin(store, {
+ _oldAPI: true,
+ get: function(id){
+ // summary:
+ // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity.
+ // Like dojo.store.DataStore.get() except returns native item.
+ var deferred = new Deferred();
+ this.fetchItemByIdentity({
+ identity: id,
+ onItem: function(object){
+ deferred.resolve(object);
+ },
+ onError: function(error){
+ deferred.reject(error);
+ }
+ });
+ return deferred.promise;
+ },
+ query: function(query, options){
+ // summary:
+ // Queries the store for objects. Like dojo/store/DataStore.query()
+ // except returned Deferred contains array of native items.
+ var deferred = new Deferred(function(){ if(fetchHandle.abort){ fetchHandle.abort(); } } );
+ deferred.total = new Deferred();
+ var fetchHandle = this.fetch(lang.mixin({
+ query: query,
+ onBegin: function(count){
+ deferred.total.resolve(count);
+ },
+ onComplete: function(results){
+ deferred.resolve(results);
+ },
+ onError: function(error){
+ deferred.reject(error);
+ }
+ }, options));
+ return new QueryResults(deferred);
+ }
+ });
+
+ if(store.getFeatures()["dojo.data.api.Notification"]){
+ this._notifyConnections = [
+ aspect.after(store, "onNew", lang.hitch(this, "_onNewItem"), true),
+ aspect.after(store, "onDelete", lang.hitch(this, "_onDeleteItem"), true),
+ aspect.after(store, "onSet", lang.hitch(this, "_onSetItem"), true)
+ ];
+ }
+ }
+ this._set("store", store); // Our store has changed, so update our notifications
+ }
+
+ // Remove existing options (if there are any)
+ if(this.options && this.options.length){
+ this.removeOption(this.options);
+ }
+
+ // Cancel listener for updates to old store
+ if(this._queryRes && this._queryRes.close){
+ this._queryRes.close();
+ }
+
+ // If user has specified new query and query options along with this new store, then use them.
+ if(fetchArgs.query){
+ this._set("query", fetchArgs.query);
+ this._set("queryOptions", fetchArgs.queryOptions);
+ }
+
+ // Add our new options
+ if(store){
+ this._loadingStore = true;
+ this.onLoadDeferred = new Deferred();
+
+ // Run query
+ // Save result in this._queryRes so we can cancel the listeners we register below
+ this._queryRes = store.query(this.query, this.queryOptions);
+ when(this._queryRes, lang.hitch(this, function(items){
+
+ if(this.sortByLabel && !fetchArgs.sort && items.length){
+ if(items[0].getValue){
+ // Old dojo.data API to access items, remove for 2.0
+ items.sort(sorter.createSortFunction([{
+ attribute: store.getLabelAttributes(items[0])[0]
+ }], store));
+ }else{
+ var labelAttr = this.labelAttr;
+ items.sort(function(a, b){
+ return a[labelAttr] > b[labelAttr] ? 1 : b[labelAttr] > a[labelAttr] ? -1 : 0;
+ });
+ }
+ }
+
+ if(fetchArgs.onFetch){
+ items = fetchArgs.onFetch.call(this, items, fetchArgs);
+ }
+
+ // TODO: Add these guys as a batch, instead of separately
+ array.forEach(items, function(i){
+ this._addOptionForItem(i);
+ }, this);
+
+ // Register listener for store updates
+ if(this._queryRes.observe){
+ this._queryRes.observe(lang.hitch(this, function(object, deletedFrom, insertedInto){
+ if(deletedFrom == insertedInto){
+ this._onSetItem(object);
+ }else{
+ if(deletedFrom != -1){
+ this._onDeleteItem(object);
+ }
+ if(insertedInto != -1){
+ this._onNewItem(object);
+ }
+ }
+ }), true);
+ }
+
+ // Set our value (which might be undefined), and then tweak
+ // it to send a change event with the real value
+ this._loadingStore = false;
+ this.set("value", "_pendingValue" in this ? this._pendingValue : selectedValue);
+ delete this._pendingValue;
+
+ if(!this.loadChildrenOnOpen){
+ this._loadChildren();
+ }else{
+ this._pseudoLoadChildren(items);
+ }
+ this.onLoadDeferred.resolve(true);
+ this.onSetStore();
+ }), function(err){
+ console.error('dijit.form.Select: ' + err.toString());
+ this.onLoadDeferred.reject(err);
+ });
+ }
+ return oStore; // dojo/data/api/Identity
+ },
+
+ // TODO: implement set() and watch() for store and query, although not sure how to handle
+ // setting them individually rather than together (as in setStore() above)
+
+ _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
+ // summary:
+ // set the value of the widget.
+ // If a string is passed, then we set our value from looking it up.
+ if(!this._onChangeActive){ priorityChange = null; }
+ if(this._loadingStore){
+ // Our store is loading - so save our value, and we'll set it when
+ // we're done
+ this._pendingValue = newValue;
+ return;
+ }
+ var opts = this.getOptions() || [];
+ if(!lang.isArray(newValue)){
+ newValue = [newValue];
+ }
+ array.forEach(newValue, function(i, idx){
+ if(!lang.isObject(i)){
+ i = i + "";
+ }
+ if(typeof i === "string"){
+ newValue[idx] = array.filter(opts, function(node){
+ return node.value === i;
+ })[0] || {value: "", label: ""};
+ }
+ }, this);
+
+ // Make sure some sane default is set
+ newValue = array.filter(newValue, function(i){ return i && i.value; });
+ if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){
+ newValue[0] = opts[0];
+ }
+ array.forEach(opts, function(i){
+ i.selected = array.some(newValue, function(v){ return v.value === i.value; });
+ });
+ var val = array.map(newValue, function(i){ return i.value; }),
+ disp = array.map(newValue, function(i){ return i.label; });
+
+ if(typeof val == "undefined" || typeof val[0] == "undefined"){ return; } // not fully initialized yet or a failed value lookup
+ this._setDisplay(this.multiple ? disp : disp[0]);
+ this.inherited(arguments, [ this.multiple ? val : val[0], priorityChange ]);
+ this._updateSelection();
+ },
+
+ _getDisplayedValueAttr: function(){
+ // summary:
+ // returns the displayed value of the widget
+ var val = this.get("value");
+ if(!lang.isArray(val)){
+ val = [val];
+ }
+ var ret = array.map(this.getOptions(val), function(v){
+ if(v && "label" in v){
+ return v.label;
+ }else if(v){
+ return v.value;
+ }
+ return null;
+ }, this);
+ return this.multiple ? ret : ret[0];
+ },
+
+ _loadChildren: function(){
+ // summary:
+ // Loads the children represented by this widget's options.
+ // reset the menu to make it populatable on the next click
+ if(this._loadingStore){ return; }
+ array.forEach(this._getChildren(), function(child){
+ child.destroyRecursive();
+ });
+ // Add each menu item
+ array.forEach(this.options, this._addOptionItem, this);
+
+ // Update states
+ this._updateSelection();
+ },
+
+ _updateSelection: function(){
+ // summary:
+ // Sets the "selected" class on the item for styling purposes
+ this._set("value", this._getValueFromOpts());
+ var val = this.value;
+ if(!lang.isArray(val)){
+ val = [val];
+ }
+ if(val && val[0]){
+ array.forEach(this._getChildren(), function(child){
+ var isSelected = array.some(val, function(v){
+ return child.option && (v === child.option.value);
+ });
+ domClass.toggle(child.domNode, this.baseClass.replace(/\s+|$/g, "SelectedOption "), isSelected);
+ child.domNode.setAttribute("aria-selected", isSelected ? "true" : "false");
+ }, this);
+ }
+ },
+
+ _getValueFromOpts: function(){
+ // summary:
+ // Returns the value of the widget by reading the options for
+ // the selected flag
+ var opts = this.getOptions() || [];
+ if(!this.multiple && opts.length){
+ // Mirror what a select does - choose the first one
+ var opt = array.filter(opts, function(i){
+ return i.selected;
+ })[0];
+ if(opt && opt.value){
+ return opt.value;
+ }else{
+ opts[0].selected = true;
+ return opts[0].value;
+ }
+ }else if(this.multiple){
+ // Set value to be the sum of all selected
+ return array.map(array.filter(opts, function(i){
+ return i.selected;
+ }), function(i){
+ return i.value;
+ }) || [];
+ }
+ return "";
+ },
+
+ // Internal functions to call when we have store notifications come in
+ _onNewItem: function(/*item*/ item, /*Object?*/ parentInfo){
+ if(!parentInfo || !parentInfo.parent){
+ // Only add it if we are top-level
+ this._addOptionForItem(item);
+ }
+ },
+ _onDeleteItem: function(/*item*/ item){
+ var store = this.store;
+ this.removeOption(store.getIdentity(item));
+ },
+ _onSetItem: function(/*item*/ item){
+ this.updateOption(this._getOptionObjForItem(item));
+ },
+
+ _getOptionObjForItem: function(item){
+ // summary:
+ // Returns an option object based off the given item. The "value"
+ // of the option item will be the identity of the item, the "label"
+ // of the option will be the label of the item.
+
+ // remove getLabel() call for 2.0 (it's to support the old dojo.data API)
+ var store = this.store,
+ label = (this.labelAttr && this.labelAttr in item) ? item[this.labelAttr] : store.getLabel(item),
+ value = (label ? store.getIdentity(item) : null);
+ return {value: value, label: label, item: item}; // __SelectOption
+ },
+
+ _addOptionForItem: function(/*item*/ item){
+ // summary:
+ // Creates (and adds) the option for the given item
+ var store = this.store;
+ if(store.isItemLoaded && !store.isItemLoaded(item)){
+ // We are not loaded - so let's load it and add later.
+ // Remove for 2.0 (it's the old dojo.data API)
+ store.loadItem({item: item, onItem: function(i){
+ this._addOptionForItem(i);
+ },
+ scope: this});
+ return;
+ }
+ var newOpt = this._getOptionObjForItem(item);
+ this.addOption(newOpt);
+ },
+
+ constructor: function(params /*===== , srcNodeRef =====*/){
+ // summary:
+ // Create the widget.
+ // params: Object|null
+ // Hash of initialization parameters for widget, including scalar values (like title, duration etc.)
+ // and functions, typically callbacks like onClick.
+ // The hash can contain any of the widget's properties, excluding read-only properties.
+ // srcNodeRef: DOMNode|String?
+ // If a srcNodeRef (DOM node) is specified, replace srcNodeRef with my generated DOM tree
+
+ // Saves off our value, if we have an initial one set so we
+ // can use it if we have a store as well (see startup())
+ this._oValue = (params || {}).value || null;
+ this._notifyConnections = []; // remove for 2.0
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ dom.setSelectable(this.focusNode, false);
+ },
+
+ _fillContent: function(){
+ // summary:
+ // Loads our options and sets up our dropdown correctly. We
+ // don't want any content, so we don't call any inherit chain
+ // function.
+ if(!this.options){
+ this.options =
+ this.srcNodeRef
+ ? query("> *", this.srcNodeRef).map(
+ function(node){
+ if(node.getAttribute("type") === "separator"){
+ return { value: "", label: "", selected: false, disabled: false };
+ }
+ return {
+ value: (node.getAttribute("data-" + kernel._scopeName + "-value") || node.getAttribute("value")),
+ label: String(node.innerHTML),
+ // FIXME: disabled and selected are not valid on complex markup children (which is why we're
+ // looking for data-dojo-value above. perhaps we should data-dojo-props="" this whole thing?)
+ // decide before 1.6
+ selected: node.getAttribute("selected") || false,
+ disabled: node.getAttribute("disabled") || false
+ };
+ },
+ this)
+ : [];
+ }
+ if(!this.value){
+ this._set("value", this._getValueFromOpts());
+ }else if(this.multiple && typeof this.value == "string"){
+ this._set("value", this.value.split(","));
+ }
+ },
+
+ postCreate: function(){
+ // summary:
+ // sets up our event handling that we need for functioning
+ // as a select
+ this.inherited(arguments);
+
+ // Make our event connections for updating state
+ this.connect(this, "onChange", "_updateSelection");
+
+ // moved from startup
+ // Connects in our store, if we have one defined
+ var store = this.store;
+ if(store && (store.getIdentity || store.getFeatures()["dojo.data.api.Identity"])){
+ // Temporarily set our store to null so that it will get set
+ // and connected appropriately
+ this.store = null;
+ this.setStore(store, this._oValue);
+ }
+ },
+
+ startup: function(){
+ // summary:
+ this._loadChildren();
+ this.inherited(arguments);
+ },
+
+ destroy: function(){
+ // summary:
+ // Clean up our connections
+
+ var h;
+ while((h = this._notifyConnections.pop())){ h.remove(); }
+
+ // Cancel listener for store updates
+ if(this._queryRes && this._queryRes.close){
+ this._queryRes.close();
+ }
+
+ this.inherited(arguments);
+ },
+
+ _addOptionItem: function(/*__SelectOption*/ /*===== option =====*/){
+ // summary:
+ // User-overridable function which, for the given option, adds an
+ // item to the select. If the option doesn't have a value, then a
+ // separator is added in that place. Make sure to store the option
+ // in the created option widget.
+ },
+
+ _removeOptionItem: function(/*__SelectOption*/ /*===== option =====*/){
+ // summary:
+ // User-overridable function which, for the given option, removes
+ // its item from the select.
+ },
+
+ _setDisplay: function(/*String or String[]*/ /*===== newDisplay =====*/){
+ // summary:
+ // Overridable function which will set the display for the
+ // widget. newDisplay is either a string (in the case of
+ // single selects) or array of strings (in the case of multi-selects)
+ },
+
+ _getChildren: function(){
+ // summary:
+ // Overridable function to return the children that this widget contains.
+ return [];
+ },
+
+ _getSelectedOptionsAttr: function(){
+ // summary:
+ // hooks into this.attr to provide a mechanism for getting the
+ // option items for the current value of the widget.
+ return this.getOptions(this.get("value"));
+ },
+
+ _pseudoLoadChildren: function(/*item[]*/ /*===== items =====*/){
+ // summary:
+ // a function that will "fake" loading children, if needed, and
+ // if we have set to not load children until the widget opens.
+ // items:
+ // An array of items that will be loaded, when needed
+ },
+
+ onSetStore: function(){
+ // summary:
+ // a function that can be connected to in order to receive a
+ // notification that the store has finished loading and all options
+ // from that store are available
+ }
+});
+
+/*=====
+_FormSelectWidget.__SelectOption = __SelectOption;
+=====*/
+
+return _FormSelectWidget;
+
+});
diff --git a/lib/dijit/form/_FormValueMixin.js b/lib/dijit/form/_FormValueMixin.js
index 46bb6c52d..02ccf0f42 100644
--- a/lib/dijit/form/_FormValueMixin.js
+++ b/lib/dijit/form/_FormValueMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_FormValueMixin",["dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/sniff","./_FormWidgetMixin"],function(_1,_2,_3,_4,_5){return _1("dijit.form._FormValueMixin",_5,{readOnly:false,_setReadOnlyAttr:function(_6){_2.set(this.focusNode,"readOnly",_6);this.focusNode.setAttribute("aria-readonly",_6);this._set("readOnly",_6);},postCreate:function(){this.inherited(arguments);if(_4("ie")){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_7,_8){this._handleOnChange(_7,_8);},_handleOnChange:function(_9,_a){this._set("value",_9);this.inherited(arguments);},undo:function(){this._setValueAttr(this._lastValueReported,false);},reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},_onKeyDown:function(e){if(e.keyCode==_3.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(_4("ie")<9||(_4("ie")&&_4("quirks"))){e.preventDefault();te=document.createEventObject();te.keyCode=_3.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}}});}); \ No newline at end of file
+define("dijit/form/_FormValueMixin",["dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/sniff","./_FormWidgetMixin"],function(_1,_2,_3,_4,_5){return _1("dijit.form._FormValueMixin",_5,{readOnly:false,_setReadOnlyAttr:function(_6){_2.set(this.focusNode,"readOnly",_6);this._set("readOnly",_6);},postCreate:function(){this.inherited(arguments);if(_4("ie")){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_7,_8){this._handleOnChange(_7,_8);},_handleOnChange:function(_9,_a){this._set("value",_9);this.inherited(arguments);},undo:function(){this._setValueAttr(this._lastValueReported,false);},reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},_onKeyDown:function(e){if(e.keyCode==_3.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){if(_4("ie")<9||(_4("ie")&&_4("quirks"))){e.preventDefault();var _b=e.srcElement,te=_b.ownerDocument.createEventObject();te.keyCode=_3.ESCAPE;te.shiftKey=e.shiftKey;_b.fireEvent("onkeypress",te);}}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_FormValueMixin.js.uncompressed.js b/lib/dijit/form/_FormValueMixin.js.uncompressed.js
new file mode 100644
index 000000000..4944631ef
--- /dev/null
+++ b/lib/dijit/form/_FormValueMixin.js.uncompressed.js
@@ -0,0 +1,89 @@
+define("dijit/form/_FormValueMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/keys", // keys.ESCAPE
+ "dojo/sniff", // has("ie"), has("quirks")
+ "./_FormWidgetMixin"
+], function(declare, domAttr, keys, has, _FormWidgetMixin){
+
+ // module:
+ // dijit/form/_FormValueMixin
+
+ return declare("dijit.form._FormValueMixin", _FormWidgetMixin, {
+ // summary:
+ // Mixin for widgets corresponding to native HTML elements such as `<input>` or `<select>`
+ // that have user changeable values.
+ // description:
+ // Each _FormValueMixin represents a single input value, and has a (possibly hidden) `<input>` element,
+ // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?)
+ // works as expected.
+
+ // readOnly: Boolean
+ // Should this widget respond to user input?
+ // In markup, this is specified as "readOnly".
+ // Similar to disabled except readOnly form values are submitted.
+ readOnly: false,
+
+ _setReadOnlyAttr: function(/*Boolean*/ value){
+ domAttr.set(this.focusNode, 'readOnly', value);
+ this._set("readOnly", value);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ if(has("ie")){ // IE won't stop the event with keypress
+ this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown);
+ }
+ // Update our reset value if it hasn't yet been set (because this.set()
+ // is only called when there *is* a value)
+ if(this._resetValue === undefined){
+ this._lastValueReported = this._resetValue = this.value;
+ }
+ },
+
+ _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
+ // summary:
+ // Hook so set('value', value) works.
+ // description:
+ // Sets the value of the widget.
+ // If the value has changed, then fire onChange event, unless priorityChange
+ // is specified as null (or false?)
+ this._handleOnChange(newValue, priorityChange);
+ },
+
+ _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
+ // summary:
+ // Called when the value of the widget has changed. Saves the new value in this.value,
+ // and calls onChange() if appropriate. See _FormWidget._handleOnChange() for details.
+ this._set("value", newValue);
+ this.inherited(arguments);
+ },
+
+ undo: function(){
+ // summary:
+ // Restore the value to the last value passed to onChange
+ this._setValueAttr(this._lastValueReported, false);
+ },
+
+ reset: function(){
+ // summary:
+ // Reset the widget's value to what it was at initialization time
+ this._hasBeenBlurred = false;
+ this._setValueAttr(this._resetValue, true);
+ },
+
+ _onKeyDown: function(e){
+ if(e.keyCode == keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){
+ if(has("ie") < 9 || (has("ie") && has("quirks"))){
+ e.preventDefault(); // default behavior needs to be stopped here since keypress is too late
+ var node = e.srcElement,
+ te = node.ownerDocument.createEventObject();
+ te.keyCode = keys.ESCAPE;
+ te.shiftKey = e.shiftKey;
+ node.fireEvent('onkeypress', te);
+ }
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/_FormValueWidget.js b/lib/dijit/form/_FormValueWidget.js
index 276378577..7a6f9a541 100644
--- a/lib/dijit/form/_FormValueWidget.js
+++ b/lib/dijit/form/_FormValueWidget.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_FormValueWidget",["dojo/_base/declare","dojo/_base/sniff","./_FormWidget","./_FormValueMixin"],function(_1,_2,_3,_4){return _1("dijit.form._FormValueWidget",[_3,_4],{_layoutHackIE7:function(){if(_2("ie")==7){var _5=this.domNode;var _6=_5.parentNode;var _7=_5.firstChild||_5;var _8=_7.style.filter;var _9=this;while(_6&&_6.clientHeight==0){(function ping(){var _a=_9.connect(_6,"onscroll",function(){_9.disconnect(_a);_7.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_7.style.filter=_8;},0);});})();_6=_6.parentNode;}}}});}); \ No newline at end of file
+define("dijit/form/_FormValueWidget",["dojo/_base/declare","dojo/sniff","./_FormWidget","./_FormValueMixin"],function(_1,_2,_3,_4){return _1("dijit.form._FormValueWidget",[_3,_4],{_layoutHackIE7:function(){if(_2("ie")==7){var _5=this.domNode;var _6=_5.parentNode;var _7=_5.firstChild||_5;var _8=_7.style.filter;var _9=this;while(_6&&_6.clientHeight==0){(function ping(){var _a=_9.connect(_6,"onscroll",function(){_9.disconnect(_a);_7.style.filter=(new Date()).getMilliseconds();_9.defer(function(){_7.style.filter=_8;});});})();_6=_6.parentNode;}}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_FormValueWidget.js.uncompressed.js b/lib/dijit/form/_FormValueWidget.js.uncompressed.js
new file mode 100644
index 000000000..9edbf2e83
--- /dev/null
+++ b/lib/dijit/form/_FormValueWidget.js.uncompressed.js
@@ -0,0 +1,51 @@
+define("dijit/form/_FormValueWidget", [
+ "dojo/_base/declare", // declare
+ "dojo/sniff", // has("ie")
+ "./_FormWidget",
+ "./_FormValueMixin"
+], function(declare, has, _FormWidget, _FormValueMixin){
+
+// module:
+// dijit/form/_FormValueWidget
+
+return declare("dijit.form._FormValueWidget", [_FormWidget, _FormValueMixin],
+{
+ // summary:
+ // Base class for widgets corresponding to native HTML elements such as `<input>` or `<select>`
+ // that have user changeable values.
+ // description:
+ // Each _FormValueWidget represents a single input value, and has a (possibly hidden) `<input>` element,
+ // to which it serializes it's input value, so that form submission (either normal submission or via FormBind?)
+ // works as expected.
+
+ // Don't attempt to mixin the 'type', 'name' attributes here programatically -- they must be declared
+ // directly in the template as read by the parser in order to function. IE is known to specifically
+ // require the 'name' attribute at element creation time. See #8484, #8660.
+
+ _layoutHackIE7: function(){
+ // summary:
+ // Work around table sizing bugs on IE7 by forcing redraw
+
+ if(has("ie") == 7){ // fix IE7 layout bug when the widget is scrolled out of sight
+ var domNode = this.domNode;
+ var parent = domNode.parentNode;
+ var pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter
+ var origFilter = pingNode.style.filter; // save custom filter, most likely nothing
+ var _this = this;
+ while(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet
+ (function ping(){
+ var disconnectHandle = _this.connect(parent, "onscroll",
+ function(){
+ _this.disconnect(disconnectHandle); // only call once
+ pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique
+ _this.defer(function(){ pingNode.style.filter = origFilter; }); // restore custom filter, if any
+ }
+ );
+ })();
+ parent = parent.parentNode;
+ }
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/_FormWidget.js b/lib/dijit/form/_FormWidget.js
index f7867b0c5..419f5ca73 100644
--- a/lib/dijit/form/_FormWidget.js
+++ b/lib/dijit/form/_FormWidget.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_FormWidget",["dojo/_base/declare","dojo/_base/kernel","dojo/ready","../_Widget","../_CssStateMixin","../_TemplatedMixin","./_FormWidgetMixin"],function(_1,_2,_3,_4,_5,_6,_7){if(!_2.isAsync){_3(0,function(){var _8=["dijit/form/_FormValueWidget"];require(_8);});}return _1("dijit.form._FormWidget",[_4,_6,_5,_7],{setDisabled:function(_9){_2.deprecated("setDisabled("+_9+") is deprecated. Use set('disabled',"+_9+") instead.","","2.0");this.set("disabled",_9);},setValue:function(_a){_2.deprecated("dijit.form._FormWidget:setValue("+_a+") is deprecated. Use set('value',"+_a+") instead.","","2.0");this.set("value",_a);},getValue:function(){_2.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},postMixInProperties:function(){this.nameAttrSetting=this.name?("name=\""+this.name.replace(/'/g,"&quot;")+"\""):"";this.inherited(arguments);},_setTypeAttr:null});}); \ No newline at end of file
+define("dijit/form/_FormWidget",["dojo/_base/declare","dojo/has","dojo/_base/kernel","dojo/ready","../_Widget","../_CssStateMixin","../_TemplatedMixin","./_FormWidgetMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8){if(_2("dijit-legacy-requires")){_4(0,function(){var _9=["dijit/form/_FormValueWidget"];require(_9);});}return _1("dijit.form._FormWidget",[_5,_7,_6,_8],{setDisabled:function(_a){_3.deprecated("setDisabled("+_a+") is deprecated. Use set('disabled',"+_a+") instead.","","2.0");this.set("disabled",_a);},setValue:function(_b){_3.deprecated("dijit.form._FormWidget:setValue("+_b+") is deprecated. Use set('value',"+_b+") instead.","","2.0");this.set("value",_b);},getValue:function(){_3.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},postMixInProperties:function(){this.nameAttrSetting=this.name?("name=\""+this.name.replace(/"/g,"&quot;")+"\""):"";this.inherited(arguments);},_setTypeAttr:null});}); \ No newline at end of file
diff --git a/lib/dijit/form/_FormWidget.js.uncompressed.js b/lib/dijit/form/_FormWidget.js.uncompressed.js
new file mode 100644
index 000000000..ada09eb0e
--- /dev/null
+++ b/lib/dijit/form/_FormWidget.js.uncompressed.js
@@ -0,0 +1,71 @@
+define("dijit/form/_FormWidget", [
+ "dojo/_base/declare", // declare
+ "dojo/has", // has("dijit-legacy-requires")
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/ready",
+ "../_Widget",
+ "../_CssStateMixin",
+ "../_TemplatedMixin",
+ "./_FormWidgetMixin"
+], function(declare, has, kernel, ready, _Widget, _CssStateMixin, _TemplatedMixin, _FormWidgetMixin){
+
+
+// module:
+// dijit/form/_FormWidget
+
+// Back compat w/1.6, remove for 2.0
+if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/form/_FormValueWidget"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+return declare("dijit.form._FormWidget", [_Widget, _TemplatedMixin, _CssStateMixin, _FormWidgetMixin], {
+ // summary:
+ // Base class for widgets corresponding to native HTML elements such as `<checkbox>` or `<button>`,
+ // which can be children of a `<form>` node or a `dijit/form/Form` widget.
+ //
+ // description:
+ // Represents a single HTML element.
+ // All these widgets should have these attributes just like native HTML input elements.
+ // You can set them during widget construction or afterwards, via `dijit/_WidgetBase.set()`.
+ //
+ // They also share some common methods.
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Deprecated. Use set('disabled', ...) instead.
+ kernel.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0");
+ this.set('disabled', disabled);
+ },
+
+ setValue: function(/*String*/ value){
+ // summary:
+ // Deprecated. Use set('value', ...) instead.
+ kernel.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use set('value',"+value+") instead.", "", "2.0");
+ this.set('value', value);
+ },
+
+ getValue: function(){
+ // summary:
+ // Deprecated. Use get('value') instead.
+ kernel.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0");
+ return this.get('value');
+ },
+
+ postMixInProperties: function(){
+ // Setup name=foo string to be referenced from the template (but only if a name has been specified)
+ // Unfortunately we can't use _setNameAttr to set the name due to IE limitations, see #8484, #8660.
+ // Regarding escaping, see heading "Attribute values" in
+ // http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2
+ this.nameAttrSetting = this.name ? ('name="' + this.name.replace(/"/g, "&quot;") + '"') : '';
+ this.inherited(arguments);
+ },
+
+ // Override automatic assigning type --> focusNode, it causes exception on IE.
+ // Instead, type must be specified as ${type} in the template, as part of the original DOM
+ _setTypeAttr: null
+});
+
+});
diff --git a/lib/dijit/form/_FormWidgetMixin.js b/lib/dijit/form/_FormWidgetMixin.js
index d84fe9a2a..097a85db2 100644
--- a/lib/dijit/form/_FormWidgetMixin.js
+++ b/lib/dijit/form/_FormWidgetMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_FormWidgetMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-style","dojo/_base/lang","dojo/mouse","dojo/_base/sniff","dojo/_base/window","dojo/window","../a11y"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _2("dijit.form._FormWidgetMixin",null,{name:"",alt:"",value:"",type:"text",tabIndex:"0",_setTabIndexAttr:"focusNode",disabled:false,intermediateChanges:false,scrollOnFocus:true,_setIdAttr:"focusNode",_setDisabledAttr:function(_b){this._set("disabled",_b);_3.set(this.focusNode,"disabled",_b);if(this.valueNode){_3.set(this.valueNode,"disabled",_b);}this.focusNode.setAttribute("aria-disabled",_b?"true":"false");if(_b){this._set("hovering",false);this._set("active",false);var _c="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:("_setTabIndexAttr" in this)?this._setTabIndexAttr:"focusNode";_1.forEach(_5.isArray(_c)?_c:[_c],function(_d){var _e=this[_d];if(_7("webkit")||_a.hasDefaultTabStop(_e)){_e.setAttribute("tabIndex","-1");}else{_e.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.set("tabIndex",this.tabIndex);}}},_onFocus:function(by){if(by=="mouse"&&this.isFocusable()){var _f=this.connect(this.focusNode,"onfocus",function(){this.disconnect(_10);this.disconnect(_f);});var _10=this.connect(_8.body(),"onmouseup",function(){this.disconnect(_10);this.disconnect(_f);if(this.focused){this.focus();}});}if(this.scrollOnFocus){this.defer(function(){_9.scrollIntoView(this.domNode);});}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(_4.get(this.domNode,"display")!="none");},focus:function(){if(!this.disabled&&this.focusNode.focus){try{this.focusNode.focus();}catch(e){}}},compare:function(_11,_12){if(typeof _11=="number"&&typeof _12=="number"){return (isNaN(_11)&&isNaN(_12))?0:_11-_12;}else{if(_11>_12){return 1;}else{if(_11<_12){return -1;}else{return 0;}}}},onChange:function(){},_onChangeActive:false,_handleOnChange:function(_13,_14){if(this._lastValueReported==undefined&&(_14===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_13;}this._pendingOnChange=this._pendingOnChange||(typeof _13!=typeof this._lastValueReported)||(this.compare(_13,this._lastValueReported)!=0);if((this.intermediateChanges||_14||_14===undefined)&&this._pendingOnChange){this._lastValueReported=_13;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){this._onChangeHandle.remove();}this._onChangeHandle=this.defer(function(){this._onChangeHandle=null;this.onChange(_13);});}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){this._onChangeHandle.remove();this.onChange(this._lastValueReported);}this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/_FormWidgetMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-style","dojo/_base/lang","dojo/mouse","dojo/sniff","dojo/window","../a11y"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _2("dijit.form._FormWidgetMixin",null,{name:"",alt:"",value:"",type:"text","aria-label":"focusNode",tabIndex:"0",_setTabIndexAttr:"focusNode",disabled:false,intermediateChanges:false,scrollOnFocus:true,_setIdAttr:"focusNode",_setDisabledAttr:function(_a){this._set("disabled",_a);_3.set(this.focusNode,"disabled",_a);if(this.valueNode){_3.set(this.valueNode,"disabled",_a);}this.focusNode.setAttribute("aria-disabled",_a?"true":"false");if(_a){this._set("hovering",false);this._set("active",false);var _b="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:("_setTabIndexAttr" in this)?this._setTabIndexAttr:"focusNode";_1.forEach(_5.isArray(_b)?_b:[_b],function(_c){var _d=this[_c];if(_7("webkit")||_9.hasDefaultTabStop(_d)){_d.setAttribute("tabIndex","-1");}else{_d.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.set("tabIndex",this.tabIndex);}}},_onFocus:function(by){if(by=="mouse"&&this.isFocusable()){var _e=this.connect(this.focusNode,"onfocus",function(){this.disconnect(_f);this.disconnect(_e);});var _f=this.connect(this.ownerDocumentBody,"onmouseup",function(){this.disconnect(_f);this.disconnect(_e);if(this.focused){this.focus();}});}if(this.scrollOnFocus){this.defer(function(){_8.scrollIntoView(this.domNode);});}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(_4.get(this.domNode,"display")!="none");},focus:function(){if(!this.disabled&&this.focusNode.focus){try{this.focusNode.focus();}catch(e){}}},compare:function(_10,_11){if(typeof _10=="number"&&typeof _11=="number"){return (isNaN(_10)&&isNaN(_11))?0:_10-_11;}else{if(_10>_11){return 1;}else{if(_10<_11){return -1;}else{return 0;}}}},onChange:function(){},_onChangeActive:false,_handleOnChange:function(_12,_13){if(this._lastValueReported==undefined&&(_13===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_12;}this._pendingOnChange=this._pendingOnChange||(typeof _12!=typeof this._lastValueReported)||(this.compare(_12,this._lastValueReported)!=0);if((this.intermediateChanges||_13||_13===undefined)&&this._pendingOnChange){this._lastValueReported=_12;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){this._onChangeHandle.remove();}this._onChangeHandle=this.defer(function(){this._onChangeHandle=null;this.onChange(_12);});}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){this._onChangeHandle.remove();this.onChange(this._lastValueReported);}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js b/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js
new file mode 100644
index 000000000..873466d53
--- /dev/null
+++ b/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js
@@ -0,0 +1,227 @@
+define("dijit/form/_FormWidgetMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-style", // domStyle.get
+ "dojo/_base/lang", // lang.hitch lang.isArray
+ "dojo/mouse", // mouse.isLeft
+ "dojo/sniff", // has("webkit")
+ "dojo/window", // winUtils.scrollIntoView
+ "../a11y" // a11y.hasDefaultTabStop
+], function(array, declare, domAttr, domStyle, lang, mouse, has, winUtils, a11y){
+
+// module:
+// dijit/form/_FormWidgetMixin
+
+return declare("dijit.form._FormWidgetMixin", null, {
+ // summary:
+ // Mixin for widgets corresponding to native HTML elements such as `<checkbox>` or `<button>`,
+ // which can be children of a `<form>` node or a `dijit/form/Form` widget.
+ //
+ // description:
+ // Represents a single HTML element.
+ // All these widgets should have these attributes just like native HTML input elements.
+ // You can set them during widget construction or afterwards, via `dijit/_WidgetBase.set()`.
+ //
+ // They also share some common methods.
+
+ // name: [const] String
+ // Name used when submitting form; same as "name" attribute or plain HTML elements
+ name: "",
+
+ // alt: String
+ // Corresponds to the native HTML `<input>` element's attribute.
+ alt: "",
+
+ // value: String
+ // Corresponds to the native HTML `<input>` element's attribute.
+ value: "",
+
+ // type: [const] String
+ // Corresponds to the native HTML `<input>` element's attribute.
+ type: "text",
+
+ // type: String
+ // Apply aria-label in markup to the widget's focusNode
+ "aria-label": "focusNode",
+
+ // tabIndex: String
+ // Order fields are traversed when user hits the tab key
+ tabIndex: "0",
+ _setTabIndexAttr: "focusNode", // force copy even when tabIndex default value, needed since Button is <span>
+
+ // disabled: Boolean
+ // Should this widget respond to user input?
+ // In markup, this is specified as "disabled='disabled'", or just "disabled".
+ disabled: false,
+
+ // intermediateChanges: Boolean
+ // Fires onChange for each value change or only on demand
+ intermediateChanges: false,
+
+ // scrollOnFocus: Boolean
+ // On focus, should this widget scroll into view?
+ scrollOnFocus: true,
+
+ // Override _WidgetBase mapping id to this.domNode, needs to be on focusNode so <label> etc.
+ // works with screen reader
+ _setIdAttr: "focusNode",
+
+ _setDisabledAttr: function(/*Boolean*/ value){
+ this._set("disabled", value);
+ domAttr.set(this.focusNode, 'disabled', value);
+ if(this.valueNode){
+ domAttr.set(this.valueNode, 'disabled', value);
+ }
+ this.focusNode.setAttribute("aria-disabled", value ? "true" : "false");
+
+ if(value){
+ // reset these, because after the domNode is disabled, we can no longer receive
+ // mouse related events, see #4200
+ this._set("hovering", false);
+ this._set("active", false);
+
+ // clear tab stop(s) on this widget's focusable node(s) (ComboBox has two focusable nodes)
+ var attachPointNames = "tabIndex" in this.attributeMap ? this.attributeMap.tabIndex :
+ ("_setTabIndexAttr" in this) ? this._setTabIndexAttr : "focusNode";
+ array.forEach(lang.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){
+ var node = this[attachPointName];
+ // complex code because tabIndex=-1 on a <div> doesn't work on FF
+ if(has("webkit") || a11y.hasDefaultTabStop(node)){ // see #11064 about webkit bug
+ node.setAttribute('tabIndex', "-1");
+ }else{
+ node.removeAttribute('tabIndex');
+ }
+ }, this);
+ }else{
+ if(this.tabIndex != ""){
+ this.set('tabIndex', this.tabIndex);
+ }
+ }
+ },
+
+ _onFocus: function(/*String*/ by){
+ // If user clicks on the widget, even if the mouse is released outside of it,
+ // this widget's focusNode should get focus (to mimic native browser hehavior).
+ // Browsers often need help to make sure the focus via mouse actually gets to the focusNode.
+ if(by == "mouse" && this.isFocusable()){
+ // IE exhibits strange scrolling behavior when refocusing a node so only do it when !focused.
+ var focusConnector = this.connect(this.focusNode, "onfocus", function(){
+ this.disconnect(mouseUpConnector);
+ this.disconnect(focusConnector);
+ });
+ // Set a global event to handle mouseup, so it fires properly
+ // even if the cursor leaves this.domNode before the mouse up event.
+ var mouseUpConnector = this.connect(this.ownerDocumentBody, "onmouseup", function(){
+ this.disconnect(mouseUpConnector);
+ this.disconnect(focusConnector);
+ // if here, then the mousedown did not focus the focusNode as the default action
+ if(this.focused){
+ this.focus();
+ }
+ });
+ }
+ if(this.scrollOnFocus){
+ this.defer(function(){ winUtils.scrollIntoView(this.domNode); }); // without defer, the input caret position can change on mouse click
+ }
+ this.inherited(arguments);
+ },
+
+ isFocusable: function(){
+ // summary:
+ // Tells if this widget is focusable or not. Used internally by dijit.
+ // tags:
+ // protected
+ return !this.disabled && this.focusNode && (domStyle.get(this.domNode, "display") != "none");
+ },
+
+ focus: function(){
+ // summary:
+ // Put focus on this widget
+ if(!this.disabled && this.focusNode.focus){
+ try{ this.focusNode.focus(); }catch(e){}/*squelch errors from hidden nodes*/
+ }
+ },
+
+ compare: function(/*anything*/ val1, /*anything*/ val2){
+ // summary:
+ // Compare 2 values (as returned by get('value') for this widget).
+ // tags:
+ // protected
+ if(typeof val1 == "number" && typeof val2 == "number"){
+ return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2;
+ }else if(val1 > val2){
+ return 1;
+ }else if(val1 < val2){
+ return -1;
+ }else{
+ return 0;
+ }
+ },
+
+ onChange: function(/*===== newValue =====*/){
+ // summary:
+ // Callback when this widget's value is changed.
+ // tags:
+ // callback
+ },
+
+ // _onChangeActive: [private] Boolean
+ // Indicates that changes to the value should call onChange() callback.
+ // This is false during widget initialization, to avoid calling onChange()
+ // when the initial value is set.
+ _onChangeActive: false,
+
+ _handleOnChange: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){
+ // summary:
+ // Called when the value of the widget is set. Calls onChange() if appropriate
+ // newValue:
+ // the new value
+ // priorityChange:
+ // For a slider, for example, dragging the slider is priorityChange==false,
+ // but on mouse up, it's priorityChange==true. If intermediateChanges==false,
+ // onChange is only called form priorityChange=true events.
+ // tags:
+ // private
+ if(this._lastValueReported == undefined && (priorityChange === null || !this._onChangeActive)){
+ // this block executes not for a change, but during initialization,
+ // and is used to store away the original value (or for ToggleButton, the original checked state)
+ this._resetValue = this._lastValueReported = newValue;
+ }
+ this._pendingOnChange = this._pendingOnChange
+ || (typeof newValue != typeof this._lastValueReported)
+ || (this.compare(newValue, this._lastValueReported) != 0);
+ if((this.intermediateChanges || priorityChange || priorityChange === undefined) && this._pendingOnChange){
+ this._lastValueReported = newValue;
+ this._pendingOnChange = false;
+ if(this._onChangeActive){
+ if(this._onChangeHandle){
+ this._onChangeHandle.remove();
+ }
+ // defer allows hidden value processing to run and
+ // also the onChange handler can safely adjust focus, etc
+ this._onChangeHandle = this.defer(
+ function(){
+ this._onChangeHandle = null;
+ this.onChange(newValue);
+ }); // try to collapse multiple onChange's fired faster than can be processed
+ }
+ }
+ },
+
+ create: function(){
+ // Overrides _Widget.create()
+ this.inherited(arguments);
+ this._onChangeActive = true;
+ },
+
+ destroy: function(){
+ if(this._onChangeHandle){ // destroy called before last onChange has fired
+ this._onChangeHandle.remove();
+ this.onChange(this._lastValueReported);
+ }
+ this.inherited(arguments);
+ }
+});
+
+});
diff --git a/lib/dijit/form/_ListBase.js b/lib/dijit/form/_ListBase.js
index 1e0dee136..1382d4db4 100644
--- a/lib/dijit/form/_ListBase.js
+++ b/lib/dijit/form/_ListBase.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_ListBase",["dojo/_base/declare","dojo/window"],function(_1,_2){return _1("dijit.form._ListBase",null,{selected:null,_getTarget:function(_3){var _4=_3.target;var _5=this.containerNode;if(_4==_5||_4==this.domNode){return null;}while(_4&&_4.parentNode!=_5){_4=_4.parentNode;}return _4;},selectFirstNode:function(){var _6=this.containerNode.firstChild;while(_6&&_6.style.display=="none"){_6=_6.nextSibling;}this._setSelectedAttr(_6);},selectLastNode:function(){var _7=this.containerNode.lastChild;while(_7&&_7.style.display=="none"){_7=_7.previousSibling;}this._setSelectedAttr(_7);},selectNextNode:function(){var _8=this._getSelectedAttr();if(!_8){this.selectFirstNode();}else{var _9=_8.nextSibling;while(_9&&_9.style.display=="none"){_9=_9.nextSibling;}if(!_9){this.selectFirstNode();}else{this._setSelectedAttr(_9);}}},selectPreviousNode:function(){var _a=this._getSelectedAttr();if(!_a){this.selectLastNode();}else{var _b=_a.previousSibling;while(_b&&_b.style.display=="none"){_b=_b.previousSibling;}if(!_b){this.selectLastNode();}else{this._setSelectedAttr(_b);}}},_setSelectedAttr:function(_c){if(this.selected!=_c){var _d=this._getSelectedAttr();if(_d){this.onDeselect(_d);this.selected=null;}if(_c&&_c.parentNode==this.containerNode){this.selected=_c;_2.scrollIntoView(_c);this.onSelect(_c);}}else{if(_c){this.onSelect(_c);}}},_getSelectedAttr:function(){var v=this.selected;return (v&&v.parentNode==this.containerNode)?v:(this.selected=null);}});}); \ No newline at end of file
+define("dijit/form/_ListBase",["dojo/_base/declare","dojo/on","dojo/window"],function(_1,on,_2){return _1("dijit.form._ListBase",null,{selected:null,_listConnect:function(_3,_4){var _5=this;return _5.own(on(_5.containerNode,on.selector(function(_6,_7,_8){return _6.parentNode==_8;},_3),function(_9){_9.preventDefault();_5[_4](_9,this);}));},selectFirstNode:function(){var _a=this.containerNode.firstChild;while(_a&&_a.style.display=="none"){_a=_a.nextSibling;}this._setSelectedAttr(_a);},selectLastNode:function(){var _b=this.containerNode.lastChild;while(_b&&_b.style.display=="none"){_b=_b.previousSibling;}this._setSelectedAttr(_b);},selectNextNode:function(){var _c=this.selected;if(!_c){this.selectFirstNode();}else{var _d=_c.nextSibling;while(_d&&_d.style.display=="none"){_d=_d.nextSibling;}if(!_d){this.selectFirstNode();}else{this._setSelectedAttr(_d);}}},selectPreviousNode:function(){var _e=this.selected;if(!_e){this.selectLastNode();}else{var _f=_e.previousSibling;while(_f&&_f.style.display=="none"){_f=_f.previousSibling;}if(!_f){this.selectLastNode();}else{this._setSelectedAttr(_f);}}},_setSelectedAttr:function(_10){if(this.selected!=_10){var _11=this.selected;if(_11){this.onDeselect(_11);this.selected=null;}if(_10){this.selected=_10;_2.scrollIntoView(_10);this.onSelect(_10);}}else{if(_10){this.onSelect(_10);}}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ListBase.js.uncompressed.js b/lib/dijit/form/_ListBase.js.uncompressed.js
new file mode 100644
index 000000000..ea32c3ceb
--- /dev/null
+++ b/lib/dijit/form/_ListBase.js.uncompressed.js
@@ -0,0 +1,135 @@
+define("dijit/form/_ListBase", [
+ "dojo/_base/declare", // declare
+ "dojo/on",
+ "dojo/window" // winUtils.scrollIntoView
+], function(declare, on, winUtils){
+
+// module:
+// dijit/form/_ListBase
+
+return declare( "dijit.form._ListBase", null, {
+ // summary:
+ // Focus-less menu to handle UI events consistently
+ // Abstract methods that must be defined externally:
+ //
+ // - onSelect: item is active (mousedown but not yet mouseup, or keyboard arrow selected but no Enter)
+ // - onDeselect: cancels onSelect
+ // tags:
+ // private
+
+ // selected: DOMNode
+ // currently selected node
+ selected: null,
+
+ _listConnect: function(/*String|Function*/ eventType, /*String*/ callbackFuncName){
+ // summary:
+ // Connects 'containerNode' to specified method of this object
+ // and automatically registers for 'disconnect' on widget destroy.
+ // description:
+ // Provide widget-specific analog to 'connect'.
+ // The callback function is called with the normal event object,
+ // but also a second parameter is passed that indicates which list item
+ // actually received the event.
+ // returns:
+ // A handle that can be passed to `disconnect` in order to disconnect
+ // before the widget is destroyed.
+ // tags:
+ // private
+
+ var self = this;
+ return self.own(on(self.containerNode,
+ on.selector(
+ function(eventTarget, selector, target){
+ return eventTarget.parentNode == target;
+ },
+ eventType
+ ),
+ function(evt){
+ evt.preventDefault();
+ self[callbackFuncName](evt, this);
+ }
+ ));
+ },
+
+ selectFirstNode: function(){
+ // summary:
+ // Select the first displayed item in the list.
+ var first = this.containerNode.firstChild;
+ while(first && first.style.display == "none"){
+ first = first.nextSibling;
+ }
+ this._setSelectedAttr(first);
+ },
+
+ selectLastNode: function(){
+ // summary:
+ // Select the last displayed item in the list
+ var last = this.containerNode.lastChild;
+ while(last && last.style.display == "none"){
+ last = last.previousSibling;
+ }
+ this._setSelectedAttr(last);
+ },
+
+ selectNextNode: function(){
+ // summary:
+ // Select the item just below the current selection.
+ // If nothing selected, select first node.
+ var selectedNode = this.selected;
+ if(!selectedNode){
+ this.selectFirstNode();
+ }else{
+ var next = selectedNode.nextSibling;
+ while(next && next.style.display == "none"){
+ next = next.nextSibling;
+ }
+ if(!next){
+ this.selectFirstNode();
+ }else{
+ this._setSelectedAttr(next);
+ }
+ }
+ },
+
+ selectPreviousNode: function(){
+ // summary:
+ // Select the item just above the current selection.
+ // If nothing selected, select last node (if
+ // you select Previous and try to keep scrolling up the list).
+ var selectedNode = this.selected;
+ if(!selectedNode){
+ this.selectLastNode();
+ }else{
+ var prev = selectedNode.previousSibling;
+ while(prev && prev.style.display == "none"){
+ prev = prev.previousSibling;
+ }
+ if(!prev){
+ this.selectLastNode();
+ }else{
+ this._setSelectedAttr(prev);
+ }
+ }
+ },
+
+ _setSelectedAttr: function(/*DomNode*/ node){
+ // summary:
+ // Does the actual select.
+ if(this.selected != node){
+ var selectedNode = this.selected;
+ if(selectedNode){
+ this.onDeselect(selectedNode);
+ this.selected = null;
+ }
+ if(node){
+ this.selected = node;
+ winUtils.scrollIntoView(node);
+ this.onSelect(node);
+ }
+ }else if(node){
+ this.onSelect(node);
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/_ListMouseMixin.js b/lib/dijit/form/_ListMouseMixin.js
index 8c731e33c..ca18b17e8 100644
--- a/lib/dijit/form/_ListMouseMixin.js
+++ b/lib/dijit/form/_ListMouseMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_ListMouseMixin",["dojo/_base/declare","dojo/_base/event","dojo/touch","./_ListBase"],function(_1,_2,_3,_4){return _1("dijit.form._ListMouseMixin",_4,{postCreate:function(){this.inherited(arguments);this.connect(this.domNode,_3.press,"_onMouseDown");this.connect(this.domNode,_3.release,"_onMouseUp");this.connect(this.domNode,"onmouseover","_onMouseOver");this.connect(this.domNode,"onmouseout","_onMouseOut");},_onMouseDown:function(_5){_2.stop(_5);if(this._hoveredNode){this.onUnhover(this._hoveredNode);this._hoveredNode=null;}this._isDragging=true;this._setSelectedAttr(this._getTarget(_5));},_onMouseUp:function(_6){_2.stop(_6);this._isDragging=false;var _7=this._getSelectedAttr();var _8=this._getTarget(_6);var _9=this._hoveredNode;if(_7&&_8==_7){this.onClick(_7);}else{if(_9&&_8==_9){this._setSelectedAttr(_9);this.onClick(_9);}}},_onMouseOut:function(){if(this._hoveredNode){this.onUnhover(this._hoveredNode);if(this._getSelectedAttr()==this._hoveredNode){this.onSelect(this._hoveredNode);}this._hoveredNode=null;}if(this._isDragging){this._cancelDrag=(new Date()).getTime()+1000;}},_onMouseOver:function(_a){if(this._cancelDrag){var _b=(new Date()).getTime();if(_b>this._cancelDrag){this._isDragging=false;}this._cancelDrag=null;}var _c=this._getTarget(_a);if(!_c){return;}if(this._hoveredNode!=_c){if(this._hoveredNode){this._onMouseOut({target:this._hoveredNode});}if(_c&&_c.parentNode==this.containerNode){if(this._isDragging){this._setSelectedAttr(_c);}else{this._hoveredNode=_c;this.onHover(_c);}}}}});}); \ No newline at end of file
+define("dijit/form/_ListMouseMixin",["dojo/_base/declare","dojo/mouse","dojo/on","dojo/touch","./_ListBase"],function(_1,_2,on,_3,_4){return _1("dijit.form._ListMouseMixin",_4,{postCreate:function(){this.inherited(arguments);this.own(on(this.domNode,_3.press,function(_5){_5.preventDefault();}));this._listConnect(_3.press,"_onMouseDown");this._listConnect(_3.release,"_onMouseUp");this._listConnect(_2.enter,"_onMouseOver");this._listConnect(_2.leave,"_onMouseOut");},_onMouseDown:function(_6,_7){if(this._hoveredNode){this.onUnhover(this._hoveredNode);this._hoveredNode=null;}this._isDragging=true;this._setSelectedAttr(_7);},_onMouseUp:function(_8,_9){this._isDragging=false;var _a=this.selected;var _b=this._hoveredNode;if(_a&&_9==_a){this.onClick(_a);}else{if(_b&&_9==_b){this._setSelectedAttr(_b);this.onClick(_b);}}},_onMouseOut:function(_c,_d){if(this._hoveredNode){this.onUnhover(this._hoveredNode);this._hoveredNode=null;}if(this._isDragging){this._cancelDrag=(new Date()).getTime()+1000;}},_onMouseOver:function(_e,_f){if(this._cancelDrag){var _10=(new Date()).getTime();if(_10>this._cancelDrag){this._isDragging=false;}this._cancelDrag=null;}this._hoveredNode=_f;this.onHover(_f);if(this._isDragging){this._setSelectedAttr(_f);}}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ListMouseMixin.js.uncompressed.js b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js
new file mode 100644
index 000000000..118f6fdfb
--- /dev/null
+++ b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js
@@ -0,0 +1,79 @@
+define("dijit/form/_ListMouseMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/mouse",
+ "dojo/on",
+ "dojo/touch",
+ "./_ListBase"
+], function(declare, mouse, on, touch, _ListBase){
+
+// module:
+// dijit/form/_ListMouseMixin
+
+return declare( "dijit.form._ListMouseMixin", _ListBase, {
+ // summary:
+ // a Mixin to handle mouse or touch events for a focus-less menu
+ // Abstract methods that must be defined externally:
+ //
+ // - onClick: item was chosen (mousedown somewhere on the menu and mouseup somewhere on the menu)
+ // tags:
+ // private
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ this.own(on(this.domNode, touch.press, function(evt){ evt.preventDefault(); })); // prevent focus shift on list scrollbar press
+
+ this._listConnect(touch.press, "_onMouseDown");
+ this._listConnect(touch.release, "_onMouseUp");
+ this._listConnect(mouse.enter, "_onMouseOver");
+ this._listConnect(mouse.leave, "_onMouseOut");
+ },
+
+ _onMouseDown: function(/*Event*/ evt, /*DomNode*/ target){
+ if(this._hoveredNode){
+ this.onUnhover(this._hoveredNode);
+ this._hoveredNode = null;
+ }
+ this._isDragging = true;
+ this._setSelectedAttr(target);
+ },
+
+ _onMouseUp: function(/*Event*/ evt, /*DomNode*/ target){
+ this._isDragging = false;
+ var selectedNode = this.selected;
+ var hoveredNode = this._hoveredNode;
+ if(selectedNode && target == selectedNode){
+ this.onClick(selectedNode);
+ }else if(hoveredNode && target == hoveredNode){ // drag to select
+ this._setSelectedAttr(hoveredNode);
+ this.onClick(hoveredNode);
+ }
+ },
+
+ _onMouseOut: function(/*Event*/ evt, /*DomNode*/ target){
+ if(this._hoveredNode){
+ this.onUnhover(this._hoveredNode);
+ this._hoveredNode = null;
+ }
+ if(this._isDragging){
+ this._cancelDrag = (new Date()).getTime() + 1000; // cancel in 1 second if no _onMouseOver fires
+ }
+ },
+
+ _onMouseOver: function(/*Event*/ evt, /*DomNode*/ target){
+ if(this._cancelDrag){
+ var time = (new Date()).getTime();
+ if(time > this._cancelDrag){
+ this._isDragging = false;
+ }
+ this._cancelDrag = null;
+ }
+ this._hoveredNode = target;
+ this.onHover(target);
+ if(this._isDragging){
+ this._setSelectedAttr(target);
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/_RadioButtonMixin.js b/lib/dijit/form/_RadioButtonMixin.js
index a444f3bd1..2ad5e12c9 100644
--- a/lib/dijit/form/_RadioButtonMixin.js
+++ b/lib/dijit/form/_RadioButtonMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_RadioButtonMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/lang","dojo/query","dojo/_base/window","../registry"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _2("dijit.form._RadioButtonMixin",null,{type:"radio",_getRelatedWidgets:function(){var _9=[];_6("input[type=radio]",this.focusNode.form||_7.doc).forEach(_5.hitch(this,function(_a){if(_a.name==this.name&&_a.form==this.focusNode.form){var _b=_8.getEnclosingWidget(_a);if(_b){_9.push(_b);}}}));return _9;},_setCheckedAttr:function(_c){this.inherited(arguments);if(!this._created){return;}if(_c){_1.forEach(this._getRelatedWidgets(),_5.hitch(this,function(_d){if(_d!=this&&_d.checked){_d.set("checked",false);}}));}},_onClick:function(e){if(this.checked||this.disabled){_4.stop(e);return false;}if(this.readOnly){_4.stop(e);_1.forEach(this._getRelatedWidgets(),_5.hitch(this,function(_e){_3.set(this.focusNode||this.domNode,"checked",_e.checked);}));return false;}return this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/form/_RadioButtonMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/lang","dojo/query","../registry"],function(_1,_2,_3,_4,_5,_6,_7){return _2("dijit.form._RadioButtonMixin",null,{type:"radio",_getRelatedWidgets:function(){var _8=[];_6("input[type=radio]",this.focusNode.form||this.ownerDocument).forEach(_5.hitch(this,function(_9){if(_9.name==this.name&&_9.form==this.focusNode.form){var _a=_7.getEnclosingWidget(_9);if(_a){_8.push(_a);}}}));return _8;},_setCheckedAttr:function(_b){this.inherited(arguments);if(!this._created){return;}if(_b){_1.forEach(this._getRelatedWidgets(),_5.hitch(this,function(_c){if(_c!=this&&_c.checked){_c.set("checked",false);}}));}},_getSubmitValue:function(_d){return _d===null?"on":_d;},_onClick:function(e){if(this.checked||this.disabled){_4.stop(e);return false;}if(this.readOnly){_4.stop(e);_1.forEach(this._getRelatedWidgets(),_5.hitch(this,function(_e){_3.set(this.focusNode||this.domNode,"checked",_e.checked);}));return false;}return this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js
new file mode 100644
index 000000000..757d843ac
--- /dev/null
+++ b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js
@@ -0,0 +1,71 @@
+define("dijit/form/_RadioButtonMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/event", // event.stop
+ "dojo/_base/lang", // lang.hitch
+ "dojo/query", // query
+ "../registry" // registry.getEnclosingWidget
+], function(array, declare, domAttr, event, lang, query, registry){
+
+ // module:
+ // dijit/form/_RadioButtonMixin
+
+ return declare("dijit.form._RadioButtonMixin", null, {
+ // summary:
+ // Mixin to provide widget functionality for an HTML radio button
+
+ // type: [private] String
+ // type attribute on `<input>` node.
+ // Users should not change this value.
+ type: "radio",
+
+ _getRelatedWidgets: function(){
+ // Private function needed to help iterate over all radio buttons in a group.
+ var ary = [];
+ query("input[type=radio]", this.focusNode.form || this.ownerDocument).forEach( // can't use name= since query doesn't support [] in the name
+ lang.hitch(this, function(inputNode){
+ if(inputNode.name == this.name && inputNode.form == this.focusNode.form){
+ var widget = registry.getEnclosingWidget(inputNode);
+ if(widget){
+ ary.push(widget);
+ }
+ }
+ })
+ );
+ return ary;
+ },
+
+ _setCheckedAttr: function(/*Boolean*/ value){
+ // If I am being checked then have to deselect currently checked radio button
+ this.inherited(arguments);
+ if(!this._created){ return; }
+ if(value){
+ array.forEach(this._getRelatedWidgets(), lang.hitch(this, function(widget){
+ if(widget != this && widget.checked){
+ widget.set('checked', false);
+ }
+ }));
+ }
+ },
+
+ _getSubmitValue: function(/*String*/ value){
+ return value === null ? "on" : value;
+ },
+
+ _onClick: function(/*Event*/ e){
+ if(this.checked || this.disabled){ // nothing to do
+ event.stop(e);
+ return false;
+ }
+ if(this.readOnly){ // ignored by some browsers so we have to resync the DOM elements with widget values
+ event.stop(e);
+ array.forEach(this._getRelatedWidgets(), lang.hitch(this, function(widget){
+ domAttr.set(this.focusNode || this.domNode, 'checked', widget.checked);
+ }));
+ return false;
+ }
+ return this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/form/_SearchMixin.js b/lib/dijit/form/_SearchMixin.js
new file mode 100644
index 000000000..0922a990a
--- /dev/null
+++ b/lib/dijit/form/_SearchMixin.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/_SearchMixin",["dojo/data/util/filter","dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/query","dojo/sniff","dojo/string","dojo/when","../registry"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _2("dijit.form._SearchMixin",null,{pageSize:Infinity,store:null,fetchProperties:{},query:{},searchDelay:200,searchAttr:"name",queryExpr:"${0}*",ignoreCase:true,_abortQuery:function(){if(this.searchTimer){this.searchTimer=this.searchTimer.remove();}if(this._queryDeferHandle){this._queryDeferHandle=this._queryDeferHandle.remove();}if(this._fetchHandle){if(this._fetchHandle.abort){this._cancelingQuery=true;this._fetchHandle.abort();this._cancelingQuery=false;}if(this._fetchHandle.cancel){this._cancelingQuery=true;this._fetchHandle.cancel();this._cancelingQuery=false;}this._fetchHandle=null;}},_processInput:function(_b){if(this.disabled||this.readOnly){return;}var _c=_b.charOrCode;if(_b.altKey||((_b.ctrlKey||_b.metaKey)&&(_c!="x"&&_c!="v"))||_c==_4.SHIFT){return;}var _d=false;this._prev_key_backspace=false;switch(_c){case _4.DELETE:case _4.BACKSPACE:this._prev_key_backspace=true;this._maskValidSubsetError=true;_d=true;break;default:_d=typeof _c=="string"||_c==229;}if(_d){if(!this.store){this.onSearch();}else{this.searchTimer=this.defer("_startSearchFromInput",1);}}},onSearch:function(){},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_startSearch:function(_e){this._abortQuery();var _f=this,_6=_5.clone(this.query),_10={start:0,count:this.pageSize,queryOptions:{ignoreCase:this.ignoreCase,deep:true}},qs=_8.substitute(this.queryExpr,[_e]),q,_11=function(){var _12=_f._fetchHandle=_f.store.query(_6,_10);if(_f.disabled||_f.readOnly||(q!==_f._lastQuery)){return;}_9(_12,function(res){_f._fetchHandle=null;if(!_f.disabled&&!_f.readOnly&&(q===_f._lastQuery)){_9(_12.total,function(_13){res.total=_13;var _14=_f.pageSize;if(isNaN(_14)||_14>res.total){_14=res.total;}res.nextPage=function(_15){_10.direction=_15=_15!==false;_10.count=_14;if(_15){_10.start+=res.length;if(_10.start>=res.total){_10.count=0;}}else{_10.start-=_14;if(_10.start<0){_10.count=Math.max(_14+_10.start,0);_10.start=0;}}if(_10.count<=0){res.length=0;_f.onSearch(res,_6,_10);}else{_11();}};_f.onSearch(res,_6,_10);});}},function(err){_f._fetchHandle=null;if(!_f._cancelingQuery){console.error(_f.declaredClass+" "+err.toString());}});};_5.mixin(_10,this.fetchProperties);if(this.store._oldAPI){q=qs;}else{q=_1.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_6[this.searchAttr]=q;this._queryDeferHandle=this.defer(_11,this.searchDelay);},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _16=this.list;if(_16){this.store=_a.byId(_16);}}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_SearchMixin.js.uncompressed.js b/lib/dijit/form/_SearchMixin.js.uncompressed.js
new file mode 100644
index 000000000..9cd69fcf7
--- /dev/null
+++ b/lib/dijit/form/_SearchMixin.js.uncompressed.js
@@ -0,0 +1,264 @@
+define("dijit/form/_SearchMixin", [
+ "dojo/data/util/filter", // patternToRegExp
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.clone lang.hitch
+ "dojo/query", // query
+ "dojo/sniff", // has("ie")
+ "dojo/string", // string.substitute
+ "dojo/when",
+ "../registry" // registry.byId
+], function(filter, declare, event, keys, lang, query, has, string, when, registry){
+
+ // module:
+ // dijit/form/_SearchMixin
+
+
+ return declare("dijit.form._SearchMixin", null, {
+ // summary:
+ // A mixin that implements the base functionality to search a store based upon user-entered text such as
+ // with `dijit/form/ComboBox` or `dijit/form/FilteringSelect`
+ // tags:
+ // protected
+
+ // pageSize: Integer
+ // Argument to data provider.
+ // Specifies maximum number of search results to return per query
+ pageSize: Infinity,
+
+ // store: [const] dojo/store/api/Store
+ // Reference to data provider object used by this ComboBox.
+ // The store must accept an object hash of properties for its query. See `query` and `queryExpr` for details.
+ store: null,
+
+ // fetchProperties: Object
+ // Mixin to the store's fetch.
+ // For example, to set the sort order of the ComboBox menu, pass:
+ // | { sort: [{attribute:"name",descending: true}] }
+ // To override the default queryOptions so that deep=false, do:
+ // | { queryOptions: {ignoreCase: true, deep: false} }
+ fetchProperties:{},
+
+ // query: Object
+ // A query that can be passed to `store` to initially filter the items.
+ // ComboBox overwrites any reference to the `searchAttr` and sets it to the `queryExpr` with the user's input substituted.
+ query: {},
+
+ // searchDelay: Integer
+ // Delay in milliseconds between when user types something and we start
+ // searching based on that value
+ searchDelay: 200,
+
+ // searchAttr: String
+ // Search for items in the data store where this attribute (in the item)
+ // matches what the user typed
+ searchAttr: "name",
+
+ // queryExpr: String
+ // This specifies what query is sent to the data store,
+ // based on what the user has typed. Changing this expression will modify
+ // whether the results are only exact matches, a "starting with" match,
+ // etc.
+ // dojo.data query expression pattern.
+ // `${0}` will be substituted for the user text.
+ // `*` is used for wildcards.
+ // `${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is"
+ queryExpr: "${0}*",
+
+ // ignoreCase: Boolean
+ // Set true if the query should ignore case when matching possible items
+ ignoreCase: true,
+
+ _abortQuery: function(){
+ // stop in-progress query
+ if(this.searchTimer){
+ this.searchTimer = this.searchTimer.remove();
+ }
+ if(this._queryDeferHandle){
+ this._queryDeferHandle = this._queryDeferHandle.remove();
+ }
+ if(this._fetchHandle){
+ if(this._fetchHandle.abort){
+ this._cancelingQuery = true;
+ this._fetchHandle.abort();
+ this._cancelingQuery = false;
+ }
+ if(this._fetchHandle.cancel){
+ this._cancelingQuery = true;
+ this._fetchHandle.cancel();
+ this._cancelingQuery = false;
+ }
+ this._fetchHandle = null;
+ }
+ },
+
+ _processInput: function(/*Event*/ evt){
+ // summary:
+ // Handles input (keyboard/paste) events
+ if(this.disabled || this.readOnly){ return; }
+ var key = evt.charOrCode;
+
+ // except for cutting/pasting case - ctrl + x/v
+ if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == keys.SHIFT){
+ return; // throw out weird key combinations and spurious events
+ }
+
+ var doSearch = false;
+ this._prev_key_backspace = false;
+
+ switch(key){
+ case keys.DELETE:
+ case keys.BACKSPACE:
+ this._prev_key_backspace = true;
+ this._maskValidSubsetError = true;
+ doSearch = true;
+ break;
+
+ default:
+ // Non char keys (F1-F12 etc..) shouldn't start a search..
+ // Ascii characters and IME input (Chinese, Japanese etc.) should.
+ //IME input produces keycode == 229.
+ doSearch = typeof key == 'string' || key == 229;
+ }
+ if(doSearch){
+ // need to wait a tad before start search so that the event
+ // bubbles through DOM and we have value visible
+ if(!this.store){
+ this.onSearch();
+ }else{
+ this.searchTimer = this.defer("_startSearchFromInput", 1);
+ }
+ }
+ },
+
+ onSearch: function(/*===== results, query, options =====*/){
+ // summary:
+ // Callback when a search completes.
+ //
+ // results: Object
+ // An array of items from the originating _SearchMixin's store.
+ //
+ // query: Object
+ // A copy of the originating _SearchMixin's query property.
+ //
+ // options: Object
+ // The additional parameters sent to the originating _SearchMixin's store, including: start, count, queryOptions.
+ //
+ // tags:
+ // callback
+ },
+
+ _startSearchFromInput: function(){
+ this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
+ },
+
+ _startSearch: function(/*String*/ text){
+ // summary:
+ // Starts a search for elements matching text (text=="" means to return all items),
+ // and calls onSearch(...) when the search completes, to display the results.
+
+ this._abortQuery();
+ var
+ _this = this,
+ // Setup parameters to be passed to store.query().
+ // Create a new query to prevent accidentally querying for a hidden
+ // value from FilteringSelect's keyField
+ query = lang.clone(this.query), // #5970
+ options = {
+ start: 0,
+ count: this.pageSize,
+ queryOptions: { // remove for 2.0
+ ignoreCase: this.ignoreCase,
+ deep: true
+ }
+ },
+ qs = string.substitute(this.queryExpr, [text]),
+ q,
+ startQuery = function(){
+ var resPromise = _this._fetchHandle = _this.store.query(query, options);
+ if(_this.disabled || _this.readOnly || (q !== _this._lastQuery)){
+ return;
+ } // avoid getting unwanted notify
+ when(resPromise, function(res){
+ _this._fetchHandle = null;
+ if(!_this.disabled && !_this.readOnly && (q === _this._lastQuery)){ // avoid getting unwanted notify
+ when(resPromise.total, function(total){
+ res.total = total;
+ var pageSize = _this.pageSize;
+ if(isNaN(pageSize) || pageSize > res.total){ pageSize = res.total; }
+ // Setup method to fetching the next page of results
+ res.nextPage = function(direction){
+ // tell callback the direction of the paging so the screen
+ // reader knows which menu option to shout
+ options.direction = direction = direction !== false;
+ options.count = pageSize;
+ if(direction){
+ options.start += res.length;
+ if(options.start >= res.total){
+ options.count = 0;
+ }
+ }else{
+ options.start -= pageSize;
+ if(options.start < 0){
+ options.count = Math.max(pageSize + options.start, 0);
+ options.start = 0;
+ }
+ }
+ if(options.count <= 0){
+ res.length = 0;
+ _this.onSearch(res, query, options);
+ }else{
+ startQuery();
+ }
+ };
+ _this.onSearch(res, query, options);
+ });
+ }
+ }, function(err){
+ _this._fetchHandle = null;
+ if(!_this._cancelingQuery){ // don't treat canceled query as an error
+ console.error(_this.declaredClass + ' ' + err.toString());
+ }
+ });
+ };
+
+ lang.mixin(options, this.fetchProperties);
+
+ // Generate query
+ if(this.store._oldAPI){
+ // remove this branch for 2.0
+ q = qs;
+ }else{
+ // Query on searchAttr is a regex for benefit of dojo/store/Memory,
+ // but with a toString() method to help dojo/store/JsonRest.
+ // Search string like "Co*" converted to regex like /^Co.*$/i.
+ q = filter.patternToRegExp(qs, this.ignoreCase);
+ q.toString = function(){ return qs; };
+ }
+
+ // set _lastQuery, *then* start the timeout
+ // otherwise, if the user types and the last query returns before the timeout,
+ // _lastQuery won't be set and their input gets rewritten
+ this._lastQuery = query[this.searchAttr] = q;
+ this._queryDeferHandle = this.defer(startQuery, this.searchDelay);
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(){
+ this.query={};
+ this.fetchProperties={};
+ },
+
+ postMixInProperties: function(){
+ if(!this.store){
+ var list = this.list;
+ if(list){
+ this.store = registry.byId(list);
+ }
+ }
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/form/_Spinner.js b/lib/dijit/form/_Spinner.js
index 10c6e14a2..74b511f5d 100644
--- a/lib/dijit/form/_Spinner.js
+++ b/lib/dijit/form/_Spinner.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/form/templates/Spinner.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdata-dojo-attach-point=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"&#9650;\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdata-dojo-attach-point=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"&#9660;\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935;\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' data-dojo-attach-point=\"textbox,focusNode\" type=\"${type}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"}});define("dijit/form/_Spinner",["dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dijit/typematic","./RangeBoundTextBox","dojo/text!./templates/Spinner.html","./_TextBoxMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _1("dijit.form._Spinner",_7,{defaultTimeout:500,minimumTimeout:10,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:_8,baseClass:"dijitTextBox dijitSpinner",cssStateNodes:{"upArrowNode":"dijitUpArrowButton","downArrowNode":"dijitDownArrowButton"},adjust:function(_a){return _a;},_arrowPressed:function(_b,_c,_d){if(this.disabled||this.readOnly){return;}this._setValueAttr(this.adjust(this.get("value"),_c*_d),false);_9.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(){this._wheelTimer=null;},_typematicCallback:function(_e,_f,evt){var inc=this.smallDelta;if(_f==this.textbox){var key=evt.charOrCode;inc=(key==_3.PAGE_UP||key==_3.PAGE_DOWN)?this.largeDelta:this.smallDelta;_f=(key==_3.UP_ARROW||key==_3.PAGE_UP)?this.upArrowNode:this.downArrowNode;}if(_e==-1){this._arrowReleased(_f);}else{this._arrowPressed(_f,(_f==this.upArrowNode)?1:-1,inc);}},_wheelTimer:null,_mouseWheeled:function(evt){_2.stop(evt);var _10=evt.wheelDelta/120;if(Math.floor(_10)!=_10){_10=evt.wheelDelta>0?1:-1;}var _11=evt.detail?(evt.detail*-1):_10;if(_11!==0){var _12=this[(_11>0?"upArrowNode":"downArrowNode")];this._arrowPressed(_12,_11,this.smallDelta);if(!this._wheelTimer){clearTimeout(this._wheelTimer);}this._wheelTimer=setTimeout(_4.hitch(this,"_arrowReleased",_12),50);}},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,!_5("mozilla")?"onmousewheel":"DOMMouseScroll","_mouseWheeled");this._connects.push(_6.addListener(this.upArrowNode,this.textbox,{charOrCode:_3.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));this._connects.push(_6.addListener(this.downArrowNode,this.textbox,{charOrCode:_3.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));this._connects.push(_6.addListener(this.upArrowNode,this.textbox,{charOrCode:_3.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));this._connects.push(_6.addListener(this.downArrowNode,this.textbox,{charOrCode:_3.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));}});}); \ No newline at end of file
+require({cache:{"url:dijit/form/templates/Spinner.html":"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdata-dojo-attach-point=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"&#9650; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdata-dojo-attach-point=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' data-dojo-attach-point=\"textbox,focusNode\" type=\"${type}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"}});define("dijit/form/_Spinner",["dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/mouse","../typematic","./RangeBoundTextBox","dojo/text!./templates/Spinner.html","./_TextBoxMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _1("dijit.form._Spinner",_8,{defaultTimeout:500,minimumTimeout:10,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:_9,baseClass:"dijitTextBox dijitSpinner",cssStateNodes:{"upArrowNode":"dijitUpArrowButton","downArrowNode":"dijitDownArrowButton"},adjust:function(_b){return _b;},_arrowPressed:function(_c,_d,_e){if(this.disabled||this.readOnly){return;}this._setValueAttr(this.adjust(this.get("value"),_d*_e),false);_a.selectInputText(this.textbox,this.textbox.value.length);},_arrowReleased:function(){this._wheelTimer=null;},_typematicCallback:function(_f,_10,evt){var inc=this.smallDelta;if(_10==this.textbox){var key=evt.charOrCode;inc=(key==_3.PAGE_UP||key==_3.PAGE_DOWN)?this.largeDelta:this.smallDelta;_10=(key==_3.UP_ARROW||key==_3.PAGE_UP)?this.upArrowNode:this.downArrowNode;}if(_f==-1){this._arrowReleased(_10);}else{this._arrowPressed(_10,(_10==this.upArrowNode)?1:-1,inc);}},_wheelTimer:null,_mouseWheeled:function(evt){_2.stop(evt);var _11=evt.wheelDelta/120;if(Math.floor(_11)!=_11){_11=evt.wheelDelta>0?1:-1;}var _12=evt.detail?(evt.detail*-1):_11;if(_12!==0){var _13=this[(_12>0?"upArrowNode":"downArrowNode")];this._arrowPressed(_13,_12,this.smallDelta);if(this._wheelTimer){this._wheelTimer.remove();}this._wheelTimer=this.defer(function(){this._arrowReleased(_13);},50);}},_setConstraintsAttr:function(_14){this.inherited(arguments);if(this.focusNode){if(this.constraints.min!==undefined){this.focusNode.setAttribute("aria-valuemin",this.constraints.min);}else{this.focusNode.removeAttribute("aria-valuemin");}if(this.constraints.max!==undefined){this.focusNode.setAttribute("aria-valuemax",this.constraints.max);}else{this.focusNode.removeAttribute("aria-valuemax");}}},_setValueAttr:function(_15,_16){this.focusNode.setAttribute("aria-valuenow",_15);this.inherited(arguments);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,_6.wheel,"_mouseWheeled");this.own(_7.addListener(this.upArrowNode,this.textbox,{charOrCode:_3.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout),_7.addListener(this.downArrowNode,this.textbox,{charOrCode:_3.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout),_7.addListener(this.upArrowNode,this.textbox,{charOrCode:_3.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout),_7.addListener(this.downArrowNode,this.textbox,{charOrCode:_3.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout,this.minimumTimeout));}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_Spinner.js.uncompressed.js b/lib/dijit/form/_Spinner.js.uncompressed.js
new file mode 100644
index 000000000..d4c6bc9df
--- /dev/null
+++ b/lib/dijit/form/_Spinner.js.uncompressed.js
@@ -0,0 +1,160 @@
+require({cache:{
+'url:dijit/form/templates/Spinner.html':"<div class=\"dijit dijitReset dijitInline dijitLeft\"\n\tid=\"widget_${id}\" role=\"presentation\"\n\t><div class=\"dijitReset dijitButtonNode dijitSpinnerButtonContainer\"\n\t\t><input class=\"dijitReset dijitInputField dijitSpinnerButtonInner\" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t/><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\tdata-dojo-attach-point=\"upArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"&#9650; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t\t><div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\tdata-dojo-attach-point=\"downArrowNode\"\n\t\t\t><div class=\"dijitArrowButtonInner\"\n\t\t\t\t><input class=\"dijitReset dijitInputField\" value=\"&#9660; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t\t\t\t\t${_buttonInputDisabled}\n\t\t\t/></div\n\t\t></div\n\t></div\n\t><div class='dijitReset dijitValidationContainer'\n\t\t><input class=\"dijitReset dijitInputField dijitValidationIcon dijitValidationInner\" value=\"&#935; \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\n\t/></div\n\t><div class=\"dijitReset dijitInputField dijitInputContainer\"\n\t\t><input class='dijitReset dijitInputInner' data-dojo-attach-point=\"textbox,focusNode\" type=\"${type}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"}});
+define("dijit/form/_Spinner", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys keys.DOWN_ARROW keys.PAGE_DOWN keys.PAGE_UP keys.UP_ARROW
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("mozilla")
+ "dojo/mouse", // mouse.wheel
+ "../typematic",
+ "./RangeBoundTextBox",
+ "dojo/text!./templates/Spinner.html",
+ "./_TextBoxMixin" // selectInputText
+], function(declare, event, keys, lang, has, mouse, typematic, RangeBoundTextBox, template, _TextBoxMixin){
+
+ // module:
+ // dijit/form/_Spinner
+
+ return declare("dijit.form._Spinner", RangeBoundTextBox, {
+ // summary:
+ // Mixin for validation widgets with a spinner.
+ // description:
+ // This class basically (conceptually) extends `dijit/form/ValidationTextBox`.
+ // It modifies the template to have up/down arrows, and provides related handling code.
+
+ // defaultTimeout: Number
+ // Number of milliseconds before a held arrow key or up/down button becomes typematic
+ defaultTimeout: 500,
+
+ // minimumTimeout: Number
+ // minimum number of milliseconds that typematic event fires when held key or button is held
+ minimumTimeout: 10,
+
+ // timeoutChangeRate: Number
+ // Fraction of time used to change the typematic timer between events.
+ // 1.0 means that each typematic event fires at defaultTimeout intervals.
+ // Less than 1.0 means that each typematic event fires at an increasing faster rate.
+ timeoutChangeRate: 0.90,
+
+ // smallDelta: Number
+ // Adjust the value by this much when spinning using the arrow keys/buttons
+ smallDelta: 1,
+
+ // largeDelta: Number
+ // Adjust the value by this much when spinning using the PgUp/Dn keys
+ largeDelta: 10,
+
+ templateString: template,
+
+ baseClass: "dijitTextBox dijitSpinner",
+
+ // Set classes like dijitUpArrowButtonHover or dijitDownArrowButtonActive depending on
+ // mouse action over specified node
+ cssStateNodes: {
+ "upArrowNode": "dijitUpArrowButton",
+ "downArrowNode": "dijitDownArrowButton"
+ },
+
+ adjust: function(val /*=====, delta =====*/){
+ // summary:
+ // Overridable function used to adjust a primitive value(Number/Date/...) by the delta amount specified.
+ // The val is adjusted in a way that makes sense to the object type.
+ // val: Object
+ // delta: Number
+ // tags:
+ // protected extension
+ return val;
+ },
+
+ _arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction, /*Number*/ increment){
+ // summary:
+ // Handler for arrow button or arrow key being pressed
+ if(this.disabled || this.readOnly){ return; }
+ this._setValueAttr(this.adjust(this.get('value'), direction*increment), false);
+ _TextBoxMixin.selectInputText(this.textbox, this.textbox.value.length);
+ },
+
+ _arrowReleased: function(/*Node*/ /*===== node =====*/){
+ // summary:
+ // Handler for arrow button or arrow key being released
+ this._wheelTimer = null;
+ },
+
+ _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
+ var inc=this.smallDelta;
+ if(node == this.textbox){
+ var key = evt.charOrCode;
+ inc = (key == keys.PAGE_UP || key == keys.PAGE_DOWN) ? this.largeDelta : this.smallDelta;
+ node = (key == keys.UP_ARROW || key == keys.PAGE_UP) ? this.upArrowNode : this.downArrowNode;
+ }
+ if(count == -1){ this._arrowReleased(node); }
+ else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1, inc); }
+ },
+
+ _wheelTimer: null,
+ _mouseWheeled: function(/*Event*/ evt){
+ // summary:
+ // Mouse wheel listener where supported
+
+ event.stop(evt);
+ // FIXME: Safari bubbles
+
+ // be nice to DOH and scroll as much as the event says to
+ var wheelDelta = evt.wheelDelta / 120;
+ if(Math.floor(wheelDelta) != wheelDelta){
+ // If not an int multiple of 120, then its touchpad scrolling.
+ // This can change very fast so just assume 1 wheel click to make it more manageable.
+ wheelDelta = evt.wheelDelta > 0 ? 1 : -1;
+ }
+ var scrollAmount = evt.detail ? (evt.detail * -1) : wheelDelta;
+ if(scrollAmount !== 0){
+ var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )];
+
+ this._arrowPressed(node, scrollAmount, this.smallDelta);
+
+ if(this._wheelTimer){
+ this._wheelTimer.remove();
+ }
+ this._wheelTimer = this.defer(function(){ this._arrowReleased(node); }, 50);
+ }
+ },
+
+ _setConstraintsAttr: function(/*Object*/ constraints){
+ this.inherited(arguments);
+ if(this.focusNode){ // not set when called from postMixInProperties
+ if(this.constraints.min !== undefined){
+ this.focusNode.setAttribute("aria-valuemin", this.constraints.min);
+ }else{
+ this.focusNode.removeAttribute("aria-valuemin");
+ }
+ if(this.constraints.max !== undefined){
+ this.focusNode.setAttribute("aria-valuemax", this.constraints.max);
+ }else{
+ this.focusNode.removeAttribute("aria-valuemax");
+ }
+ }
+ },
+
+ _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
+ // summary:
+ // Hook so set('value', ...) works.
+
+ this.focusNode.setAttribute("aria-valuenow", value);
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // extra listeners
+ this.connect(this.domNode, mouse.wheel, "_mouseWheeled");
+ this.own(
+ typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout),
+ typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout),
+ typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout),
+ typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout)
+ );
+ }
+ });
+});
diff --git a/lib/dijit/form/_TextBoxMixin.js b/lib/dijit/form/_TextBoxMixin.js
index 133074972..2b0b43de9 100644
--- a/lib/dijit/form/_TextBoxMixin.js
+++ b/lib/dijit/form/_TextBoxMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_TextBoxMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/_base/event","dojo/keys","dojo/_base/lang",".."],function(_1,_2,_3,_4,_5,_6,_7){var _8=_2("dijit.form._TextBoxMixin",null,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,placeHolder:"",_getValueAttr:function(){return this.parse(this.get("displayedValue"),this.constraints);},_setValueAttr:function(_9,_a,_b){var _c;if(_9!==undefined){_c=this.filter(_9);if(typeof _b!="string"){if(_c!==null&&((typeof _c!="number")||!isNaN(_c))){_b=this.filter(this.format(_c,this.constraints));}else{_b="";}}}if(_b!=null&&_b!=undefined&&((typeof _b)!="number"||!isNaN(_b))&&this.textbox.value!=_b){this.textbox.value=_b;this._set("displayedValue",this.get("displayedValue"));}if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_b);}this.inherited(arguments,[_c,_a]);},displayedValue:"",_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},_setDisplayedValueAttr:function(_d){if(_d===null||_d===undefined){_d="";}else{if(typeof _d!="string"){_d=String(_d);}}this.textbox.value=_d;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_d);}},format:function(_e){return ((_e==null||_e==undefined)?"":(_e.toString?_e.toString():_e));},parse:function(_f){return _f;},_refreshState:function(){},onInput:function(){},__skipInputEvent:false,_onInput:function(){if(this.textDir=="auto"){this.applyTextDir(this.focusNode,this.focusNode.value);}this._refreshState();this._set("displayedValue",this.get("displayedValue"));},postCreate:function(){this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);var _10=function(e){var _11=e.charOrCode||e.keyCode||229;if(e.type=="keydown"){switch(_11){case _5.SHIFT:case _5.ALT:case _5.CTRL:case _5.META:case _5.CAPS_LOCK:return;default:if(_11>=65&&_11<=90){return;}}}if(e.type=="keypress"&&typeof _11!="string"){return;}if(e.type=="input"){if(this.__skipInputEvent){this.__skipInputEvent=false;return;}}else{this.__skipInputEvent=true;}var _12=_6.mixin({},e,{charOrCode:_11,wasConsumed:false,preventDefault:function(){_12.wasConsumed=true;e.preventDefault();},stopPropagation:function(){e.stopPropagation();}});if(this.onInput(_12)===false){_4.stop(_12);}if(_12.wasConsumed){return;}setTimeout(_6.hitch(this,"_onInput",_12),0);};_1.forEach(["onkeydown","onkeypress","onpaste","oncut","oninput","oncompositionend"],function(_13){this.connect(this.textbox,_13,_10);},this);},_blankValue:"",filter:function(val){if(val===null){return this._blankValue;}if(typeof val!="string"){return val;}if(this.trim){val=_6.trim(val);}if(this.uppercase){val=val.toUpperCase();}if(this.lowercase){val=val.toLowerCase();}if(this.propercase){val=val.replace(/[^\s]+/g,function(_14){return _14.substring(0,1).toUpperCase()+_14.substring(1);});}return val;},_setBlurValue:function(){this._setValueAttr(this.get("value"),true);},_onBlur:function(e){if(this.disabled){return;}this._setBlurValue();this.inherited(arguments);if(this._selectOnClickHandle){this.disconnect(this._selectOnClickHandle);}},_isTextSelected:function(){return this.textbox.selectionStart==this.textbox.selectionEnd;},_onFocus:function(by){if(this.disabled||this.readOnly){return;}if(this.selectOnClick&&by=="mouse"){this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){this.disconnect(this._selectOnClickHandle);if(this._isTextSelected()){_8.selectInputText(this.textbox);}});}this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);},_setTextDirAttr:function(_15){if(!this._created||this.textDir!=_15){this._set("textDir",_15);this.applyTextDir(this.focusNode,this.focusNode.value);}}});_8._setSelectionRange=_7._setSelectionRange=function(_16,_17,_18){if(_16.setSelectionRange){_16.setSelectionRange(_17,_18);}};_8.selectInputText=_7.selectInputText=function(_19,_1a,_1b){_19=_3.byId(_19);if(isNaN(_1a)){_1a=0;}if(isNaN(_1b)){_1b=_19.value?_19.value.length:0;}try{_19.focus();_8._setSelectionRange(_19,_1a,_1b);}catch(e){}};return _8;}); \ No newline at end of file
+define("dijit/form/_TextBoxMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","../main"],function(_1,_2,_3,_4,_5,_6,on,_7){var _8=_2("dijit.form._TextBoxMixin",null,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,placeHolder:"",_getValueAttr:function(){return this.parse(this.get("displayedValue"),this.constraints);},_setValueAttr:function(_9,_a,_b){var _c;if(_9!==undefined){_c=this.filter(_9);if(typeof _b!="string"){if(_c!==null&&((typeof _c!="number")||!isNaN(_c))){_b=this.filter(this.format(_c,this.constraints));}else{_b="";}}}if(_b!=null&&((typeof _b)!="number"||!isNaN(_b))&&this.textbox.value!=_b){this.textbox.value=_b;this._set("displayedValue",this.get("displayedValue"));}if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_b);}this.inherited(arguments,[_c,_a]);},displayedValue:"",_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},_setDisplayedValueAttr:function(_d){if(_d==null){_d="";}else{if(typeof _d!="string"){_d=String(_d);}}this.textbox.value=_d;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_d);}},format:function(_e){return _e==null?"":(_e.toString?_e.toString():_e);},parse:function(_f){return _f;},_refreshState:function(){},onInput:function(){},__skipInputEvent:false,_onInput:function(evt){if(this.textDir=="auto"){this.applyTextDir(this.focusNode,this.focusNode.value);}this._processInput(evt);},_processInput:function(evt){this._refreshState();this._set("displayedValue",this.get("displayedValue"));},postCreate:function(){this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);var _10=function(e){var _11;if(e.type=="keydown"){_11=e.keyCode;switch(_11){case _5.SHIFT:case _5.ALT:case _5.CTRL:case _5.META:case _5.CAPS_LOCK:case _5.NUM_LOCK:case _5.SCROLL_LOCK:return;}if(!e.ctrlKey&&!e.metaKey&&!e.altKey){switch(_11){case _5.NUMPAD_0:case _5.NUMPAD_1:case _5.NUMPAD_2:case _5.NUMPAD_3:case _5.NUMPAD_4:case _5.NUMPAD_5:case _5.NUMPAD_6:case _5.NUMPAD_7:case _5.NUMPAD_8:case _5.NUMPAD_9:case _5.NUMPAD_MULTIPLY:case _5.NUMPAD_PLUS:case _5.NUMPAD_ENTER:case _5.NUMPAD_MINUS:case _5.NUMPAD_PERIOD:case _5.NUMPAD_DIVIDE:return;}if((_11>=65&&_11<=90)||(_11>=48&&_11<=57)||_11==_5.SPACE){return;}var _12=false;for(var i in _5){if(_5[i]===e.keyCode){_12=true;break;}}if(!_12){return;}}}_11=e.charCode>=32?String.fromCharCode(e.charCode):e.charCode;if(!_11){_11=(e.keyCode>=65&&e.keyCode<=90)||(e.keyCode>=48&&e.keyCode<=57)||e.keyCode==_5.SPACE?String.fromCharCode(e.keyCode):e.keyCode;}if(!_11){_11=229;}if(e.type=="keypress"){if(typeof _11!="string"){return;}if((_11>="a"&&_11<="z")||(_11>="A"&&_11<="Z")||(_11>="0"&&_11<="9")||(_11===" ")){if(e.ctrlKey||e.metaKey||e.altKey){return;}}}if(e.type=="input"){if(this.__skipInputEvent){this.__skipInputEvent=false;return;}}else{this.__skipInputEvent=true;}var _13={faux:true},_14;for(_14 in e){if(_14!="layerX"&&_14!="layerY"){var v=e[_14];if(typeof v!="function"&&typeof v!="undefined"){_13[_14]=v;}}}_6.mixin(_13,{charOrCode:_11,_wasConsumed:false,preventDefault:function(){_13._wasConsumed=true;e.preventDefault();},stopPropagation:function(){e.stopPropagation();}});if(this.onInput(_13)===false){_13.preventDefault();_13.stopPropagation();}if(_13._wasConsumed){return;}this.defer(function(){this._onInput(_13);});};this.own(on(this.textbox,"keydown, keypress, paste, cut, input, compositionend",_6.hitch(this,_10)));},_blankValue:"",filter:function(val){if(val===null){return this._blankValue;}if(typeof val!="string"){return val;}if(this.trim){val=_6.trim(val);}if(this.uppercase){val=val.toUpperCase();}if(this.lowercase){val=val.toLowerCase();}if(this.propercase){val=val.replace(/[^\s]+/g,function(_15){return _15.substring(0,1).toUpperCase()+_15.substring(1);});}return val;},_setBlurValue:function(){this._setValueAttr(this.get("value"),true);},_onBlur:function(e){if(this.disabled){return;}this._setBlurValue();this.inherited(arguments);},_isTextSelected:function(){return this.textbox.selectionStart!=this.textbox.selectionEnd;},_onFocus:function(by){if(this.disabled||this.readOnly){return;}if(this.selectOnClick&&by=="mouse"){this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){this.disconnect(this._selectOnClickHandle);this._selectOnClickHandle=null;if(!this._isTextSelected()){_8.selectInputText(this.textbox);}});this.defer(function(){if(this._selectOnClickHandle){this.disconnect(this._selectOnClickHandle);this._selectOnClickHandle=null;}},500);}this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);},_setTextDirAttr:function(_16){if(!this._created||this.textDir!=_16){this._set("textDir",_16);this.applyTextDir(this.focusNode,this.focusNode.value);}}});_8._setSelectionRange=_7._setSelectionRange=function(_17,_18,_19){if(_17.setSelectionRange){_17.setSelectionRange(_18,_19);}};_8.selectInputText=_7.selectInputText=function(_1a,_1b,_1c){_1a=_3.byId(_1a);if(isNaN(_1b)){_1b=0;}if(isNaN(_1c)){_1c=_1a.value?_1a.value.length:0;}try{_1a.focus();_8._setSelectionRange(_1a,_1b,_1c);}catch(e){}};return _8;}); \ No newline at end of file
diff --git a/lib/dijit/form/_TextBoxMixin.js.uncompressed.js b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js
new file mode 100644
index 000000000..7c010bcb3
--- /dev/null
+++ b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js
@@ -0,0 +1,474 @@
+define("dijit/form/_TextBoxMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.byId
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys.ALT keys.CAPS_LOCK keys.CTRL keys.META keys.SHIFT
+ "dojo/_base/lang", // lang.mixin
+ "dojo/on", // on
+ "../main" // for exporting dijit._setSelectionRange, dijit.selectInputText
+], function(array, declare, dom, event, keys, lang, on, dijit){
+
+// module:
+// dijit/form/_TextBoxMixin
+
+var _TextBoxMixin = declare("dijit.form._TextBoxMixin", null, {
+ // summary:
+ // A mixin for textbox form input widgets
+
+ // trim: Boolean
+ // Removes leading and trailing whitespace if true. Default is false.
+ trim: false,
+
+ // uppercase: Boolean
+ // Converts all characters to uppercase if true. Default is false.
+ uppercase: false,
+
+ // lowercase: Boolean
+ // Converts all characters to lowercase if true. Default is false.
+ lowercase: false,
+
+ // propercase: Boolean
+ // Converts the first character of each word to uppercase if true.
+ propercase: false,
+
+ // maxLength: String
+ // HTML INPUT tag maxLength declaration.
+ maxLength: "",
+
+ // selectOnClick: [const] Boolean
+ // If true, all text will be selected when focused with mouse
+ selectOnClick: false,
+
+ // placeHolder: String
+ // Defines a hint to help users fill out the input field (as defined in HTML 5).
+ // This should only contain plain text (no html markup).
+ placeHolder: "",
+
+ _getValueAttr: function(){
+ // summary:
+ // Hook so get('value') works as we like.
+ // description:
+ // For `dijit/form/TextBox` this basically returns the value of the `<input>`.
+ //
+ // For `dijit/form/MappedTextBox` subclasses, which have both
+ // a "displayed value" and a separate "submit value",
+ // This treats the "displayed value" as the master value, computing the
+ // submit value from it via this.parse().
+ return this.parse(this.get('displayedValue'), this.constraints);
+ },
+
+ _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+ // summary:
+ // Hook so set('value', ...) works.
+ //
+ // description:
+ // Sets the value of the widget to "value" which can be of
+ // any type as determined by the widget.
+ //
+ // value:
+ // The visual element value is also set to a corresponding,
+ // but not necessarily the same, value.
+ //
+ // formattedValue:
+ // If specified, used to set the visual element value,
+ // otherwise a computed visual value is used.
+ //
+ // priorityChange:
+ // If true, an onChange event is fired immediately instead of
+ // waiting for the next blur event.
+
+ var filteredValue;
+ if(value !== undefined){
+ // TODO: this is calling filter() on both the display value and the actual value.
+ // I added a comment to the filter() definition about this, but it should be changed.
+ filteredValue = this.filter(value);
+ if(typeof formattedValue != "string"){
+ if(filteredValue !== null && ((typeof filteredValue != "number") || !isNaN(filteredValue))){
+ formattedValue = this.filter(this.format(filteredValue, this.constraints));
+ }else{ formattedValue = ''; }
+ }
+ }
+ if(formattedValue != null /* and !undefined */ && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){
+ this.textbox.value = formattedValue;
+ this._set("displayedValue", this.get("displayedValue"));
+ }
+
+ if(this.textDir == "auto"){
+ this.applyTextDir(this.focusNode, formattedValue);
+ }
+
+ this.inherited(arguments, [filteredValue, priorityChange]);
+ },
+
+ // displayedValue: String
+ // For subclasses like ComboBox where the displayed value
+ // (ex: Kentucky) and the serialized value (ex: KY) are different,
+ // this represents the displayed value.
+ //
+ // Setting 'displayedValue' through set('displayedValue', ...)
+ // updates 'value', and vice-versa. Otherwise 'value' is updated
+ // from 'displayedValue' periodically, like onBlur etc.
+ //
+ // TODO: move declaration to MappedTextBox?
+ // Problem is that ComboBox references displayedValue,
+ // for benefit of FilteringSelect.
+ displayedValue: "",
+
+ _getDisplayedValueAttr: function(){
+ // summary:
+ // Hook so get('displayedValue') works.
+ // description:
+ // Returns the displayed value (what the user sees on the screen),
+ // after filtering (ie, trimming spaces etc.).
+ //
+ // For some subclasses of TextBox (like ComboBox), the displayed value
+ // is different from the serialized value that's actually
+ // sent to the server (see `dijit/form/ValidationTextBox.serialize()`)
+
+ // TODO: maybe we should update this.displayedValue on every keystroke so that we don't need
+ // this method
+ // TODO: this isn't really the displayed value when the user is typing
+ return this.filter(this.textbox.value);
+ },
+
+ _setDisplayedValueAttr: function(/*String*/ value){
+ // summary:
+ // Hook so set('displayedValue', ...) works.
+ // description:
+ // Sets the value of the visual element to the string "value".
+ // The widget value is also set to a corresponding,
+ // but not necessarily the same, value.
+
+ if(value == null /* or undefined */){ value = '' }
+ else if(typeof value != "string"){ value = String(value) }
+
+ this.textbox.value = value;
+
+ // sets the serialized value to something corresponding to specified displayedValue
+ // (if possible), and also updates the textbox.value, for example converting "123"
+ // to "123.00"
+ this._setValueAttr(this.get('value'), undefined);
+
+ this._set("displayedValue", this.get('displayedValue'));
+
+ // textDir support
+ if(this.textDir == "auto"){
+ this.applyTextDir(this.focusNode, value);
+ }
+ },
+
+ format: function(value /*=====, constraints =====*/){
+ // summary:
+ // Replaceable function to convert a value to a properly formatted string.
+ // value: String
+ // constraints: Object
+ // tags:
+ // protected extension
+ return value == null /* or undefined */ ? "" : (value.toString ? value.toString() : value);
+ },
+
+ parse: function(value /*=====, constraints =====*/){
+ // summary:
+ // Replaceable function to convert a formatted string to a value
+ // value: String
+ // constraints: Object
+ // tags:
+ // protected extension
+
+ return value; // String
+ },
+
+ _refreshState: function(){
+ // summary:
+ // After the user types some characters, etc., this method is
+ // called to check the field for validity etc. The base method
+ // in `dijit/form/TextBox` does nothing, but subclasses override.
+ // tags:
+ // protected
+ },
+
+ /*=====
+ onInput: function(event){
+ // summary:
+ // Connect to this function to receive notifications of various user data-input events.
+ // Return false to cancel the event and prevent it from being processed.
+ // event:
+ // keydown | keypress | cut | paste | input
+ // tags:
+ // callback
+ },
+ =====*/
+ onInput: function(){},
+
+ __skipInputEvent: false,
+ _onInput: function(/*Event*/ evt){
+ // summary:
+ // Called AFTER the input event has happened
+
+ // set text direction according to textDir that was defined in creation
+ if(this.textDir == "auto"){
+ this.applyTextDir(this.focusNode, this.focusNode.value);
+ }
+
+ this._processInput(evt);
+ },
+
+ _processInput: function(/*Event*/ evt){
+ // summary:
+ // Default action handler for user input events
+
+ this._refreshState();
+
+ // In case someone is watch()'ing for changes to displayedValue
+ this._set("displayedValue", this.get("displayedValue"));
+ },
+
+ postCreate: function(){
+ // setting the value here is needed since value="" in the template causes "undefined"
+ // and setting in the DOM (instead of the JS object) helps with form reset actions
+ this.textbox.setAttribute("value", this.textbox.value); // DOM and JS values should be the same
+
+ this.inherited(arguments);
+
+ // normalize input events to reduce spurious event processing
+ // onkeydown: do not forward modifier keys
+ // set charOrCode to numeric keycode
+ // onkeypress: do not forward numeric charOrCode keys (already sent through onkeydown)
+ // onpaste & oncut: set charOrCode to 229 (IME)
+ // oninput: if primary event not already processed, set charOrCode to 229 (IME), else do not forward
+ var handleEvent = function(e){
+ var charOrCode;
+ if(e.type == "keydown"){
+ charOrCode = e.keyCode;
+ switch(charOrCode){ // ignore state keys
+ case keys.SHIFT:
+ case keys.ALT:
+ case keys.CTRL:
+ case keys.META:
+ case keys.CAPS_LOCK:
+ case keys.NUM_LOCK:
+ case keys.SCROLL_LOCK:
+ return;
+ }
+ if(!e.ctrlKey && !e.metaKey && !e.altKey){ // no modifiers
+ switch(charOrCode){ // ignore location keys
+ case keys.NUMPAD_0:
+ case keys.NUMPAD_1:
+ case keys.NUMPAD_2:
+ case keys.NUMPAD_3:
+ case keys.NUMPAD_4:
+ case keys.NUMPAD_5:
+ case keys.NUMPAD_6:
+ case keys.NUMPAD_7:
+ case keys.NUMPAD_8:
+ case keys.NUMPAD_9:
+ case keys.NUMPAD_MULTIPLY:
+ case keys.NUMPAD_PLUS:
+ case keys.NUMPAD_ENTER:
+ case keys.NUMPAD_MINUS:
+ case keys.NUMPAD_PERIOD:
+ case keys.NUMPAD_DIVIDE:
+ return;
+ }
+ if((charOrCode >= 65 && charOrCode <= 90) || (charOrCode >= 48 && charOrCode <= 57) || charOrCode == keys.SPACE){
+ return; // keypress will handle simple non-modified printable keys
+ }
+ var named = false;
+ for(var i in keys){
+ if(keys[i] === e.keyCode){
+ named = true;
+ break;
+ }
+ }
+ if(!named){ return; } // only allow named ones through
+ }
+ }
+ charOrCode = e.charCode >= 32 ? String.fromCharCode(e.charCode) : e.charCode;
+ if(!charOrCode){
+ charOrCode = (e.keyCode >= 65 && e.keyCode <= 90) || (e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == keys.SPACE ? String.fromCharCode(e.keyCode) : e.keyCode;
+ }
+ if(!charOrCode){
+ charOrCode = 229; // IME
+ }
+ if(e.type == "keypress"){
+ if(typeof charOrCode != "string"){ return; }
+ if((charOrCode >= 'a' && charOrCode <= 'z') || (charOrCode >= 'A' && charOrCode <= 'Z') || (charOrCode >= '0' && charOrCode <= '9') || (charOrCode === ' ')){
+ if(e.ctrlKey || e.metaKey || e.altKey){ return; } // can only be stopped reliably in keydown
+ }
+ }
+ if(e.type == "input"){
+ if(this.__skipInputEvent){ // duplicate event
+ this.__skipInputEvent = false;
+ return;
+ }
+ }else{
+ this.__skipInputEvent = true;
+ }
+ // create fake event to set charOrCode and to know if preventDefault() was called
+ var faux = { faux: true }, attr;
+ for(attr in e){
+ if(attr != "layerX" && attr != "layerY"){ // prevent WebKit warnings
+ var v = e[attr];
+ if(typeof v != "function" && typeof v != "undefined"){ faux[attr] = v; }
+ }
+ }
+ lang.mixin(faux, {
+ charOrCode: charOrCode,
+ _wasConsumed: false,
+ preventDefault: function(){
+ faux._wasConsumed = true;
+ e.preventDefault();
+ },
+ stopPropagation: function(){ e.stopPropagation(); }
+ });
+ // give web page author a chance to consume the event
+ //console.log(faux.type + ', charOrCode = (' + (typeof charOrCode) + ') ' + charOrCode + ', ctrl ' + !!faux.ctrlKey + ', alt ' + !!faux.altKey + ', meta ' + !!faux.metaKey + ', shift ' + !!faux.shiftKey);
+ if(this.onInput(faux) === false){ // return false means stop
+ faux.preventDefault();
+ faux.stopPropagation();
+ }
+ if(faux._wasConsumed){ return; } // if preventDefault was called
+ this.defer(function(){ this._onInput(faux); }); // widget notification after key has posted
+ };
+ this.own(on(this.textbox, "keydown, keypress, paste, cut, input, compositionend", lang.hitch(this, handleEvent)));
+ },
+
+ _blankValue: '', // if the textbox is blank, what value should be reported
+ filter: function(val){
+ // summary:
+ // Auto-corrections (such as trimming) that are applied to textbox
+ // value on blur or form submit.
+ // description:
+ // For MappedTextBox subclasses, this is called twice
+ //
+ // - once with the display value
+ // - once the value as set/returned by set('value', ...)
+ //
+ // and get('value'), ex: a Number for NumberTextBox.
+ //
+ // In the latter case it does corrections like converting null to NaN. In
+ // the former case the NumberTextBox.filter() method calls this.inherited()
+ // to execute standard trimming code in TextBox.filter().
+ //
+ // TODO: break this into two methods in 2.0
+ //
+ // tags:
+ // protected extension
+ if(val === null){ return this._blankValue; }
+ if(typeof val != "string"){ return val; }
+ if(this.trim){
+ val = lang.trim(val);
+ }
+ if(this.uppercase){
+ val = val.toUpperCase();
+ }
+ if(this.lowercase){
+ val = val.toLowerCase();
+ }
+ if(this.propercase){
+ val = val.replace(/[^\s]+/g, function(word){
+ return word.substring(0,1).toUpperCase() + word.substring(1);
+ });
+ }
+ return val;
+ },
+
+ _setBlurValue: function(){
+ this._setValueAttr(this.get('value'), true);
+ },
+
+ _onBlur: function(e){
+ if(this.disabled){ return; }
+ this._setBlurValue();
+ this.inherited(arguments);
+ },
+
+ _isTextSelected: function(){
+ return this.textbox.selectionStart != this.textbox.selectionEnd;
+ },
+
+ _onFocus: function(/*String*/ by){
+ if(this.disabled || this.readOnly){ return; }
+
+ // Select all text on focus via click if nothing already selected.
+ // Since mouse-up will clear the selection, need to defer selection until after mouse-up.
+ // Don't do anything on focus by tabbing into the widget since there's no associated mouse-up event.
+ if(this.selectOnClick && by == "mouse"){
+ this._selectOnClickHandle = this.connect(this.domNode, "onmouseup", function(){
+ // Only select all text on first click; otherwise users would have no way to clear
+ // the selection.
+ this.disconnect(this._selectOnClickHandle);
+ this._selectOnClickHandle = null;
+
+ // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up)
+ // and if not, then select all the text
+ if(!this._isTextSelected()){
+ _TextBoxMixin.selectInputText(this.textbox);
+ }
+ });
+ // in case the mouseup never comes
+ this.defer(function(){
+ if(this._selectOnClickHandle){
+ this.disconnect(this._selectOnClickHandle);
+ this._selectOnClickHandle = null;
+ }
+ }, 500); // if mouseup not received soon, then treat it as some gesture
+ }
+ // call this.inherited() before refreshState(), since this.inherited() will possibly scroll the viewport
+ // (to scroll the TextBox into view), which will affect how _refreshState() positions the tooltip
+ this.inherited(arguments);
+
+ this._refreshState();
+ },
+
+ reset: function(){
+ // Overrides `dijit/_FormWidget/reset()`.
+ // Additionally resets the displayed textbox value to ''
+ this.textbox.value = '';
+ this.inherited(arguments);
+ },
+
+ _setTextDirAttr: function(/*String*/ textDir){
+ // summary:
+ // Setter for textDir.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // set('textDir', value)
+ // tags:
+ // private
+
+ // only if new textDir is different from the old one
+ // and on widgets creation.
+ if(!this._created
+ || this.textDir != textDir){
+ this._set("textDir", textDir);
+ // so the change of the textDir will take place immediately.
+ this.applyTextDir(this.focusNode, this.focusNode.value);
+ }
+ }
+});
+
+
+_TextBoxMixin._setSelectionRange = dijit._setSelectionRange = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){
+ if(element.setSelectionRange){
+ element.setSelectionRange(start, stop);
+ }
+};
+
+_TextBoxMixin.selectInputText = dijit.selectInputText = function(/*DomNode*/ element, /*Number?*/ start, /*Number?*/ stop){
+ // summary:
+ // Select text in the input element argument, from start (default 0), to stop (default end).
+
+ // TODO: use functions in _editor/selection.js?
+ element = dom.byId(element);
+ if(isNaN(start)){ start = 0; }
+ if(isNaN(stop)){ stop = element.value ? element.value.length : 0; }
+ try{
+ element.focus();
+ _TextBoxMixin._setSelectionRange(element, start, stop);
+ }catch(e){ /* squelch random errors (esp. on IE) from unexpected focus changes or DOM nodes being hidden */ }
+};
+
+return _TextBoxMixin;
+});
diff --git a/lib/dijit/form/_ToggleButtonMixin.js b/lib/dijit/form/_ToggleButtonMixin.js
index bffb6a64d..18e99b6c7 100644
--- a/lib/dijit/form/_ToggleButtonMixin.js
+++ b/lib/dijit/form/_ToggleButtonMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/_ToggleButtonMixin",["dojo/_base/declare","dojo/dom-attr"],function(_1,_2){return _1("dijit.form._ToggleButtonMixin",null,{checked:false,_aria_attr:"aria-pressed",_onClick:function(_3){var _4=this.checked;this._set("checked",!_4);var _5=this.inherited(arguments);this.set("checked",_5?this.checked:_4);return _5;},_setCheckedAttr:function(_6,_7){this._set("checked",_6);_2.set(this.focusNode||this.domNode,"checked",_6);(this.focusNode||this.domNode).setAttribute(this._aria_attr,_6?"true":"false");this._handleOnChange(_6,_7);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});}); \ No newline at end of file
+define("dijit/form/_ToggleButtonMixin",["dojo/_base/declare","dojo/dom-attr"],function(_1,_2){return _1("dijit.form._ToggleButtonMixin",null,{checked:false,_aria_attr:"aria-pressed",_onClick:function(_3){var _4=this.checked;this._set("checked",!_4);var _5=this.inherited(arguments);this.set("checked",_5?this.checked:_4);return _5;},_setCheckedAttr:function(_6,_7){this._set("checked",_6);var _8=this.focusNode||this.domNode;_2.set(_8,"checked",!!_6);if(_6){_8.setAttribute("checked","");}else{_8.removeAttribute("checked");}_8.setAttribute(this._aria_attr,String(_6));this._handleOnChange(_6,_7);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js
new file mode 100644
index 000000000..dabd07928
--- /dev/null
+++ b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js
@@ -0,0 +1,55 @@
+define("dijit/form/_ToggleButtonMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr" // domAttr.set
+], function(declare, domAttr){
+
+// module:
+// dijit/form/_ToggleButtonMixin
+
+return declare("dijit.form._ToggleButtonMixin", null, {
+ // summary:
+ // A mixin to provide functionality to allow a button that can be in two states (checked or not).
+
+ // checked: Boolean
+ // Corresponds to the native HTML `<input>` element's attribute.
+ // In markup, specified as "checked='checked'" or just "checked".
+ // True if the button is depressed, or the checkbox is checked,
+ // or the radio button is selected, etc.
+ checked: false,
+
+ // aria-pressed for toggle buttons, and aria-checked for checkboxes
+ _aria_attr: "aria-pressed",
+
+ _onClick: function(/*Event*/ evt){
+ var original = this.checked;
+ this._set('checked', !original); // partially set the toggled value, assuming the toggle will work, so it can be overridden in the onclick handler
+ var ret = this.inherited(arguments); // the user could reset the value here
+ this.set('checked', ret ? this.checked : original); // officially set the toggled or user value, or reset it back
+ return ret;
+ },
+
+ _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){
+ this._set("checked", value);
+ var node = this.focusNode || this.domNode;
+ domAttr.set(node, "checked", !!value); // "mixed" -> true
+ if(value){
+ node.setAttribute("checked", "");
+ }else{
+ node.removeAttribute("checked");
+ }
+ node.setAttribute(this._aria_attr, String(value)); // aria values should be strings
+ this._handleOnChange(value, priorityChange);
+ },
+
+ reset: function(){
+ // summary:
+ // Reset the widget's value to what it was at initialization time
+
+ this._hasBeenBlurred = false;
+
+ // set checked state to original setting
+ this.set('checked', this.params.checked || false);
+ }
+});
+
+});
diff --git a/lib/dijit/form/nls/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..dd9807dda
--- /dev/null
+++ b/lib/dijit/form/nls/ComboBox.js.uncompressed.js
@@ -0,0 +1,40 @@
+define("dijit/form/nls/ComboBox", { root:
+//begin v1.x content
+({
+ previousMessage: "Previous choices",
+ nextMessage: "More choices"
+})
+//end v1.x content
+,
+"zh": true,
+"zh-tw": true,
+"tr": true,
+"th": true,
+"sv": true,
+"sl": true,
+"sk": true,
+"ru": true,
+"ro": true,
+"pt": true,
+"pt-pt": true,
+"pl": true,
+"nl": true,
+"nb": true,
+"ko": true,
+"kk": true,
+"ja": true,
+"it": true,
+"hu": true,
+"hr": true,
+"he": true,
+"fr": true,
+"fi": true,
+"es": true,
+"el": true,
+"de": true,
+"da": true,
+"cs": true,
+"ca": true,
+"az": true,
+"ar": true
+});
diff --git a/lib/dijit/form/nls/Textarea.js.uncompressed.js b/lib/dijit/form/nls/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..2d05609c1
--- /dev/null
+++ b/lib/dijit/form/nls/Textarea.js.uncompressed.js
@@ -0,0 +1,43 @@
+define("dijit/form/nls/Textarea", { root:
+//begin v1.x content
+// used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'edit area', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'edit area frame' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+//end v1.x content
+,
+"zh": true,
+"zh-tw": true,
+"tr": true,
+"th": true,
+"sv": true,
+"sl": true,
+"sk": true,
+"ru": true,
+"ro": true,
+"pt": true,
+"pt-pt": true,
+"pl": true,
+"nl": true,
+"nb": true,
+"ko": true,
+"kk": true,
+"ja": true,
+"it": true,
+"hu": true,
+"hr": true,
+"he": true,
+"fr": true,
+"fi": true,
+"es": true,
+"el": true,
+"de": true,
+"da": true,
+"cs": true,
+"ca": true,
+"az": true,
+"ar": true
+});
diff --git a/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..6712ff35d
--- /dev/null
+++ b/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/ar/ComboBox", ({
+ previousMessage: "الاختيارات السابقة",
+ nextMessage: "مزيد من الاختيارات"
+})
+);
diff --git a/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..f3b1a2780
--- /dev/null
+++ b/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ar/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'مساحة التحرير', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'اطار مساحة التحرير' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/ar/validate.js.uncompressed.js b/lib/dijit/form/nls/ar/validate.js.uncompressed.js
new file mode 100644
index 000000000..9445e2e07
--- /dev/null
+++ b/lib/dijit/form/nls/ar/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/ar/validate", ({
+ invalidMessage: "القيمة التي تم ادخالها غير صحيحة.",
+ missingMessage: "يجب ادخال هذه القيمة.",
+ rangeMessage: "هذه القيمة ليس بالمدى الصحيح."
+})
+);
diff --git a/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..4522d81f6
--- /dev/null
+++ b/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/az/ComboBox", ({
+ "previousMessage" : "Əvvəlki variantlar",
+ "nextMessage" : "Başqa variantlar"
+})
+);
diff --git a/lib/dijit/form/nls/az/Textarea.js.uncompressed.js b/lib/dijit/form/nls/az/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..065fc024e
--- /dev/null
+++ b/lib/dijit/form/nls/az/Textarea.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/az/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ "iframeEditTitle" : "Redaktə sahəsi",
+ "iframeFocusTitle" : "Redaktə sahəsi çərçivəsi"
+})
+);
diff --git a/lib/dijit/form/nls/az/validate.js.uncompressed.js b/lib/dijit/form/nls/az/validate.js.uncompressed.js
new file mode 100644
index 000000000..641097ab0
--- /dev/null
+++ b/lib/dijit/form/nls/az/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/az/validate", ({
+ "rangeMessage" : "Bu dəyər aralıq xaricində.",
+ "invalidMessage" : "Girilən dəyər keçərli deyil.",
+ "missingMessage" : "Bu deyər lazımlı."
+})
+);
diff --git a/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..1de0e3e9c
--- /dev/null
+++ b/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/ca/ComboBox", ({
+ previousMessage: "Opcions anteriors",
+ nextMessage: "Més opcions"
+})
+);
diff --git a/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..6c24ee46e
--- /dev/null
+++ b/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ca/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'àrea d\'edició', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'Marc de l\'àrea d\'edició' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/ca/validate.js.uncompressed.js b/lib/dijit/form/nls/ca/validate.js.uncompressed.js
new file mode 100644
index 000000000..f5badf7cf
--- /dev/null
+++ b/lib/dijit/form/nls/ca/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/ca/validate", ({
+ invalidMessage: "El valor introduït no és vàlid",
+ missingMessage: "Aquest valor és necessari",
+ rangeMessage: "Aquest valor és fora de l'interval"
+})
+);
diff --git a/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..0976a71e4
--- /dev/null
+++ b/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/cs/ComboBox", ({
+ previousMessage: "Předchozí volby",
+ nextMessage: "Další volby"
+})
+);
diff --git a/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js b/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..ff81072e2
--- /dev/null
+++ b/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/cs/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'oblast úprav', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'rámec oblasti úprav' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/cs/validate.js.uncompressed.js b/lib/dijit/form/nls/cs/validate.js.uncompressed.js
new file mode 100644
index 000000000..4409056a0
--- /dev/null
+++ b/lib/dijit/form/nls/cs/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/cs/validate", ({
+ invalidMessage: "Zadaná hodnota není platná.",
+ missingMessage: "Tato hodnota je vyžadována.",
+ rangeMessage: "Tato hodnota je mimo rozsah."
+})
+);
diff --git a/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..a5c78b81b
--- /dev/null
+++ b/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/da/ComboBox", ({
+ previousMessage: "Forrige valg",
+ nextMessage: "Flere valg"
+})
+);
diff --git a/lib/dijit/form/nls/da/Textarea.js.uncompressed.js b/lib/dijit/form/nls/da/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..9c259d4df
--- /dev/null
+++ b/lib/dijit/form/nls/da/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/da/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'ramme om redigeringsområde' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/da/validate.js b/lib/dijit/form/nls/da/validate.js
index b29f9ccca..67f605900 100644
--- a/lib/dijit/form/nls/da/validate.js
+++ b/lib/dijit/form/nls/da/validate.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/da/validate",({invalidMessage:"Den angivne værdi er ikke gyldig.",missingMessage:"Værdien er påkrævet.",rangeMessage:"Værdien er uden for intervallet."})); \ No newline at end of file
+define("dijit/form/nls/da/validate",({invalidMessage:"Den angivne værdi er ugyldig.",missingMessage:"Værdien er påkrævet.",rangeMessage:"Værdien er uden for intervallet."})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/da/validate.js.uncompressed.js b/lib/dijit/form/nls/da/validate.js.uncompressed.js
new file mode 100644
index 000000000..43dbdc57c
--- /dev/null
+++ b/lib/dijit/form/nls/da/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/da/validate", ({
+ invalidMessage: "Den angivne værdi er ugyldig.",
+ missingMessage: "Værdien er påkrævet.",
+ rangeMessage: "Værdien er uden for intervallet."
+})
+);
diff --git a/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..9117ccd52
--- /dev/null
+++ b/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/de/ComboBox", ({
+ previousMessage: "Vorherige Auswahl",
+ nextMessage: "Weitere Auswahlmöglichkeiten"
+})
+);
diff --git a/lib/dijit/form/nls/de/Textarea.js.uncompressed.js b/lib/dijit/form/nls/de/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..f5703e383
--- /dev/null
+++ b/lib/dijit/form/nls/de/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/de/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'Editierbereich', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'Rahmen für Editierbereich' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/de/validate.js.uncompressed.js b/lib/dijit/form/nls/de/validate.js.uncompressed.js
new file mode 100644
index 000000000..5fd19699c
--- /dev/null
+++ b/lib/dijit/form/nls/de/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/de/validate", ({
+ invalidMessage: "Der eingegebene Wert ist ungültig. ",
+ missingMessage: "Dieser Wert ist erforderlich.",
+ rangeMessage: "Dieser Wert liegt außerhalb des gültigen Bereichs. "
+})
+);
diff --git a/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..e749e7166
--- /dev/null
+++ b/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/el/ComboBox", ({
+ previousMessage: "Προηγούμενες επιλογές",
+ nextMessage: "Περισσότερες επιλογές"
+})
+);
diff --git a/lib/dijit/form/nls/el/Textarea.js.uncompressed.js b/lib/dijit/form/nls/el/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..383c37aa9
--- /dev/null
+++ b/lib/dijit/form/nls/el/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/el/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'περιοχή επεξεργασίας', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'πλαίσιο περιοχής επεξεργασίας' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/el/validate.js.uncompressed.js b/lib/dijit/form/nls/el/validate.js.uncompressed.js
new file mode 100644
index 000000000..626a9ad60
--- /dev/null
+++ b/lib/dijit/form/nls/el/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/el/validate", ({
+ invalidMessage: "Η τιμή που καταχωρήσατε δεν είναι έγκυρη.",
+ missingMessage: "Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί.",
+ rangeMessage: "Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών."
+})
+);
diff --git a/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..3421e0e76
--- /dev/null
+++ b/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/es/ComboBox", ({
+ previousMessage: "Opciones anteriores",
+ nextMessage: "Más opciones"
+})
+);
diff --git a/lib/dijit/form/nls/es/Textarea.js.uncompressed.js b/lib/dijit/form/nls/es/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..89b9e0bdd
--- /dev/null
+++ b/lib/dijit/form/nls/es/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/es/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'área de edición', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'marco del área de edición' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/es/validate.js.uncompressed.js b/lib/dijit/form/nls/es/validate.js.uncompressed.js
new file mode 100644
index 000000000..5f54b3cc8
--- /dev/null
+++ b/lib/dijit/form/nls/es/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/es/validate", ({
+ invalidMessage: "El valor especificado no es válido.",
+ missingMessage: "Este valor es necesario.",
+ rangeMessage: "Este valor está fuera del intervalo."
+})
+);
diff --git a/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..8bb153b2f
--- /dev/null
+++ b/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/fi/ComboBox", ({
+ previousMessage: "Edelliset valinnat",
+ nextMessage: "Lisää valintoja"
+})
+);
diff --git a/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js b/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..a71666147
--- /dev/null
+++ b/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/fi/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'muokkausalue', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'muokkausalueen kehys' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/fi/validate.js.uncompressed.js b/lib/dijit/form/nls/fi/validate.js.uncompressed.js
new file mode 100644
index 000000000..f081ee0af
--- /dev/null
+++ b/lib/dijit/form/nls/fi/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/fi/validate", ({
+ invalidMessage: "Annettu arvo ei kelpaa.",
+ missingMessage: "Tämä arvo on pakollinen.",
+ rangeMessage: "Tämä arvo on sallitun alueen ulkopuolella."
+})
+);
diff --git a/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..db10552b6
--- /dev/null
+++ b/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/fr/ComboBox", ({
+ previousMessage: "Choix précédents",
+ nextMessage: "Plus de choix"
+})
+);
diff --git a/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..564a98c4f
--- /dev/null
+++ b/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/fr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'zone d\'édition', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'cadre de la zone d\'édition' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/fr/validate.js.uncompressed.js b/lib/dijit/form/nls/fr/validate.js.uncompressed.js
new file mode 100644
index 000000000..b706349dc
--- /dev/null
+++ b/lib/dijit/form/nls/fr/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/fr/validate", ({
+ invalidMessage: "La valeur indiquée n'est pas correcte.",
+ missingMessage: "Cette valeur est requise.",
+ rangeMessage: "Cette valeur n'est pas comprise dans la plage autorisée."
+})
+);
diff --git a/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..be6411478
--- /dev/null
+++ b/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/he/ComboBox", ({
+ previousMessage: "האפשרויות הקודמות",
+ nextMessage: "אפשרויות נוספות"
+})
+);
diff --git a/lib/dijit/form/nls/he/Textarea.js.uncompressed.js b/lib/dijit/form/nls/he/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..770ddb75b
--- /dev/null
+++ b/lib/dijit/form/nls/he/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/he/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'אזור עריכה', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'מסגרת אזור עריכה' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/he/validate.js.uncompressed.js b/lib/dijit/form/nls/he/validate.js.uncompressed.js
new file mode 100644
index 000000000..c52edfb9d
--- /dev/null
+++ b/lib/dijit/form/nls/he/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/he/validate", ({
+ invalidMessage: "הערך שצוין אינו חוקי.",
+ missingMessage: "זהו ערך דרוש.",
+ rangeMessage: "הערך מחוץ לטווח."
+})
+);
diff --git a/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..c242142cd
--- /dev/null
+++ b/lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/hr/ComboBox", ({
+ previousMessage: "Prethodni izbori",
+ nextMessage: "Više izbora"
+})
+);
diff --git a/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..bfe511dc9
--- /dev/null
+++ b/lib/dijit/form/nls/hr/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/hr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'područje uređivanja', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'okvir područja uređivanja' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/hr/validate.js.uncompressed.js b/lib/dijit/form/nls/hr/validate.js.uncompressed.js
new file mode 100644
index 000000000..80784c8e1
--- /dev/null
+++ b/lib/dijit/form/nls/hr/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/hr/validate", ({
+ invalidMessage: "Unesena vrijednost nije važeća.",
+ missingMessage: "Potrebna je ova vrijednost.",
+ rangeMessage: "Ova vrijednost je izvan raspona."
+})
+);
diff --git a/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..e29e01583
--- /dev/null
+++ b/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/hu/ComboBox", ({
+ previousMessage: "Előző menüpontok",
+ nextMessage: "További menüpontok"
+})
+);
diff --git a/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js b/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..cd65cd35f
--- /dev/null
+++ b/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/hu/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'szerkesztési terület', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'szerkesztési terület keret' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/hu/validate.js.uncompressed.js b/lib/dijit/form/nls/hu/validate.js.uncompressed.js
new file mode 100644
index 000000000..129d268bd
--- /dev/null
+++ b/lib/dijit/form/nls/hu/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/hu/validate", ({
+ invalidMessage: "A megadott érték érvénytelen.",
+ missingMessage: "Meg kell adni egy értéket.",
+ rangeMessage: "Az érték kívül van a megengedett tartományon."
+})
+);
diff --git a/lib/dijit/form/nls/it/ComboBox.js b/lib/dijit/form/nls/it/ComboBox.js
index 80392837a..ff829811a 100644
--- a/lib/dijit/form/nls/it/ComboBox.js
+++ b/lib/dijit/form/nls/it/ComboBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/it/ComboBox",({previousMessage:"Scelte precedenti",nextMessage:"Altre scelte"})); \ No newline at end of file
+define("dijit/form/nls/it/ComboBox",({previousMessage:"Scelte precedenti",nextMessage:"Scelte successive"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..a8710ea92
--- /dev/null
+++ b/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/it/ComboBox", ({
+ previousMessage: "Scelte precedenti",
+ nextMessage: "Scelte successive"
+})
+);
diff --git a/lib/dijit/form/nls/it/Textarea.js.uncompressed.js b/lib/dijit/form/nls/it/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..21953ee4c
--- /dev/null
+++ b/lib/dijit/form/nls/it/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/it/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'modifica area', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'modifica frame area' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/it/validate.js b/lib/dijit/form/nls/it/validate.js
index 4d439d539..c6c8b9065 100644
--- a/lib/dijit/form/nls/it/validate.js
+++ b/lib/dijit/form/nls/it/validate.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/it/validate",({invalidMessage:"Il valore immesso non è valido.",missingMessage:"Questo valore è obbligatorio.",rangeMessage:"Questo valore non è compreso nell'intervallo."})); \ No newline at end of file
+define("dijit/form/nls/it/validate",({invalidMessage:"Il valore immesso non è valido.",missingMessage:"Questo valore è obbligatorio.",rangeMessage:"Questo valore è fuori dall'intervallo consentito."})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/it/validate.js.uncompressed.js b/lib/dijit/form/nls/it/validate.js.uncompressed.js
new file mode 100644
index 000000000..0e61395ea
--- /dev/null
+++ b/lib/dijit/form/nls/it/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/it/validate", ({
+ invalidMessage: "Il valore immesso non è valido.",
+ missingMessage: "Questo valore è obbligatorio.",
+ rangeMessage: "Questo valore è fuori dall'intervallo consentito."
+})
+);
diff --git a/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..7b7cfe934
--- /dev/null
+++ b/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/ja/ComboBox", ({
+ previousMessage: "以前の選択項目",
+ nextMessage: "追加の選択項目"
+})
+);
diff --git a/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..dc0218f3d
--- /dev/null
+++ b/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ja/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: '編集域', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: '編集域フレーム' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/ja/validate.js.uncompressed.js b/lib/dijit/form/nls/ja/validate.js.uncompressed.js
new file mode 100644
index 000000000..e5d2c4d6e
--- /dev/null
+++ b/lib/dijit/form/nls/ja/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/ja/validate", ({
+ invalidMessage: "入力した値は無効です。",
+ missingMessage: "この値は必須です。",
+ rangeMessage: "この値は範囲外です。"
+})
+);
diff --git a/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..123045ac2
--- /dev/null
+++ b/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/kk/ComboBox", ({
+ previousMessage: "Алдыңғы нұсқалар",
+ nextMessage: "Басқа нұсқалар"
+})
+);
diff --git a/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js b/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..17e849eaa
--- /dev/null
+++ b/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/kk/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'өңдеу аумағы', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'өңдеу аумағының жақтауы' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/kk/validate.js.uncompressed.js b/lib/dijit/form/nls/kk/validate.js.uncompressed.js
new file mode 100644
index 000000000..c5a2828d6
--- /dev/null
+++ b/lib/dijit/form/nls/kk/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/kk/validate", ({
+ invalidMessage: "Енгізілген мән жарамды емес.",
+ missingMessage: "Бұл мән міндетті.",
+ rangeMessage: "Бұл мән ауқымнан тыс."
+})
+);
diff --git a/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..ab3fbad6a
--- /dev/null
+++ b/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/ko/ComboBox", ({
+ previousMessage: "이전 선택사항",
+ nextMessage: "기타 선택사항"
+})
+);
diff --git a/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..670dceaa9
--- /dev/null
+++ b/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ko/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: '편집 영역', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: '편집 영역 프레임' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/ko/validate.js.uncompressed.js b/lib/dijit/form/nls/ko/validate.js.uncompressed.js
new file mode 100644
index 000000000..2b38c0a92
--- /dev/null
+++ b/lib/dijit/form/nls/ko/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/ko/validate", ({
+ invalidMessage: "입력된 값이 올바르지 않습니다.",
+ missingMessage: "이 값은 필수입니다.",
+ rangeMessage: "이 값은 범위를 벗어납니다."
+})
+);
diff --git a/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..c05fcd36b
--- /dev/null
+++ b/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/nb/ComboBox", ({
+ previousMessage: "Tidligere valg",
+ nextMessage: "Flere valg"
+})
+);
diff --git a/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js b/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..656fd191b
--- /dev/null
+++ b/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/nb/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'ramme for redigeringsområde' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/nb/validate.js.uncompressed.js b/lib/dijit/form/nls/nb/validate.js.uncompressed.js
new file mode 100644
index 000000000..bab0094bb
--- /dev/null
+++ b/lib/dijit/form/nls/nb/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/nb/validate", ({
+ invalidMessage: "Den angitte verdien er ikke gyldig.",
+ missingMessage: "Denne verdien er obligatorisk.",
+ rangeMessage: "Denne verdien er utenfor gyldig område."
+})
+);
diff --git a/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..2aa44597d
--- /dev/null
+++ b/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/nl/ComboBox", ({
+ previousMessage: "Eerdere opties",
+ nextMessage: "Meer opties"
+})
+);
diff --git a/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..5f26a130b
--- /dev/null
+++ b/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/nl/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'veld bewerken', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'veldkader bewerken' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/nl/validate.js.uncompressed.js b/lib/dijit/form/nls/nl/validate.js.uncompressed.js
new file mode 100644
index 000000000..e62882456
--- /dev/null
+++ b/lib/dijit/form/nls/nl/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/nl/validate", ({
+ invalidMessage: "De opgegeven waarde is ongeldig.",
+ missingMessage: "Deze waarde is verplicht.",
+ rangeMessage: "Deze waarde is niet toegestaan."
+})
+);
diff --git a/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..b1e34aada
--- /dev/null
+++ b/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/pl/ComboBox", ({
+ previousMessage: "Poprzednie wybory",
+ nextMessage: "Więcej wyborów"
+})
+);
diff --git a/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..99a7c2afc
--- /dev/null
+++ b/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/pl/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'edycja obszaru', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'edycja ramki obszaru' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/pl/validate.js b/lib/dijit/form/nls/pl/validate.js
index 2a6a12893..dd83e464c 100644
--- a/lib/dijit/form/nls/pl/validate.js
+++ b/lib/dijit/form/nls/pl/validate.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/pl/validate",({invalidMessage:"Wprowadzona wartość jest niepoprawna.",missingMessage:"Ta wartość jest wymagana.",rangeMessage:"Ta wartość jest spoza zakresu."})); \ No newline at end of file
+define("dijit/form/nls/pl/validate",({invalidMessage:"Wprowadzona wartość jest nieprawidłowa.",missingMessage:"Ta wartość jest wymagana.",rangeMessage:"Ta wartość jest spoza zakresu."})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/pl/validate.js.uncompressed.js b/lib/dijit/form/nls/pl/validate.js.uncompressed.js
new file mode 100644
index 000000000..0c115c1c0
--- /dev/null
+++ b/lib/dijit/form/nls/pl/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/pl/validate", ({
+ invalidMessage: "Wprowadzona wartość jest nieprawidłowa.",
+ missingMessage: "Ta wartość jest wymagana.",
+ rangeMessage: "Ta wartość jest spoza zakresu."
+})
+);
diff --git a/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..df9b05f2c
--- /dev/null
+++ b/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/pt-pt/ComboBox", ({
+ previousMessage: "Opções anteriores",
+ nextMessage: "Mais opções"
+})
+);
diff --git a/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..1a65b1c23
--- /dev/null
+++ b/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/pt-pt/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'área de edição', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'painel da área de edição' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js b/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js
new file mode 100644
index 000000000..e64416837
--- /dev/null
+++ b/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/pt-pt/validate", ({
+ invalidMessage: "O valor introduzido não é válido.",
+ missingMessage: "Este valor é requerido.",
+ rangeMessage: "Este valor encontra-se fora do intervalo."
+})
+);
diff --git a/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..a3675f7f1
--- /dev/null
+++ b/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/pt/ComboBox", ({
+ previousMessage: "Opções anteriores",
+ nextMessage: "Mais opções"
+})
+);
diff --git a/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js b/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..69a1c3a03
--- /dev/null
+++ b/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/pt/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'editar área', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'editar quadro da área' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/pt/validate.js.uncompressed.js b/lib/dijit/form/nls/pt/validate.js.uncompressed.js
new file mode 100644
index 000000000..bf2b583bb
--- /dev/null
+++ b/lib/dijit/form/nls/pt/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/pt/validate", ({
+ invalidMessage: "O valor inserido não é válido.",
+ missingMessage: "Este valor é necessário.",
+ rangeMessage: "Este valor está fora do intervalo. "
+})
+);
diff --git a/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..ad4e57210
--- /dev/null
+++ b/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/ro/ComboBox", ({
+ previousMessage: "Alegeri anterioare",
+ nextMessage: "Mai multe alegeri"
+})
+);
diff --git a/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..e691fbec5
--- /dev/null
+++ b/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ro/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'zonă de editare', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'cadru zonă de editare' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/ro/validate.js.uncompressed.js b/lib/dijit/form/nls/ro/validate.js.uncompressed.js
new file mode 100644
index 000000000..841221c24
--- /dev/null
+++ b/lib/dijit/form/nls/ro/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/ro/validate", ({
+ invalidMessage: "Valoarea introdusă nu este validă.",
+ missingMessage: "Această valoare este necesară.",
+ rangeMessage: "Această valoare este în afara intervalului. "
+})
+);
diff --git a/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..5782c3930
--- /dev/null
+++ b/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/ru/ComboBox", ({
+ previousMessage: "Предыдущие варианты",
+ nextMessage: "Следующие варианты"
+})
+);
diff --git a/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js b/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..fa9705a8e
--- /dev/null
+++ b/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ru/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'область редактирования', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'фрейм области редактирования' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/ru/validate.js.uncompressed.js b/lib/dijit/form/nls/ru/validate.js.uncompressed.js
new file mode 100644
index 000000000..50174b18d
--- /dev/null
+++ b/lib/dijit/form/nls/ru/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/ru/validate", ({
+ invalidMessage: "Указано недопустимое значение.",
+ missingMessage: "Это обязательное значение.",
+ rangeMessage: "Это значение вне диапазона."
+})
+);
diff --git a/lib/dijit/form/nls/sk/ComboBox.js b/lib/dijit/form/nls/sk/ComboBox.js
index 798051638..1229481dd 100644
--- a/lib/dijit/form/nls/sk/ComboBox.js
+++ b/lib/dijit/form/nls/sk/ComboBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/sk/ComboBox",({previousMessage:"Predchádzajúce voľby",nextMessage:"Ďalšie voľby"})); \ No newline at end of file
+define("dijit/form/nls/sk/ComboBox",({previousMessage:"Predchádzajúce možnosti",nextMessage:"Viac možností"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..98602c530
--- /dev/null
+++ b/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/sk/ComboBox", ({
+ previousMessage: "Predchádzajúce možnosti",
+ nextMessage: "Viac možností"
+})
+);
diff --git a/lib/dijit/form/nls/sk/Textarea.js b/lib/dijit/form/nls/sk/Textarea.js
index 003b04757..8d63972ba 100644
--- a/lib/dijit/form/nls/sk/Textarea.js
+++ b/lib/dijit/form/nls/sk/Textarea.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/sk/Textarea",({iframeEditTitle:"upraviť oblasť",iframeFocusTitle:"upraviť rám oblasti"})); \ No newline at end of file
+define("dijit/form/nls/sk/Textarea",({iframeEditTitle:"upraviť oblasť",iframeFocusTitle:"upraviť rámec oblasti"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..0bc6f107c
--- /dev/null
+++ b/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/sk/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'upraviť oblasť', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'upraviť rámec oblasti' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/sk/validate.js b/lib/dijit/form/nls/sk/validate.js
index d5b9883a5..b33fe9536 100644
--- a/lib/dijit/form/nls/sk/validate.js
+++ b/lib/dijit/form/nls/sk/validate.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/sk/validate",({invalidMessage:"Zadaná hodnota nie je platná.",missingMessage:"Táto hodnota je vyžadovaná.",rangeMessage:"Táto hodnota je mimo rozsah."})); \ No newline at end of file
+define("dijit/form/nls/sk/validate",({invalidMessage:"Zadaná hodnota nie je platná.",missingMessage:"Táto hodnota je povinná.",rangeMessage:"Táto hodnota je mimo rozsah."})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/sk/validate.js.uncompressed.js b/lib/dijit/form/nls/sk/validate.js.uncompressed.js
new file mode 100644
index 000000000..747907a59
--- /dev/null
+++ b/lib/dijit/form/nls/sk/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/sk/validate", ({
+ invalidMessage: "Zadaná hodnota nie je platná.",
+ missingMessage: "Táto hodnota je povinná.",
+ rangeMessage: "Táto hodnota je mimo rozsah."
+})
+);
diff --git a/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..45e3d998c
--- /dev/null
+++ b/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/sl/ComboBox", ({
+ previousMessage: "Prejšnje izbire",
+ nextMessage: "Dodatne izbire"
+})
+);
diff --git a/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..6420d6a47
--- /dev/null
+++ b/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/sl/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'urejevalno področje', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'okvir urejevalnega področja' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/sl/validate.js.uncompressed.js b/lib/dijit/form/nls/sl/validate.js.uncompressed.js
new file mode 100644
index 000000000..e23377b24
--- /dev/null
+++ b/lib/dijit/form/nls/sl/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/sl/validate", ({
+ invalidMessage: "Vnesena vrednost ni veljavna.",
+ missingMessage: "Ta vrednost je zahtevana.",
+ rangeMessage: "Ta vrednost je izven območja."
+})
+);
diff --git a/lib/dijit/form/nls/sv/ComboBox.js b/lib/dijit/form/nls/sv/ComboBox.js
index 804ca0fb5..1a951a610 100644
--- a/lib/dijit/form/nls/sv/ComboBox.js
+++ b/lib/dijit/form/nls/sv/ComboBox.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/sv/ComboBox",({previousMessage:"Föregående alternativ",nextMessage:"Fler alternativ"})); \ No newline at end of file
+define("dijit/form/nls/sv/ComboBox",({previousMessage:"Tidigare val",nextMessage:"Fler val"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..2096aa739
--- /dev/null
+++ b/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/sv/ComboBox", ({
+ previousMessage: "Tidigare val",
+ nextMessage: "Fler val"
+})
+);
diff --git a/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js b/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..33a0b812b
--- /dev/null
+++ b/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/sv/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'redigeringsområde', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'redigeringsområdesram' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/sv/validate.js b/lib/dijit/form/nls/sv/validate.js
index 3cccc47dc..28018f7ff 100644
--- a/lib/dijit/form/nls/sv/validate.js
+++ b/lib/dijit/form/nls/sv/validate.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/sv/validate",({invalidMessage:"Det angivna värdet är ogiltigt.",missingMessage:"Värdet är obligatoriskt.",rangeMessage:"Värdet är utanför intervallet."})); \ No newline at end of file
+define("dijit/form/nls/sv/validate",({invalidMessage:"Angivet värde är inte giltigt.",missingMessage:"Värdet krävs.",rangeMessage:"Värdet ligger utanför intervallet."})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/sv/validate.js.uncompressed.js b/lib/dijit/form/nls/sv/validate.js.uncompressed.js
new file mode 100644
index 000000000..62d235516
--- /dev/null
+++ b/lib/dijit/form/nls/sv/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/sv/validate", ({
+ invalidMessage: "Angivet värde är inte giltigt.",
+ missingMessage: "Värdet krävs.",
+ rangeMessage: "Värdet ligger utanför intervallet."
+})
+);
diff --git a/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..035df3f3c
--- /dev/null
+++ b/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/th/ComboBox", ({
+ previousMessage: "การเลือกก่อนหน้า",
+ nextMessage: "การเลือกเพิ่มเติม"
+})
+);
diff --git a/lib/dijit/form/nls/th/Textarea.js b/lib/dijit/form/nls/th/Textarea.js
index a5a4ea132..04ac12b70 100644
--- a/lib/dijit/form/nls/th/Textarea.js
+++ b/lib/dijit/form/nls/th/Textarea.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/th/Textarea",({iframeEditTitle:"แก้ไขพื้นที่",iframeFocusTitle:"แก้ไขกรอบพื้นที่"})); \ No newline at end of file
+define("dijit/form/nls/th/Textarea",({iframeEditTitle:"พื้นที่แก้ไข",iframeFocusTitle:"กรอบพื้นที่แก้ไข"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/th/Textarea.js.uncompressed.js b/lib/dijit/form/nls/th/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..a306e27b0
--- /dev/null
+++ b/lib/dijit/form/nls/th/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/th/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'พื้นที่แก้ไข', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'กรอบพื้นที่แก้ไข' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/th/validate.js.uncompressed.js b/lib/dijit/form/nls/th/validate.js.uncompressed.js
new file mode 100644
index 000000000..512cd4fc7
--- /dev/null
+++ b/lib/dijit/form/nls/th/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/th/validate", ({
+ invalidMessage: "ค่าที่ป้อนไม่ถูกต้อง",
+ missingMessage: "จำเป็นต้องมีค่านี้",
+ rangeMessage: "ค่านี้เกินช่วง"
+})
+);
diff --git a/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..ca5af6817
--- /dev/null
+++ b/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/tr/ComboBox", ({
+ previousMessage: "Önceki seçenekler",
+ nextMessage: "Diğer seçenekler"
+})
+);
diff --git a/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js b/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..d9e4e8fe7
--- /dev/null
+++ b/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/tr/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: 'düzenleme alanı', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: 'düzenleme alanı çerçevesi' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/tr/validate.js.uncompressed.js b/lib/dijit/form/nls/tr/validate.js.uncompressed.js
new file mode 100644
index 000000000..b00351fc7
--- /dev/null
+++ b/lib/dijit/form/nls/tr/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/tr/validate", ({
+ invalidMessage: "Girilen değer geçersiz.",
+ missingMessage: "Bu değer gerekli.",
+ rangeMessage: "Bu değer aralık dışında."
+})
+);
diff --git a/lib/dijit/form/nls/validate.js.uncompressed.js b/lib/dijit/form/nls/validate.js.uncompressed.js
new file mode 100644
index 000000000..421ddb51a
--- /dev/null
+++ b/lib/dijit/form/nls/validate.js.uncompressed.js
@@ -0,0 +1,41 @@
+define("dijit/form/nls/validate", { root:
+//begin v1.x content
+({
+ invalidMessage: "The value entered is not valid.",
+ missingMessage: "This value is required.",
+ rangeMessage: "This value is out of range."
+})
+//end v1.x content
+,
+"zh": true,
+"zh-tw": true,
+"tr": true,
+"th": true,
+"sv": true,
+"sl": true,
+"sk": true,
+"ru": true,
+"ro": true,
+"pt": true,
+"pt-pt": true,
+"pl": true,
+"nl": true,
+"nb": true,
+"ko": true,
+"kk": true,
+"ja": true,
+"it": true,
+"hu": true,
+"hr": true,
+"he": true,
+"fr": true,
+"fi": true,
+"es": true,
+"el": true,
+"de": true,
+"da": true,
+"cs": true,
+"ca": true,
+"az": true,
+"ar": true
+});
diff --git a/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..c85710946
--- /dev/null
+++ b/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/zh-tw/ComboBox", ({
+ previousMessage: "前一個選擇項",
+ nextMessage: "其他選擇項"
+})
+);
diff --git a/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..e36c60bbc
--- /dev/null
+++ b/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/zh-tw/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: '編輯區', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: '編輯區框' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js b/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js
new file mode 100644
index 000000000..f6d052f96
--- /dev/null
+++ b/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/zh-tw/validate", ({
+ invalidMessage: "輸入的值無效。",
+ missingMessage: "必須提供此值。",
+ rangeMessage: "此值超出範圍。"
+})
+);
diff --git a/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js b/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..177ee8117
--- /dev/null
+++ b/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/form/nls/zh/ComboBox", ({
+ previousMessage: "先前选项",
+ nextMessage: "更多选项"
+})
+);
diff --git a/lib/dijit/form/nls/zh/Textarea.js b/lib/dijit/form/nls/zh/Textarea.js
index 917b5cd68..4be70540d 100644
--- a/lib/dijit/form/nls/zh/Textarea.js
+++ b/lib/dijit/form/nls/zh/Textarea.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/zh/Textarea",({iframeEditTitle:"编辑区",iframeFocusTitle:"编辑区框架"})); \ No newline at end of file
+define("dijit/form/nls/zh/Textarea",({iframeEditTitle:"编辑区域",iframeFocusTitle:"编辑区域框"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js b/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..09fe9c853
--- /dev/null
+++ b/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/zh/Textarea", // used by both the editor and textarea widgets to provide information to screen reader users
+({
+ iframeEditTitle: '编辑区域', // primary title for editable IFRAME, for screen readers when focus is in the editing area
+ iframeFocusTitle: '编辑区域框' // secondary title for editable IFRAME when focus is on outer container
+ // to let user know that focus has moved out of editing area and to the
+ // parent element of the editing area
+})
+);
diff --git a/lib/dijit/form/nls/zh/validate.js b/lib/dijit/form/nls/zh/validate.js
index 7a78d23c6..6b6c555c4 100644
--- a/lib/dijit/form/nls/zh/validate.js
+++ b/lib/dijit/form/nls/zh/validate.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/form/nls/zh/validate",({invalidMessage:"输入的值无效。",missingMessage:"此值是必需值。",rangeMessage:"此值超出范围。"})); \ No newline at end of file
+define("dijit/form/nls/zh/validate",({invalidMessage:"输入的值无效。",missingMessage:"该值是必需的。",rangeMessage:"此值超出范围。"})); \ No newline at end of file
diff --git a/lib/dijit/form/nls/zh/validate.js.uncompressed.js b/lib/dijit/form/nls/zh/validate.js.uncompressed.js
new file mode 100644
index 000000000..ed5178f97
--- /dev/null
+++ b/lib/dijit/form/nls/zh/validate.js.uncompressed.js
@@ -0,0 +1,7 @@
+define(
+"dijit/form/nls/zh/validate", ({
+ invalidMessage: "输入的值无效。",
+ missingMessage: "该值是必需的。",
+ rangeMessage: "此值超出范围。"
+})
+);
diff --git a/lib/dijit/form/templates/CheckBox.html b/lib/dijit/form/templates/CheckBox.html
index fd81fc226..a9c99b53b 100644
--- a/lib/dijit/form/templates/CheckBox.html
+++ b/lib/dijit/form/templates/CheckBox.html
@@ -1,6 +1,6 @@
<div class="dijit dijitReset dijitInline" role="presentation"
><input
- ${!nameAttrSetting} type="${type}" ${checkedAttrSetting}
+ ${!nameAttrSetting} type="${type}" role="${type}" aria-checked="false" ${checkedAttrSetting}
class="dijitReset dijitCheckBoxInput"
data-dojo-attach-point="focusNode"
data-dojo-attach-event="onclick:_onClick"
diff --git a/lib/dijit/form/templates/ComboButton.html b/lib/dijit/form/templates/ComboButton.html
index 49eed10a8..1ffe2ec89 100644
--- a/lib/dijit/form/templates/ComboButton.html
+++ b/lib/dijit/form/templates/ComboButton.html
@@ -18,6 +18,6 @@
><div class="dijitReset dijitArrowButtonChar" role="presentation">&#9660;</div
></td
><td style="display:none !important;"
- ><input ${!nameAttrSetting} type="${type}" value="${value}" data-dojo-attach-point="valueNode"
+ ><input ${!nameAttrSetting} type="${type}" value="${value}" data-dojo-attach-point="valueNode" role="presentation"
/></td></tr></tbody
></table>
diff --git a/lib/dijit/form/templates/DropDownBox.html b/lib/dijit/form/templates/DropDownBox.html
index 0314ad951..eb8f3e70d 100644
--- a/lib/dijit/form/templates/DropDownBox.html
+++ b/lib/dijit/form/templates/DropDownBox.html
@@ -3,7 +3,7 @@
role="combobox"
><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'
data-dojo-attach-point="_buttonNode, _popupStateNode" role="presentation"
- ><input class="dijitReset dijitInputField dijitArrowButtonInner" value="&#9660; " type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ ><input class="dijitReset dijitInputField dijitArrowButtonInner" value="&#9660; " type="text" tabIndex="-1" readonly="readonly" role="button presentation" aria-hidden="true"
${_buttonInputDisabled}
/></div
><div class='dijitReset dijitValidationContainer'
diff --git a/lib/dijit/form/templates/DropDownButton.html b/lib/dijit/form/templates/DropDownButton.html
index 56d2618f4..92d9ad047 100644
--- a/lib/dijit/form/templates/DropDownButton.html
+++ b/lib/dijit/form/templates/DropDownButton.html
@@ -16,5 +16,5 @@
></span
></span
><input ${!nameAttrSetting} type="${type}" value="${value}" class="dijitOffScreen" tabIndex="-1"
- data-dojo-attach-point="valueNode"
+ data-dojo-attach-point="valueNode" role="presentation"
/></span>
diff --git a/lib/dijit/form/templates/HorizontalSlider.html b/lib/dijit/form/templates/HorizontalSlider.html
index 9fd16d4ea..f633281cb 100644
--- a/lib/dijit/form/templates/HorizontalSlider.html
+++ b/lib/dijit/form/templates/HorizontalSlider.html
@@ -1,4 +1,5 @@
<table class="dijit dijitReset dijitSlider dijitSliderH" cellspacing="0" cellpadding="0" border="0" rules="none" data-dojo-attach-event="onkeypress:_onKeyPress,onkeyup:_onKeyUp"
+ role="presentation"
><tr class="dijitReset"
><td class="dijitReset" colspan="2"></td
><td data-dojo-attach-point="topDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH"></td
@@ -16,7 +17,7 @@
/><div class="dijitReset dijitSliderBarContainerH" role="presentation" data-dojo-attach-point="sliderBarContainer"
><div role="presentation" data-dojo-attach-point="progressBar" class="dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH" data-dojo-attach-event="press:_onBarClick"
><div class="dijitSliderMoveable dijitSliderMoveableH"
- ><div data-dojo-attach-point="sliderHandle,focusNode" class="dijitSliderImageHandle dijitSliderImageHandleH" data-dojo-attach-event="press:_onHandleClick" role="slider" valuemin="${minimum}" valuemax="${maximum}"></div
+ ><div data-dojo-attach-point="sliderHandle,focusNode" class="dijitSliderImageHandle dijitSliderImageHandleH" data-dojo-attach-event="press:_onHandleClick" role="slider"></div
></div
></div
><div role="presentation" data-dojo-attach-point="remainingBar" class="dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH" data-dojo-attach-event="press:_onBarClick"></div
diff --git a/lib/dijit/form/templates/Select.html b/lib/dijit/form/templates/Select.html
index 9e917ab92..acf2d2c23 100644
--- a/lib/dijit/form/templates/Select.html
+++ b/lib/dijit/form/templates/Select.html
@@ -1,14 +1,18 @@
<table class="dijit dijitReset dijitInline dijitLeft"
data-dojo-attach-point="_buttonNode,tableNode,focusNode" cellspacing='0' cellpadding='0'
- role="combobox" aria-haspopup="true"
+ role="listbox" aria-haspopup="true"
><tbody role="presentation"><tr role="presentation"
- ><td class="dijitReset dijitStretch dijitButtonContents dijitButtonNode" role="presentation"
- ><span class="dijitReset dijitInline dijitButtonText" data-dojo-attach-point="containerNode,_popupStateNode"></span
+ ><td class="dijitReset dijitStretch dijitButtonContents" role="presentation"
+ ><div class="dijitReset dijitInputField dijitButtonText" data-dojo-attach-point="containerNode,_popupStateNode" role="presentation"></div
+ ><div class="dijitReset dijitValidationContainer"
+ ><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="&#935; " type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ /></div
><input type="hidden" ${!nameAttrSetting} data-dojo-attach-point="valueNode" value="${value}" aria-hidden="true"
- /></td><td class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton"
- data-dojo-attach-point="titleNode" role="presentation"
- ><div class="dijitReset dijitArrowButtonInner" role="presentation"></div
- ><div class="dijitReset dijitArrowButtonChar" role="presentation">&#9660;</div
- ></td
+ /></td
+ ><td class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer"
+ data-dojo-attach-point="titleNode" role="presentation"
+ ><input class="dijitReset dijitInputField dijitArrowButtonInner" value="&#9660; " type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ ${_buttonInputDisabled}
+ /></td
></tr></tbody
></table>
diff --git a/lib/dijit/form/templates/Spinner.html b/lib/dijit/form/templates/Spinner.html
index 468613d01..a711cd4e3 100644
--- a/lib/dijit/form/templates/Spinner.html
+++ b/lib/dijit/form/templates/Spinner.html
@@ -5,20 +5,20 @@
/><div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton"
data-dojo-attach-point="upArrowNode"
><div class="dijitArrowButtonInner"
- ><input class="dijitReset dijitInputField" value="&#9650;" type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ ><input class="dijitReset dijitInputField" value="&#9650; " type="text" tabIndex="-1" readonly="readonly" role="presentation"
${_buttonInputDisabled}
/></div
></div
><div class="dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitDownArrowButton"
data-dojo-attach-point="downArrowNode"
><div class="dijitArrowButtonInner"
- ><input class="dijitReset dijitInputField" value="&#9660;" type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ ><input class="dijitReset dijitInputField" value="&#9660; " type="text" tabIndex="-1" readonly="readonly" role="presentation"
${_buttonInputDisabled}
/></div
></div
></div
><div class='dijitReset dijitValidationContainer'
- ><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="&#935;" type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ ><input class="dijitReset dijitInputField dijitValidationIcon dijitValidationInner" value="&#935; " type="text" tabIndex="-1" readonly="readonly" role="presentation"
/></div
><div class="dijitReset dijitInputField dijitInputContainer"
><input class='dijitReset dijitInputInner' data-dojo-attach-point="textbox,focusNode" type="${type}" data-dojo-attach-event="onkeypress:_onKeyPress"
diff --git a/lib/dijit/form/templates/VerticalSlider.html b/lib/dijit/form/templates/VerticalSlider.html
index 0c72ed90a..372c82cf0 100644
--- a/lib/dijit/form/templates/VerticalSlider.html
+++ b/lib/dijit/form/templates/VerticalSlider.html
@@ -1,4 +1,5 @@
<table class="dijit dijitReset dijitSlider dijitSliderV" cellspacing="0" cellpadding="0" border="0" rules="none" data-dojo-attach-event="onkeypress:_onKeyPress,onkeyup:_onKeyUp"
+ role="presentation"
><tr class="dijitReset"
><td class="dijitReset"></td
><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
@@ -14,19 +15,19 @@
><td class="dijitReset"></td
></tr
><tr class="dijitReset"
- ><td data-dojo-attach-point="leftDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV"></td
+ ><td data-dojo-attach-point="leftDecoration" class="dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV"></td
><td class="dijitReset dijitSliderDecorationC" style="height:100%;"
><input data-dojo-attach-point="valueNode" type="hidden" ${!nameAttrSetting}
/><center class="dijitReset dijitSliderBarContainerV" role="presentation" data-dojo-attach-point="sliderBarContainer"
><div role="presentation" data-dojo-attach-point="remainingBar" class="dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV" data-dojo-attach-event="press:_onBarClick"><!--#5629--></div
><div role="presentation" data-dojo-attach-point="progressBar" class="dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV" data-dojo-attach-event="press:_onBarClick"
><div class="dijitSliderMoveable dijitSliderMoveableV" style="vertical-align:top;"
- ><div data-dojo-attach-point="sliderHandle,focusNode" class="dijitSliderImageHandle dijitSliderImageHandleV" data-dojo-attach-event="press:_onHandleClick" role="slider" valuemin="${minimum}" valuemax="${maximum}"></div
+ ><div data-dojo-attach-point="sliderHandle,focusNode" class="dijitSliderImageHandle dijitSliderImageHandleV" data-dojo-attach-event="press:_onHandleClick" role="slider"></div
></div
></div
></center
></td
- ><td data-dojo-attach-point="containerNode,rightDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV"></td
+ ><td data-dojo-attach-point="containerNode,rightDecoration" class="dijitReset dijitInline dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV"></td
></tr
><tr class="dijitReset"
><td class="dijitReset"></td