summaryrefslogtreecommitdiff
path: root/lib/dijit
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
parent9a2885da170ffd64358b99194095851a2d09c1b6 (diff)
upgrade dojo to 1.8.3 (refs #570)
Diffstat (limited to 'lib/dijit')
-rw-r--r--lib/dijit/BackgroundIframe.js2
-rw-r--r--lib/dijit/BackgroundIframe.js.uncompressed.js110
-rw-r--r--lib/dijit/Calendar.js2
-rw-r--r--lib/dijit/Calendar.js.uncompressed.js312
-rw-r--r--lib/dijit/CalendarLite.js2
-rw-r--r--lib/dijit/CalendarLite.js.uncompressed.js501
-rw-r--r--lib/dijit/CheckedMenuItem.js2
-rw-r--r--lib/dijit/CheckedMenuItem.js.uncompressed.js53
-rw-r--r--lib/dijit/ColorPalette.js2
-rw-r--r--lib/dijit/ColorPalette.js.uncompressed.js161
-rw-r--r--lib/dijit/Declaration.js2
-rw-r--r--lib/dijit/Declaration.js.uncompressed.js105
-rw-r--r--lib/dijit/Destroyable.js2
-rw-r--r--lib/dijit/Destroyable.js.uncompressed.js59
-rw-r--r--lib/dijit/Dialog.js2
-rw-r--r--lib/dijit/Dialog.js.uncompressed.js661
-rw-r--r--lib/dijit/DialogUnderlay.js2
-rw-r--r--lib/dijit/DialogUnderlay.js.uncompressed.js102
-rw-r--r--lib/dijit/DropDownMenu.js2
-rw-r--r--lib/dijit/DropDownMenu.js.uncompressed.js58
-rw-r--r--lib/dijit/Editor.js2
-rw-r--r--lib/dijit/Editor.js.uncompressed.js865
-rw-r--r--lib/dijit/InlineEditBox.js2
-rw-r--r--lib/dijit/InlineEditBox.js.uncompressed.js659
-rw-r--r--lib/dijit/LICENSE2
-rw-r--r--lib/dijit/Menu.js2
-rw-r--r--lib/dijit/Menu.js.uncompressed.js349
-rw-r--r--lib/dijit/MenuBar.js2
-rw-r--r--lib/dijit/MenuBar.js.uncompressed.js92
-rw-r--r--lib/dijit/MenuBarItem.js2
-rw-r--r--lib/dijit/MenuBarItem.js.uncompressed.js28
-rw-r--r--lib/dijit/MenuItem.js2
-rw-r--r--lib/dijit/MenuItem.js.uncompressed.js187
-rw-r--r--lib/dijit/MenuSeparator.js.uncompressed.js35
-rw-r--r--lib/dijit/PopupMenuBarItem.js.uncompressed.js16
-rw-r--r--lib/dijit/PopupMenuItem.js2
-rw-r--r--lib/dijit/PopupMenuItem.js.uncompressed.js73
-rw-r--r--lib/dijit/ProgressBar.js2
-rw-r--r--lib/dijit/ProgressBar.js.uncompressed.js171
-rw-r--r--lib/dijit/TitlePane.js2
-rw-r--r--lib/dijit/TitlePane.js.uncompressed.js268
-rw-r--r--lib/dijit/Toolbar.js2
-rw-r--r--lib/dijit/Toolbar.js.uncompressed.js43
-rw-r--r--lib/dijit/ToolbarSeparator.js.uncompressed.js31
-rw-r--r--lib/dijit/Tooltip.js2
-rw-r--r--lib/dijit/Tooltip.js.uncompressed.js542
-rw-r--r--lib/dijit/TooltipDialog.js2
-rw-r--r--lib/dijit/TooltipDialog.js.uncompressed.js174
-rw-r--r--lib/dijit/Tree.js2
-rw-r--r--lib/dijit/Tree.js.uncompressed.js1910
-rw-r--r--lib/dijit/Viewport.js2
-rw-r--r--lib/dijit/Viewport.js.uncompressed.js50
-rw-r--r--lib/dijit/WidgetSet.js2
-rw-r--r--lib/dijit/WidgetSet.js.uncompressed.js247
-rw-r--r--lib/dijit/_BidiSupport.js2
-rw-r--r--lib/dijit/_BidiSupport.js.uncompressed.js113
-rw-r--r--lib/dijit/_Calendar.js2
-rw-r--r--lib/dijit/_Calendar.js.uncompressed.js22
-rw-r--r--lib/dijit/_Contained.js.uncompressed.js60
-rw-r--r--lib/dijit/_Container.js2
-rw-r--r--lib/dijit/_Container.js.uncompressed.js94
-rw-r--r--lib/dijit/_CssStateMixin.js2
-rw-r--r--lib/dijit/_CssStateMixin.js.uncompressed.js324
-rw-r--r--lib/dijit/_DialogMixin.js.uncompressed.js70
-rw-r--r--lib/dijit/_FocusMixin.js.uncompressed.js66
-rw-r--r--lib/dijit/_HasDropDown.js2
-rw-r--r--lib/dijit/_HasDropDown.js.uncompressed.js509
-rw-r--r--lib/dijit/_KeyNavContainer.js.uncompressed.js257
-rw-r--r--lib/dijit/_MenuBase.js2
-rw-r--r--lib/dijit/_MenuBase.js.uncompressed.js429
-rw-r--r--lib/dijit/_OnDijitClickMixin.js2
-rw-r--r--lib/dijit/_OnDijitClickMixin.js.uncompressed.js50
-rw-r--r--lib/dijit/_PaletteMixin.js2
-rw-r--r--lib/dijit/_PaletteMixin.js.uncompressed.js340
-rw-r--r--lib/dijit/_Templated.js.uncompressed.js64
-rw-r--r--lib/dijit/_TemplatedMixin.js2
-rw-r--r--lib/dijit/_TemplatedMixin.js.uncompressed.js309
-rw-r--r--lib/dijit/_TimePicker.js2
-rw-r--r--lib/dijit/_TimePicker.js.uncompressed.js525
-rw-r--r--lib/dijit/_Widget.js2
-rw-r--r--lib/dijit/_Widget.js.uncompressed.js363
-rw-r--r--lib/dijit/_WidgetBase.js2
-rw-r--r--lib/dijit/_WidgetBase.js.uncompressed.js1137
-rw-r--r--lib/dijit/_WidgetsInTemplateMixin.js2
-rw-r--r--lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js65
-rw-r--r--lib/dijit/_base.js2
-rw-r--r--lib/dijit/_base.js.uncompressed.js27
-rw-r--r--lib/dijit/_base/focus.js2
-rw-r--r--lib/dijit/_base/focus.js.uncompressed.js323
-rw-r--r--lib/dijit/_base/manager.js2
-rw-r--r--lib/dijit/_base/manager.js.uncompressed.js35
-rw-r--r--lib/dijit/_base/place.js2
-rw-r--r--lib/dijit/_base/place.js.uncompressed.js131
-rw-r--r--lib/dijit/_base/popup.js2
-rw-r--r--lib/dijit/_base/popup.js.uncompressed.js58
-rw-r--r--lib/dijit/_base/scroll.js2
-rw-r--r--lib/dijit/_base/scroll.js.uncompressed.js22
-rw-r--r--lib/dijit/_base/sniff.js.uncompressed.js12
-rw-r--r--lib/dijit/_base/typematic.js.uncompressed.js10
-rw-r--r--lib/dijit/_base/wai.js2
-rw-r--r--lib/dijit/_base/wai.js.uncompressed.js109
-rw-r--r--lib/dijit/_base/window.js2
-rw-r--r--lib/dijit/_base/window.js.uncompressed.js18
-rw-r--r--lib/dijit/_editor/RichText.js2
-rw-r--r--lib/dijit/_editor/RichText.js.uncompressed.js2874
-rw-r--r--lib/dijit/_editor/_Plugin.js2
-rw-r--r--lib/dijit/_editor/_Plugin.js.uncompressed.js302
-rw-r--r--lib/dijit/_editor/html.js2
-rw-r--r--lib/dijit/_editor/html.js.uncompressed.js223
-rw-r--r--lib/dijit/_editor/nls/FontChoice.js.uncompressed.js62
-rw-r--r--lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js48
-rw-r--r--lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/ar/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/az/commands.js.uncompressed.js50
-rw-r--r--lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/ca/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ca/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/commands.js.uncompressed.js85
-rw-r--r--lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/cs/commands.js2
-rw-r--r--lib/dijit/_editor/nls/cs/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/da/commands.js2
-rw-r--r--lib/dijit/_editor/nls/da/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/de/commands.js2
-rw-r--r--lib/dijit/_editor/nls/de/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/el/commands.js2
-rw-r--r--lib/dijit/_editor/nls/el/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/es/commands.js2
-rw-r--r--lib/dijit/_editor/nls/es/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/fi/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/fi/commands.js2
-rw-r--r--lib/dijit/_editor/nls/fi/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/fr/commands.js2
-rw-r--r--lib/dijit/_editor/nls/fr/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/he/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/hr/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/hu/commands.js2
-rw-r--r--lib/dijit/_editor/nls/hu/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/it/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/it/commands.js2
-rw-r--r--lib/dijit/_editor/nls/it/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/ja/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/ja/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ja/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/kk/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/kk/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/kk/commands.js2
-rw-r--r--lib/dijit/_editor/nls/kk/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/ko/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/ko/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ko/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/nb/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/nl/commands.js2
-rw-r--r--lib/dijit/_editor/nls/nl/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/pl/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/pl/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/pl/commands.js2
-rw-r--r--lib/dijit/_editor/nls/pl/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js49
-rw-r--r--lib/dijit/_editor/nls/pt/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/pt/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/pt/commands.js2
-rw-r--r--lib/dijit/_editor/nls/pt/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ro/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/ro/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ro/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/ru/commands.js2
-rw-r--r--lib/dijit/_editor/nls/ru/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/sk/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/sk/commands.js2
-rw-r--r--lib/dijit/_editor/nls/sk/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/sl/commands.js2
-rw-r--r--lib/dijit/_editor/nls/sl/commands.js.uncompressed.js49
-rw-r--r--lib/dijit/_editor/nls/sv/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/sv/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/sv/commands.js2
-rw-r--r--lib/dijit/_editor/nls/sv/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/th/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/th/commands.js2
-rw-r--r--lib/dijit/_editor/nls/th/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/tr/commands.js2
-rw-r--r--lib/dijit/_editor/nls/tr/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/zh-tw/commands.js2
-rw-r--r--lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/zh/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/zh/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/zh/commands.js2
-rw-r--r--lib/dijit/_editor/nls/zh/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/plugins/AlwaysShowToolbar.js2
-rw-r--r--lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js191
-rw-r--r--lib/dijit/_editor/plugins/EnterKeyHandling.js2
-rw-r--r--lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js622
-rw-r--r--lib/dijit/_editor/plugins/FontChoice.js2
-rw-r--r--lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js583
-rw-r--r--lib/dijit/_editor/plugins/FullScreen.js2
-rw-r--r--lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js450
-rw-r--r--lib/dijit/_editor/plugins/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js609
-rw-r--r--lib/dijit/_editor/plugins/NewPage.js2
-rw-r--r--lib/dijit/_editor/plugins/NewPage.js.uncompressed.js77
-rw-r--r--lib/dijit/_editor/plugins/Print.js2
-rw-r--r--lib/dijit/_editor/plugins/Print.js.uncompressed.js123
-rw-r--r--lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js60
-rw-r--r--lib/dijit/_editor/plugins/TextColor.js2
-rw-r--r--lib/dijit/_editor/plugins/TextColor.js.uncompressed.js115
-rw-r--r--lib/dijit/_editor/plugins/ToggleDir.js2
-rw-r--r--lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js69
-rw-r--r--lib/dijit/_editor/plugins/ViewSource.js2
-rw-r--r--lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js577
-rw-r--r--lib/dijit/_editor/range.js2
-rw-r--r--lib/dijit/_editor/range.js.uncompressed.js559
-rw-r--r--lib/dijit/_editor/selection.js2
-rw-r--r--lib/dijit/_editor/selection.js.uncompressed.js383
-rw-r--r--lib/dijit/_tree/dndSource.js.uncompressed.js20
-rw-r--r--lib/dijit/a11y.js2
-rw-r--r--lib/dijit/a11y.js.uncompressed.js177
-rw-r--r--lib/dijit/a11yclick.js2
-rw-r--r--lib/dijit/a11yclick.js.uncompressed.js131
-rw-r--r--lib/dijit/dijit-all.js2
-rw-r--r--lib/dijit/dijit-all.js.uncompressed.js75
-rw-r--r--lib/dijit/dijit.js2
-rw-r--r--lib/dijit/dijit.js.uncompressed.js26
-rw-r--r--lib/dijit/dijit.profile.js6
-rw-r--r--lib/dijit/focus.js2
-rw-r--r--lib/dijit/focus.js.uncompressed.js364
-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
-rw-r--r--lib/dijit/hccss.js2
-rw-r--r--lib/dijit/hccss.js.uncompressed.js23
-rw-r--r--lib/dijit/icons/commonIcons.css2
-rw-r--r--lib/dijit/layout/AccordionContainer.js2
-rw-r--r--lib/dijit/layout/AccordionContainer.js.uncompressed.js540
-rw-r--r--lib/dijit/layout/AccordionPane.js.uncompressed.js25
-rw-r--r--lib/dijit/layout/BorderContainer.js2
-rw-r--r--lib/dijit/layout/BorderContainer.js.uncompressed.js547
-rw-r--r--lib/dijit/layout/ContentPane.js2
-rw-r--r--lib/dijit/layout/ContentPane.js.uncompressed.js646
-rw-r--r--lib/dijit/layout/LayoutContainer.js2
-rw-r--r--lib/dijit/layout/LayoutContainer.js.uncompressed.js91
-rw-r--r--lib/dijit/layout/LinkPane.js.uncompressed.js44
-rw-r--r--lib/dijit/layout/ScrollingTabController.js2
-rw-r--r--lib/dijit/layout/ScrollingTabController.js.uncompressed.js500
-rw-r--r--lib/dijit/layout/SplitContainer.js2
-rw-r--r--lib/dijit/layout/SplitContainer.js.uncompressed.js584
-rw-r--r--lib/dijit/layout/StackContainer.js2
-rw-r--r--lib/dijit/layout/StackContainer.js.uncompressed.js374
-rw-r--r--lib/dijit/layout/StackController.js2
-rw-r--r--lib/dijit/layout/StackController.js.uncompressed.js390
-rw-r--r--lib/dijit/layout/TabContainer.js2
-rw-r--r--lib/dijit/layout/TabContainer.js.uncompressed.js77
-rw-r--r--lib/dijit/layout/TabController.js2
-rw-r--r--lib/dijit/layout/TabController.js.uncompressed.js171
-rw-r--r--lib/dijit/layout/_ContentPaneResizeMixin.js2
-rw-r--r--lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js234
-rw-r--r--lib/dijit/layout/_LayoutWidget.js2
-rw-r--r--lib/dijit/layout/_LayoutWidget.js.uncompressed.js185
-rw-r--r--lib/dijit/layout/_TabContainerBase.js.uncompressed.js146
-rw-r--r--lib/dijit/layout/templates/_ScrollingTabControllerButton.html10
-rw-r--r--lib/dijit/layout/templates/_TabButton.html20
-rw-r--r--lib/dijit/layout/utils.js2
-rw-r--r--lib/dijit/layout/utils.js.uncompressed.js145
-rw-r--r--lib/dijit/main.js.uncompressed.js16
-rw-r--r--lib/dijit/nls/ar/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ar/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/az/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/az/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/ca/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ca/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/common.js.uncompressed.js42
-rw-r--r--lib/dijit/nls/cs/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/cs/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/da/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/da/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/de/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/de/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/el/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/el/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/es/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/es/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/fi/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/fi/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/fr/common.js2
-rw-r--r--lib/dijit/nls/fr/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/fr/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/he/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/he/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/hr/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/hr/loading.js2
-rw-r--r--lib/dijit/nls/hr/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/hu/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/hu/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/it/common.js2
-rw-r--r--lib/dijit/nls/it/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/it/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/ja/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ja/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/kk/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/kk/loading.js2
-rw-r--r--lib/dijit/nls/kk/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/ko/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ko/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/loading.js.uncompressed.js40
-rw-r--r--lib/dijit/nls/nb/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/nb/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/nl/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/nl/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/pl/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/pl/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/pt-pt/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/pt-pt/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/pt/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/pt/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/ro/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ro/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/ru/common.js2
-rw-r--r--lib/dijit/nls/ru/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ru/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/sk/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/sk/loading.js2
-rw-r--r--lib/dijit/nls/sk/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/sl/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/sl/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/sv/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/sv/loading.js2
-rw-r--r--lib/dijit/nls/sv/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/th/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/th/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/tr/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/tr/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/zh-tw/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/zh-tw/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/nls/zh/common.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/zh/loading.js.uncompressed.js6
-rw-r--r--lib/dijit/package.json7
-rw-r--r--lib/dijit/place.js2
-rw-r--r--lib/dijit/place.js.uncompressed.js367
-rw-r--r--lib/dijit/popup.js2
-rw-r--r--lib/dijit/popup.js.uncompressed.js318
-rw-r--r--lib/dijit/registry.js2
-rw-r--r--lib/dijit/registry.js.uncompressed.js161
-rw-r--r--lib/dijit/resources/_modules.js18
-rw-r--r--lib/dijit/templates/Calendar.html2
-rw-r--r--lib/dijit/templates/CheckedMenuItem.html3
-rw-r--r--lib/dijit/templates/Dialog.html11
-rw-r--r--lib/dijit/templates/InlineEditBox.html6
-rw-r--r--lib/dijit/templates/Menu.html3
-rw-r--r--lib/dijit/templates/MenuBarItem.html4
-rw-r--r--lib/dijit/templates/MenuItem.html3
-rw-r--r--lib/dijit/templates/TitlePane.html6
-rw-r--r--lib/dijit/templates/TooltipDialog.html2
-rw-r--r--lib/dijit/templates/Tree.html3
-rw-r--r--lib/dijit/templates/TreeNode.html5
-rw-r--r--lib/dijit/themes/claro/Calendar.css33
-rw-r--r--lib/dijit/themes/claro/Calendar.less34
-rw-r--r--lib/dijit/themes/claro/ColorPalette.css2
-rw-r--r--lib/dijit/themes/claro/Common.css40
-rw-r--r--lib/dijit/themes/claro/Common.less34
-rw-r--r--lib/dijit/themes/claro/Dialog.css25
-rw-r--r--lib/dijit/themes/claro/Dialog.less18
-rw-r--r--lib/dijit/themes/claro/Editor.css12
-rw-r--r--lib/dijit/themes/claro/Editor.less10
-rw-r--r--lib/dijit/themes/claro/Menu.css84
-rw-r--r--lib/dijit/themes/claro/Menu.less87
-rw-r--r--lib/dijit/themes/claro/ProgressBar.css11
-rw-r--r--lib/dijit/themes/claro/ProgressBar.less10
-rw-r--r--lib/dijit/themes/claro/README34
-rw-r--r--lib/dijit/themes/claro/TimePicker.css23
-rw-r--r--lib/dijit/themes/claro/TimePicker.less17
-rw-r--r--lib/dijit/themes/claro/TitlePane.css18
-rw-r--r--lib/dijit/themes/claro/TitlePane.less8
-rw-r--r--lib/dijit/themes/claro/Toolbar.css64
-rw-r--r--lib/dijit/themes/claro/Toolbar.less30
-rw-r--r--lib/dijit/themes/claro/Tree.css49
-rw-r--r--lib/dijit/themes/claro/Tree.less39
-rw-r--r--lib/dijit/themes/claro/claro_rtl.css1
-rw-r--r--lib/dijit/themes/claro/form/Button.css34
-rw-r--r--lib/dijit/themes/claro/form/Button.less38
-rw-r--r--lib/dijit/themes/claro/form/Common.css91
-rw-r--r--lib/dijit/themes/claro/form/Common.less71
-rw-r--r--lib/dijit/themes/claro/form/Common_rtl.css9
-rw-r--r--lib/dijit/themes/claro/form/Common_rtl.less9
-rw-r--r--lib/dijit/themes/claro/form/NumberSpinner.css21
-rw-r--r--lib/dijit/themes/claro/form/NumberSpinner.less10
-rw-r--r--lib/dijit/themes/claro/form/Select.css67
-rw-r--r--lib/dijit/themes/claro/form/Select.less64
-rw-r--r--lib/dijit/themes/claro/form/Select_rtl.css4
-rw-r--r--lib/dijit/themes/claro/form/Select_rtl.less6
-rw-r--r--lib/dijit/themes/claro/form/Slider.css56
-rw-r--r--lib/dijit/themes/claro/form/Slider.less43
-rw-r--r--lib/dijit/themes/claro/form/images/button.pngbin680 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/buttonDisabled.pngbin0 -> 105 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/buttonDisabled.svg23
-rw-r--r--lib/dijit/themes/claro/form/images/buttonEnabled.pngbin0 -> 122 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/buttonEnabled.svg24
-rw-r--r--lib/dijit/themes/claro/form/images/button_grad_d.pngbin3897 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/formHighlight.pngbin339 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/shadow.pngbin4624 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/sliderHorizontal.pngbin180 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/sliderVertical.pngbin177 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/form/images/textBox_back.pngbin2837 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/activeGradient.pngbin0 -> 146 bytes
-rw-r--r--lib/dijit/themes/claro/images/activeGradient.svg19
-rw-r--r--lib/dijit/themes/claro/images/calendar.pngbin0 -> 194 bytes
-rw-r--r--lib/dijit/themes/claro/images/calendarContainerImages.pngbin3347 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/commonHighlight.pngbin339 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/dnd.pngbin2996 -> 2127 bytes
-rw-r--r--lib/dijit/themes/claro/images/menuHighlight.pngbin339 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/progressBarEmpty.pngbin2849 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/standardGradient.pngbin0 -> 153 bytes
-rw-r--r--lib/dijit/themes/claro/images/standardGradient.svg18
-rw-r--r--lib/dijit/themes/claro/images/titlebar.pngbin640 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/tooltipGradient.pngbin1030 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/images/treeExpand_loading.gifbin1944 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/AccordionContainer.css29
-rw-r--r--lib/dijit/themes/claro/layout/AccordionContainer.less16
-rw-r--r--lib/dijit/themes/claro/layout/BorderContainer.css24
-rw-r--r--lib/dijit/themes/claro/layout/BorderContainer.less20
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer.css258
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer.less268
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer_rtl.css63
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer_rtl.less74
-rw-r--r--lib/dijit/themes/claro/layout/images/accordion.pngbin640 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/splitterHorizontalHover.pngbin3711 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/splitterVerticalHover.pngbin3869 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabBottom.pngbin718 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabBottomSelected.pngbin0 -> 118 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabBottomSelected.svg18
-rw-r--r--lib/dijit/themes/claro/layout/images/tabBottomUnselected.pngbin0 -> 110 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabBottomUnselected.svg19
-rw-r--r--lib/dijit/themes/claro/layout/images/tabLeft.pngbin1692 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabLeftSelected.pngbin0 -> 213 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabLeftSelected.svg17
-rw-r--r--lib/dijit/themes/claro/layout/images/tabLeftUnselected.pngbin0 -> 106 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabLeftUnselected.svg16
-rw-r--r--lib/dijit/themes/claro/layout/images/tabRight.pngbin1759 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabRightSelected.pngbin0 -> 210 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabRightSelected.svg17
-rw-r--r--lib/dijit/themes/claro/layout/images/tabRightUnselected.pngbin0 -> 105 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabRightUnselected.svg16
-rw-r--r--lib/dijit/themes/claro/layout/images/tabTop.pngbin721 -> 0 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabTopSelected.pngbin0 -> 120 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabTopSelected.svg18
-rw-r--r--lib/dijit/themes/claro/layout/images/tabTopUnselected.pngbin0 -> 121 bytes
-rw-r--r--lib/dijit/themes/claro/layout/images/tabTopUnselected.svg19
-rw-r--r--lib/dijit/themes/claro/variables.less186
-rw-r--r--lib/dijit/themes/dijit.css435
-rw-r--r--lib/dijit/themes/dijit_rtl.css45
-rw-r--r--lib/dijit/themes/nihilo/Common.css14
-rw-r--r--lib/dijit/themes/nihilo/Dialog.css10
-rw-r--r--lib/dijit/themes/nihilo/form/Button.css7
-rw-r--r--lib/dijit/themes/nihilo/form/Button_rtl.css6
-rw-r--r--lib/dijit/themes/nihilo/form/Common.css19
-rw-r--r--lib/dijit/themes/nihilo/form/Select.css46
-rw-r--r--lib/dijit/themes/nihilo/form/TimeTextBox.css2
-rw-r--r--lib/dijit/themes/nihilo/images/dndNoCopy.pngbin699 -> 1332 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/dndNoMove.pngbin677 -> 991 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gifbin291 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gifbin266 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gifbin388 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabLeftChecked.gifbin303 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabRightChecked.gifbin300 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabStripe.gifbin54 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabStripeBottom.gifbin432 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabStripeLeft.gifbin432 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/images/tabStripeRight.gifbin432 -> 0 bytes
-rw-r--r--lib/dijit/themes/nihilo/layout/TabContainer.css226
-rw-r--r--lib/dijit/themes/soria/Common.css19
-rw-r--r--lib/dijit/themes/soria/Dialog.css10
-rw-r--r--lib/dijit/themes/soria/form/Button.css6
-rw-r--r--lib/dijit/themes/soria/form/Button_rtl.css6
-rw-r--r--lib/dijit/themes/soria/form/Common.css18
-rw-r--r--lib/dijit/themes/soria/form/Select.css55
-rw-r--r--lib/dijit/themes/soria/form/TimeTextBox.css2
-rw-r--r--lib/dijit/themes/soria/images/dndNoCopy.pngbin699 -> 1332 bytes
-rw-r--r--lib/dijit/themes/soria/images/dndNoMove.pngbin677 -> 991 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabBottomActiveSpriteLR.gifbin741 -> 0 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabBottomHoverSpriteLR.gifbin569 -> 0 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabLeftChecked.gifbin795 -> 2005 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabRightChecked.gifbin793 -> 2003 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabStripe.gifbin54 -> 0 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabStripeBottom.gifbin54 -> 0 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabStripeLeft.gifbin54 -> 0 bytes
-rw-r--r--lib/dijit/themes/soria/images/tabStripeRight.gifbin54 -> 0 bytes
-rw-r--r--lib/dijit/themes/soria/layout/TabContainer.css233
-rw-r--r--lib/dijit/themes/tundra/Common.css18
-rw-r--r--lib/dijit/themes/tundra/form/Button.css8
-rw-r--r--lib/dijit/themes/tundra/form/Common.css15
-rw-r--r--lib/dijit/themes/tundra/form/Select.css52
-rw-r--r--lib/dijit/themes/tundra/images/dndNoCopy.pngbin699 -> 1332 bytes
-rw-r--r--lib/dijit/themes/tundra/images/dndNoMove.pngbin677 -> 991 bytes
-rw-r--r--lib/dijit/themes/tundra/layout/TabContainer.css42
-rw-r--r--lib/dijit/themes/tundra/layout/TabContainer_rtl.css48
-rw-r--r--lib/dijit/tree/ForestStoreModel.js2
-rw-r--r--lib/dijit/tree/ForestStoreModel.js.uncompressed.js279
-rw-r--r--lib/dijit/tree/ObjectStoreModel.js2
-rw-r--r--lib/dijit/tree/ObjectStoreModel.js.uncompressed.js250
-rw-r--r--lib/dijit/tree/TreeStoreModel.js2
-rw-r--r--lib/dijit/tree/TreeStoreModel.js.uncompressed.js379
-rw-r--r--lib/dijit/tree/_dndContainer.js2
-rw-r--r--lib/dijit/tree/_dndContainer.js.uncompressed.js165
-rw-r--r--lib/dijit/tree/_dndSelector.js2
-rw-r--r--lib/dijit/tree/_dndSelector.js.uncompressed.js356
-rw-r--r--lib/dijit/tree/dndSource.js2
-rw-r--r--lib/dijit/tree/dndSource.js.uncompressed.js564
-rw-r--r--lib/dijit/tree/model.js1
-rw-r--r--lib/dijit/tree/model.js.uncompressed.js150
-rw-r--r--lib/dijit/typematic.js2
-rw-r--r--lib/dijit/typematic.js.uncompressed.js201
772 files changed, 44307 insertions, 2088 deletions
diff --git a/lib/dijit/BackgroundIframe.js b/lib/dijit/BackgroundIframe.js
index 4823973ad..8b6f3f856 100644
--- a/lib/dijit/BackgroundIframe.js
+++ b/lib/dijit/BackgroundIframe.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/BackgroundIframe",["require",".","dojo/_base/config","dojo/dom-construct","dojo/dom-style","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6,on,_7,_8){var _9=new function(){var _a=[];this.pop=function(){var _b;if(_a.length){_b=_a.pop();_b.style.display="";}else{if(_7("ie")<9){var _c=_3["dojoBlankHtmlUrl"]||_1.toUrl("dojo/resources/blank.html")||"javascript:\"\"";var _d="<iframe src='"+_c+"' role='presentation'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_b=_8.doc.createElement(_d);}else{_b=_4.create("iframe");_b.src="javascript:\"\"";_b.className="dijitBackgroundIframe";_b.setAttribute("role","presentation");_5.set(_b,"opacity",0.1);}_b.tabIndex=-1;}return _b;};this.push=function(_e){_e.style.display="none";_a.push(_e);};}();_2.BackgroundIframe=function(_f){if(!_f.id){throw new Error("no id");}if(_7("ie")||_7("mozilla")){var _10=(this.iframe=_9.pop());_f.appendChild(_10);if(_7("ie")<7||_7("quirks")){this.resize(_f);this._conn=on(_f,"resize",_6.hitch(this,function(){this.resize(_f);}));}else{_5.set(_10,{width:"100%",height:"100%"});}}};_6.extend(_2.BackgroundIframe,{resize:function(_11){if(this.iframe){_5.set(this.iframe,{width:_11.offsetWidth+"px",height:_11.offsetHeight+"px"});}},destroy:function(){if(this._conn){this._conn.remove();this._conn=null;}if(this.iframe){_9.push(this.iframe);delete this.iframe;}}});return _2.BackgroundIframe;}); \ No newline at end of file
+define("dijit/BackgroundIframe",["require","./main","dojo/_base/config","dojo/dom-construct","dojo/dom-style","dojo/_base/lang","dojo/on","dojo/sniff","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6,on,_7,_8){var _9=new function(){var _a=[];this.pop=function(){var _b;if(_a.length){_b=_a.pop();_b.style.display="";}else{if(_7("ie")<9){var _c=_3["dojoBlankHtmlUrl"]||_1.toUrl("dojo/resources/blank.html")||"javascript:\"\"";var _d="<iframe src='"+_c+"' role='presentation'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_b=_8.doc.createElement(_d);}else{_b=_4.create("iframe");_b.src="javascript:\"\"";_b.className="dijitBackgroundIframe";_b.setAttribute("role","presentation");_5.set(_b,"opacity",0.1);}_b.tabIndex=-1;}return _b;};this.push=function(_e){_e.style.display="none";_a.push(_e);};}();_2.BackgroundIframe=function(_f){if(!_f.id){throw new Error("no id");}if(_7("ie")||_7("mozilla")){var _10=(this.iframe=_9.pop());_f.appendChild(_10);if(_7("ie")<7||_7("quirks")){this.resize(_f);this._conn=on(_f,"resize",_6.hitch(this,function(){this.resize(_f);}));}else{_5.set(_10,{width:"100%",height:"100%"});}}};_6.extend(_2.BackgroundIframe,{resize:function(_11){if(this.iframe){_5.set(this.iframe,{width:_11.offsetWidth+"px",height:_11.offsetHeight+"px"});}},destroy:function(){if(this._conn){this._conn.remove();this._conn=null;}if(this.iframe){_9.push(this.iframe);delete this.iframe;}}});return _2.BackgroundIframe;}); \ No newline at end of file
diff --git a/lib/dijit/BackgroundIframe.js.uncompressed.js b/lib/dijit/BackgroundIframe.js.uncompressed.js
new file mode 100644
index 000000000..06ee17e06
--- /dev/null
+++ b/lib/dijit/BackgroundIframe.js.uncompressed.js
@@ -0,0 +1,110 @@
+define("dijit/BackgroundIframe", [
+ "require", // require.toUrl
+ "./main", // to export dijit.BackgroundIframe
+ "dojo/_base/config",
+ "dojo/dom-construct", // domConstruct.create
+ "dojo/dom-style", // domStyle.set
+ "dojo/_base/lang", // lang.extend lang.hitch
+ "dojo/on",
+ "dojo/sniff", // has("ie"), has("mozilla"), has("quirks")
+ "dojo/_base/window" // win.doc.createElement
+], function(require, dijit, config, domConstruct, domStyle, lang, on, has, win){
+
+ // module:
+ // dijit/BackgroundIFrame
+
+ // TODO: remove _frames, it isn't being used much, since popups never release their
+ // iframes (see [22236])
+ var _frames = new function(){
+ // summary:
+ // cache of iframes
+
+ var queue = [];
+
+ this.pop = function(){
+ var iframe;
+ if(queue.length){
+ iframe = queue.pop();
+ iframe.style.display="";
+ }else{
+ if(has("ie") < 9){
+ var burl = config["dojoBlankHtmlUrl"] || require.toUrl("dojo/resources/blank.html") || "javascript:\"\"";
+ var html="<iframe src='" + burl + "' role='presentation'"
+ + " style='position: absolute; left: 0px; top: 0px;"
+ + "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
+ iframe = win.doc.createElement(html);
+ }else{
+ iframe = domConstruct.create("iframe");
+ iframe.src = 'javascript:""';
+ iframe.className = "dijitBackgroundIframe";
+ iframe.setAttribute("role", "presentation");
+ domStyle.set(iframe, "opacity", 0.1);
+ }
+ iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.
+ }
+ return iframe;
+ };
+
+ this.push = function(iframe){
+ iframe.style.display="none";
+ queue.push(iframe);
+ }
+ }();
+
+
+ dijit.BackgroundIframe = function(/*DomNode*/ node){
+ // summary:
+ // For IE/FF z-index schenanigans. id attribute is required.
+ //
+ // description:
+ // new dijit.BackgroundIframe(node).
+ //
+ // Makes a background iframe as a child of node, that fills
+ // area (and position) of node
+
+ if(!node.id){ throw new Error("no id"); }
+ if(has("ie") || has("mozilla")){
+ var iframe = (this.iframe = _frames.pop());
+ node.appendChild(iframe);
+ if(has("ie")<7 || has("quirks")){
+ this.resize(node);
+ this._conn = on(node, 'resize', lang.hitch(this, function(){
+ this.resize(node);
+ }));
+ }else{
+ domStyle.set(iframe, {
+ width: '100%',
+ height: '100%'
+ });
+ }
+ }
+ };
+
+ lang.extend(dijit.BackgroundIframe, {
+ resize: function(node){
+ // summary:
+ // Resize the iframe so it's the same size as node.
+ // Needed on IE6 and IE/quirks because height:100% doesn't work right.
+ if(this.iframe){
+ domStyle.set(this.iframe, {
+ width: node.offsetWidth + 'px',
+ height: node.offsetHeight + 'px'
+ });
+ }
+ },
+ destroy: function(){
+ // summary:
+ // destroy the iframe
+ if(this._conn){
+ this._conn.remove();
+ this._conn = null;
+ }
+ if(this.iframe){
+ _frames.push(this.iframe);
+ delete this.iframe;
+ }
+ }
+ });
+
+ return dijit.BackgroundIframe;
+});
diff --git a/lib/dijit/Calendar.js b/lib/dijit/Calendar.js
index 9c86805d9..64f058010 100644
--- a/lib/dijit/Calendar.js
+++ b/lib/dijit/Calendar.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/Calendar",["dojo/_base/array","dojo/date","dojo/date/locale","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/_base/event","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/_base/sniff","./CalendarLite","./_Widget","./_CssStateMixin","./_TemplatedMixin","./form/DropDownButton","./hccss"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_4("dijit.Calendar",[_c,_d,_e],{cssStateNodes:{"decrementMonth":"dijitCalendarArrow","incrementMonth":"dijitCalendarArrow","previousYearLabelNode":"dijitCalendarPreviousYear","nextYearLabelNode":"dijitCalendarNextYear"},setValue:function(_12){_8.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.","","2.0");this.set("value",_12);},_createMonthWidget:function(){return new _11._MonthDropDownButton({id:this.id+"_mddb",tabIndex:-1,onMonthSelect:_a.hitch(this,"_onMonthSelect"),lang:this.lang,dateLocaleModule:this.dateLocaleModule},this.monthNode);},buildRendering:function(){this.inherited(arguments);this.connect(this.domNode,"onkeypress","_onKeyPress");this.connect(this.dateRowsNode,"onmouseover","_onDayMouseOver");this.connect(this.dateRowsNode,"onmouseout","_onDayMouseOut");this.connect(this.dateRowsNode,"onmousedown","_onDayMouseDown");this.connect(this.dateRowsNode,"onmouseup","_onDayMouseUp");},_onMonthSelect:function(_13){this._setCurrentFocusAttr(this.dateFuncObj.add(this.currentFocus,"month",_13-this.currentFocus.getMonth()));},_onDayMouseOver:function(evt){var _14=_6.contains(evt.target,"dijitCalendarDateLabel")?evt.target.parentNode:evt.target;if(_14&&((_14.dijitDateValue&&!_6.contains(_14,"dijitCalendarDisabledDate"))||_14==this.previousYearLabelNode||_14==this.nextYearLabelNode)){_6.add(_14,"dijitCalendarHoveredDate");this._currentNode=_14;}},_onDayMouseOut:function(evt){if(!this._currentNode){return;}if(evt.relatedTarget&&evt.relatedTarget.parentNode==this._currentNode){return;}var cls="dijitCalendarHoveredDate";if(_6.contains(this._currentNode,"dijitCalendarActiveDate")){cls+=" dijitCalendarActiveDate";}_6.remove(this._currentNode,cls);this._currentNode=null;},_onDayMouseDown:function(evt){var _15=evt.target.parentNode;if(_15&&_15.dijitDateValue&&!_6.contains(_15,"dijitCalendarDisabledDate")){_6.add(_15,"dijitCalendarActiveDate");this._currentNode=_15;}},_onDayMouseUp:function(evt){var _16=evt.target.parentNode;if(_16&&_16.dijitDateValue){_6.remove(_16,"dijitCalendarActiveDate");}},handleKey:function(evt){var _17=-1,_18,_19=this.currentFocus;switch(evt.charOrCode){case _9.RIGHT_ARROW:_17=1;case _9.LEFT_ARROW:_18="day";if(!this.isLeftToRight()){_17*=-1;}break;case _9.DOWN_ARROW:_17=1;case _9.UP_ARROW:_18="week";break;case _9.PAGE_DOWN:_17=1;case _9.PAGE_UP:_18=evt.ctrlKey||evt.altKey?"year":"month";break;case _9.END:_19=this.dateFuncObj.add(_19,"month",1);_18="day";case _9.HOME:_19=new this.dateClassObj(_19);_19.setDate(1);break;case _9.ENTER:case " ":this.set("value",this.currentFocus);break;default:return true;}if(_18){_19=this.dateFuncObj.add(_19,_18,_17);}this._setCurrentFocusAttr(_19);return false;},_onKeyPress:function(evt){if(!this.handleKey(evt)){_7.stop(evt);}},onValueSelected:function(){},onChange:function(_1a){this.onValueSelected(_1a);},getClassForDate:function(){}});_11._MonthDropDownButton=_4("dijit.Calendar._MonthDropDownButton",_10,{onMonthSelect:function(){},postCreate:function(){this.inherited(arguments);this.dropDown=new _11._MonthDropDown({id:this.id+"_mdd",onChange:this.onMonthSelect});},_setMonthAttr:function(_1b){var _1c=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_1b);this.dropDown.set("months",_1c);this.containerNode.innerHTML=(_b("ie")==6?"":"<div class='dijitSpacer'>"+this.dropDown.domNode.innerHTML+"</div>")+"<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>"+_1c[_1b.getMonth()]+"</div>";}});_11._MonthDropDown=_4("dijit.Calendar._MonthDropDown",[_d,_f],{months:[],templateString:"<div class='dijitCalendarMonthMenu dijitMenu' "+"data-dojo-attach-event='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>",_setMonthsAttr:function(_1d){this.domNode.innerHTML=_1.map(_1d,function(_1e,idx){return _1e?"<div class='dijitCalendarMonthLabel' month='"+idx+"'>"+_1e+"</div>":"";}).join("");},_onClick:function(evt){this.onChange(_5.get(evt.target,"month"));},onChange:function(){},_onMenuHover:function(evt){_6.toggle(evt.target,"dijitCalendarMonthLabelHover",evt.type=="mouseover");}});return _11;}); \ No newline at end of file
+define("dijit/Calendar",["dojo/_base/array","dojo/date","dojo/date/locale","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/_base/event","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/sniff","./CalendarLite","./_Widget","./_CssStateMixin","./_TemplatedMixin","./form/DropDownButton"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_4("dijit.Calendar",[_c,_d,_e],{cssStateNodes:{"decrementMonth":"dijitCalendarArrow","incrementMonth":"dijitCalendarArrow","previousYearLabelNode":"dijitCalendarPreviousYear","nextYearLabelNode":"dijitCalendarNextYear"},setValue:function(_12){_8.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.","","2.0");this.set("value",_12);},_createMonthWidget:function(){return new _11._MonthDropDownButton({id:this.id+"_mddb",tabIndex:-1,onMonthSelect:_a.hitch(this,"_onMonthSelect"),lang:this.lang,dateLocaleModule:this.dateLocaleModule},this.monthNode);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onkeydown","_onKeyDown");this.connect(this.dateRowsNode,"onmouseover","_onDayMouseOver");this.connect(this.dateRowsNode,"onmouseout","_onDayMouseOut");this.connect(this.dateRowsNode,"onmousedown","_onDayMouseDown");this.connect(this.dateRowsNode,"onmouseup","_onDayMouseUp");},_onMonthSelect:function(_13){var _14=new this.dateClassObj(this.currentFocus);_14.setDate(1);_14.setMonth(_13);var _15=this.dateModule.getDaysInMonth(_14);var _16=this.currentFocus.getDate();_14.setDate(Math.min(_16,_15));this._setCurrentFocusAttr(_14);},_onDayMouseOver:function(evt){var _17=_6.contains(evt.target,"dijitCalendarDateLabel")?evt.target.parentNode:evt.target;if(_17&&((_17.dijitDateValue&&!_6.contains(_17,"dijitCalendarDisabledDate"))||_17==this.previousYearLabelNode||_17==this.nextYearLabelNode)){_6.add(_17,"dijitCalendarHoveredDate");this._currentNode=_17;}},_onDayMouseOut:function(evt){if(!this._currentNode){return;}if(evt.relatedTarget&&evt.relatedTarget.parentNode==this._currentNode){return;}var cls="dijitCalendarHoveredDate";if(_6.contains(this._currentNode,"dijitCalendarActiveDate")){cls+=" dijitCalendarActiveDate";}_6.remove(this._currentNode,cls);this._currentNode=null;},_onDayMouseDown:function(evt){var _18=evt.target.parentNode;if(_18&&_18.dijitDateValue&&!_6.contains(_18,"dijitCalendarDisabledDate")){_6.add(_18,"dijitCalendarActiveDate");this._currentNode=_18;}},_onDayMouseUp:function(evt){var _19=evt.target.parentNode;if(_19&&_19.dijitDateValue){_6.remove(_19,"dijitCalendarActiveDate");}},handleKey:function(evt){var _1a=-1,_1b,_1c=this.currentFocus;switch(evt.keyCode){case _9.RIGHT_ARROW:_1a=1;case _9.LEFT_ARROW:_1b="day";if(!this.isLeftToRight()){_1a*=-1;}break;case _9.DOWN_ARROW:_1a=1;case _9.UP_ARROW:_1b="week";break;case _9.PAGE_DOWN:_1a=1;case _9.PAGE_UP:_1b=evt.ctrlKey||evt.altKey?"year":"month";break;case _9.END:_1c=this.dateModule.add(_1c,"month",1);_1b="day";case _9.HOME:_1c=new this.dateClassObj(_1c);_1c.setDate(1);break;case _9.ENTER:case _9.SPACE:this.set("value",this.currentFocus);break;default:return true;}if(_1b){_1c=this.dateModule.add(_1c,_1b,_1a);}this._setCurrentFocusAttr(_1c);return false;},_onKeyDown:function(evt){if(!this.handleKey(evt)){_7.stop(evt);}},onValueSelected:function(){},onChange:function(_1d){this.onValueSelected(_1d);},getClassForDate:function(){}});_11._MonthDropDownButton=_4("dijit.Calendar._MonthDropDownButton",_10,{onMonthSelect:function(){},postCreate:function(){this.inherited(arguments);this.dropDown=new _11._MonthDropDown({id:this.id+"_mdd",onChange:this.onMonthSelect});},_setMonthAttr:function(_1e){var _1f=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_1e);this.dropDown.set("months",_1f);this.containerNode.innerHTML=(_b("ie")==6?"":"<div class='dijitSpacer'>"+this.dropDown.domNode.innerHTML+"</div>")+"<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>"+_1f[_1e.getMonth()]+"</div>";}});_11._MonthDropDown=_4("dijit.Calendar._MonthDropDown",[_d,_f],{months:[],templateString:"<div class='dijitCalendarMonthMenu dijitMenu' "+"data-dojo-attach-event='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>",_setMonthsAttr:function(_20){this.domNode.innerHTML=_1.map(_20,function(_21,idx){return _21?"<div class='dijitCalendarMonthLabel' month='"+idx+"'>"+_21+"</div>":"";}).join("");},_onClick:function(evt){this.onChange(_5.get(evt.target,"month"));},onChange:function(){},_onMenuHover:function(evt){_6.toggle(evt.target,"dijitCalendarMonthLabelHover",evt.type=="mouseover");}});return _11;}); \ No newline at end of file
diff --git a/lib/dijit/Calendar.js.uncompressed.js b/lib/dijit/Calendar.js.uncompressed.js
new file mode 100644
index 000000000..8aafae0b6
--- /dev/null
+++ b/lib/dijit/Calendar.js.uncompressed.js
@@ -0,0 +1,312 @@
+define("dijit/Calendar", [
+ "dojo/_base/array", // array.map
+ "dojo/date",
+ "dojo/date/locale",
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.get
+ "dojo/dom-class", // domClass.add domClass.contains domClass.remove domClass.toggle
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("ie")
+ "./CalendarLite",
+ "./_Widget",
+ "./_CssStateMixin",
+ "./_TemplatedMixin",
+ "./form/DropDownButton"
+], function(array, date, local, declare, domAttr, domClass, event, kernel, keys, lang, has,
+ CalendarLite, _Widget, _CssStateMixin, _TemplatedMixin, DropDownButton){
+
+ // module:
+ // dijit/Calendar
+
+ var Calendar = declare("dijit.Calendar",
+ [CalendarLite, _Widget, _CssStateMixin], // _Widget for deprecated methods like setAttribute()
+ {
+ // summary:
+ // A simple GUI for choosing a date in the context of a monthly calendar.
+ //
+ // description:
+ // See CalendarLite for general description. Calendar extends CalendarLite, adding:
+ //
+ // - month drop down list
+ // - keyboard navigation
+ // - CSS classes for hover/mousepress on date, month, and year nodes
+ // - support of deprecated methods (will be removed in 2.0)
+
+ // Set node classes for various mouse events, see dijit._CssStateMixin for more details
+ cssStateNodes: {
+ "decrementMonth": "dijitCalendarArrow",
+ "incrementMonth": "dijitCalendarArrow",
+ "previousYearLabelNode": "dijitCalendarPreviousYear",
+ "nextYearLabelNode": "dijitCalendarNextYear"
+ },
+
+ setValue: function(/*Date*/ value){
+ // summary:
+ // Deprecated. Use set('value', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.", "", "2.0");
+ this.set('value', value);
+ },
+
+ _createMonthWidget: function(){
+ // summary:
+ // Creates the drop down button that displays the current month and lets user pick a new one
+
+ return new Calendar._MonthDropDownButton({
+ id: this.id + "_mddb",
+ tabIndex: -1,
+ onMonthSelect: lang.hitch(this, "_onMonthSelect"),
+ lang: this.lang,
+ dateLocaleModule: this.dateLocaleModule
+ }, this.monthNode);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Events specific to Calendar, not used in CalendarLite
+ this.connect(this.domNode, "onkeydown", "_onKeyDown");
+ this.connect(this.dateRowsNode, "onmouseover", "_onDayMouseOver");
+ this.connect(this.dateRowsNode, "onmouseout", "_onDayMouseOut");
+ this.connect(this.dateRowsNode, "onmousedown", "_onDayMouseDown");
+ this.connect(this.dateRowsNode, "onmouseup", "_onDayMouseUp");
+ },
+
+ _onMonthSelect: function(/*Number*/ newMonth){
+ // summary:
+ // Handler for when user selects a month from the drop down list
+ // tags:
+ // protected
+
+ // move to selected month, bounding by the number of days in the month
+ // (ex: jan 31 --> feb 28, not feb 31)
+ var date = new this.dateClassObj(this.currentFocus);
+ date.setDate(1);
+ date.setMonth(newMonth);
+ var daysInMonth = this.dateModule.getDaysInMonth(date);
+ var currentDate = this.currentFocus.getDate();
+ date.setDate(Math.min(currentDate, daysInMonth));
+ this._setCurrentFocusAttr(date);
+ },
+
+ _onDayMouseOver: function(/*Event*/ evt){
+ // summary:
+ // Handler for mouse over events on days, sets hovered style
+ // tags:
+ // protected
+
+ // event can occur on <td> or the <span> inside the td,
+ // set node to the <td>.
+ var node =
+ domClass.contains(evt.target, "dijitCalendarDateLabel") ?
+ evt.target.parentNode :
+ evt.target;
+
+ if(node && (
+ (node.dijitDateValue && !domClass.contains(node, "dijitCalendarDisabledDate"))
+ || node == this.previousYearLabelNode || node == this.nextYearLabelNode
+ )){
+ domClass.add(node, "dijitCalendarHoveredDate");
+ this._currentNode = node;
+ }
+ },
+
+ _onDayMouseOut: function(/*Event*/ evt){
+ // summary:
+ // Handler for mouse out events on days, clears hovered style
+ // tags:
+ // protected
+
+ if(!this._currentNode){ return; }
+
+ // if mouse out occurs moving from <td> to <span> inside <td>, ignore it
+ if(evt.relatedTarget && evt.relatedTarget.parentNode == this._currentNode){ return; }
+ var cls = "dijitCalendarHoveredDate";
+ if(domClass.contains(this._currentNode, "dijitCalendarActiveDate")){
+ cls += " dijitCalendarActiveDate";
+ }
+ domClass.remove(this._currentNode, cls);
+ this._currentNode = null;
+ },
+
+ _onDayMouseDown: function(/*Event*/ evt){
+ var node = evt.target.parentNode;
+ if(node && node.dijitDateValue && !domClass.contains(node, "dijitCalendarDisabledDate")){
+ domClass.add(node, "dijitCalendarActiveDate");
+ this._currentNode = node;
+ }
+ },
+
+ _onDayMouseUp: function(/*Event*/ evt){
+ var node = evt.target.parentNode;
+ if(node && node.dijitDateValue){
+ domClass.remove(node, "dijitCalendarActiveDate");
+ }
+ },
+
+ handleKey: function(/*Event*/ evt){
+ // summary:
+ // Provides keyboard navigation of calendar.
+ // description:
+ // Called from _onKeyDown() to handle keypress on a stand alone Calendar,
+ // and also from `dijit/form/_DateTimeTextBox` to pass a keydown event
+ // from the `dijit/form/DateTextBox` to be handled in this widget
+ // returns:
+ // False if the key was recognized as a navigation key,
+ // to indicate that the event was handled by Calendar and shouldn't be propagated
+ // tags:
+ // protected
+ var increment = -1,
+ interval,
+ newValue = this.currentFocus;
+ switch(evt.keyCode){
+ case keys.RIGHT_ARROW:
+ increment = 1;
+ //fallthrough...
+ case keys.LEFT_ARROW:
+ interval = "day";
+ if(!this.isLeftToRight()){ increment *= -1; }
+ break;
+ case keys.DOWN_ARROW:
+ increment = 1;
+ //fallthrough...
+ case keys.UP_ARROW:
+ interval = "week";
+ break;
+ case keys.PAGE_DOWN:
+ increment = 1;
+ //fallthrough...
+ case keys.PAGE_UP:
+ interval = evt.ctrlKey || evt.altKey ? "year" : "month";
+ break;
+ case keys.END:
+ // go to the next month
+ newValue = this.dateModule.add(newValue, "month", 1);
+ // subtract a day from the result when we're done
+ interval = "day";
+ //fallthrough...
+ case keys.HOME:
+ newValue = new this.dateClassObj(newValue);
+ newValue.setDate(1);
+ break;
+ case keys.ENTER:
+ case keys.SPACE:
+ this.set("value", this.currentFocus);
+ break;
+ default:
+ return true;
+ }
+
+ if(interval){
+ newValue = this.dateModule.add(newValue, interval, increment);
+ }
+
+ this._setCurrentFocusAttr(newValue);
+
+ return false;
+ },
+
+ _onKeyDown: function(/*Event*/ evt){
+ // summary:
+ // For handling keypress events on a stand alone calendar
+ if(!this.handleKey(evt)){
+ event.stop(evt);
+ }
+ },
+
+ onValueSelected: function(/*Date*/ /*===== date =====*/){
+ // summary:
+ // Deprecated. Notification that a date cell was selected. It may be the same as the previous value.
+ // description:
+ // Formerly used by `dijit/form/_DateTimeTextBox` (and thus `dijit/form/DateTextBox`)
+ // to get notification when the user has clicked a date. Now onExecute() (above) is used.
+ // tags:
+ // protected
+ },
+
+ onChange: function(value){
+ this.onValueSelected(value); // remove in 2.0
+ },
+
+ getClassForDate: function(/*===== dateObject, locale =====*/){
+ // summary:
+ // May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+ // for example to indicate a holiday in specified locale.
+ // dateObject: Date
+ // locale: String?
+ // tags:
+ // extension
+
+/*=====
+ return ""; // String
+=====*/
+ }
+ });
+
+ Calendar._MonthDropDownButton = declare("dijit.Calendar._MonthDropDownButton", DropDownButton, {
+ // summary:
+ // DropDownButton for the current month. Displays name of current month
+ // and a list of month names in the drop down
+
+ onMonthSelect: function(){ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.dropDown = new Calendar._MonthDropDown({
+ id: this.id + "_mdd", //do not change this id because it is referenced in the template
+ onChange: this.onMonthSelect
+ });
+ },
+ _setMonthAttr: function(month){
+ // summary:
+ // Set the current month to display as a label
+ var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month);
+ this.dropDown.set("months", monthNames);
+
+ // Set name of current month and also fill in spacer element with all the month names
+ // (invisible) so that the maximum width will affect layout. But not on IE6 because then
+ // the center <TH> overlaps the right <TH> (due to a browser bug).
+ this.containerNode.innerHTML =
+ (has("ie") == 6 ? "" : "<div class='dijitSpacer'>" + this.dropDown.domNode.innerHTML + "</div>") +
+ "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" + monthNames[month.getMonth()] + "</div>";
+ }
+ });
+
+ Calendar._MonthDropDown = declare("dijit.Calendar._MonthDropDown", [_Widget, _TemplatedMixin], {
+ // summary:
+ // The list-of-months drop down from the MonthDropDownButton
+
+ // months: String[]
+ // List of names of months, possibly w/some undefined entries for Hebrew leap months
+ // (ex: ["January", "February", undefined, "April", ...])
+ months: [],
+
+ templateString: "<div class='dijitCalendarMonthMenu dijitMenu' " +
+ "data-dojo-attach-event='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>",
+
+ _setMonthsAttr: function(/*String[]*/ months){
+ this.domNode.innerHTML = array.map(months, function(month, idx){
+ return month ? "<div class='dijitCalendarMonthLabel' month='" + idx +"'>" + month + "</div>" : "";
+ }).join("");
+ },
+
+ _onClick: function(/*Event*/ evt){
+ this.onChange(domAttr.get(evt.target, "month"));
+ },
+
+ onChange: function(/*Number*/ /*===== month =====*/){
+ // summary:
+ // Callback when month is selected from drop down
+ },
+
+ _onMenuHover: function(evt){
+ domClass.toggle(evt.target, "dijitCalendarMonthLabelHover", evt.type == "mouseover");
+ }
+ });
+
+ return Calendar;
+});
diff --git a/lib/dijit/CalendarLite.js b/lib/dijit/CalendarLite.js
index bd84f6d87..48c05d224 100644
--- a/lib/dijit/CalendarLite.js
+++ b/lib/dijit/CalendarLite.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/Calendar.html":"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" aria-labelledby=\"${id}_mddb ${id}_year\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div data-dojo-attach-point=\"monthNode\">\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t${!dayCellsHtml}\n\t\t</tr>\n\t</thead>\n\t<tbody data-dojo-attach-point=\"dateRowsNode\" data-dojo-attach-event=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t\t${!dateRowsHtml}\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\" role=\"presentation\">\n\t\t\t\t<div class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span data-dojo-attach-point=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\" role=\"button\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\" role=\"button\" id=\"${id}_year\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\" role=\"button\"></span>\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\n"}});define("dijit/CalendarLite",["dojo/_base/array","dojo/_base/declare","dojo/cldr/supplemental","dojo/date","dojo/date/locale","dojo/dom","dojo/dom-class","dojo/_base/event","dojo/_base/lang","dojo/_base/sniff","dojo/string","dojo/_base/window","./_WidgetBase","./_TemplatedMixin","dojo/text!./templates/Calendar.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){var _10=_2("dijit.CalendarLite",[_d,_e],{templateString:_f,dowTemplateString:"<th class=\"dijitReset dijitCalendarDayLabelTemplate\" role=\"columnheader\"><span class=\"dijitCalendarDayLabel\">${d}</span></th>",dateTemplateString:"<td class=\"dijitReset\" role=\"gridcell\" data-dojo-attach-point=\"dateCells\"><span class=\"dijitCalendarDateLabel\" data-dojo-attach-point=\"dateLabels\"></span></td>",weekTemplateString:"<tr class=\"dijitReset dijitCalendarWeekTemplate\" role=\"row\">${d}${d}${d}${d}${d}${d}${d}</tr>",value:new Date(""),datePackage:_4,dayWidth:"narrow",tabIndex:"0",currentFocus:new Date(),baseClass:"dijitCalendar",_isValidDate:function(_11){return _11&&!isNaN(_11)&&typeof _11=="object"&&_11.toString()!=this.constructor.prototype.value.toString();},_getValueAttr:function(){if(this.value&&!isNaN(this.value)){var _12=new this.dateClassObj(this.value);_12.setHours(0,0,0,0);if(_12.getDate()<this.value.getDate()){_12=this.dateFuncObj.add(_12,"hour",1);}return _12;}else{return null;}},_setValueAttr:function(_13,_14){if(_13){_13=new this.dateClassObj(_13);}if(this._isValidDate(_13)){if(!this._isValidDate(this.value)||this.dateFuncObj.compare(_13,this.value)){_13.setHours(1,0,0,0);if(!this.isDisabledDate(_13,this.lang)){this._set("value",_13);this.set("currentFocus",_13);if(_14||typeof _14=="undefined"){this.onChange(this.get("value"));}}}}else{this._set("value",null);this.set("currentFocus",this.currentFocus);}},_setText:function(_15,_16){while(_15.firstChild){_15.removeChild(_15.firstChild);}_15.appendChild(_c.doc.createTextNode(_16));},_populateGrid:function(){var _17=new this.dateClassObj(this.currentFocus);_17.setDate(1);var _18=_17.getDay(),_19=this.dateFuncObj.getDaysInMonth(_17),_1a=this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(_17,"month",-1)),_1b=new this.dateClassObj(),_1c=_3.getFirstDayOfWeek(this.lang);if(_1c>_18){_1c-=7;}this._date2cell={};_1.forEach(this.dateCells,function(_1d,idx){var i=idx+_1c;var _1e=new this.dateClassObj(_17),_1f,_20="dijitCalendar",adj=0;if(i<_18){_1f=_1a-_18+i+1;adj=-1;_20+="Previous";}else{if(i>=(_18+_19)){_1f=i-_18-_19+1;adj=1;_20+="Next";}else{_1f=i-_18+1;_20+="Current";}}if(adj){_1e=this.dateFuncObj.add(_1e,"month",adj);}_1e.setDate(_1f);if(!this.dateFuncObj.compare(_1e,_1b,"date")){_20="dijitCalendarCurrentDate "+_20;}if(this._isSelectedDate(_1e,this.lang)){_20="dijitCalendarSelectedDate "+_20;_1d.setAttribute("aria-selected",true);}else{_1d.setAttribute("aria-selected",false);}if(this.isDisabledDate(_1e,this.lang)){_20="dijitCalendarDisabledDate "+_20;_1d.setAttribute("aria-disabled",true);}else{_20="dijitCalendarEnabledDate "+_20;_1d.removeAttribute("aria-disabled");}var _21=this.getClassForDate(_1e,this.lang);if(_21){_20=_21+" "+_20;}_1d.className=_20+"Month dijitCalendarDateTemplate";var _22=_1e.valueOf();this._date2cell[_22]=_1d;_1d.dijitDateValue=_22;this._setText(this.dateLabels[idx],_1e.getDateLocalized?_1e.getDateLocalized(this.lang):_1e.getDate());},this);this.monthWidget.set("month",_17);var y=_17.getFullYear()-1;var d=new this.dateClassObj();_1.forEach(["previous","current","next"],function(_23){d.setFullYear(y++);this._setText(this[_23+"YearLabelNode"],this.dateLocaleModule.format(d,{selector:"year",locale:this.lang}));},this);},goToToday:function(){this.set("value",new this.dateClassObj());},constructor:function(_24){this.datePackage=_24.datePackage||this.datePackage;this.dateFuncObj=typeof this.datePackage=="string"?_9.getObject(this.datePackage,false):this.datePackage;this.dateClassObj=this.dateFuncObj.Date||Date;this.dateLocaleModule=_9.getObject("locale",false,this.dateFuncObj);},_createMonthWidget:function(){return _10._MonthWidget({id:this.id+"_mw",lang:this.lang,dateLocaleModule:this.dateLocaleModule},this.monthNode);},buildRendering:function(){var d=this.dowTemplateString,_25=this.dateLocaleModule.getNames("days",this.dayWidth,"standAlone",this.lang),_26=_3.getFirstDayOfWeek(this.lang);this.dayCellsHtml=_b.substitute([d,d,d,d,d,d,d].join(""),{d:""},function(){return _25[_26++%7];});var r=_b.substitute(this.weekTemplateString,{d:this.dateTemplateString});this.dateRowsHtml=[r,r,r,r,r,r].join("");this.dateCells=[];this.dateLabels=[];this.inherited(arguments);_6.setSelectable(this.domNode,false);var _27=new this.dateClassObj(this.currentFocus);this._supportingWidgets.push(this.monthWidget=this._createMonthWidget());this.set("currentFocus",_27,false);var _28=_9.hitch(this,function(_29,_2a,_2b){this.connect(this[_29],"onclick",function(){this._setCurrentFocusAttr(this.dateFuncObj.add(this.currentFocus,_2a,_2b));});});_28("incrementMonth","month",1);_28("decrementMonth","month",-1);_28("nextYearLabelNode","year",1);_28("previousYearLabelNode","year",-1);},_setCurrentFocusAttr:function(_2c,_2d){var _2e=this.currentFocus,_2f=_2e&&this._date2cell?this._date2cell[_2e.valueOf()]:null;_2c=new this.dateClassObj(_2c);_2c.setHours(1,0,0,0);this._set("currentFocus",_2c);this._populateGrid();var _30=this._date2cell[_2c.valueOf()];_30.setAttribute("tabIndex",this.tabIndex);if(this.focused||_2d){_30.focus();}if(_2f&&_2f!=_30){if(_a("webkit")){_2f.setAttribute("tabIndex","-1");}else{_2f.removeAttribute("tabIndex");}}},focus:function(){this._setCurrentFocusAttr(this.currentFocus,true);},_onDayClick:function(evt){_8.stop(evt);for(var _31=evt.target;_31&&!_31.dijitDateValue;_31=_31.parentNode){}if(_31&&!_7.contains(_31,"dijitCalendarDisabledDate")){this.set("value",_31.dijitDateValue);}},onChange:function(){},_isSelectedDate:function(_32){return this._isValidDate(this.value)&&!this.dateFuncObj.compare(_32,this.value,"date");},isDisabledDate:function(){},getClassForDate:function(){}});_10._MonthWidget=_2("dijit.CalendarLite._MonthWidget",_d,{_setMonthAttr:function(_33){var _34=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_33),_35=(_a("ie")==6?"":"<div class='dijitSpacer'>"+_1.map(_34,function(s){return "<div>"+s+"</div>";}).join("")+"</div>");this.domNode.innerHTML=_35+"<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>"+_34[_33.getMonth()]+"</div>";}});return _10;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/Calendar.html":"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" aria-labelledby=\"${id}_mddb ${id}_year\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div data-dojo-attach-point=\"monthNode\">\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr role=\"row\">\n\t\t\t${!dayCellsHtml}\n\t\t</tr>\n\t</thead>\n\t<tbody data-dojo-attach-point=\"dateRowsNode\" data-dojo-attach-event=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t\t${!dateRowsHtml}\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\" role=\"presentation\">\n\t\t\t\t<div class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span data-dojo-attach-point=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\" role=\"button\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\" role=\"button\" id=\"${id}_year\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\" role=\"button\"></span>\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\n"}});define("dijit/CalendarLite",["dojo/_base/array","dojo/_base/declare","dojo/cldr/supplemental","dojo/date","dojo/date/locale","dojo/date/stamp","dojo/dom","dojo/dom-class","dojo/_base/event","dojo/_base/lang","dojo/sniff","dojo/string","./_WidgetBase","./_TemplatedMixin","dojo/text!./templates/Calendar.html","./hccss"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){var _10=_2("dijit.CalendarLite",[_d,_e],{templateString:_f,dowTemplateString:"<th class=\"dijitReset dijitCalendarDayLabelTemplate\" role=\"columnheader\"><span class=\"dijitCalendarDayLabel\">${d}</span></th>",dateTemplateString:"<td class=\"dijitReset\" role=\"gridcell\" data-dojo-attach-point=\"dateCells\"><span class=\"dijitCalendarDateLabel\" data-dojo-attach-point=\"dateLabels\"></span></td>",weekTemplateString:"<tr class=\"dijitReset dijitCalendarWeekTemplate\" role=\"row\">${d}${d}${d}${d}${d}${d}${d}</tr>",value:new Date(""),datePackage:"",dayWidth:"narrow",tabIndex:"0",currentFocus:new Date(),baseClass:"dijitCalendar",_isValidDate:function(_11){return _11&&!isNaN(_11)&&typeof _11=="object"&&_11.toString()!=this.constructor.prototype.value.toString();},_getValueAttr:function(){if(this.value&&!isNaN(this.value)){var _12=new this.dateClassObj(this.value);_12.setHours(0,0,0,0);if(_12.getDate()<this.value.getDate()){_12=this.dateModule.add(_12,"hour",1);}return _12;}else{return null;}},_setValueAttr:function(_13,_14){if(typeof _13=="string"){_13=_6.fromISOString(_13);}_13=this._patchDate(_13);if(this._isValidDate(_13)&&!this.isDisabledDate(_13,this.lang)){this._set("value",_13);this.set("currentFocus",_13);this._markSelectedDates([_13]);if(this._created&&(_14||typeof _14=="undefined")){this.onChange(this.get("value"));}}else{this._set("value",null);this._markSelectedDates([]);}},_patchDate:function(_15){if(_15){_15=new this.dateClassObj(_15);_15.setHours(1,0,0,0);}return _15;},_setText:function(_16,_17){while(_16.firstChild){_16.removeChild(_16.firstChild);}_16.appendChild(_16.ownerDocument.createTextNode(_17));},_populateGrid:function(){var _18=new this.dateClassObj(this.currentFocus);_18.setDate(1);var _19=_18.getDay(),_1a=this.dateModule.getDaysInMonth(_18),_1b=this.dateModule.getDaysInMonth(this.dateModule.add(_18,"month",-1)),_1c=new this.dateClassObj(),_1d=_3.getFirstDayOfWeek(this.lang);if(_1d>_19){_1d-=7;}this._date2cell={};_1.forEach(this.dateCells,function(_1e,idx){var i=idx+_1d;var _1f=new this.dateClassObj(_18),_20,_21="dijitCalendar",adj=0;if(i<_19){_20=_1b-_19+i+1;adj=-1;_21+="Previous";}else{if(i>=(_19+_1a)){_20=i-_19-_1a+1;adj=1;_21+="Next";}else{_20=i-_19+1;_21+="Current";}}if(adj){_1f=this.dateModule.add(_1f,"month",adj);}_1f.setDate(_20);if(!this.dateModule.compare(_1f,_1c,"date")){_21="dijitCalendarCurrentDate "+_21;}if(this.isDisabledDate(_1f,this.lang)){_21="dijitCalendarDisabledDate "+_21;_1e.setAttribute("aria-disabled","true");}else{_21="dijitCalendarEnabledDate "+_21;_1e.removeAttribute("aria-disabled");_1e.setAttribute("aria-selected","false");}var _22=this.getClassForDate(_1f,this.lang);if(_22){_21=_22+" "+_21;}_1e.className=_21+"Month dijitCalendarDateTemplate";var _23=_1f.valueOf();this._date2cell[_23]=_1e;_1e.dijitDateValue=_23;this._setText(this.dateLabels[idx],_1f.getDateLocalized?_1f.getDateLocalized(this.lang):_1f.getDate());},this);},_populateControls:function(){var _24=new this.dateClassObj(this.currentFocus);_24.setDate(1);this.monthWidget.set("month",_24);var y=_24.getFullYear()-1;var d=new this.dateClassObj();_1.forEach(["previous","current","next"],function(_25){d.setFullYear(y++);this._setText(this[_25+"YearLabelNode"],this.dateLocaleModule.format(d,{selector:"year",locale:this.lang}));},this);},goToToday:function(){this.set("value",new this.dateClassObj());},constructor:function(_26){this.dateModule=_26.datePackage?_a.getObject(_26.datePackage,false):_4;this.dateClassObj=this.dateModule.Date||Date;this.dateLocaleModule=_26.datePackage?_a.getObject(_26.datePackage+".locale",false):_5;},_createMonthWidget:function(){return _10._MonthWidget({id:this.id+"_mw",lang:this.lang,dateLocaleModule:this.dateLocaleModule},this.monthNode);},buildRendering:function(){var d=this.dowTemplateString,_27=this.dateLocaleModule.getNames("days",this.dayWidth,"standAlone",this.lang),_28=_3.getFirstDayOfWeek(this.lang);this.dayCellsHtml=_c.substitute([d,d,d,d,d,d,d].join(""),{d:""},function(){return _27[_28++%7];});var r=_c.substitute(this.weekTemplateString,{d:this.dateTemplateString});this.dateRowsHtml=[r,r,r,r,r,r].join("");this.dateCells=[];this.dateLabels=[];this.inherited(arguments);_7.setSelectable(this.domNode,false);var _29=new this.dateClassObj(this.currentFocus);this.monthWidget=this._createMonthWidget();this.set("currentFocus",_29,false);},postCreate:function(){this.inherited(arguments);this._connectControls();},_connectControls:function(){var _2a=_a.hitch(this,function(_2b,_2c,_2d){this.connect(this[_2b],"onclick",function(){this._setCurrentFocusAttr(this.dateModule.add(this.currentFocus,_2c,_2d));});});_2a("incrementMonth","month",1);_2a("decrementMonth","month",-1);_2a("nextYearLabelNode","year",1);_2a("previousYearLabelNode","year",-1);},_setCurrentFocusAttr:function(_2e,_2f){var _30=this.currentFocus,_31=this._getNodeByDate(_30);_2e=this._patchDate(_2e);this._set("currentFocus",_2e);if(!this._date2cell||this.dateModule.difference(_30,_2e,"month")!=0){this._populateGrid();this._populateControls();this._markSelectedDates([this.value]);}var _32=this._getNodeByDate(_2e);_32.setAttribute("tabIndex",this.tabIndex);if(this.focused||_2f){_32.focus();}if(_31&&_31!=_32){if(_b("webkit")){_31.setAttribute("tabIndex","-1");}else{_31.removeAttribute("tabIndex");}}},focus:function(){this._setCurrentFocusAttr(this.currentFocus,true);},_onDayClick:function(evt){_9.stop(evt);for(var _33=evt.target;_33&&!_33.dijitDateValue;_33=_33.parentNode){}if(_33&&!_8.contains(_33,"dijitCalendarDisabledDate")){this.set("value",_33.dijitDateValue);}},_getNodeByDate:function(_34){_34=this._patchDate(_34);return _34&&this._date2cell?this._date2cell[_34.valueOf()]:null;},_markSelectedDates:function(_35){function _36(_37,_38){_8.toggle(_38,"dijitCalendarSelectedDate",_37);_38.setAttribute("aria-selected",_37?"true":"false");};_1.forEach(this._selectedCells||[],_a.partial(_36,false));this._selectedCells=_1.filter(_1.map(_35,this._getNodeByDate,this),function(n){return n;});_1.forEach(this._selectedCells,_a.partial(_36,true));},onChange:function(){},isDisabledDate:function(){},getClassForDate:function(){}});_10._MonthWidget=_2("dijit.CalendarLite._MonthWidget",_d,{_setMonthAttr:function(_39){var _3a=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang,_39),_3b=(_b("ie")==6?"":"<div class='dijitSpacer'>"+_1.map(_3a,function(s){return "<div>"+s+"</div>";}).join("")+"</div>");this.domNode.innerHTML=_3b+"<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>"+_3a[_39.getMonth()]+"</div>";}});return _10;}); \ No newline at end of file
diff --git a/lib/dijit/CalendarLite.js.uncompressed.js b/lib/dijit/CalendarLite.js.uncompressed.js
new file mode 100644
index 000000000..960cf520d
--- /dev/null
+++ b/lib/dijit/CalendarLite.js.uncompressed.js
@@ -0,0 +1,501 @@
+require({cache:{
+'url:dijit/templates/Calendar.html':"<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" aria-labelledby=\"${id}_mddb ${id}_year\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div data-dojo-attach-point=\"monthNode\">\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset dijitCalendarArrow' data-dojo-attach-point=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" role=\"presentation\"/>\n\t\t\t\t<span data-dojo-attach-point=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr role=\"row\">\n\t\t\t${!dayCellsHtml}\n\t\t</tr>\n\t</thead>\n\t<tbody data-dojo-attach-point=\"dateRowsNode\" data-dojo-attach-event=\"onclick: _onDayClick\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t\t${!dateRowsHtml}\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\" role=\"presentation\">\n\t\t\t\t<div class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span data-dojo-attach-point=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\" role=\"button\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\" role=\"button\" id=\"${id}_year\"></span>\n\t\t\t\t\t<span data-dojo-attach-point=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\" role=\"button\"></span>\n\t\t\t\t</div>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\n"}});
+define("dijit/CalendarLite", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/cldr/supplemental", // cldrSupplemental.getFirstDayOfWeek
+ "dojo/date", // date
+ "dojo/date/locale",
+ "dojo/date/stamp", // stamp.fromISOString
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-class", // domClass.contains
+ "dojo/_base/event", // event.stop
+ "dojo/_base/lang", // lang.getObject, lang.hitch
+ "dojo/sniff", // has("ie") has("webkit")
+ "dojo/string", // string.substitute
+ "./_WidgetBase",
+ "./_TemplatedMixin",
+ "dojo/text!./templates/Calendar.html",
+ "./hccss" // not used directly, but sets CSS class on <body>
+], function(array, declare, cldrSupplemental, date, locale, stamp, dom, domClass, event, lang, has, string,
+ _WidgetBase, _TemplatedMixin, template){
+
+
+ // module:
+ // dijit/CalendarLite
+
+ var CalendarLite = declare("dijit.CalendarLite", [_WidgetBase, _TemplatedMixin], {
+ // summary:
+ // Lightweight version of Calendar widget aimed towards mobile use
+ //
+ // description:
+ // A simple GUI for choosing a date in the context of a monthly calendar.
+ // This widget can't be used in a form because it doesn't serialize the date to an
+ // `<input>` field. For a form element, use dijit/form/DateTextBox instead.
+ //
+ // Note that the parser takes all dates attributes passed in the
+ // [RFC 3339 format](http://www.faqs.org/rfcs/rfc3339.html), e.g. `2005-06-30T08:05:00-07:00`
+ // so that they are serializable and locale-independent.
+ //
+ // Also note that this widget isn't keyboard accessible; use dijit.Calendar for that
+ // example:
+ // | var calendar = new dijit.CalendarLite({}, dojo.byId("calendarNode"));
+ //
+ // example:
+ // | <div data-dojo-type="dijit/CalendarLite"></div>
+
+ // Template for main calendar
+ templateString: template,
+
+ // Template for cell for a day of the week (ex: M)
+ dowTemplateString: '<th class="dijitReset dijitCalendarDayLabelTemplate" role="columnheader"><span class="dijitCalendarDayLabel">${d}</span></th>',
+
+ // Templates for a single date (ex: 13), and for a row for a week (ex: 20 21 22 23 24 25 26)
+ dateTemplateString: '<td class="dijitReset" role="gridcell" data-dojo-attach-point="dateCells"><span class="dijitCalendarDateLabel" data-dojo-attach-point="dateLabels"></span></td>',
+ weekTemplateString: '<tr class="dijitReset dijitCalendarWeekTemplate" role="row">${d}${d}${d}${d}${d}${d}${d}</tr>',
+
+ // value: Date
+ // The currently selected Date, initially set to invalid date to indicate no selection.
+ value: new Date(""),
+ // TODO: for 2.0 make this a string (ISO format) rather than a Date
+
+ // 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
+
+ // dayWidth: String
+ // How to represent the days of the week in the calendar header. See locale
+ dayWidth: "narrow",
+
+ // tabIndex: String
+ // Order fields are traversed when user hits the tab key
+ tabIndex: "0",
+
+ // currentFocus: Date
+ // Date object containing the currently focused date, or the date which would be focused
+ // if the calendar itself was focused. Also indicates which year and month to display,
+ // i.e. the current "page" the calendar is on.
+ currentFocus: new Date(),
+
+ baseClass:"dijitCalendar",
+
+ _isValidDate: function(/*Date*/ value){
+ // summary:
+ // Runs various tests on the value, checking that it's a valid date, rather
+ // than blank or NaN.
+ // tags:
+ // private
+ return value && !isNaN(value) && typeof value == "object" &&
+ value.toString() != this.constructor.prototype.value.toString();
+ },
+
+ _getValueAttr: function(){
+ // summary:
+ // Support get('value')
+
+ // this.value is set to 1AM, but return midnight, local time for back-compat
+ if(this.value && !isNaN(this.value)){
+ var value = new this.dateClassObj(this.value);
+ value.setHours(0, 0, 0, 0);
+
+ // If daylight savings pushes midnight to the previous date, fix the Date
+ // object to point at 1am so it will represent the correct day. See #9366
+ if(value.getDate() < this.value.getDate()){
+ value = this.dateModule.add(value, "hour", 1);
+ }
+ return value;
+ }else{
+ return null;
+ }
+ },
+
+ _setValueAttr: function(/*Date|Number*/ value, /*Boolean*/ priorityChange){
+ // summary:
+ // Support set("value", ...)
+ // description:
+ // Set the current date and update the UI. If the date is disabled, the value will
+ // not change, but the display will change to the corresponding month.
+ // value:
+ // Either a Date or the number of seconds since 1970.
+ // tags:
+ // protected
+ if(typeof value == "string"){
+ value = stamp.fromISOString(value);
+ }
+ value = this._patchDate(value);
+
+ if(this._isValidDate(value) && !this.isDisabledDate(value, this.lang)){
+ this._set("value", value);
+
+ // Set focus cell to the new value. Arguably this should only happen when there isn't a current
+ // focus point. This will also repopulate the grid to new month/year if necessary.
+ this.set("currentFocus", value);
+
+ // Mark the selected date
+ this._markSelectedDates([value]);
+
+ if(this._created && (priorityChange || typeof priorityChange == "undefined")){
+ this.onChange(this.get('value'));
+ }
+ }else{
+ // clear value, and mark all dates as unselected
+ this._set("value", null);
+ this._markSelectedDates([]);
+ }
+ },
+
+ _patchDate: function(/*Date|Number*/ value){
+ // summary:
+ // Convert Number into Date, or copy Date object. Then, round to nearest day,
+ // setting to 1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
+ if(value){
+ value = new this.dateClassObj(value);
+ value.setHours(1, 0, 0, 0);
+ }
+ return value;
+ },
+
+ _setText: function(node, text){
+ // summary:
+ // This just sets the content of node to the specified text.
+ // Can't do "node.innerHTML=text" because of an IE bug w/tables, see #3434.
+ // tags:
+ // private
+ while(node.firstChild){
+ node.removeChild(node.firstChild);
+ }
+ node.appendChild(node.ownerDocument.createTextNode(text));
+ },
+
+ _populateGrid: function(){
+ // summary:
+ // Fills in the calendar grid with each day (1-31).
+ // Call this on creation, when moving to a new month.
+ // tags:
+ // private
+
+ var month = new this.dateClassObj(this.currentFocus);
+ month.setDate(1);
+
+ var firstDay = month.getDay(),
+ daysInMonth = this.dateModule.getDaysInMonth(month),
+ daysInPreviousMonth = this.dateModule.getDaysInMonth(this.dateModule.add(month, "month", -1)),
+ today = new this.dateClassObj(),
+ dayOffset = cldrSupplemental.getFirstDayOfWeek(this.lang);
+ if(dayOffset > firstDay){ dayOffset -= 7; }
+
+ // Mapping from date (as specified by number returned from Date.valueOf()) to corresponding <td>
+ this._date2cell = {};
+
+ // Iterate through dates in the calendar and fill in date numbers and style info
+ array.forEach(this.dateCells, function(template, idx){
+ var i = idx + dayOffset;
+ var date = new this.dateClassObj(month),
+ number, clazz = "dijitCalendar", adj = 0;
+
+ if(i < firstDay){
+ number = daysInPreviousMonth - firstDay + i + 1;
+ adj = -1;
+ clazz += "Previous";
+ }else if(i >= (firstDay + daysInMonth)){
+ number = i - firstDay - daysInMonth + 1;
+ adj = 1;
+ clazz += "Next";
+ }else{
+ number = i - firstDay + 1;
+ clazz += "Current";
+ }
+
+ if(adj){
+ date = this.dateModule.add(date, "month", adj);
+ }
+ date.setDate(number);
+
+ if(!this.dateModule.compare(date, today, "date")){
+ clazz = "dijitCalendarCurrentDate " + clazz;
+ }
+
+ if(this.isDisabledDate(date, this.lang)){
+ clazz = "dijitCalendarDisabledDate " + clazz;
+ template.setAttribute("aria-disabled", "true");
+ }else{
+ clazz = "dijitCalendarEnabledDate " + clazz;
+ template.removeAttribute("aria-disabled");
+ template.setAttribute("aria-selected", "false");
+ }
+
+ var clazz2 = this.getClassForDate(date, this.lang);
+ if(clazz2){
+ clazz = clazz2 + " " + clazz;
+ }
+
+ template.className = clazz + "Month dijitCalendarDateTemplate";
+
+ // Each cell has an associated integer value representing it's date
+ var dateVal = date.valueOf();
+ this._date2cell[dateVal] = template;
+ template.dijitDateValue = dateVal;
+
+ // Set Date string (ex: "13").
+ this._setText(this.dateLabels[idx], date.getDateLocalized ? date.getDateLocalized(this.lang) : date.getDate());
+ }, this);
+ },
+
+ _populateControls: function(){
+ // summary:
+ // Fill in localized month, and prev/current/next years
+ // tags:
+ // protected
+
+ var month = new this.dateClassObj(this.currentFocus);
+ month.setDate(1);
+
+ // set name of this month
+ this.monthWidget.set("month", month);
+
+ var y = month.getFullYear() - 1;
+ var d = new this.dateClassObj();
+ array.forEach(["previous", "current", "next"], function(name){
+ d.setFullYear(y++);
+ this._setText(this[name+"YearLabelNode"],
+ this.dateLocaleModule.format(d, {selector:'year', locale:this.lang}));
+ }, this);
+ },
+
+ goToToday: function(){
+ // summary:
+ // Sets calendar's value to today's date
+ this.set('value', new this.dateClassObj());
+ },
+
+ 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;
+ },
+
+ _createMonthWidget: function(){
+ // summary:
+ // Creates the drop down button that displays the current month and lets user pick a new one
+
+ return CalendarLite._MonthWidget({
+ id: this.id + "_mw",
+ lang: this.lang,
+ dateLocaleModule: this.dateLocaleModule
+ }, this.monthNode);
+ },
+
+ buildRendering: function(){
+ // Markup for days of the week (referenced from template)
+ var d = this.dowTemplateString,
+ dayNames = this.dateLocaleModule.getNames('days', this.dayWidth, 'standAlone', this.lang),
+ dayOffset = cldrSupplemental.getFirstDayOfWeek(this.lang);
+ this.dayCellsHtml = string.substitute([d,d,d,d,d,d,d].join(""), {d: ""}, function(){
+ return dayNames[dayOffset++ % 7];
+ });
+
+ // Markup for dates of the month (referenced from template), but without numbers filled in
+ var r = string.substitute(this.weekTemplateString, {d: this.dateTemplateString});
+ this.dateRowsHtml = [r,r,r,r,r,r].join("");
+
+ // Instantiate from template.
+ // dateCells and dateLabels arrays filled when _Templated parses my template.
+ this.dateCells = [];
+ this.dateLabels = [];
+ this.inherited(arguments);
+
+ dom.setSelectable(this.domNode, false);
+
+ var dateObj = new this.dateClassObj(this.currentFocus);
+
+ this.monthWidget = this._createMonthWidget();
+
+ this.set('currentFocus', dateObj, false); // draw the grid to the month specified by currentFocus
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this._connectControls();
+ },
+
+ _connectControls: function(){
+ // summary:
+ // Set up connects for increment/decrement of months/years
+ // tags:
+ // protected
+
+ var connect = lang.hitch(this, function(nodeProp, part, amount){
+ this.connect(this[nodeProp], "onclick", function(){
+ this._setCurrentFocusAttr(this.dateModule.add(this.currentFocus, part, amount));
+ });
+ });
+
+ connect("incrementMonth", "month", 1);
+ connect("decrementMonth", "month", -1);
+ connect("nextYearLabelNode", "year", 1);
+ connect("previousYearLabelNode", "year", -1);
+ },
+
+ _setCurrentFocusAttr: function(/*Date*/ date, /*Boolean*/ forceFocus){
+ // summary:
+ // If the calendar currently has focus, then focuses specified date,
+ // changing the currently displayed month/year if necessary.
+ // If the calendar doesn't have focus, updates currently
+ // displayed month/year, and sets the cell that will get focus
+ // when Calendar is focused.
+ // forceFocus:
+ // If true, will focus() the cell even if calendar itself doesn't have focus
+
+ var oldFocus = this.currentFocus,
+ oldCell = this._getNodeByDate(oldFocus);
+ date = this._patchDate(date);
+
+ this._set("currentFocus", date);
+
+ // If the focus is on a different month than the current calendar month, switch the displayed month.
+ // Also will populate the grid initially, on Calendar creation.
+ if(!this._date2cell || this.dateModule.difference(oldFocus, date, "month") != 0){
+ this._populateGrid();
+ this._populateControls();
+ this._markSelectedDates([this.value]);
+ }
+
+ // set tabIndex=0 on new cell, and focus it (but only if Calendar itself is focused)
+ var newCell = this._getNodeByDate(date);
+ newCell.setAttribute("tabIndex", this.tabIndex);
+ if(this.focused || forceFocus){
+ newCell.focus();
+ }
+
+ // set tabIndex=-1 on old focusable cell
+ if(oldCell && oldCell != newCell){
+ if(has("webkit")){ // see #11064 about webkit bug
+ oldCell.setAttribute("tabIndex", "-1");
+ }else{
+ oldCell.removeAttribute("tabIndex");
+ }
+ }
+ },
+
+ focus: function(){
+ // summary:
+ // Focus the calendar by focusing one of the calendar cells
+ this._setCurrentFocusAttr(this.currentFocus, true);
+ },
+
+ _onDayClick: function(/*Event*/ evt){
+ // summary:
+ // Handler for day clicks, selects the date if appropriate
+ // tags:
+ // protected
+ event.stop(evt);
+ for(var node = evt.target; node && !node.dijitDateValue; node = node.parentNode);
+ if(node && !domClass.contains(node, "dijitCalendarDisabledDate")){
+ this.set('value', node.dijitDateValue);
+ }
+ },
+
+ _getNodeByDate : function(/*Date*/ value){
+ // summary:
+ // Returns the cell corresponding to the date, or null if the date is not within the currently
+ // displayed month.
+ value = this._patchDate(value);
+ return value && this._date2cell ? this._date2cell[value.valueOf()] : null;
+ },
+
+ _markSelectedDates: function(/*Date[]*/ dates){
+ // summary:
+ // Marks the specified cells as selected, and clears cells previously marked as selected.
+ // For CalendarLite at most one cell is selected at any point, but this allows an array
+ // for easy subclassing.
+
+ // Function to mark a cell as selected or unselected
+ function mark(/*Boolean*/ selected, /*DomNode*/ cell){
+ domClass.toggle(cell, "dijitCalendarSelectedDate", selected);
+ cell.setAttribute("aria-selected", selected ? "true" : "false");
+ }
+
+ // Clear previously selected cells.
+ array.forEach(this._selectedCells || [], lang.partial(mark, false));
+
+ // Mark newly selected cells. Ignore dates outside the currently displayed month.
+ this._selectedCells = array.filter(array.map(dates, this._getNodeByDate, this), function(n){ return n;});
+ array.forEach(this._selectedCells, lang.partial(mark, true));
+ },
+
+ onChange: function(/*Date*/ /*===== date =====*/){
+ // summary:
+ // Called only when the selected date has changed
+ },
+
+ isDisabledDate: function(/*===== dateObject, locale =====*/){
+ // summary:
+ // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+ // dateObject: Date
+ // locale: String?
+ // tags:
+ // extension
+/*=====
+ return false; // Boolean
+=====*/
+ },
+
+ getClassForDate: function(/*===== dateObject, locale =====*/){
+ // summary:
+ // May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+ // for example to indicate a holiday in specified locale.
+ // dateObject: Date
+ // locale: String?
+ // tags:
+ // extension
+
+/*=====
+ return ""; // String
+=====*/
+ }
+ });
+
+ CalendarLite._MonthWidget = declare("dijit.CalendarLite._MonthWidget", _WidgetBase, {
+ // summary:
+ // Displays name of current month padded to the width of the month
+ // w/the longest name, so that changing months doesn't change width.
+ //
+ // Create as:
+ // | new Calendar._MonthWidget({
+ // | lang: ...,
+ // | dateLocaleModule: ...
+ // | })
+
+ _setMonthAttr: function(month){
+ // summary:
+ // Set the current month to display as a label
+ var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month),
+ spacer =
+ (has("ie") == 6 ? "" : "<div class='dijitSpacer'>" +
+ array.map(monthNames, function(s){ return "<div>" + s + "</div>"; }).join("") + "</div>");
+
+ // Set name of current month and also fill in spacer element with all the month names
+ // (invisible) so that the maximum width will affect layout. But not on IE6 because then
+ // the center <TH> overlaps the right <TH> (due to a browser bug).
+ this.domNode.innerHTML =
+ spacer +
+ "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" +
+ monthNames[month.getMonth()] + "</div>";
+ }
+ });
+
+ return CalendarLite;
+});
diff --git a/lib/dijit/CheckedMenuItem.js b/lib/dijit/CheckedMenuItem.js
index 30ea390dc..acb134479 100644
--- a/lib/dijit/CheckedMenuItem.js
+++ b/lib/dijit/CheckedMenuItem.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/CheckedMenuItem.html":"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">&#10003;</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">&#160;</td>\n</tr>\n"}});define("dijit/CheckedMenuItem",["dojo/_base/declare","dojo/dom-class","./MenuItem","dojo/text!./templates/CheckedMenuItem.html","./hccss"],function(_1,_2,_3,_4){return _1("dijit.CheckedMenuItem",_3,{templateString:_4,checked:false,_setCheckedAttr:function(_5){_2.toggle(this.domNode,"dijitCheckedMenuItemChecked",_5);this.domNode.setAttribute("aria-checked",_5);this._set("checked",_5);},iconClass:"",onChange:function(){},_onClick:function(e){if(!this.disabled){this.set("checked",!this.checked);this.onChange(this.checked);}this.inherited(arguments);}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/CheckedMenuItem.html":"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">&#10003;</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">&#160;</td>\n</tr>\n"}});define("dijit/CheckedMenuItem",["dojo/_base/declare","dojo/dom-class","./MenuItem","dojo/text!./templates/CheckedMenuItem.html","./hccss"],function(_1,_2,_3,_4){return _1("dijit.CheckedMenuItem",_3,{templateString:_4,checked:false,_setCheckedAttr:function(_5){_2.toggle(this.domNode,"dijitCheckedMenuItemChecked",_5);this.domNode.setAttribute("aria-checked",_5?"true":"false");this._set("checked",_5);},iconClass:"",onChange:function(){},_onClick:function(_6){if(!this.disabled){this.set("checked",!this.checked);this.onChange(this.checked);}this.onClick(_6);}});}); \ No newline at end of file
diff --git a/lib/dijit/CheckedMenuItem.js.uncompressed.js b/lib/dijit/CheckedMenuItem.js.uncompressed.js
new file mode 100644
index 000000000..b28a9887d
--- /dev/null
+++ b/lib/dijit/CheckedMenuItem.js.uncompressed.js
@@ -0,0 +1,53 @@
+require({cache:{
+'url:dijit/templates/CheckedMenuItem.html':"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">&#10003;</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">&#160;</td>\n</tr>\n"}});
+define("dijit/CheckedMenuItem", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.toggle
+ "./MenuItem",
+ "dojo/text!./templates/CheckedMenuItem.html",
+ "./hccss"
+], function(declare, domClass, MenuItem, template){
+
+ // module:
+ // dijit/CheckedMenuItem
+
+ return declare("dijit.CheckedMenuItem", MenuItem, {
+ // summary:
+ // A checkbox-like menu item for toggling on and off
+
+ templateString: template,
+
+ // checked: Boolean
+ // Our checked state
+ checked: false,
+ _setCheckedAttr: function(/*Boolean*/ checked){
+ // summary:
+ // Hook so attr('checked', bool) works.
+ // Sets the class and state for the check box.
+ domClass.toggle(this.domNode, "dijitCheckedMenuItemChecked", checked);
+ this.domNode.setAttribute("aria-checked", checked ? "true" : "false");
+ this._set("checked", checked);
+ },
+
+ iconClass: "", // override dijitNoIcon
+
+ onChange: function(/*Boolean*/ /*===== checked =====*/){
+ // summary:
+ // User defined function to handle check/uncheck events
+ // tags:
+ // callback
+ },
+
+ _onClick: function(evt){
+ // summary:
+ // Clicking this item just toggles its state
+ // tags:
+ // private
+ if(!this.disabled){
+ this.set("checked", !this.checked);
+ this.onChange(this.checked);
+ }
+ this.onClick(evt);
+ }
+ });
+});
diff --git a/lib/dijit/ColorPalette.js b/lib/dijit/ColorPalette.js
index 22e4e3a81..16669a4ac 100644
--- a/lib/dijit/ColorPalette.js
+++ b/lib/dijit/ColorPalette.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/ColorPalette.html":"<div class=\"dijitInline dijitColorPalette\">\n\t<table dojoAttachPoint=\"paletteTableNode\" class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\" role=\"grid\">\n\t\t<tbody data-dojo-attach-point=\"gridNode\"></tbody>\n\t</table>\n</div>\n"}});define("dijit/ColorPalette",["require","dojo/text!./templates/ColorPalette.html","./_Widget","./_TemplatedMixin","./_PaletteMixin","dojo/i18n","dojo/_base/Color","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/_base/window","dojo/string","dojo/i18n!dojo/nls/colors","dojo/colors"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){var _d=_8("dijit.ColorPalette",[_3,_4,_5],{palette:"7x10",_palettes:{"7x10":[["white","seashell","cornsilk","lemonchiffon","lightyellow","palegreen","paleturquoise","lightcyan","lavender","plum"],["lightgray","pink","bisque","moccasin","khaki","lightgreen","lightseagreen","lightskyblue","cornflowerblue","violet"],["silver","lightcoral","sandybrown","orange","palegoldenrod","chartreuse","mediumturquoise","skyblue","mediumslateblue","orchid"],["gray","red","orangered","darkorange","yellow","limegreen","darkseagreen","royalblue","slateblue","mediumorchid"],["dimgray","crimson","chocolate","coral","gold","forestgreen","seagreen","blue","blueviolet","darkorchid"],["darkslategray","firebrick","saddlebrown","sienna","olive","green","darkcyan","mediumblue","darkslateblue","darkmagenta"],["black","darkred","maroon","brown","darkolivegreen","darkgreen","midnightblue","navy","indigo","purple"]],"3x4":[["white","lime","green","blue"],["silver","yellow","fuchsia","navy"],["gray","red","purple","black"]]},templateString:_2,baseClass:"dijitColorPalette",_dyeFactory:function(_e,_f,col){return new this._dyeClass(_e,_f,col);},buildRendering:function(){this.inherited(arguments);this._dyeClass=_8(_d._Color,{hc:_9.contains(_b.body(),"dijit_a11y"),palette:this.palette});this._preparePalette(this._palettes[this.palette],_6.getLocalization("dojo","colors",this.lang));}});_d._Color=_8("dijit._Color",_7,{template:"<span class='dijitInline dijitPaletteImg'>"+"<img src='${blankGif}' alt='${alt}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>"+"</span>",hcTemplate:"<span class='dijitInline dijitPaletteImg' style='position: relative; overflow: hidden; height: 12px; width: 14px;'>"+"<img src='${image}' alt='${alt}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>"+"</span>",_imagePaths:{"7x10":_1.toUrl("./themes/a11y/colors7x10.png"),"3x4":_1.toUrl("./themes/a11y/colors3x4.png")},constructor:function(_10,row,col){this._alias=_10;this._row=row;this._col=col;this.setColor(_7.named[_10]);},getValue:function(){return this.toHex();},fillCell:function(_11,_12){var _13=_c.substitute(this.hc?this.hcTemplate:this.template,{color:this.toHex(),blankGif:_12,alt:this._alias,image:this._imagePaths[this.palette].toString(),left:this._col*-20-5,top:this._row*-20-5,size:this.palette=="7x10"?"height: 145px; width: 206px":"height: 64px; width: 86px"});_a.place(_13,_11);}});return _d;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/ColorPalette.html":"<div class=\"dijitInline dijitColorPalette\">\n\t<table dojoAttachPoint=\"paletteTableNode\" class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\" role=\"grid\">\n\t\t<tbody data-dojo-attach-point=\"gridNode\"></tbody>\n\t</table>\n</div>\n"}});define("dijit/ColorPalette",["require","dojo/text!./templates/ColorPalette.html","./_Widget","./_TemplatedMixin","./_PaletteMixin","./hccss","dojo/i18n","dojo/_base/Color","dojo/_base/declare","dojo/dom-construct","dojo/string","dojo/i18n!dojo/nls/colors","dojo/colors"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){var _c=_9("dijit.ColorPalette",[_3,_4,_5],{palette:"7x10",_palettes:{"7x10":[["white","seashell","cornsilk","lemonchiffon","lightyellow","palegreen","paleturquoise","lightcyan","lavender","plum"],["lightgray","pink","bisque","moccasin","khaki","lightgreen","lightseagreen","lightskyblue","cornflowerblue","violet"],["silver","lightcoral","sandybrown","orange","palegoldenrod","chartreuse","mediumturquoise","skyblue","mediumslateblue","orchid"],["gray","red","orangered","darkorange","yellow","limegreen","darkseagreen","royalblue","slateblue","mediumorchid"],["dimgray","crimson","chocolate","coral","gold","forestgreen","seagreen","blue","blueviolet","darkorchid"],["darkslategray","firebrick","saddlebrown","sienna","olive","green","darkcyan","mediumblue","darkslateblue","darkmagenta"],["black","darkred","maroon","brown","darkolivegreen","darkgreen","midnightblue","navy","indigo","purple"]],"3x4":[["white","lime","green","blue"],["silver","yellow","fuchsia","navy"],["gray","red","purple","black"]]},templateString:_2,baseClass:"dijitColorPalette",_dyeFactory:function(_d,_e,_f,_10){return new this._dyeClass(_d,_e,_f,_10);},buildRendering:function(){this.inherited(arguments);this._dyeClass=_9(_c._Color,{palette:this.palette});this._preparePalette(this._palettes[this.palette],_7.getLocalization("dojo","colors",this.lang));}});_c._Color=_9("dijit._Color",_8,{template:"<span class='dijitInline dijitPaletteImg'>"+"<img src='${blankGif}' alt='${alt}' title='${title}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>"+"</span>",hcTemplate:"<span class='dijitInline dijitPaletteImg' style='position: relative; overflow: hidden; height: 12px; width: 14px;'>"+"<img src='${image}' alt='${alt}' title='${title}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>"+"</span>",_imagePaths:{"7x10":_1.toUrl("./themes/a11y/colors7x10.png"),"3x4":_1.toUrl("./themes/a11y/colors3x4.png")},constructor:function(_11,row,col,_12){this._title=_12;this._row=row;this._col=col;this.setColor(_8.named[_11]);},getValue:function(){return this.toHex();},fillCell:function(_13,_14){var _15=_b.substitute(_6("highcontrast")?this.hcTemplate:this.template,{color:this.toHex(),blankGif:_14,alt:this._title,title:this._title,image:this._imagePaths[this.palette].toString(),left:this._col*-20-5,top:this._row*-20-5,size:this.palette=="7x10"?"height: 145px; width: 206px":"height: 64px; width: 86px"});_a.place(_15,_13);}});return _c;}); \ No newline at end of file
diff --git a/lib/dijit/ColorPalette.js.uncompressed.js b/lib/dijit/ColorPalette.js.uncompressed.js
new file mode 100644
index 000000000..af406bec8
--- /dev/null
+++ b/lib/dijit/ColorPalette.js.uncompressed.js
@@ -0,0 +1,161 @@
+require({cache:{
+'url:dijit/templates/ColorPalette.html':"<div class=\"dijitInline dijitColorPalette\">\n\t<table dojoAttachPoint=\"paletteTableNode\" class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\" role=\"grid\">\n\t\t<tbody data-dojo-attach-point=\"gridNode\"></tbody>\n\t</table>\n</div>\n"}});
+define("dijit/ColorPalette", [
+ "require", // require.toUrl
+ "dojo/text!./templates/ColorPalette.html",
+ "./_Widget", // used also to load dijit/hccss for setting has("highcontrast")
+ "./_TemplatedMixin",
+ "./_PaletteMixin",
+ "./hccss", // has("highcontrast")
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/Color", // dojo.Color dojo.Color.named
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.place
+ "dojo/string", // string.substitute
+ "dojo/i18n!dojo/nls/colors", // translations
+ "dojo/colors" // extend dojo.Color w/names of other colors
+], function(require, template, _Widget, _TemplatedMixin, _PaletteMixin, has, i18n, Color,
+ declare, domConstruct, string){
+
+// module:
+// dijit/ColorPalette
+
+var ColorPalette = declare("dijit.ColorPalette", [_Widget, _TemplatedMixin, _PaletteMixin], {
+ // summary:
+ // A keyboard accessible color-picking widget
+ // description:
+ // Grid showing various colors, so the user can pick a certain color.
+ // Can be used standalone, or as a popup.
+ //
+ // example:
+ // | <div data-dojo-type="dijit/ColorPalette"></div>
+ //
+ // example:
+ // | var picker = new dijit.ColorPalette({ },srcNode);
+ // | picker.startup();
+
+
+ // palette: [const] String
+ // Size of grid, either "7x10" or "3x4".
+ palette: "7x10",
+
+ // _palettes: [protected] Map
+ // This represents the value of the colors.
+ // The first level is a hashmap of the different palettes available.
+ // The next two dimensions represent the columns and rows of colors.
+ _palettes: {
+ "7x10": [["white", "seashell", "cornsilk", "lemonchiffon","lightyellow", "palegreen", "paleturquoise", "lightcyan", "lavender", "plum"],
+ ["lightgray", "pink", "bisque", "moccasin", "khaki", "lightgreen", "lightseagreen", "lightskyblue", "cornflowerblue", "violet"],
+ ["silver", "lightcoral", "sandybrown", "orange", "palegoldenrod", "chartreuse", "mediumturquoise", "skyblue", "mediumslateblue","orchid"],
+ ["gray", "red", "orangered", "darkorange", "yellow", "limegreen", "darkseagreen", "royalblue", "slateblue", "mediumorchid"],
+ ["dimgray", "crimson", "chocolate", "coral", "gold", "forestgreen", "seagreen", "blue", "blueviolet", "darkorchid"],
+ ["darkslategray","firebrick","saddlebrown", "sienna", "olive", "green", "darkcyan", "mediumblue","darkslateblue", "darkmagenta" ],
+ ["black", "darkred", "maroon", "brown", "darkolivegreen", "darkgreen", "midnightblue", "navy", "indigo", "purple"]],
+
+ "3x4": [["white", "lime", "green", "blue"],
+ ["silver", "yellow", "fuchsia", "navy"],
+ ["gray", "red", "purple", "black"]]
+ },
+
+ // templateString: String
+ // The template of this widget.
+ templateString: template,
+
+ baseClass: "dijitColorPalette",
+
+ _dyeFactory: function(value, row, col, title){
+ // Overrides _PaletteMixin._dyeFactory().
+ return new this._dyeClass(value, row, col, title);
+ },
+
+ buildRendering: function(){
+ // Instantiate the template, which makes a skeleton into which we'll insert a bunch of
+ // <img> nodes
+ this.inherited(arguments);
+
+ // Creates customized constructor for dye class (color of a single cell) for
+ // specified palette and high-contrast vs. normal mode. Used in _getDye().
+ this._dyeClass = declare(ColorPalette._Color, {
+ palette: this.palette
+ });
+
+ // Creates <img> nodes in each cell of the template.
+ this._preparePalette(
+ this._palettes[this.palette],
+ i18n.getLocalization("dojo", "colors", this.lang));
+ }
+});
+
+ColorPalette._Color = declare("dijit._Color", Color, {
+ // summary:
+ // Object associated with each cell in a ColorPalette palette.
+ // Implements dijit/Dye.
+
+ // Template for each cell in normal (non-high-contrast mode). Each cell contains a wrapper
+ // node for showing the border (called dijitPaletteImg for back-compat), and dijitColorPaletteSwatch
+ // for showing the color.
+ template:
+ "<span class='dijitInline dijitPaletteImg'>" +
+ "<img src='${blankGif}' alt='${alt}' title='${title}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>" +
+ "</span>",
+
+ // Template for each cell in high contrast mode. Each cell contains an image with the whole palette,
+ // but scrolled and clipped to show the correct color only
+ hcTemplate:
+ "<span class='dijitInline dijitPaletteImg' style='position: relative; overflow: hidden; height: 12px; width: 14px;'>" +
+ "<img src='${image}' alt='${alt}' title='${title}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>" +
+ "</span>",
+
+ // _imagePaths: [protected] Map
+ // This is stores the path to the palette images used for high-contrast mode display
+ _imagePaths: {
+ "7x10": require.toUrl("./themes/a11y/colors7x10.png"),
+ "3x4": require.toUrl("./themes/a11y/colors3x4.png")
+ },
+
+ constructor: function(alias, row, col, title){
+ // summary:
+ // Constructor for ColorPalette._Color
+ // alias: String
+ // English name of the color.
+ // row: Number
+ // Vertical position in grid.
+ // column: Number
+ // Horizontal position in grid.
+ // title: String
+ // Localized name of the color.
+ this._title = title;
+ this._row = row;
+ this._col = col;
+ this.setColor(Color.named[alias]);
+ },
+
+ getValue: function(){
+ // summary:
+ // Note that although dijit._Color is initialized with a value like "white" getValue() always
+ // returns a hex value
+ return this.toHex();
+ },
+
+ fillCell: function(/*DOMNode*/ cell, /*String*/ blankGif){
+ var html = string.substitute(has("highcontrast") ? this.hcTemplate : this.template, {
+ // substitution variables for normal mode
+ color: this.toHex(),
+ blankGif: blankGif,
+ alt: this._title,
+ title: this._title,
+
+ // variables used for high contrast mode
+ image: this._imagePaths[this.palette].toString(),
+ left: this._col * -20 - 5,
+ top: this._row * -20 - 5,
+ size: this.palette == "7x10" ? "height: 145px; width: 206px" : "height: 64px; width: 86px"
+ });
+
+ domConstruct.place(html, cell);
+ }
+});
+
+
+return ColorPalette;
+});
diff --git a/lib/dijit/Declaration.js b/lib/dijit/Declaration.js
index 833489d99..5d2a1ac25 100644
--- a/lib/dijit/Declaration.js
+++ b/lib/dijit/Declaration.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/Declaration",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/parser","dojo/query","./_Widget","./_TemplatedMixin","./_WidgetsInTemplateMixin","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _3("dijit.Declaration",_7,{_noScript:true,stopParser:true,widgetClass:"",defaults:null,mixins:[],buildRendering:function(){var _a=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_b=_6("> script[type^='dojo/method']",_a).orphan(),_c=_6("> script[type^='dojo/connect']",_a).orphan(),_d=_a.nodeName;var _e=this.defaults||{};_1.forEach(_b,function(s){var _f=s.getAttribute("event")||s.getAttribute("data-dojo-event"),_10=_5._functionFromScript(s);if(_f){_e[_f]=_10;}else{_c.push(s);}});this.mixins=this.mixins.length?_1.map(this.mixins,function(_11){return _4.getObject(_11);}):[_7,_8,_9];_e._skipNodeCache=true;_e.templateString="<"+_d+" class='"+_a.className+"'"+" data-dojo-attach-point='"+(_a.getAttribute("data-dojo-attach-point")||_a.getAttribute("dojoAttachPoint")||"")+"' data-dojo-attach-event='"+(_a.getAttribute("data-dojo-attach-event")||_a.getAttribute("dojoAttachEvent")||"")+"' >"+_a.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_d+">";var wc=_3(this.widgetClass,this.mixins,_e);_1.forEach(_c,function(s){var evt=s.getAttribute("event")||s.getAttribute("data-dojo-event")||"postscript",_12=_5._functionFromScript(s);_2.connect(wc.prototype,evt,_12);});}});}); \ No newline at end of file
+define("dijit/Declaration",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/parser","dojo/query","./_Widget","./_TemplatedMixin","./_WidgetsInTemplateMixin","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _3("dijit.Declaration",_7,{_noScript:true,stopParser:true,widgetClass:"",defaults:null,mixins:[],buildRendering:function(){var _a=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_b=_6("> script[type^='dojo/method']",_a).orphan(),_c=_6("> script[type^='dojo/connect']",_a).orphan(),_d=_a.nodeName;var _e=this.defaults||{};_1.forEach(_b,function(s){var _f=s.getAttribute("event")||s.getAttribute("data-dojo-event"),_10=_5._functionFromScript(s);if(_f){_e[_f]=_10;}else{_c.push(s);}});if(this.mixins.length){this.mixins=_1.map(this.mixins,function(_11){return _4.getObject(_11);});}else{this.mixins=[_7,_8,_9];}_e._skipNodeCache=true;_e.templateString="<"+_d+" class='"+_a.className+"'"+" data-dojo-attach-point='"+(_a.getAttribute("data-dojo-attach-point")||_a.getAttribute("dojoAttachPoint")||"")+"' data-dojo-attach-event='"+(_a.getAttribute("data-dojo-attach-event")||_a.getAttribute("dojoAttachEvent")||"")+"' >"+_a.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_d+">";var wc=_3(this.widgetClass,this.mixins,_e);_1.forEach(_c,function(s){var evt=s.getAttribute("event")||s.getAttribute("data-dojo-event")||"postscript",_12=_5._functionFromScript(s);_2.connect(wc.prototype,evt,_12);});}});}); \ No newline at end of file
diff --git a/lib/dijit/Declaration.js.uncompressed.js b/lib/dijit/Declaration.js.uncompressed.js
new file mode 100644
index 000000000..0b4bc28bf
--- /dev/null
+++ b/lib/dijit/Declaration.js.uncompressed.js
@@ -0,0 +1,105 @@
+define("dijit/Declaration", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/connect", // connect.connect
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.getObject
+ "dojo/parser", // parser._functionFromScript
+ "dojo/query", // query
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_WidgetsInTemplateMixin",
+ "dojo/NodeList-dom"
+], function(array, connect, declare, lang, parser, query, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin){
+
+ // module:
+ // dijit/Declaration
+
+ return declare("dijit.Declaration", _Widget, {
+ // summary:
+ // The Declaration widget allows a developer to declare new widget
+ // classes directly from a snippet of markup.
+
+ // _noScript: [private] Boolean
+ // Flag to parser to leave alone the script tags contained inside of me
+ _noScript: true,
+
+ // stopParser: [private] Boolean
+ // Flag to parser to not try and parse widgets declared inside of me
+ stopParser: true,
+
+ // widgetClass: [const] String
+ // Name of class being declared, ex: "acme.myWidget"
+ widgetClass: "",
+
+ // propList: [const] Object
+ // Set of attributes for this widget along with default values, ex:
+ // {delay: 100, title: "hello world"}
+ defaults: null,
+
+ // mixins: [const] String[]
+ // List containing the prototype for this widget, and also any mixins,
+ // ex: ["dijit._Widget", "dijit._Container"]
+ mixins: [],
+
+ buildRendering: function(){
+ var src = this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),
+ methods = query("> script[type^='dojo/method']", src).orphan(),
+ connects = query("> script[type^='dojo/connect']", src).orphan(),
+ srcType = src.nodeName;
+
+ var propList = this.defaults || {};
+
+ // For all methods defined like <script type="dojo/method" data-dojo-event="foo">,
+ // add that method to prototype.
+ // If there's no "event" specified then it's code to run on instantiation,
+ // so it becomes a connection to "postscript" (handled below).
+ array.forEach(methods, function(s){
+ var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event"),
+ func = parser._functionFromScript(s);
+ if(evt){
+ propList[evt] = func;
+ }else{
+ connects.push(s);
+ }
+ });
+
+ // map array of strings like [ "dijit.form.Button" ] to array of mixin objects
+ // (note that array.map(this.mixins, lang.getObject) doesn't work because it passes
+ // a bogus third argument to getObject(), confusing it)
+ if(this.mixins.length){
+ this.mixins = array.map(this.mixins, function(name){ return lang.getObject(name); } );
+ }else{
+ this.mixins = [ _Widget, _TemplatedMixin, _WidgetsInTemplateMixin ];
+ }
+
+ propList._skipNodeCache = true;
+ propList.templateString =
+ "<"+srcType+" class='"+src.className+"'" +
+ " data-dojo-attach-point='"+
+ (src.getAttribute("data-dojo-attach-point") || src.getAttribute("dojoAttachPoint") || '')+
+ "' data-dojo-attach-event='"+
+ (src.getAttribute("data-dojo-attach-event") || src.getAttribute("dojoAttachEvent") || '')+
+ "' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
+
+ // create the new widget class
+ var wc = declare(
+ this.widgetClass,
+ this.mixins,
+ propList
+ );
+
+ // Handle <script> blocks of form:
+ // <script type="dojo/connect" data-dojo-event="foo">
+ // and
+ // <script type="dojo/method">
+ // (Note that the second one is just shorthand for a dojo/connect to postscript)
+ // Since this is a connect in the declaration, we are actually connection to the method
+ // in the _prototype_.
+ array.forEach(connects, function(s){
+ var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event") || "postscript",
+ func = parser._functionFromScript(s);
+ connect.connect(wc.prototype, evt, func);
+ });
+ }
+ });
+});
diff --git a/lib/dijit/Destroyable.js b/lib/dijit/Destroyable.js
new file mode 100644
index 000000000..b58101cc7
--- /dev/null
+++ b/lib/dijit/Destroyable.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/Destroyable",["dojo/_base/array","dojo/aspect","dojo/_base/declare"],function(_1,_2,_3){return _3("dijit.Destroyable",null,{destroy:function(_4){this._destroyed=true;},own:function(){_1.forEach(arguments,function(_5){var _6="destroyRecursive" in _5?"destroyRecursive":"destroy" in _5?"destroy":"remove";var _7=_2.before(this,"destroy",function(_8){_5[_6](_8);});var _9=_2.after(_5,_6,function(){_7.remove();_9.remove();},true);},this);return arguments;}});}); \ No newline at end of file
diff --git a/lib/dijit/Destroyable.js.uncompressed.js b/lib/dijit/Destroyable.js.uncompressed.js
new file mode 100644
index 000000000..ee6b8893e
--- /dev/null
+++ b/lib/dijit/Destroyable.js.uncompressed.js
@@ -0,0 +1,59 @@
+define("dijit/Destroyable", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/aspect",
+ "dojo/_base/declare"
+], function(array, aspect, declare){
+
+// module:
+// dijit/Destroyable
+
+return declare("dijit.Destroyable", null, {
+ // summary:
+ // Mixin to track handles and release them when instance is destroyed.
+ // description:
+ // Call this.own(...) on list of handles (returned from dojo/aspect, dojo/on,
+ // dojo/Stateful::watch, or any class (including widgets) with a destroyRecursive() or destroy() method.
+ // Then call destroy() later to destroy this instance and release the resources.
+
+ destroy: function(/*Boolean*/ preserveDom){
+ // summary:
+ // Destroy this class, releasing any resources registered via own().
+ this._destroyed = true;
+ },
+
+ own: function(){
+ // summary:
+ // Track specified handles and remove/destroy them when this instance is destroyed, unless they were
+ // already removed/destroyed manually.
+ // tags:
+ // protected
+ // returns:
+ // The array of specified handles, so you can do for example:
+ // | var handle = this.own(on(...))[0];
+
+ array.forEach(arguments, function(handle){
+ var destroyMethodName =
+ "destroyRecursive" in handle ? "destroyRecursive" : // remove "destroyRecursive" for 2.0
+ "destroy" in handle ? "destroy" :
+ "remove";
+
+ // When this.destroy() is called, destroy handle. Since I'm using aspect.before(),
+ // the handle will be destroyed before a subclass's destroy() method starts running, before it calls
+ // this.inherited() or even if it doesn't call this.inherited() at all. If that's an issue, make an
+ // onDestroy() method and connect to that instead.
+ var odh = aspect.before(this, "destroy", function(preserveDom){
+ handle[destroyMethodName](preserveDom);
+ });
+
+ // If handle is destroyed manually before this.destroy() is called, remove the listener set directly above.
+ var hdh = aspect.after(handle, destroyMethodName, function(){
+ odh.remove();
+ hdh.remove();
+ }, true);
+ }, this);
+
+ return arguments; // handle
+ }
+});
+
+});
diff --git a/lib/dijit/Dialog.js b/lib/dijit/Dialog.js
index 919f4b551..8f1959ddf 100644
--- a/lib/dijit/Dialog.js
+++ b/lib/dijit/Dialog.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/Dialog.html":"<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div data-dojo-attach-point=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"}});define("dijit/Dialog",["require","dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/fx","dojo/i18n","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/ready","dojo/_base/sniff","dojo/_base/window","dojo/window","dojo/dnd/Moveable","dojo/dnd/TimedMoveable","./focus","./_base/manager","./_Widget","./_TemplatedMixin","./_CssStateMixin","./form/_FormMixin","./_DialogMixin","./DialogUnderlay","./layout/ContentPane","dojo/text!./templates/Dialog.html",".","dojo/i18n!./nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,fx,_b,_c,_d,_e,on,_f,has,win,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_1a,_1b,_1c,_1d){var _1e=_4("dijit._DialogBase",[_16,_18,_19,_17],{templateString:_1c,baseClass:"dijitDialog",cssStateNodes:{closeButtonNode:"dijitDialogCloseIcon"},_setTitleAttr:[{node:"titleNode",type:"innerHTML"},{node:"titleBar",type:"attribute"}],open:false,duration:_14.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,"aria-describedby":"",postMixInProperties:function(){var _1f=_b.getLocalization("dijit","common");_e.mixin(this,_1f);this.inherited(arguments);},postCreate:function(){_9.set(this.domNode,{display:"none",position:"absolute"});win.body().appendChild(this.domNode);this.inherited(arguments);this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();if(this.autofocus&&_20.isTop(this)){this._getFocusItems(this.domNode);_13.focus(this._firstFocusItem);}this.inherited(arguments);},_endDrag:function(){var _21=_8.position(this.domNode),_22=_10.getBox();_21.y=Math.min(Math.max(_21.y,0),(_22.h-_21.h));_21.x=Math.min(Math.max(_21.x,0),(_22.w-_21.w));this._relativePosition=_21;this._position();},_setup:function(){var _23=this.domNode;if(this.titleBar&&this.draggable){this._moveable=new ((has("ie")==6)?_12:_11)(_23,{handle:this.titleBar});this.connect(this._moveable,"onMoveStop","_endDrag");}else{_7.add(_23,"dijitDialogFixed");}this.underlayAttrs={dialogId:this.id,"class":_2.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" ")};},_size:function(){this._checkIfSingleChild();if(this._singleChild){if(this._singleChildOriginalStyle){this._singleChild.domNode.style.cssText=this._singleChildOriginalStyle;}delete this._singleChildOriginalStyle;}else{_9.set(this.containerNode,{width:"auto",height:"auto"});}var bb=_8.position(this.domNode);var _24=_10.getBox();if(bb.w>=_24.w||bb.h>=_24.h){var w=Math.min(bb.w,Math.floor(_24.w*0.75)),h=Math.min(bb.h,Math.floor(_24.h*0.75));if(this._singleChild&&this._singleChild.resize){this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;this._singleChild.resize({w:w,h:h});}else{_9.set(this.containerNode,{width:w+"px",height:h+"px",overflow:"auto",position:"relative"});}}else{if(this._singleChild&&this._singleChild.resize){this._singleChild.resize();}}},_position:function(){if(!_7.contains(win.body(),"dojoMove")){var _25=this.domNode,_26=_10.getBox(),p=this._relativePosition,bb=p?null:_8.position(_25),l=Math.floor(_26.l+(p?p.x:(_26.w-bb.w)/2)),t=Math.floor(_26.t+(p?p.y:(_26.h-bb.h)/2));_9.set(_25,{left:l+"px",top:t+"px"});}},_onKey:function(evt){if(evt.charOrCode){var _27=evt.target;if(evt.charOrCode===_d.TAB){this._getFocusItems(this.domNode);}var _28=(this._firstFocusItem==this._lastFocusItem);if(_27==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===_d.TAB){if(!_28){_13.focus(this._lastFocusItem);}_a.stop(evt);}else{if(_27==this._lastFocusItem&&evt.charOrCode===_d.TAB&&!evt.shiftKey){if(!_28){_13.focus(this._firstFocusItem);}_a.stop(evt);}else{while(_27){if(_27==this.domNode||_7.contains(_27,"dijitPopup")){if(evt.charOrCode==_d.ESCAPE){this.onCancel();}else{return;}}_27=_27.parentNode;}if(evt.charOrCode!==_d.TAB){_a.stop(evt);}else{if(!has("opera")){try{this._firstFocusItem.focus();}catch(e){}}}}}}},show:function(){if(this.open){return;}if(!this._started){this.startup();}if(!this._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}this._modalconnects.push(on(window,"scroll",_e.hitch(this,"layout")));this._modalconnects.push(on(window,"resize",_e.hitch(this,function(){var _29=_10.getBox();if(!this._oldViewport||_29.h!=this._oldViewport.h||_29.w!=this._oldViewport.w){this.layout();this._oldViewport=_29;}})));this._modalconnects.push(on(this.domNode,_3._keypress,_e.hitch(this,"_onKey")));_9.set(this.domNode,{opacity:0,display:""});this._set("open",true);this._onShow();this._size();this._position();var _2a;this._fadeInDeferred=new _5(_e.hitch(this,function(){_2a.stop();delete this._fadeInDeferred;}));_2a=fx.fadeIn({node:this.domNode,duration:this.duration,beforeBegin:_e.hitch(this,function(){_20.show(this,this.underlayAttrs);}),onEnd:_e.hitch(this,function(){if(this.autofocus&&_20.isTop(this)){this._getFocusItems(this.domNode);_13.focus(this._firstFocusItem);}this._fadeInDeferred.callback(true);delete this._fadeInDeferred;})}).play();return this._fadeInDeferred;},hide:function(){if(!this._alreadyInitialized){return;}if(this._fadeInDeferred){this._fadeInDeferred.cancel();}var _2b;this._fadeOutDeferred=new _5(_e.hitch(this,function(){_2b.stop();delete this._fadeOutDeferred;}));this._fadeOutDeferred.then(_e.hitch(this,"onHide"));_2b=fx.fadeOut({node:this.domNode,duration:this.duration,onEnd:_e.hitch(this,function(){this.domNode.style.display="none";_20.hide(this);this._fadeOutDeferred.callback(true);delete this._fadeOutDeferred;})}).play();if(this._scrollConnected){this._scrollConnected=false;}var h;while(h=this._modalconnects.pop()){h.remove();}if(this._relativePosition){delete this._relativePosition;}this._set("open",false);return this._fadeOutDeferred;},layout:function(){if(this.domNode.style.display!="none"){if(_1d._underlay){_1d._underlay.layout();}this._position();}},destroy:function(){if(this._fadeInDeferred){this._fadeInDeferred.cancel();}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}if(this._moveable){this._moveable.destroy();}var h;while(h=this._modalconnects.pop()){h.remove();}_20.hide(this);this.inherited(arguments);}});var _2c=_4("dijit.Dialog",[_1b,_1e],{});_2c._DialogBase=_1e;var _20=_2c._DialogLevelManager={_beginZIndex:950,show:function(_2d,_2e){ds[ds.length-1].focus=_13.curNode;var _2f=_1d._underlay;if(!_2f||_2f._destroyed){_2f=_1d._underlay=new _1a(_2e);}else{_2f.set(_2d.underlayAttrs);}var _30=ds[ds.length-1].dialog?ds[ds.length-1].zIndex+2:_2c._DialogLevelManager._beginZIndex;if(ds.length==1){_2f.show();}_9.set(_1d._underlay.domNode,"zIndex",_30-1);_9.set(_2d.domNode,"zIndex",_30);ds.push({dialog:_2d,underlayAttrs:_2e,zIndex:_30});},hide:function(_31){if(ds[ds.length-1].dialog==_31){ds.pop();var pd=ds[ds.length-1];if(ds.length==1){if(!_1d._underlay._destroyed){_1d._underlay.hide();}}else{_9.set(_1d._underlay.domNode,"zIndex",pd.zIndex-1);_1d._underlay.set(pd.underlayAttrs);}if(_31.refocus){var _32=pd.focus;if(pd.dialog&&(!_32||!_6.isDescendant(_32,pd.dialog.domNode))){pd.dialog._getFocusItems(pd.dialog.domNode);_32=pd.dialog._firstFocusItem;}if(_32){try{_32.focus();}catch(e){}}}}else{var idx=_2.indexOf(_2.map(ds,function(_33){return _33.dialog;}),_31);if(idx!=-1){ds.splice(idx,1);}}},isTop:function(_34){return ds[ds.length-1].dialog==_34;}};var ds=_2c._dialogStack=[{dialog:null,focus:null,underlayAttrs:null}];if(!_c.isAsync){_f(0,function(){var _35=["dijit/TooltipDialog"];_1(_35);});}return _2c;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/Dialog.html":"<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div data-dojo-attach-point=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t\t<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"\n\t\t\t\trole=\"heading\" level=\"1\"></span>\n\t\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t\t</span>\n\t</div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"}});define("dijit/Dialog",["require","dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/fx","dojo/i18n","dojo/keys","dojo/_base/lang","dojo/on","dojo/ready","dojo/sniff","dojo/window","dojo/dnd/Moveable","dojo/dnd/TimedMoveable","./focus","./_base/manager","./_Widget","./_TemplatedMixin","./_CssStateMixin","./form/_FormMixin","./_DialogMixin","./DialogUnderlay","./layout/ContentPane","dojo/text!./templates/Dialog.html","./main","dojo/i18n!./nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,fx,_b,_c,_d,on,_e,_f,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_1a,_1b,_1c,_1d){var _1e=_4("dijit._DialogBase",[_16,_18,_19,_17],{templateString:_1c,baseClass:"dijitDialog",cssStateNodes:{closeButtonNode:"dijitDialogCloseIcon"},_setTitleAttr:[{node:"titleNode",type:"innerHTML"},{node:"titleBar",type:"attribute"}],open:false,duration:_14.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,_setDraggableAttr:function(val){this._set("draggable",val);},"aria-describedby":"",maxRatio:0.9,postMixInProperties:function(){var _1f=_b.getLocalization("dijit","common");_d.mixin(this,_1f);this.inherited(arguments);},postCreate:function(){_9.set(this.domNode,{display:"none",position:"absolute"});this.ownerDocumentBody.appendChild(this.domNode);this.inherited(arguments);this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();if(this.autofocus&&_20.isTop(this)){this._getFocusItems(this.domNode);_13.focus(this._firstFocusItem);}this.inherited(arguments);},_onBlur:function(by){this.inherited(arguments);var _21=_d.hitch(this,function(){if(this.open&&!this._destroyed&&_20.isTop(this)){this._getFocusItems(this.domNode);_13.focus(this._firstFocusItem);}});if(by=="mouse"){on.once(this.ownerDocument,"mouseup",_21);}else{_21();}},_endDrag:function(){var _22=_8.position(this.domNode),_23=_10.getBox(this.ownerDocument);_22.y=Math.min(Math.max(_22.y,0),(_23.h-_22.h));_22.x=Math.min(Math.max(_22.x,0),(_23.w-_22.w));this._relativePosition=_22;this._position();},_setup:function(){var _24=this.domNode;if(this.titleBar&&this.draggable){this._moveable=new ((_f("ie")==6)?_12:_11)(_24,{handle:this.titleBar});this.connect(this._moveable,"onMoveStop","_endDrag");}else{_7.add(_24,"dijitDialogFixed");}this.underlayAttrs={dialogId:this.id,"class":_2.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" "),ownerDocument:this.ownerDocument};},_size:function(){this._checkIfSingleChild();if(this._singleChild){if(typeof this._singleChildOriginalStyle!="undefined"){this._singleChild.domNode.style.cssText=this._singleChildOriginalStyle;delete this._singleChildOriginalStyle;}}else{_9.set(this.containerNode,{width:"auto",height:"auto"});}var bb=_8.position(this.domNode);var _25=_10.getBox(this.ownerDocument);_25.w*=this.maxRatio;_25.h*=this.maxRatio;if(bb.w>=_25.w||bb.h>=_25.h){var _26=_8.position(this.containerNode),w=Math.min(bb.w,_25.w)-(bb.w-_26.w),h=Math.min(bb.h,_25.h)-(bb.h-_26.h);if(this._singleChild&&this._singleChild.resize){if(typeof this._singleChildOriginalStyle=="undefined"){this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;}this._singleChild.resize({w:w,h:h});}else{_9.set(this.containerNode,{width:w+"px",height:h+"px",overflow:"auto",position:"relative"});}}else{if(this._singleChild&&this._singleChild.resize){this._singleChild.resize();}}},_position:function(){if(!_7.contains(this.ownerDocumentBody,"dojoMove")){var _27=this.domNode,_28=_10.getBox(this.ownerDocument),p=this._relativePosition,bb=p?null:_8.position(_27),l=Math.floor(_28.l+(p?p.x:(_28.w-bb.w)/2)),t=Math.floor(_28.t+(p?p.y:(_28.h-bb.h)/2));_9.set(_27,{left:l+"px",top:t+"px"});}},_onKey:function(evt){if(evt.charOrCode){var _29=evt.target;if(evt.charOrCode===_c.TAB){this._getFocusItems(this.domNode);}var _2a=(this._firstFocusItem==this._lastFocusItem);if(_29==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===_c.TAB){if(!_2a){_13.focus(this._lastFocusItem);}_a.stop(evt);}else{if(_29==this._lastFocusItem&&evt.charOrCode===_c.TAB&&!evt.shiftKey){if(!_2a){_13.focus(this._firstFocusItem);}_a.stop(evt);}else{while(_29){if(_29==this.domNode||_7.contains(_29,"dijitPopup")){if(evt.charOrCode==_c.ESCAPE){this.onCancel();}else{return;}}_29=_29.parentNode;}if(evt.charOrCode!==_c.TAB){_a.stop(evt);}else{if(!_f("opera")){try{this._firstFocusItem.focus();}catch(e){}}}}}}},show:function(){if(this.open){return;}if(!this._started){this.startup();}if(!this._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}var win=_10.get(this.ownerDocument);this._modalconnects.push(on(win,"scroll",_d.hitch(this,"resize")));this._modalconnects.push(on(this.domNode,_3._keypress,_d.hitch(this,"_onKey")));_9.set(this.domNode,{opacity:0,display:""});this._set("open",true);this._onShow();this._size();this._position();var _2b;this._fadeInDeferred=new _5(_d.hitch(this,function(){_2b.stop();delete this._fadeInDeferred;}));_2b=fx.fadeIn({node:this.domNode,duration:this.duration,beforeBegin:_d.hitch(this,function(){_20.show(this,this.underlayAttrs);}),onEnd:_d.hitch(this,function(){if(this.autofocus&&_20.isTop(this)){this._getFocusItems(this.domNode);_13.focus(this._firstFocusItem);}this._fadeInDeferred.resolve(true);delete this._fadeInDeferred;})}).play();return this._fadeInDeferred;},hide:function(){if(!this._alreadyInitialized||!this.open){return;}if(this._fadeInDeferred){this._fadeInDeferred.cancel();}var _2c;this._fadeOutDeferred=new _5(_d.hitch(this,function(){_2c.stop();delete this._fadeOutDeferred;}));this._fadeOutDeferred.then(_d.hitch(this,"onHide"));_2c=fx.fadeOut({node:this.domNode,duration:this.duration,onEnd:_d.hitch(this,function(){this.domNode.style.display="none";_20.hide(this);this._fadeOutDeferred.resolve(true);delete this._fadeOutDeferred;})}).play();if(this._scrollConnected){this._scrollConnected=false;}var h;while(h=this._modalconnects.pop()){h.remove();}if(this._relativePosition){delete this._relativePosition;}this._set("open",false);return this._fadeOutDeferred;},resize:function(){if(this.domNode.style.display!="none"){if(_1a._singleton){_1a._singleton.layout();}this._position();this._size();}},destroy:function(){if(this._fadeInDeferred){this._fadeInDeferred.cancel();}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}if(this._moveable){this._moveable.destroy();}var h;while(h=this._modalconnects.pop()){h.remove();}_20.hide(this);this.inherited(arguments);}});var _2d=_4("dijit.Dialog",[_1b,_1e],{});_2d._DialogBase=_1e;var _20=_2d._DialogLevelManager={_beginZIndex:950,show:function(_2e,_2f){ds[ds.length-1].focus=_13.curNode;var _30=_1a._singleton;if(!_30||_30._destroyed){_30=_1d._underlay=_1a._singleton=new _1a(_2f);}else{_30.set(_2e.underlayAttrs);}var _31=ds[ds.length-1].dialog?ds[ds.length-1].zIndex+2:_2d._DialogLevelManager._beginZIndex;if(ds.length==1){_30.show();}_9.set(_1a._singleton.domNode,"zIndex",_31-1);_9.set(_2e.domNode,"zIndex",_31);ds.push({dialog:_2e,underlayAttrs:_2f,zIndex:_31});},hide:function(_32){if(ds[ds.length-1].dialog==_32){ds.pop();var pd=ds[ds.length-1];if(!_1a._singleton._destroyed){if(ds.length==1){_1a._singleton.hide();}else{_9.set(_1a._singleton.domNode,"zIndex",pd.zIndex-1);_1a._singleton.set(pd.underlayAttrs);}}if(_32.refocus){var _33=pd.focus;if(pd.dialog&&(!_33||!_6.isDescendant(_33,pd.dialog.domNode))){pd.dialog._getFocusItems(pd.dialog.domNode);_33=pd.dialog._firstFocusItem;}if(_33){try{_33.focus();}catch(e){}}}}else{var idx=_2.indexOf(_2.map(ds,function(_34){return _34.dialog;}),_32);if(idx!=-1){ds.splice(idx,1);}}},isTop:function(_35){return ds[ds.length-1].dialog==_35;}};var ds=_2d._dialogStack=[{dialog:null,focus:null,underlayAttrs:null}];if(_f("dijit-legacy-requires")){_e(0,function(){var _36=["dijit/TooltipDialog"];_1(_36);});}return _2d;}); \ No newline at end of file
diff --git a/lib/dijit/Dialog.js.uncompressed.js b/lib/dijit/Dialog.js.uncompressed.js
new file mode 100644
index 000000000..5122b716a
--- /dev/null
+++ b/lib/dijit/Dialog.js.uncompressed.js
@@ -0,0 +1,661 @@
+require({cache:{
+'url:dijit/templates/Dialog.html':"<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div data-dojo-attach-point=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t\t<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"\n\t\t\t\trole=\"heading\" level=\"1\"></span>\n\t\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t\t</span>\n\t</div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"}});
+define("dijit/Dialog", [
+ "require",
+ "dojo/_base/array", // array.forEach array.indexOf array.map
+ "dojo/_base/connect", // connect._keypress
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred
+ "dojo/dom", // dom.isDescendant
+ "dojo/dom-class", // domClass.add domClass.contains
+ "dojo/dom-geometry", // domGeometry.position
+ "dojo/dom-style", // domStyle.set
+ "dojo/_base/event", // event.stop
+ "dojo/_base/fx", // fx.fadeIn fx.fadeOut
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/keys",
+ "dojo/_base/lang", // lang.mixin lang.hitch
+ "dojo/on",
+ "dojo/ready",
+ "dojo/sniff", // has("ie") has("opera") has("dijit-legacy-requires")
+ "dojo/window", // winUtils.getBox, winUtils.get
+ "dojo/dnd/Moveable", // Moveable
+ "dojo/dnd/TimedMoveable", // TimedMoveable
+ "./focus",
+ "./_base/manager", // manager.defaultDuration
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_CssStateMixin",
+ "./form/_FormMixin",
+ "./_DialogMixin",
+ "./DialogUnderlay",
+ "./layout/ContentPane",
+ "dojo/text!./templates/Dialog.html",
+ "./main", // for back-compat, exporting dijit._underlay (remove in 2.0)
+ "dojo/i18n!./nls/common"
+], function(require, array, connect, declare, Deferred,
+ dom, domClass, domGeometry, domStyle, event, fx, i18n, keys, lang, on, ready, has, winUtils,
+ Moveable, TimedMoveable, focus, manager, _Widget, _TemplatedMixin, _CssStateMixin, _FormMixin, _DialogMixin,
+ DialogUnderlay, ContentPane, template, dijit){
+
+ // module:
+ // dijit/Dialog
+
+ /*=====
+ dijit._underlay = function(kwArgs){
+ // summary:
+ // A shared instance of a `dijit.DialogUnderlay`
+ //
+ // description:
+ // A shared instance of a `dijit.DialogUnderlay` created and
+ // used by `dijit.Dialog`, though never created until some Dialog
+ // or subclass thereof is shown.
+ };
+ =====*/
+
+ var _DialogBase = declare("dijit._DialogBase", [_TemplatedMixin, _FormMixin, _DialogMixin, _CssStateMixin], {
+ templateString: template,
+
+ baseClass: "dijitDialog",
+
+ cssStateNodes: {
+ closeButtonNode: "dijitDialogCloseIcon"
+ },
+
+ // Map widget attributes to DOMNode attributes.
+ _setTitleAttr: [
+ { node: "titleNode", type: "innerHTML" },
+ { node: "titleBar", type: "attribute" }
+ ],
+
+ // open: [readonly] Boolean
+ // True if Dialog is currently displayed on screen.
+ open: false,
+
+ // duration: Integer
+ // The time in milliseconds it takes the dialog to fade in and out
+ duration: manager.defaultDuration,
+
+ // refocus: Boolean
+ // A Toggle to modify the default focus behavior of a Dialog, which
+ // is to re-focus the element which had focus before being opened.
+ // False will disable refocusing. Default: true
+ refocus: true,
+
+ // autofocus: Boolean
+ // A Toggle to modify the default focus behavior of a Dialog, which
+ // is to focus on the first dialog element after opening the dialog.
+ // False will disable autofocusing. Default: true
+ autofocus: true,
+
+ // _firstFocusItem: [private readonly] DomNode
+ // The pointer to the first focusable node in the dialog.
+ // Set by `dijit/_DialogMixin._getFocusItems()`.
+ _firstFocusItem: null,
+
+ // _lastFocusItem: [private readonly] DomNode
+ // The pointer to which node has focus prior to our dialog.
+ // Set by `dijit/_DialogMixin._getFocusItems()`.
+ _lastFocusItem: null,
+
+ // doLayout: [protected] Boolean
+ // Don't change this parameter from the default value.
+ // This ContentPane parameter doesn't make sense for Dialog, since Dialog
+ // is never a child of a layout container, nor can you specify the size of
+ // Dialog in order to control the size of an inner widget.
+ doLayout: false,
+
+ // draggable: Boolean
+ // Toggles the moveable aspect of the Dialog. If true, Dialog
+ // can be dragged by it's title. If false it will remain centered
+ // in the viewport.
+ draggable: true,
+
+ _setDraggableAttr: function(/*Boolean*/ val){
+ // Avoid _WidgetBase behavior of copying draggable attribute to this.domNode,
+ // as that prevents text select on modern browsers (#14452)
+ this._set("draggable", val);
+ },
+
+ // aria-describedby: String
+ // Allows the user to add an aria-describedby attribute onto the dialog. The value should
+ // be the id of the container element of text that describes the dialog purpose (usually
+ // the first text in the dialog).
+ // | <div data-dojo-type="dijit/Dialog" aria-describedby="intro" .....>
+ // | <div id="intro">Introductory text</div>
+ // | <div>rest of dialog contents</div>
+ // | </div>
+ "aria-describedby": "",
+
+ // maxRatio: Number
+ // Maximum size to allow the dialog to expand to, relative to viewport size
+ maxRatio: 0.9,
+
+ postMixInProperties: function(){
+ var _nlsResources = i18n.getLocalization("dijit", "common");
+ lang.mixin(this, _nlsResources);
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ domStyle.set(this.domNode, {
+ display: "none",
+ position:"absolute"
+ });
+ this.ownerDocumentBody.appendChild(this.domNode);
+
+ this.inherited(arguments);
+
+ this.connect(this, "onExecute", "hide");
+ this.connect(this, "onCancel", "hide");
+ this._modalconnects = [];
+ },
+
+ onLoad: function(){
+ // summary:
+ // Called when data has been loaded from an href.
+ // Unlike most other callbacks, this function can be connected to (via `dojo.connect`)
+ // but should *not* be overridden.
+ // tags:
+ // callback
+
+ // when href is specified we need to reposition the dialog after the data is loaded
+ // and find the focusable elements
+ this._position();
+ if(this.autofocus && DialogLevelManager.isTop(this)){
+ this._getFocusItems(this.domNode);
+ focus.focus(this._firstFocusItem);
+ }
+ this.inherited(arguments);
+ },
+
+ _onBlur: function(by){
+ this.inherited(arguments);
+
+ // If focus was accidentally removed from the dialog, such as if the user clicked a blank
+ // area of the screen, or clicked the browser's address bar and then tabbed into the page,
+ // then refocus. Won't do anything if focus was removed because the Dialog was closed, or
+ // because a new Dialog popped up on top of the old one.
+ var refocus = lang.hitch(this, function(){
+ if(this.open && !this._destroyed && DialogLevelManager.isTop(this)){
+ this._getFocusItems(this.domNode);
+ focus.focus(this._firstFocusItem);
+ }
+ });
+ if(by == "mouse"){
+ // wait for mouse up, and then refocus dialog; otherwise doesn't work
+ on.once(this.ownerDocument, "mouseup", refocus);
+ }else{
+ refocus();
+ }
+ },
+
+ _endDrag: function(){
+ // summary:
+ // Called after dragging the Dialog. Saves the position of the dialog in the viewport,
+ // and also adjust position to be fully within the viewport, so user doesn't lose access to handle
+ var nodePosition = domGeometry.position(this.domNode),
+ viewport = winUtils.getBox(this.ownerDocument);
+ nodePosition.y = Math.min(Math.max(nodePosition.y, 0), (viewport.h - nodePosition.h));
+ nodePosition.x = Math.min(Math.max(nodePosition.x, 0), (viewport.w - nodePosition.w));
+ this._relativePosition = nodePosition;
+ this._position();
+ },
+
+ _setup: function(){
+ // summary:
+ // Stuff we need to do before showing the Dialog for the first
+ // time (but we defer it until right beforehand, for
+ // performance reasons).
+ // tags:
+ // private
+
+ var node = this.domNode;
+
+ if(this.titleBar && this.draggable){
+ this._moveable = new ((has("ie") == 6) ? TimedMoveable // prevent overload, see #5285
+ : Moveable)(node, { handle: this.titleBar });
+ this.connect(this._moveable, "onMoveStop", "_endDrag");
+ }else{
+ domClass.add(node,"dijitDialogFixed");
+ }
+
+ this.underlayAttrs = {
+ dialogId: this.id,
+ "class": array.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" "),
+ ownerDocument: this.ownerDocument
+ };
+ },
+
+ _size: function(){
+ // summary:
+ // If necessary, shrink dialog contents so dialog fits in viewport
+ // tags:
+ // private
+
+ this._checkIfSingleChild();
+
+ // If we resized the dialog contents earlier, reset them back to original size, so
+ // that if the user later increases the viewport size, the dialog can display w/out a scrollbar.
+ // Need to do this before the domGeometry.position(this.domNode) call below.
+ if(this._singleChild){
+ if(typeof this._singleChildOriginalStyle != "undefined"){
+ this._singleChild.domNode.style.cssText = this._singleChildOriginalStyle;
+ delete this._singleChildOriginalStyle;
+ }
+ }else{
+ domStyle.set(this.containerNode, {
+ width:"auto",
+ height:"auto"
+ });
+ }
+
+ var bb = domGeometry.position(this.domNode);
+
+ // Get viewport size but then reduce it by a bit; Dialog should always have some space around it
+ // to indicate that it's a popup. This will also compensate for possible scrollbars on viewport.
+ var viewport = winUtils.getBox(this.ownerDocument);
+ viewport.w *= this.maxRatio;
+ viewport.h *= this.maxRatio;
+
+ if(bb.w >= viewport.w || bb.h >= viewport.h){
+ // Reduce size of dialog contents so that dialog fits in viewport
+
+ var containerSize = domGeometry.position(this.containerNode),
+ w = Math.min(bb.w, viewport.w) - (bb.w - containerSize.w),
+ h = Math.min(bb.h, viewport.h) - (bb.h - containerSize.h);
+
+ if(this._singleChild && this._singleChild.resize){
+ if(typeof this._singleChildOriginalStyle == "undefined"){
+ this._singleChildOriginalStyle = this._singleChild.domNode.style.cssText;
+ }
+ this._singleChild.resize({w: w, h: h});
+ }else{
+ domStyle.set(this.containerNode, {
+ width: w + "px",
+ height: h + "px",
+ overflow: "auto",
+ position: "relative" // workaround IE bug moving scrollbar or dragging dialog
+ });
+ }
+ }else{
+ if(this._singleChild && this._singleChild.resize){
+ this._singleChild.resize();
+ }
+ }
+ },
+
+ _position: function(){
+ // summary:
+ // Position modal dialog in the viewport. If no relative offset
+ // in the viewport has been determined (by dragging, for instance),
+ // center the node. Otherwise, use the Dialog's stored relative offset,
+ // and position the node to top: left: values based on the viewport.
+ if(!domClass.contains(this.ownerDocumentBody, "dojoMove")){ // don't do anything if called during auto-scroll
+ var node = this.domNode,
+ viewport = winUtils.getBox(this.ownerDocument),
+ p = this._relativePosition,
+ bb = p ? null : domGeometry.position(node),
+ l = Math.floor(viewport.l + (p ? p.x : (viewport.w - bb.w) / 2)),
+ t = Math.floor(viewport.t + (p ? p.y : (viewport.h - bb.h) / 2))
+ ;
+ domStyle.set(node,{
+ left: l + "px",
+ top: t + "px"
+ });
+ }
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary:
+ // Handles the keyboard events for accessibility reasons
+ // tags:
+ // private
+
+ if(evt.charOrCode){
+ var node = evt.target;
+ if(evt.charOrCode === keys.TAB){
+ this._getFocusItems(this.domNode);
+ }
+ var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+ // see if we are shift-tabbing from first focusable item on dialog
+ if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === keys.TAB){
+ if(!singleFocusItem){
+ focus.focus(this._lastFocusItem); // send focus to last item in dialog
+ }
+ event.stop(evt);
+ }else if(node == this._lastFocusItem && evt.charOrCode === keys.TAB && !evt.shiftKey){
+ if(!singleFocusItem){
+ focus.focus(this._firstFocusItem); // send focus to first item in dialog
+ }
+ event.stop(evt);
+ }else{
+ // see if the key is for the dialog
+ while(node){
+ if(node == this.domNode || domClass.contains(node, "dijitPopup")){
+ if(evt.charOrCode == keys.ESCAPE){
+ this.onCancel();
+ }else{
+ return; // just let it go
+ }
+ }
+ node = node.parentNode;
+ }
+ // this key is for the disabled document window
+ if(evt.charOrCode !== keys.TAB){ // allow tabbing into the dialog for a11y
+ event.stop(evt);
+ // opera won't tab to a div
+ }else if(!has("opera")){
+ try{
+ this._firstFocusItem.focus();
+ }catch(e){ /*squelch*/ }
+ }
+ }
+ }
+ },
+
+ show: function(){
+ // summary:
+ // Display the dialog
+ // returns: dojo/_base/Deferred
+ // Deferred object that resolves when the display animation is complete
+
+ if(this.open){ return; }
+
+ if(!this._started){
+ this.startup();
+ }
+
+ // first time we show the dialog, there's some initialization stuff to do
+ if(!this._alreadyInitialized){
+ this._setup();
+ this._alreadyInitialized=true;
+ }
+
+ if(this._fadeOutDeferred){
+ this._fadeOutDeferred.cancel();
+ }
+
+ // Recenter Dialog if user scrolls browser. Connecting to document doesn't work on IE, need to use window.
+ var win = winUtils.get(this.ownerDocument);
+ this._modalconnects.push(on(win, "scroll", lang.hitch(this, "resize")));
+
+ this._modalconnects.push(on(this.domNode, connect._keypress, lang.hitch(this, "_onKey")));
+
+ domStyle.set(this.domNode, {
+ opacity:0,
+ display:""
+ });
+
+ this._set("open", true);
+ this._onShow(); // lazy load trigger
+
+ this._size();
+ this._position();
+
+ // fade-in Animation object, setup below
+ var fadeIn;
+
+ this._fadeInDeferred = new Deferred(lang.hitch(this, function(){
+ fadeIn.stop();
+ delete this._fadeInDeferred;
+ }));
+
+ fadeIn = fx.fadeIn({
+ node: this.domNode,
+ duration: this.duration,
+ beforeBegin: lang.hitch(this, function(){
+ DialogLevelManager.show(this, this.underlayAttrs);
+ }),
+ onEnd: lang.hitch(this, function(){
+ if(this.autofocus && DialogLevelManager.isTop(this)){
+ // find focusable items each time dialog is shown since if dialog contains a widget the
+ // first focusable items can change
+ this._getFocusItems(this.domNode);
+ focus.focus(this._firstFocusItem);
+ }
+ this._fadeInDeferred.resolve(true);
+ delete this._fadeInDeferred;
+ })
+ }).play();
+
+ return this._fadeInDeferred;
+ },
+
+ hide: function(){
+ // summary:
+ // Hide the dialog
+ // returns: dojo/_base/Deferred
+ // Deferred object that resolves when the hide animation is complete
+
+ // If we haven't been initialized yet then we aren't showing and we can just return.
+ // Likewise if we are already hidden, or are currently fading out.
+ if(!this._alreadyInitialized || !this.open){
+ return;
+ }
+ if(this._fadeInDeferred){
+ this._fadeInDeferred.cancel();
+ }
+
+ // fade-in Animation object, setup below
+ var fadeOut;
+
+ this._fadeOutDeferred = new Deferred(lang.hitch(this, function(){
+ fadeOut.stop();
+ delete this._fadeOutDeferred;
+ }));
+ // fire onHide when the promise resolves.
+ this._fadeOutDeferred.then(lang.hitch(this, 'onHide'));
+
+ fadeOut = fx.fadeOut({
+ node: this.domNode,
+ duration: this.duration,
+ onEnd: lang.hitch(this, function(){
+ this.domNode.style.display = "none";
+ DialogLevelManager.hide(this);
+ this._fadeOutDeferred.resolve(true);
+ delete this._fadeOutDeferred;
+ })
+ }).play();
+
+ if(this._scrollConnected){
+ this._scrollConnected = false;
+ }
+ var h;
+ while(h = this._modalconnects.pop()){
+ h.remove();
+ }
+
+ if(this._relativePosition){
+ delete this._relativePosition;
+ }
+ this._set("open", false);
+
+ return this._fadeOutDeferred;
+ },
+
+ resize: function(){
+ // summary:
+ // Called when viewport scrolled or size changed. Position the Dialog and the underlay.
+ // tags:
+ // private
+ if(this.domNode.style.display != "none"){
+ if(DialogUnderlay._singleton){ // avoid race condition during show()
+ DialogUnderlay._singleton.layout();
+ }
+ this._position();
+ this._size();
+ }
+ },
+
+ destroy: function(){
+ if(this._fadeInDeferred){
+ this._fadeInDeferred.cancel();
+ }
+ if(this._fadeOutDeferred){
+ this._fadeOutDeferred.cancel();
+ }
+ if(this._moveable){
+ this._moveable.destroy();
+ }
+ var h;
+ while(h = this._modalconnects.pop()){
+ h.remove();
+ }
+
+ DialogLevelManager.hide(this);
+
+ this.inherited(arguments);
+ }
+ });
+
+ var Dialog = declare("dijit.Dialog", [ContentPane, _DialogBase], {
+ // summary:
+ // A modal dialog Widget.
+ // description:
+ // Pops up a modal dialog window, blocking access to the screen
+ // and also graying out the screen Dialog is extended from
+ // ContentPane so it supports all the same parameters (href, etc.).
+ // example:
+ // | <div data-dojo-type="dijit/Dialog" data-dojo-props="href: 'test.html'"></div>
+ // example:
+ // | var foo = new Dialog({ title: "test dialog", content: "test content" };
+ // | foo.placeAt(win.body());
+ // | foo.startup();
+ });
+ Dialog._DialogBase = _DialogBase; // for monkey patching and dojox/widget/DialogSimple
+
+ var DialogLevelManager = Dialog._DialogLevelManager = {
+ // summary:
+ // Controls the various active "levels" on the page, starting with the
+ // stuff initially visible on the page (at z-index 0), and then having an entry for
+ // each Dialog shown.
+
+ _beginZIndex: 950,
+
+ show: function(/*dijit/_WidgetBase*/ dialog, /*Object*/ underlayAttrs){
+ // summary:
+ // Call right before fade-in animation for new dialog.
+ // Saves current focus, displays/adjusts underlay for new dialog,
+ // and sets the z-index of the dialog itself.
+ //
+ // New dialog will be displayed on top of all currently displayed dialogs.
+ //
+ // Caller is responsible for setting focus in new dialog after the fade-in
+ // animation completes.
+
+ // Save current focus
+ ds[ds.length-1].focus = focus.curNode;
+
+ // Display the underlay, or if already displayed then adjust for this new dialog
+ // TODO: one underlay per document (based on dialog.ownerDocument)
+ var underlay = DialogUnderlay._singleton;
+ if(!underlay || underlay._destroyed){
+ underlay = dijit._underlay = DialogUnderlay._singleton = new DialogUnderlay(underlayAttrs);
+ }else{
+ underlay.set(dialog.underlayAttrs);
+ }
+
+ // Set z-index a bit above previous dialog
+ var zIndex = ds[ds.length-1].dialog ? ds[ds.length-1].zIndex + 2 : Dialog._DialogLevelManager._beginZIndex;
+ if(ds.length == 1){ // first dialog
+ underlay.show();
+ }
+ domStyle.set(DialogUnderlay._singleton.domNode, 'zIndex', zIndex - 1);
+
+ // Dialog
+ domStyle.set(dialog.domNode, 'zIndex', zIndex);
+
+ ds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex});
+ },
+
+ hide: function(/*dijit/_WidgetBase*/ dialog){
+ // summary:
+ // Called when the specified dialog is hidden/destroyed, after the fade-out
+ // animation ends, in order to reset page focus, fix the underlay, etc.
+ // If the specified dialog isn't open then does nothing.
+ //
+ // Caller is responsible for either setting display:none on the dialog domNode,
+ // or calling dijit/popup.hide(), or removing it from the page DOM.
+
+ if(ds[ds.length-1].dialog == dialog){
+ // Removing the top (or only) dialog in the stack, return focus
+ // to previous dialog
+
+ ds.pop();
+
+ var pd = ds[ds.length-1]; // the new active dialog (or the base page itself)
+
+ // Adjust underlay, unless the underlay widget has already been destroyed
+ // because we are being called during page unload (when all widgets are destroyed)
+ if(!DialogUnderlay._singleton._destroyed){
+ if(ds.length == 1){
+ // Returning to original page. Hide the underlay.
+ DialogUnderlay._singleton.hide();
+ }else{
+ // Popping back to previous dialog, adjust underlay.
+ domStyle.set(DialogUnderlay._singleton.domNode, 'zIndex', pd.zIndex - 1);
+ DialogUnderlay._singleton.set(pd.underlayAttrs);
+ }
+ }
+
+ // Adjust focus
+ if(dialog.refocus){
+ // If we are returning control to a previous dialog but for some reason
+ // that dialog didn't have a focused field, set focus to first focusable item.
+ // This situation could happen if two dialogs appeared at nearly the same time,
+ // since a dialog doesn't set it's focus until the fade-in is finished.
+ var focus = pd.focus;
+ if(pd.dialog && (!focus || !dom.isDescendant(focus, pd.dialog.domNode))){
+ pd.dialog._getFocusItems(pd.dialog.domNode);
+ focus = pd.dialog._firstFocusItem;
+ }
+
+ if(focus){
+ // Refocus the button that spawned the Dialog. This will fail in corner cases including
+ // page unload on IE, because the dijit/form/Button that launched the Dialog may get destroyed
+ // before this code runs. (#15058)
+ try{
+ focus.focus();
+ }catch(e){}
+ }
+ }
+ }else{
+ // Removing a dialog out of order (#9944, #10705).
+ // Don't need to mess with underlay or z-index or anything.
+ var idx = array.indexOf(array.map(ds, function(elem){return elem.dialog}), dialog);
+ if(idx != -1){
+ ds.splice(idx, 1);
+ }
+ }
+ },
+
+ isTop: function(/*dijit/_WidgetBase*/ dialog){
+ // summary:
+ // Returns true if specified Dialog is the top in the task
+ return ds[ds.length-1].dialog == dialog;
+ }
+ };
+
+ // Stack representing the various active "levels" on the page, starting with the
+ // stuff initially visible on the page (at z-index 0), and then having an entry for
+ // each Dialog shown.
+ // Each element in stack has form {
+ // dialog: dialogWidget,
+ // focus: returnFromGetFocus(),
+ // underlayAttrs: attributes to set on underlay (when this widget is active)
+ // }
+ var ds = Dialog._dialogStack = [
+ {dialog: null, focus: null, underlayAttrs: null} // entry for stuff at z-index: 0
+ ];
+
+ // Back compat w/1.6, remove for 2.0
+ if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/TooltipDialog"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+ }
+
+ return Dialog;
+});
diff --git a/lib/dijit/DialogUnderlay.js b/lib/dijit/DialogUnderlay.js
index 0321e512c..d078422b4 100644
--- a/lib/dijit/DialogUnderlay.js
+++ b/lib/dijit/DialogUnderlay.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/DialogUnderlay",["dojo/_base/declare","dojo/dom-attr","dojo/_base/window","dojo/window","./_Widget","./_TemplatedMixin","./BackgroundIframe"],function(_1,_2,_3,_4,_5,_6,_7){return _1("dijit.DialogUnderlay",[_5,_6],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' data-dojo-attach-point='node'></div></div>",dialogId:"","class":"",_setDialogIdAttr:function(id){_2.set(this.node,"id",id+"_underlay");this._set("dialogId",id);},_setClassAttr:function(_8){this.node.className="dijitDialogUnderlay "+_8;this._set("class",_8);},postCreate:function(){_3.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _9=_4.getBox();os.top=_9.t+"px";os.left=_9.l+"px";is.width=_9.w+"px";is.height=_9.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new _7(this.domNode);},hide:function(){this.bgIframe.destroy();delete this.bgIframe;this.domNode.style.display="none";}});}); \ No newline at end of file
+define("dijit/DialogUnderlay",["dojo/_base/declare","dojo/dom-attr","dojo/window","./_Widget","./_TemplatedMixin","./BackgroundIframe"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.DialogUnderlay",[_4,_5],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' data-dojo-attach-point='node'></div></div>",dialogId:"","class":"",_setDialogIdAttr:function(id){_2.set(this.node,"id",id+"_underlay");this._set("dialogId",id);},_setClassAttr:function(_7){this.node.className="dijitDialogUnderlay "+_7;this._set("class",_7);},postCreate:function(){this.ownerDocumentBody.appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _8=_3.getBox(this.ownerDocument);os.top=_8.t+"px";os.left=_8.l+"px";is.width=_8.w+"px";is.height=_8.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new _6(this.domNode);},hide:function(){this.bgIframe.destroy();delete this.bgIframe;this.domNode.style.display="none";}});}); \ No newline at end of file
diff --git a/lib/dijit/DialogUnderlay.js.uncompressed.js b/lib/dijit/DialogUnderlay.js.uncompressed.js
new file mode 100644
index 000000000..040c5411f
--- /dev/null
+++ b/lib/dijit/DialogUnderlay.js.uncompressed.js
@@ -0,0 +1,102 @@
+define("dijit/DialogUnderlay", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/window", // winUtils.getBox
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./BackgroundIframe"
+], function(declare, domAttr, winUtils, _Widget, _TemplatedMixin, BackgroundIframe){
+
+ // module:
+ // dijit/DialogUnderlay
+
+ return declare("dijit.DialogUnderlay", [_Widget, _TemplatedMixin], {
+ // summary:
+ // The component that blocks the screen behind a `dijit.Dialog`
+ //
+ // description:
+ // A component used to block input behind a `dijit.Dialog`. Only a single
+ // instance of this widget is created by `dijit.Dialog`, and saved as
+ // a reference to be shared between all Dialogs as `dijit._underlay`
+ //
+ // The underlay itself can be styled based on and id:
+ // | #myDialog_underlay { background-color:red; }
+ //
+ // In the case of `dijit.Dialog`, this id is based on the id of the Dialog,
+ // suffixed with _underlay.
+
+ // Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe.
+ // Inner div has opacity specified in CSS file.
+ templateString: "<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' data-dojo-attach-point='node'></div></div>",
+
+ // Parameters on creation or updatable later
+
+ // dialogId: String
+ // Id of the dialog.... DialogUnderlay's id is based on this id
+ dialogId: "",
+
+ // class: String
+ // This class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay
+ "class": "",
+
+ _setDialogIdAttr: function(id){
+ domAttr.set(this.node, "id", id + "_underlay");
+ this._set("dialogId", id);
+ },
+
+ _setClassAttr: function(clazz){
+ this.node.className = "dijitDialogUnderlay " + clazz;
+ this._set("class", clazz);
+ },
+
+ postCreate: function(){
+ // summary:
+ // Append the underlay to the body
+ this.ownerDocumentBody.appendChild(this.domNode);
+ },
+
+ layout: function(){
+ // summary:
+ // Sets the background to the size of the viewport
+ //
+ // description:
+ // Sets the background to the size of the viewport (rather than the size
+ // of the document) since we need to cover the whole browser window, even
+ // if the document is only a few lines long.
+ // tags:
+ // private
+
+ var is = this.node.style,
+ os = this.domNode.style;
+
+ // hide the background temporarily, so that the background itself isn't
+ // causing scrollbars to appear (might happen when user shrinks browser
+ // window and then we are called to resize)
+ os.display = "none";
+
+ // then resize and show
+ var viewport = winUtils.getBox(this.ownerDocument);
+ os.top = viewport.t + "px";
+ os.left = viewport.l + "px";
+ is.width = viewport.w + "px";
+ is.height = viewport.h + "px";
+ os.display = "block";
+ },
+
+ show: function(){
+ // summary:
+ // Show the dialog underlay
+ this.domNode.style.display = "block";
+ this.layout();
+ this.bgIframe = new BackgroundIframe(this.domNode);
+ },
+
+ hide: function(){
+ // summary:
+ // Hides the dialog underlay
+ this.bgIframe.destroy();
+ delete this.bgIframe;
+ this.domNode.style.display = "none";
+ }
+ });
+});
diff --git a/lib/dijit/DropDownMenu.js b/lib/dijit/DropDownMenu.js
index b58d9ae4a..dd60d3c93 100644
--- a/lib/dijit/DropDownMenu.js
+++ b/lib/dijit/DropDownMenu.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/Menu.html":"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" data-dojo-attach-point=\"containerNode\"></tbody>\n</table>\n"}});define("dijit/DropDownMenu",["dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/text!./templates/Menu.html","./_OnDijitClickMixin","./_MenuBase"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.DropDownMenu",[_6,_5],{templateString:_4,baseClass:"dijitMenu",postCreate:function(){var l=this.isLeftToRight();this._openSubMenuKey=l?_3.RIGHT_ARROW:_3.LEFT_ARROW;this._closeSubMenuKey=l?_3.LEFT_ARROW:_3.RIGHT_ARROW;this.connectKeyNavHandlers([_3.UP_ARROW],[_3.DOWN_ARROW]);},_onKeyPress:function(_7){if(_7.ctrlKey||_7.altKey){return;}switch(_7.charOrCode){case this._openSubMenuKey:this._moveToPopup(_7);_2.stop(_7);break;case this._closeSubMenuKey:if(this.parentMenu){if(this.parentMenu._isMenuBar){this.parentMenu.focusPrev();}else{this.onCancel(false);}}else{_2.stop(_7);}break;}}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/Menu.html":"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\"\n\t data-dojo-attach-event=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" data-dojo-attach-point=\"containerNode\"></tbody>\n</table>\n"}});define("dijit/DropDownMenu",["dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/text!./templates/Menu.html","./_OnDijitClickMixin","./_MenuBase"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.DropDownMenu",[_6,_5],{templateString:_4,baseClass:"dijitMenu",postCreate:function(){this.inherited(arguments);var l=this.isLeftToRight();this._openSubMenuKey=l?_3.RIGHT_ARROW:_3.LEFT_ARROW;this._closeSubMenuKey=l?_3.LEFT_ARROW:_3.RIGHT_ARROW;this.connectKeyNavHandlers([_3.UP_ARROW],[_3.DOWN_ARROW]);},_onKeyPress:function(_7){if(_7.ctrlKey||_7.altKey){return;}switch(_7.charOrCode){case this._openSubMenuKey:this._moveToPopup(_7);_2.stop(_7);break;case this._closeSubMenuKey:if(this.parentMenu){if(this.parentMenu._isMenuBar){this.parentMenu.focusPrev();}else{this.onCancel(false);}}else{_2.stop(_7);}break;}}});}); \ No newline at end of file
diff --git a/lib/dijit/DropDownMenu.js.uncompressed.js b/lib/dijit/DropDownMenu.js.uncompressed.js
new file mode 100644
index 000000000..0d5234c98
--- /dev/null
+++ b/lib/dijit/DropDownMenu.js.uncompressed.js
@@ -0,0 +1,58 @@
+require({cache:{
+'url:dijit/templates/Menu.html':"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\"\n\t data-dojo-attach-event=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" data-dojo-attach-point=\"containerNode\"></tbody>\n</table>\n"}});
+define("dijit/DropDownMenu", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/text!./templates/Menu.html",
+ "./_OnDijitClickMixin",
+ "./_MenuBase"
+], function(declare, event, keys, template, _OnDijitClickMixin, _MenuBase){
+
+ // module:
+ // dijit/DropDownMenu
+
+ return declare("dijit.DropDownMenu", [_MenuBase, _OnDijitClickMixin], {
+ // summary:
+ // A menu, without features for context menu (Meaning, drop down menu)
+
+ templateString: template,
+
+ baseClass: "dijitMenu",
+
+ postCreate: function(){
+ this.inherited(arguments);
+ var l = this.isLeftToRight();
+ this._openSubMenuKey = l ? keys.RIGHT_ARROW : keys.LEFT_ARROW;
+ this._closeSubMenuKey = l ? keys.LEFT_ARROW : keys.RIGHT_ARROW;
+ this.connectKeyNavHandlers([keys.UP_ARROW], [keys.DOWN_ARROW]);
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary:
+ // Handle keyboard based menu navigation.
+ // tags:
+ // protected
+
+ if(evt.ctrlKey || evt.altKey){ return; }
+
+ switch(evt.charOrCode){
+ case this._openSubMenuKey:
+ this._moveToPopup(evt);
+ event.stop(evt);
+ break;
+ case this._closeSubMenuKey:
+ if(this.parentMenu){
+ if(this.parentMenu._isMenuBar){
+ this.parentMenu.focusPrev();
+ }else{
+ this.onCancel(false);
+ }
+ }else{
+ event.stop(evt);
+ }
+ break;
+ }
+ }
+ });
+});
diff --git a/lib/dijit/Editor.js b/lib/dijit/Editor.js
index 8ad9b2b4a..c95c46377 100644
--- a/lib/dijit/Editor.js
+++ b/lib/dijit/Editor.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/Editor",["dojo/_base/array","dojo/_base/declare","dojo/_base/Deferred","dojo/i18n","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/string","dojo/topic","dojo/_base/window","./_base/focus","./_Container","./Toolbar","./ToolbarSeparator","./layout/_LayoutWidget","./form/ToggleButton","./_editor/_Plugin","./_editor/plugins/EnterKeyHandling","./_editor/html","./_editor/range","./_editor/RichText",".","dojo/i18n!./_editor/nls/commands"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_1a,_1b){var _1c=_2("dijit.Editor",_1a,{plugins:null,extraPlugins:null,constructor:function(){if(!_b.isArray(this.plugins)){this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|","insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull",_17];}this._plugins=[];this._editInterval=this.editActionInterval*1000;if(_c("ie")){this.events.push("onBeforeDeactivate");this.events.push("onBeforeActivate");}},postMixInProperties:function(){this.setValueDeferred=new _3();this.inherited(arguments);},postCreate:function(){this._steps=this._steps.slice(0);this._undoedSteps=this._undoedSteps.slice(0);if(_b.isArray(this.extraPlugins)){this.plugins=this.plugins.concat(this.extraPlugins);}this.inherited(arguments);this.commands=_4.getLocalization("dijit._editor","commands",this.lang);if(!this.toolbar){this.toolbar=new _12({dir:this.dir,lang:this.lang});this.header.appendChild(this.toolbar.domNode);}_1.forEach(this.plugins,this.addPlugin,this);this.setValueDeferred.callback(true);_6.add(this.iframe.parentNode,"dijitEditorIFrameContainer");_6.add(this.iframe,"dijitEditorIFrame");_5.set(this.iframe,"allowTransparency",true);if(_c("webkit")){_8.set(this.domNode,"KhtmlUserSelect","none");}this.toolbar.startup();this.onNormalizedDisplayChanged();},destroy:function(){_1.forEach(this._plugins,function(p){if(p&&p.destroy){p.destroy();}});this._plugins=[];this.toolbar.destroyRecursive();delete this.toolbar;this.inherited(arguments);},addPlugin:function(_1d,_1e){var _1f=_b.isString(_1d)?{name:_1d}:_b.isFunction(_1d)?{ctor:_1d}:_1d;if(!_1f.setEditor){var o={"args":_1f,"plugin":null,"editor":this};if(_1f.name){if(_16.registry[_1f.name]){o.plugin=_16.registry[_1f.name](_1f);}else{_e.publish(_1b._scopeName+".Editor.getPlugin",o);}}if(!o.plugin){var pc=_1f.ctor||_b.getObject(_1f.name);if(pc){o.plugin=new pc(_1f);}}if(!o.plugin){console.warn("Cannot find plugin",_1d);return;}_1d=o.plugin;}if(arguments.length>1){this._plugins[_1e]=_1d;}else{this._plugins.push(_1d);}_1d.setEditor(this);if(_b.isFunction(_1d.setToolbar)){_1d.setToolbar(this.toolbar);}},resize:function(_20){if(_20){_14.prototype.resize.apply(this,arguments);}},layout:function(){var _21=(this._contentBox.h-(this.getHeaderHeight()+this.getFooterHeight()+_7.getPadBorderExtents(this.iframe.parentNode).h+_7.getMarginExtents(this.iframe.parentNode).h));this.editingArea.style.height=_21+"px";if(this.iframe){this.iframe.style.height="100%";}this._layoutMode=true;},_onIEMouseDown:function(e){var _22;var b=this.document.body;var _23=b.clientWidth;var _24=b.clientHeight;var _25=b.clientLeft;var _26=b.offsetWidth;var _27=b.offsetHeight;var _28=b.offsetLeft;if(/^rtl$/i.test(b.dir||"")){if(_23<_26&&e.x>_23&&e.x<_26){_22=true;}}else{if(e.x<_25&&e.x>_28){_22=true;}}if(!_22){if(_24<_27&&e.y>_24&&e.y<_27){_22=true;}}if(!_22){delete this._cursorToStart;delete this._savedSelection;if(e.target.tagName=="BODY"){setTimeout(_b.hitch(this,"placeCursorAtEnd"),0);}this.inherited(arguments);}},onBeforeActivate:function(){this._restoreSelection();},onBeforeDeactivate:function(e){if(this.customUndo){this.endEditing(true);}if(e.target.tagName!="BODY"){this._saveSelection();}},customUndo:true,editActionInterval:3,beginEditing:function(cmd){if(!this._inEditing){this._inEditing=true;this._beginEditing(cmd);}if(this.editActionInterval>0){if(this._editTimer){clearTimeout(this._editTimer);}this._editTimer=setTimeout(_b.hitch(this,this.endEditing),this._editInterval);}},_steps:[],_undoedSteps:[],execCommand:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return this[cmd]();}else{if(this.customUndo){this.endEditing();this._beginEditing();}var r=this.inherited(arguments);if(this.customUndo){this._endEditing();}return r;}},_pasteImpl:function(){return this._clipboardCommand("paste");},_cutImpl:function(){return this._clipboardCommand("cut");},_copyImpl:function(){return this._clipboardCommand("copy");},_clipboardCommand:function(cmd){var r;try{r=this.document.execCommand(cmd,false,null);if(_c("webkit")&&!r){throw {code:1011};}}catch(e){if(e.code==1011){var sub=_d.substitute,_29={cut:"X",copy:"C",paste:"V"};alert(sub(this.commands.systemShortcut,[this.commands[cmd],sub(this.commands[_c("mac")?"appleKey":"ctrlKey"],[_29[cmd]])]));}r=false;}return r;},queryCommandEnabled:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0);}else{return this.inherited(arguments);}},_moveToBookmark:function(b){var _2a=b.mark;var _2b=b.mark;var col=b.isCollapsed;var r,_2c,_2d,sel;if(_2b){if(_c("ie")<9){if(_b.isArray(_2b)){_2a=[];_1.forEach(_2b,function(n){_2a.push(_19.getNode(n,this.editNode));},this);_f.withGlobal(this.window,"moveToBookmark",_1b,[{mark:_2a,isCollapsed:col}]);}else{if(_2b.startContainer&&_2b.endContainer){sel=_19.getSelection(this.window);if(sel&&sel.removeAllRanges){sel.removeAllRanges();r=_19.create(this.window);_2c=_19.getNode(_2b.startContainer,this.editNode);_2d=_19.getNode(_2b.endContainer,this.editNode);if(_2c&&_2d){r.setStart(_2c,_2b.startOffset);r.setEnd(_2d,_2b.endOffset);sel.addRange(r);}}}}}else{sel=_19.getSelection(this.window);if(sel&&sel.removeAllRanges){sel.removeAllRanges();r=_19.create(this.window);_2c=_19.getNode(_2b.startContainer,this.editNode);_2d=_19.getNode(_2b.endContainer,this.editNode);if(_2c&&_2d){r.setStart(_2c,_2b.startOffset);r.setEnd(_2d,_2b.endOffset);sel.addRange(r);}}}}},_changeToStep:function(_2e,to){this.setValue(to.text);var b=to.bookmark;if(!b){return;}this._moveToBookmark(b);},undo:function(){var ret=false;if(!this._undoRedoActive){this._undoRedoActive=true;this.endEditing(true);var s=this._steps.pop();if(s&&this._steps.length>0){this.focus();this._changeToStep(s,this._steps[this._steps.length-1]);this._undoedSteps.push(s);this.onDisplayChanged();delete this._undoRedoActive;ret=true;}delete this._undoRedoActive;}return ret;},redo:function(){var ret=false;if(!this._undoRedoActive){this._undoRedoActive=true;this.endEditing(true);var s=this._undoedSteps.pop();if(s&&this._steps.length>0){this.focus();this._changeToStep(this._steps[this._steps.length-1],s);this._steps.push(s);this.onDisplayChanged();ret=true;}delete this._undoRedoActive;}return ret;},endEditing:function(_2f){if(this._editTimer){clearTimeout(this._editTimer);}if(this._inEditing){this._endEditing(_2f);this._inEditing=false;}},_getBookmark:function(){var b=_f.withGlobal(this.window,_10.getBookmark);var tmp=[];if(b&&b.mark){var _30=b.mark;if(_c("ie")<9){var sel=_19.getSelection(this.window);if(!_b.isArray(_30)){if(sel){var _31;if(sel.rangeCount){_31=sel.getRangeAt(0);}if(_31){b.mark=_31.cloneRange();}else{b.mark=_f.withGlobal(this.window,_10.getBookmark);}}}else{_1.forEach(b.mark,function(n){tmp.push(_19.getIndex(n,this.editNode).o);},this);b.mark=tmp;}}try{if(b.mark&&b.mark.startContainer){tmp=_19.getIndex(b.mark.startContainer,this.editNode).o;b.mark={startContainer:tmp,startOffset:b.mark.startOffset,endContainer:b.mark.endContainer===b.mark.startContainer?tmp:_19.getIndex(b.mark.endContainer,this.editNode).o,endOffset:b.mark.endOffset};}}catch(e){b.mark=null;}}return b;},_beginEditing:function(){if(this._steps.length===0){this._steps.push({"text":_18.getChildrenHtml(this.editNode),"bookmark":this._getBookmark()});}},_endEditing:function(){var v=_18.getChildrenHtml(this.editNode);this._undoedSteps=[];this._steps.push({text:v,bookmark:this._getBookmark()});},onKeyDown:function(e){if(!_c("ie")&&!this.iframe&&e.keyCode==_a.TAB&&!this.tabIndent){this._saveSelection();}if(!this.customUndo){this.inherited(arguments);return;}var k=e.keyCode;if(e.ctrlKey&&!e.altKey){if(k==90||k==122){_9.stop(e);this.undo();return;}else{if(k==89||k==121){_9.stop(e);this.redo();return;}}}this.inherited(arguments);switch(k){case _a.ENTER:case _a.BACKSPACE:case _a.DELETE:this.beginEditing();break;case 88:case 86:if(e.ctrlKey&&!e.altKey&&!e.metaKey){this.endEditing();if(e.keyCode==88){this.beginEditing("cut");setTimeout(_b.hitch(this,this.endEditing),1);}else{this.beginEditing("paste");setTimeout(_b.hitch(this,this.endEditing),1);}break;}default:if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<_a.F1||e.keyCode>_a.F15)){this.beginEditing();break;}case _a.ALT:this.endEditing();break;case _a.UP_ARROW:case _a.DOWN_ARROW:case _a.LEFT_ARROW:case _a.RIGHT_ARROW:case _a.HOME:case _a.END:case _a.PAGE_UP:case _a.PAGE_DOWN:this.endEditing(true);break;case _a.CTRL:case _a.SHIFT:case _a.TAB:break;}},_onBlur:function(){this.inherited(arguments);this.endEditing(true);},_saveSelection:function(){try{this._savedSelection=this._getBookmark();}catch(e){}},_restoreSelection:function(){if(this._savedSelection){delete this._cursorToStart;if(_f.withGlobal(this.window,"isCollapsed",_1b)){this._moveToBookmark(this._savedSelection);}delete this._savedSelection;}},onClick:function(){this.endEditing(true);this.inherited(arguments);},replaceValue:function(_32){if(!this.customUndo){this.inherited(arguments);}else{if(this.isClosed){this.setValue(_32);}else{this.beginEditing();if(!_32){_32="&#160;";}this.setValue(_32);this.endEditing();}}},_setDisabledAttr:function(_33){var _34=_b.hitch(this,function(){if((!this.disabled&&_33)||(!this._buttonEnabledPlugins&&_33)){_1.forEach(this._plugins,function(p){p.set("disabled",true);});}else{if(this.disabled&&!_33){_1.forEach(this._plugins,function(p){p.set("disabled",false);});}}});this.setValueDeferred.addCallback(_34);this.inherited(arguments);},_setStateClass:function(){try{this.inherited(arguments);if(this.document&&this.document.body){_8.set(this.document.body,"color",_8.get(this.iframe,"color"));}}catch(e){}}});function _35(_36){return new _16({command:_36.name});};function _37(_38){return new _16({buttonClass:_15,command:_38.name});};_b.mixin(_16.registry,{"undo":_35,"redo":_35,"cut":_35,"copy":_35,"paste":_35,"insertOrderedList":_35,"insertUnorderedList":_35,"indent":_35,"outdent":_35,"justifyCenter":_35,"justifyFull":_35,"justifyLeft":_35,"justifyRight":_35,"delete":_35,"selectAll":_35,"removeFormat":_35,"unlink":_35,"insertHorizontalRule":_35,"bold":_37,"italic":_37,"underline":_37,"strikethrough":_37,"subscript":_37,"superscript":_37,"|":function(){return new _16({button:new _13(),setEditor:function(_39){this.editor=_39;}});}});return _1c;}); \ No newline at end of file
+define("dijit/Editor",["require","dojo/_base/array","dojo/_base/declare","dojo/_base/Deferred","dojo/i18n","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/string","dojo/topic","dojo/_base/window","./_base/focus","./_Container","./Toolbar","./ToolbarSeparator","./layout/_LayoutWidget","./form/ToggleButton","./_editor/_Plugin","./_editor/plugins/EnterKeyHandling","./_editor/html","./_editor/range","./_editor/RichText","./main","dojo/i18n!./_editor/nls/commands"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,win,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_1a,_1b){var _1c=_3("dijit.Editor",_1a,{plugins:null,extraPlugins:null,constructor:function(){if(!_c.isArray(this.plugins)){this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|","insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull",_17];}this._plugins=[];this._editInterval=this.editActionInterval*1000;if(_d("ie")){this.events.push("onBeforeDeactivate");this.events.push("onBeforeActivate");}},postMixInProperties:function(){this.setValueDeferred=new _4();this.inherited(arguments);},postCreate:function(){this._steps=this._steps.slice(0);this._undoedSteps=this._undoedSteps.slice(0);if(_c.isArray(this.extraPlugins)){this.plugins=this.plugins.concat(this.extraPlugins);}this.inherited(arguments);this.commands=_5.getLocalization("dijit._editor","commands",this.lang);if(!this.toolbar){this.toolbar=new _12({ownerDocument:this.ownerDocument,dir:this.dir,lang:this.lang});this.header.appendChild(this.toolbar.domNode);}_2.forEach(this.plugins,this.addPlugin,this);this.setValueDeferred.resolve(true);_7.add(this.iframe.parentNode,"dijitEditorIFrameContainer");_7.add(this.iframe,"dijitEditorIFrame");_6.set(this.iframe,"allowTransparency",true);if(_d("webkit")){_9.set(this.domNode,"KhtmlUserSelect","none");}this.toolbar.startup();this.onNormalizedDisplayChanged();},destroy:function(){_2.forEach(this._plugins,function(p){if(p&&p.destroy){p.destroy();}});this._plugins=[];this.toolbar.destroyRecursive();delete this.toolbar;this.inherited(arguments);},addPlugin:function(_1d,_1e){var _1f=_c.isString(_1d)?{name:_1d}:_c.isFunction(_1d)?{ctor:_1d}:_1d;if(!_1f.setEditor){var o={"args":_1f,"plugin":null,"editor":this};if(_1f.name){if(_16.registry[_1f.name]){o.plugin=_16.registry[_1f.name](_1f);}else{_f.publish(_1b._scopeName+".Editor.getPlugin",o);}}if(!o.plugin){try{var pc=_1f.ctor||_c.getObject(_1f.name)||_1(_1f.name);if(pc){o.plugin=new pc(_1f);}}catch(e){throw new Error(this.id+": cannot find plugin ["+_1f.name+"]");}}if(!o.plugin){throw new Error(this.id+": cannot find plugin ["+_1f.name+"]");}_1d=o.plugin;}if(arguments.length>1){this._plugins[_1e]=_1d;}else{this._plugins.push(_1d);}_1d.setEditor(this);if(_c.isFunction(_1d.setToolbar)){_1d.setToolbar(this.toolbar);}},resize:function(_20){if(_20){_14.prototype.resize.apply(this,arguments);}},layout:function(){var _21=(this._contentBox.h-(this.getHeaderHeight()+this.getFooterHeight()+_8.getPadBorderExtents(this.iframe.parentNode).h+_8.getMarginExtents(this.iframe.parentNode).h));this.editingArea.style.height=_21+"px";if(this.iframe){this.iframe.style.height="100%";}this._layoutMode=true;},_onIEMouseDown:function(e){var _22;var b=this.document.body;var _23=b.clientWidth;var _24=b.clientHeight;var _25=b.clientLeft;var _26=b.offsetWidth;var _27=b.offsetHeight;var _28=b.offsetLeft;if(/^rtl$/i.test(b.dir||"")){if(_23<_26&&e.x>_23&&e.x<_26){_22=true;}}else{if(e.x<_25&&e.x>_28){_22=true;}}if(!_22){if(_24<_27&&e.y>_24&&e.y<_27){_22=true;}}if(!_22){delete this._cursorToStart;delete this._savedSelection;if(e.target.tagName=="BODY"){this.defer("placeCursorAtEnd");}this.inherited(arguments);}},onBeforeActivate:function(){this._restoreSelection();},onBeforeDeactivate:function(e){if(this.customUndo){this.endEditing(true);}if(e.target.tagName!="BODY"){this._saveSelection();}},customUndo:true,editActionInterval:3,beginEditing:function(cmd){if(!this._inEditing){this._inEditing=true;this._beginEditing(cmd);}if(this.editActionInterval>0){if(this._editTimer){this._editTimer.remove();}this._editTimer=this.defer("endEditing",this._editInterval);}},_steps:[],_undoedSteps:[],execCommand:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return this[cmd]();}else{if(this.customUndo){this.endEditing();this._beginEditing();}var r=this.inherited(arguments);if(this.customUndo){this._endEditing();}return r;}},_pasteImpl:function(){return this._clipboardCommand("paste");},_cutImpl:function(){return this._clipboardCommand("cut");},_copyImpl:function(){return this._clipboardCommand("copy");},_clipboardCommand:function(cmd){var r;try{r=this.document.execCommand(cmd,false,null);if(_d("webkit")&&!r){throw {code:1011};}}catch(e){if(e.code==1011||(e.code==9&&_d("opera"))){var sub=_e.substitute,_29={cut:"X",copy:"C",paste:"V"};alert(sub(this.commands.systemShortcut,[this.commands[cmd],sub(this.commands[_d("mac")?"appleKey":"ctrlKey"],[_29[cmd]])]));}r=false;}return r;},queryCommandEnabled:function(cmd){if(this.customUndo&&(cmd=="undo"||cmd=="redo")){return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0);}else{return this.inherited(arguments);}},_moveToBookmark:function(b){var _2a=b.mark;var _2b=b.mark;var col=b.isCollapsed;var r,_2c,_2d,sel;if(_2b){if(_d("ie")<9){if(_c.isArray(_2b)){_2a=[];_2.forEach(_2b,function(n){_2a.push(_19.getNode(n,this.editNode));},this);win.withGlobal(this.window,"moveToBookmark",_10,[{mark:_2a,isCollapsed:col}]);}else{if(_2b.startContainer&&_2b.endContainer){sel=_19.getSelection(this.window);if(sel&&sel.removeAllRanges){sel.removeAllRanges();r=_19.create(this.window);_2c=_19.getNode(_2b.startContainer,this.editNode);_2d=_19.getNode(_2b.endContainer,this.editNode);if(_2c&&_2d){r.setStart(_2c,_2b.startOffset);r.setEnd(_2d,_2b.endOffset);sel.addRange(r);}}}}}else{sel=_19.getSelection(this.window);if(sel&&sel.removeAllRanges){sel.removeAllRanges();r=_19.create(this.window);_2c=_19.getNode(_2b.startContainer,this.editNode);_2d=_19.getNode(_2b.endContainer,this.editNode);if(_2c&&_2d){r.setStart(_2c,_2b.startOffset);r.setEnd(_2d,_2b.endOffset);sel.addRange(r);}}}}},_changeToStep:function(_2e,to){this.setValue(to.text);var b=to.bookmark;if(!b){return;}this._moveToBookmark(b);},undo:function(){var ret=false;if(!this._undoRedoActive){this._undoRedoActive=true;this.endEditing(true);var s=this._steps.pop();if(s&&this._steps.length>0){this.focus();this._changeToStep(s,this._steps[this._steps.length-1]);this._undoedSteps.push(s);this.onDisplayChanged();delete this._undoRedoActive;ret=true;}delete this._undoRedoActive;}return ret;},redo:function(){var ret=false;if(!this._undoRedoActive){this._undoRedoActive=true;this.endEditing(true);var s=this._undoedSteps.pop();if(s&&this._steps.length>0){this.focus();this._changeToStep(this._steps[this._steps.length-1],s);this._steps.push(s);this.onDisplayChanged();ret=true;}delete this._undoRedoActive;}return ret;},endEditing:function(_2f){if(this._editTimer){this._editTimer=this._editTimer.remove();}if(this._inEditing){this._endEditing(_2f);this._inEditing=false;}},_getBookmark:function(){var b=win.withGlobal(this.window,_10.getBookmark);var tmp=[];if(b&&b.mark){var _30=b.mark;if(_d("ie")<9){var sel=_19.getSelection(this.window);if(!_c.isArray(_30)){if(sel){var _31;if(sel.rangeCount){_31=sel.getRangeAt(0);}if(_31){b.mark=_31.cloneRange();}else{b.mark=win.withGlobal(this.window,_10.getBookmark);}}}else{_2.forEach(b.mark,function(n){tmp.push(_19.getIndex(n,this.editNode).o);},this);b.mark=tmp;}}try{if(b.mark&&b.mark.startContainer){tmp=_19.getIndex(b.mark.startContainer,this.editNode).o;b.mark={startContainer:tmp,startOffset:b.mark.startOffset,endContainer:b.mark.endContainer===b.mark.startContainer?tmp:_19.getIndex(b.mark.endContainer,this.editNode).o,endOffset:b.mark.endOffset};}}catch(e){b.mark=null;}}return b;},_beginEditing:function(){if(this._steps.length===0){this._steps.push({"text":_18.getChildrenHtml(this.editNode),"bookmark":this._getBookmark()});}},_endEditing:function(){var v=_18.getChildrenHtml(this.editNode);this._undoedSteps=[];this._steps.push({text:v,bookmark:this._getBookmark()});},onKeyDown:function(e){if(!_d("ie")&&!this.iframe&&e.keyCode==_b.TAB&&!this.tabIndent){this._saveSelection();}if(!this.customUndo){this.inherited(arguments);return;}var k=e.keyCode;if(e.ctrlKey&&!e.altKey){if(k==90||k==122){_a.stop(e);this.undo();return;}else{if(k==89||k==121){_a.stop(e);this.redo();return;}}}this.inherited(arguments);switch(k){case _b.ENTER:case _b.BACKSPACE:case _b.DELETE:this.beginEditing();break;case 88:case 86:if(e.ctrlKey&&!e.altKey&&!e.metaKey){this.endEditing();if(e.keyCode==88){this.beginEditing("cut");}else{this.beginEditing("paste");}this.defer("endEditing",1);break;}default:if(!e.ctrlKey&&!e.altKey&&!e.metaKey&&(e.keyCode<_b.F1||e.keyCode>_b.F15)){this.beginEditing();break;}case _b.ALT:this.endEditing();break;case _b.UP_ARROW:case _b.DOWN_ARROW:case _b.LEFT_ARROW:case _b.RIGHT_ARROW:case _b.HOME:case _b.END:case _b.PAGE_UP:case _b.PAGE_DOWN:this.endEditing(true);break;case _b.CTRL:case _b.SHIFT:case _b.TAB:break;}},_onBlur:function(){this.inherited(arguments);this.endEditing(true);},_saveSelection:function(){try{this._savedSelection=this._getBookmark();}catch(e){}},_restoreSelection:function(){if(this._savedSelection){delete this._cursorToStart;if(win.withGlobal(this.window,"isCollapsed",_10)){this._moveToBookmark(this._savedSelection);}delete this._savedSelection;}},onClick:function(){this.endEditing(true);this.inherited(arguments);},replaceValue:function(_32){if(!this.customUndo){this.inherited(arguments);}else{if(this.isClosed){this.setValue(_32);}else{this.beginEditing();if(!_32){_32="&#160;";}this.setValue(_32);this.endEditing();}}},_setDisabledAttr:function(_33){this.setValueDeferred.then(_c.hitch(this,function(){if((!this.disabled&&_33)||(!this._buttonEnabledPlugins&&_33)){_2.forEach(this._plugins,function(p){p.set("disabled",true);});}else{if(this.disabled&&!_33){_2.forEach(this._plugins,function(p){p.set("disabled",false);});}}}));this.inherited(arguments);},_setStateClass:function(){try{this.inherited(arguments);if(this.document&&this.document.body){_9.set(this.document.body,"color",_9.get(this.iframe,"color"));}}catch(e){}}});function _34(_35){return new _16({command:_35.name});};function _36(_37){return new _16({buttonClass:_15,command:_37.name});};_c.mixin(_16.registry,{"undo":_34,"redo":_34,"cut":_34,"copy":_34,"paste":_34,"insertOrderedList":_34,"insertUnorderedList":_34,"indent":_34,"outdent":_34,"justifyCenter":_34,"justifyFull":_34,"justifyLeft":_34,"justifyRight":_34,"delete":_34,"selectAll":_34,"removeFormat":_34,"unlink":_34,"insertHorizontalRule":_34,"bold":_36,"italic":_36,"underline":_36,"strikethrough":_36,"subscript":_36,"superscript":_36,"|":function(){return new _16({setEditor:function(_38){this.editor=_38;this.button=new _13({ownerDocument:_38.ownerDocument});}});}});return _1c;}); \ No newline at end of file
diff --git a/lib/dijit/Editor.js.uncompressed.js b/lib/dijit/Editor.js.uncompressed.js
new file mode 100644
index 000000000..9c2e30042
--- /dev/null
+++ b/lib/dijit/Editor.js.uncompressed.js
@@ -0,0 +1,865 @@
+define("dijit/Editor", [
+ "require",
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.add
+ "dojo/dom-geometry",
+ "dojo/dom-style", // domStyle.set, get
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys.F1 keys.F15 keys.TAB
+ "dojo/_base/lang", // lang.getObject lang.hitch
+ "dojo/sniff", // has("ie") has("mac") has("webkit")
+ "dojo/string", // string.substitute
+ "dojo/topic", // topic.publish()
+ "dojo/_base/window", // win.withGlobal
+ "./_base/focus", // dijit.getBookmark()
+ "./_Container",
+ "./Toolbar",
+ "./ToolbarSeparator",
+ "./layout/_LayoutWidget",
+ "./form/ToggleButton",
+ "./_editor/_Plugin",
+ "./_editor/plugins/EnterKeyHandling",
+ "./_editor/html",
+ "./_editor/range",
+ "./_editor/RichText",
+ "./main", // dijit._scopeName
+ "dojo/i18n!./_editor/nls/commands"
+], function(require, array, declare, Deferred, i18n, domAttr, domClass, domGeometry, domStyle,
+ event, keys, lang, has, string, topic, win,
+ focusBase, _Container, Toolbar, ToolbarSeparator, _LayoutWidget, ToggleButton,
+ _Plugin, EnterKeyHandling, html, rangeapi, RichText, dijit){
+
+ // module:
+ // dijit/Editor
+
+ var Editor = declare("dijit.Editor", RichText, {
+ // summary:
+ // A rich text Editing widget
+ //
+ // description:
+ // This widget provides basic WYSIWYG editing features, based on the browser's
+ // underlying rich text editing capability, accompanied by a toolbar (`dijit.Toolbar`).
+ // A plugin model is available to extend the editor's capabilities as well as the
+ // the options available in the toolbar. Content generation may vary across
+ // browsers, and clipboard operations may have different results, to name
+ // a few limitations. Note: this widget should not be used with the HTML
+ // &lt;TEXTAREA&gt; tag -- see dijit/_editor/RichText for details.
+
+ // plugins: [const] Object[]
+ // A list of plugin names (as strings) or instances (as objects)
+ // for this widget.
+ //
+ // When declared in markup, it might look like:
+ // | plugins="['bold',{name:'dijit._editor.plugins.FontChoice', command:'fontName', generic:true}]"
+ plugins: null,
+
+ // extraPlugins: [const] Object[]
+ // A list of extra plugin names which will be appended to plugins array
+ extraPlugins: null,
+
+ constructor: function(/*===== params, srcNodeRef =====*/){
+ // summary:
+ // Create the widget.
+ // params: Object|null
+ // Initial settings for any of the attributes, except readonly attributes.
+ // srcNodeRef: DOMNode
+ // The editor replaces the specified DOMNode.
+
+ if(!lang.isArray(this.plugins)){
+ this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|",
+ "insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull",
+ EnterKeyHandling /*, "createLink"*/];
+ }
+
+ this._plugins=[];
+ this._editInterval = this.editActionInterval * 1000;
+
+ //IE will always lose focus when other element gets focus, while for FF and safari,
+ //when no iframe is used, focus will be lost whenever another element gets focus.
+ //For IE, we can connect to onBeforeDeactivate, which will be called right before
+ //the focus is lost, so we can obtain the selected range. For other browsers,
+ //no equivalent of onBeforeDeactivate, so we need to do two things to make sure
+ //selection is properly saved before focus is lost: 1) when user clicks another
+ //element in the page, in which case we listen to mousedown on the entire page and
+ //see whether user clicks out of a focus editor, if so, save selection (focus will
+ //only lost after onmousedown event is fired, so we can obtain correct caret pos.)
+ //2) when user tabs away from the editor, which is handled in onKeyDown below.
+ if(has("ie")){
+ this.events.push("onBeforeDeactivate");
+ this.events.push("onBeforeActivate");
+ }
+ },
+
+ postMixInProperties: function(){
+ // summary:
+ // Extension to make sure a deferred is in place before certain functions
+ // execute, like making sure all the plugins are properly inserted.
+
+ // Set up a deferred so that the value isn't applied to the editor
+ // until all the plugins load, needed to avoid timing condition
+ // reported in #10537.
+ this.setValueDeferred = new Deferred();
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ //for custom undo/redo, if enabled.
+ this._steps=this._steps.slice(0);
+ this._undoedSteps=this._undoedSteps.slice(0);
+
+ if(lang.isArray(this.extraPlugins)){
+ this.plugins=this.plugins.concat(this.extraPlugins);
+ }
+
+ this.inherited(arguments);
+
+ this.commands = i18n.getLocalization("dijit._editor", "commands", this.lang);
+
+ if(!this.toolbar){
+ // if we haven't been assigned a toolbar, create one
+ this.toolbar = new Toolbar({
+ ownerDocument: this.ownerDocument,
+ dir: this.dir,
+ lang: this.lang
+ });
+ this.header.appendChild(this.toolbar.domNode);
+ }
+
+ array.forEach(this.plugins, this.addPlugin, this);
+
+ // Okay, denote the value can now be set.
+ this.setValueDeferred.resolve(true);
+
+ domClass.add(this.iframe.parentNode, "dijitEditorIFrameContainer");
+ domClass.add(this.iframe, "dijitEditorIFrame");
+ domAttr.set(this.iframe, "allowTransparency", true);
+
+ if(has("webkit")){
+ // Disable selecting the entire editor by inadvertent double-clicks.
+ // on buttons, title bar, etc. Otherwise clicking too fast on
+ // a button such as undo/redo selects the entire editor.
+ domStyle.set(this.domNode, "KhtmlUserSelect", "none");
+ }
+ this.toolbar.startup();
+ this.onNormalizedDisplayChanged(); //update toolbar button status
+ },
+ destroy: function(){
+ array.forEach(this._plugins, function(p){
+ if(p && p.destroy){
+ p.destroy();
+ }
+ });
+ this._plugins=[];
+ this.toolbar.destroyRecursive();
+ delete this.toolbar;
+ this.inherited(arguments);
+ },
+ addPlugin: function(/*String||Object||Function*/ plugin, /*Integer?*/ index){
+ // summary:
+ // takes a plugin name as a string or a plugin instance and
+ // adds it to the toolbar and associates it with this editor
+ // instance. The resulting plugin is added to the Editor's
+ // plugins array. If index is passed, it's placed in the plugins
+ // array at that index. No big magic, but a nice helper for
+ // passing in plugin names via markup.
+ // plugin:
+ // String, args object, plugin instance, or plugin constructor
+ // args:
+ // This object will be passed to the plugin constructor
+ // index:
+ // Used when creating an instance from
+ // something already in this.plugins. Ensures that the new
+ // instance is assigned to this.plugins at that index.
+ var args=lang.isString(plugin)?{name:plugin}:lang.isFunction(plugin)?{ctor:plugin}:plugin;
+ if(!args.setEditor){
+ var o={"args":args,"plugin":null,"editor":this};
+ if(args.name){
+ // search registry for a plugin factory matching args.name, if it's not there then
+ // fallback to 1.0 API:
+ // ask all loaded plugin modules to fill in o.plugin if they can (ie, if they implement args.name)
+ // remove fallback for 2.0.
+ if(_Plugin.registry[args.name]){
+ o.plugin = _Plugin.registry[args.name](args);
+ }else{
+ topic.publish(dijit._scopeName + ".Editor.getPlugin", o); // publish
+ }
+ }
+ if(!o.plugin){
+ try{
+ // TODO: remove lang.getObject() call in 2.0
+ var pc = args.ctor || lang.getObject(args.name) || require(args.name);
+ if(pc){
+ o.plugin = new pc(args);
+ }
+ }catch(e){
+ throw new Error(this.id + ": cannot find plugin [" + args.name + "]");
+ }
+ }
+ if(!o.plugin){
+ throw new Error(this.id + ": cannot find plugin [" + args.name + "]");
+ }
+ plugin=o.plugin;
+ }
+ if(arguments.length > 1){
+ this._plugins[index] = plugin;
+ }else{
+ this._plugins.push(plugin);
+ }
+ plugin.setEditor(this);
+ if(lang.isFunction(plugin.setToolbar)){
+ plugin.setToolbar(this.toolbar);
+ }
+ },
+
+ //the following 2 functions are required to make the editor play nice under a layout widget, see #4070
+
+ resize: function(size){
+ // summary:
+ // Resize the editor to the specified size, see `dijit/layout/_LayoutWidget.resize()`
+ if(size){
+ // we've been given a height/width for the entire editor (toolbar + contents), calls layout()
+ // to split the allocated size between the toolbar and the contents
+ _LayoutWidget.prototype.resize.apply(this, arguments);
+ }
+ /*
+ else{
+ // do nothing, the editor is already laid out correctly. The user has probably specified
+ // the height parameter, which was used to set a size on the iframe
+ }
+ */
+ },
+ layout: function(){
+ // summary:
+ // Called from `dijit/layout/_LayoutWidget.resize()`. This shouldn't be called directly
+ // tags:
+ // protected
+
+ // Converts the iframe (or rather the <div> surrounding it) to take all the available space
+ // except what's needed for the header (toolbars) and footer (breadcrumbs, etc).
+ // A class was added to the iframe container and some themes style it, so we have to
+ // calc off the added margins and padding too. See tracker: #10662
+ var areaHeight = (this._contentBox.h -
+ (this.getHeaderHeight() + this.getFooterHeight() +
+ domGeometry.getPadBorderExtents(this.iframe.parentNode).h +
+ domGeometry.getMarginExtents(this.iframe.parentNode).h));
+ this.editingArea.style.height = areaHeight + "px";
+ if(this.iframe){
+ this.iframe.style.height="100%";
+ }
+ this._layoutMode = true;
+ },
+
+ _onIEMouseDown: function(/*Event*/ e){
+ // summary:
+ // IE only to prevent 2 clicks to focus
+ // tags:
+ // private
+ var outsideClientArea;
+ // IE 8's componentFromPoint is broken, which is a shame since it
+ // was smaller code, but oh well. We have to do this brute force
+ // to detect if the click was scroller or not.
+ var b = this.document.body;
+ var clientWidth = b.clientWidth;
+ var clientHeight = b.clientHeight;
+ var clientLeft = b.clientLeft;
+ var offsetWidth = b.offsetWidth;
+ var offsetHeight = b.offsetHeight;
+ var offsetLeft = b.offsetLeft;
+
+ //Check for vertical scroller click.
+ if(/^rtl$/i.test(b.dir || "")){
+ if(clientWidth < offsetWidth && e.x > clientWidth && e.x < offsetWidth){
+ // Check the click was between width and offset width, if so, scroller
+ outsideClientArea = true;
+ }
+ }else{
+ // RTL mode, we have to go by the left offsets.
+ if(e.x < clientLeft && e.x > offsetLeft){
+ // Check the click was between width and offset width, if so, scroller
+ outsideClientArea = true;
+ }
+ }
+ if(!outsideClientArea){
+ // Okay, might be horiz scroller, check that.
+ if(clientHeight < offsetHeight && e.y > clientHeight && e.y < offsetHeight){
+ // Horizontal scroller.
+ outsideClientArea = true;
+ }
+ }
+ if(!outsideClientArea){
+ delete this._cursorToStart; // Remove the force to cursor to start position.
+ delete this._savedSelection; // new mouse position overrides old selection
+ if(e.target.tagName == "BODY"){
+ this.defer("placeCursorAtEnd");
+ }
+ this.inherited(arguments);
+ }
+ },
+ onBeforeActivate: function(){
+ this._restoreSelection();
+ },
+ onBeforeDeactivate: function(e){
+ // summary:
+ // Called on IE right before focus is lost. Saves the selected range.
+ // tags:
+ // private
+ if(this.customUndo){
+ this.endEditing(true);
+ }
+ //in IE, the selection will be lost when other elements get focus,
+ //let's save focus before the editor is deactivated
+ if(e.target.tagName != "BODY"){
+ this._saveSelection();
+ }
+ //console.log('onBeforeDeactivate',this);
+ },
+
+ /* beginning of custom undo/redo support */
+
+ // customUndo: Boolean
+ // Whether we shall use custom undo/redo support instead of the native
+ // browser support. By default, we now use custom undo. It works better
+ // than native browser support and provides a consistent behavior across
+ // browsers with a minimal performance hit. We already had the hit on
+ // the slowest browser, IE, anyway.
+ customUndo: true,
+
+ // editActionInterval: Integer
+ // When using customUndo, not every keystroke will be saved as a step.
+ // Instead typing (including delete) will be grouped together: after
+ // a user stops typing for editActionInterval seconds, a step will be
+ // saved; if a user resume typing within editActionInterval seconds,
+ // the timeout will be restarted. By default, editActionInterval is 3
+ // seconds.
+ editActionInterval: 3,
+
+ beginEditing: function(cmd){
+ // summary:
+ // Called to note that the user has started typing alphanumeric characters, if it's not already noted.
+ // Deals with saving undo; see editActionInterval parameter.
+ // tags:
+ // private
+ if(!this._inEditing){
+ this._inEditing=true;
+ this._beginEditing(cmd);
+ }
+ if(this.editActionInterval>0){
+ if(this._editTimer){
+ this._editTimer.remove();
+ }
+ this._editTimer = this.defer("endEditing", this._editInterval);
+ }
+ },
+
+ // TODO: declaring these in the prototype is meaningless, just create in the constructor/postCreate
+ _steps:[],
+ _undoedSteps:[],
+
+ execCommand: function(cmd){
+ // summary:
+ // Main handler for executing any commands to the editor, like paste, bold, etc.
+ // Called by plugins, but not meant to be called by end users.
+ // tags:
+ // protected
+ if(this.customUndo && (cmd == 'undo' || cmd == 'redo')){
+ return this[cmd]();
+ }else{
+ if(this.customUndo){
+ this.endEditing();
+ this._beginEditing();
+ }
+ var r = this.inherited(arguments);
+ if(this.customUndo){
+ this._endEditing();
+ }
+ return r;
+ }
+ },
+
+ _pasteImpl: function(){
+ // summary:
+ // Over-ride of paste command control to make execCommand cleaner
+ // tags:
+ // Protected
+ return this._clipboardCommand("paste");
+ },
+
+ _cutImpl: function(){
+ // summary:
+ // Over-ride of cut command control to make execCommand cleaner
+ // tags:
+ // Protected
+ return this._clipboardCommand("cut");
+ },
+
+ _copyImpl: function(){
+ // summary:
+ // Over-ride of copy command control to make execCommand cleaner
+ // tags:
+ // Protected
+ return this._clipboardCommand("copy");
+ },
+
+ _clipboardCommand: function(cmd){
+ // summary:
+ // Function to handle processing clipboard commands (or at least try to).
+ // tags:
+ // Private
+ var r;
+ try{
+ // Try to exec the superclass exec-command and see if it works.
+ r = this.document.execCommand(cmd, false, null);
+ if(has("webkit") && !r){ //see #4598: webkit does not guarantee clipboard support from js
+ throw { code: 1011 }; // throw an object like Mozilla's error
+ }
+ }catch(e){
+ //TODO: when else might we get an exception? Do we need the Mozilla test below?
+ if(e.code == 1011 /* Mozilla: service denied */ ||
+ (e.code == 9 && has("opera") /* Opera not supported */)){
+ // Warn user of platform limitation. Cannot programmatically access clipboard. See ticket #4136
+ var sub = string.substitute,
+ accel = {cut:'X', copy:'C', paste:'V'};
+ alert(sub(this.commands.systemShortcut,
+ [this.commands[cmd], sub(this.commands[has("mac") ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
+ }
+ r = false;
+ }
+ return r;
+ },
+
+ queryCommandEnabled: function(cmd){
+ // summary:
+ // Returns true if specified editor command is enabled.
+ // Used by the plugins to know when to highlight/not highlight buttons.
+ // tags:
+ // protected
+ if(this.customUndo && (cmd == 'undo' || cmd == 'redo')){
+ return cmd == 'undo' ? (this._steps.length > 1) : (this._undoedSteps.length > 0);
+ }else{
+ return this.inherited(arguments);
+ }
+ },
+ _moveToBookmark: function(b){
+ // summary:
+ // Selects the text specified in bookmark b
+ // tags:
+ // private
+ var bookmark = b.mark;
+ var mark = b.mark;
+ var col = b.isCollapsed;
+ var r, sNode, eNode, sel;
+ if(mark){
+ if(has("ie") < 9){
+ if(lang.isArray(mark)){
+ //IE CONTROL, have to use the native bookmark.
+ bookmark = [];
+ array.forEach(mark,function(n){
+ bookmark.push(rangeapi.getNode(n,this.editNode));
+ },this);
+ win.withGlobal(this.window,'moveToBookmark',focusBase,[{mark: bookmark, isCollapsed: col}]);
+ }else{
+ if(mark.startContainer && mark.endContainer){
+ // Use the pseudo WC3 range API. This works better for positions
+ // than the IE native bookmark code.
+ sel = rangeapi.getSelection(this.window);
+ if(sel && sel.removeAllRanges){
+ sel.removeAllRanges();
+ r = rangeapi.create(this.window);
+ sNode = rangeapi.getNode(mark.startContainer,this.editNode);
+ eNode = rangeapi.getNode(mark.endContainer,this.editNode);
+ if(sNode && eNode){
+ // Okay, we believe we found the position, so add it into the selection
+ // There are cases where it may not be found, particularly in undo/redo, when
+ // IE changes the underlying DOM on us (wraps text in a <p> tag or similar.
+ // So, in those cases, don't bother restoring selection.
+ r.setStart(sNode,mark.startOffset);
+ r.setEnd(eNode,mark.endOffset);
+ sel.addRange(r);
+ }
+ }
+ }
+ }
+ }else{//w3c range
+ sel = rangeapi.getSelection(this.window);
+ if(sel && sel.removeAllRanges){
+ sel.removeAllRanges();
+ r = rangeapi.create(this.window);
+ sNode = rangeapi.getNode(mark.startContainer,this.editNode);
+ eNode = rangeapi.getNode(mark.endContainer,this.editNode);
+ if(sNode && eNode){
+ // Okay, we believe we found the position, so add it into the selection
+ // There are cases where it may not be found, particularly in undo/redo, when
+ // formatting as been done and so on, so don't restore selection then.
+ r.setStart(sNode,mark.startOffset);
+ r.setEnd(eNode,mark.endOffset);
+ sel.addRange(r);
+ }
+ }
+ }
+ }
+ },
+ _changeToStep: function(from, to){
+ // summary:
+ // Reverts editor to "to" setting, from the undo stack.
+ // tags:
+ // private
+ this.setValue(to.text);
+ var b=to.bookmark;
+ if(!b){ return; }
+ this._moveToBookmark(b);
+ },
+ undo: function(){
+ // summary:
+ // Handler for editor undo (ex: ctrl-z) operation
+ // tags:
+ // private
+ var ret = false;
+ if(!this._undoRedoActive){
+ this._undoRedoActive = true;
+ this.endEditing(true);
+ var s=this._steps.pop();
+ if(s && this._steps.length>0){
+ this.focus();
+ this._changeToStep(s,this._steps[this._steps.length-1]);
+ this._undoedSteps.push(s);
+ this.onDisplayChanged();
+ delete this._undoRedoActive;
+ ret = true;
+ }
+ delete this._undoRedoActive;
+ }
+ return ret;
+ },
+ redo: function(){
+ // summary:
+ // Handler for editor redo (ex: ctrl-y) operation
+ // tags:
+ // private
+ var ret = false;
+ if(!this._undoRedoActive){
+ this._undoRedoActive = true;
+ this.endEditing(true);
+ var s=this._undoedSteps.pop();
+ if(s && this._steps.length>0){
+ this.focus();
+ this._changeToStep(this._steps[this._steps.length-1],s);
+ this._steps.push(s);
+ this.onDisplayChanged();
+ ret = true;
+ }
+ delete this._undoRedoActive;
+ }
+ return ret;
+ },
+ endEditing: function(ignore_caret){
+ // summary:
+ // Called to note that the user has stopped typing alphanumeric characters, if it's not already noted.
+ // Deals with saving undo; see editActionInterval parameter.
+ // tags:
+ // private
+ if(this._editTimer){
+ this._editTimer = this._editTimer.remove();
+ }
+ if(this._inEditing){
+ this._endEditing(ignore_caret);
+ this._inEditing=false;
+ }
+ },
+
+ _getBookmark: function(){
+ // summary:
+ // Get the currently selected text
+ // tags:
+ // protected
+ var b=win.withGlobal(this.window,focusBase.getBookmark);
+ var tmp=[];
+ if(b && b.mark){
+ var mark = b.mark;
+ if(has("ie") < 9){
+ // Try to use the pseudo range API on IE for better accuracy.
+ var sel = rangeapi.getSelection(this.window);
+ if(!lang.isArray(mark)){
+ if(sel){
+ var range;
+ if(sel.rangeCount){
+ range = sel.getRangeAt(0);
+ }
+ if(range){
+ b.mark = range.cloneRange();
+ }else{
+ b.mark = win.withGlobal(this.window,focusBase.getBookmark);
+ }
+ }
+ }else{
+ // Control ranges (img, table, etc), handle differently.
+ array.forEach(b.mark,function(n){
+ tmp.push(rangeapi.getIndex(n,this.editNode).o);
+ },this);
+ b.mark = tmp;
+ }
+ }
+ try{
+ if(b.mark && b.mark.startContainer){
+ tmp=rangeapi.getIndex(b.mark.startContainer,this.editNode).o;
+ b.mark={startContainer:tmp,
+ startOffset:b.mark.startOffset,
+ endContainer:b.mark.endContainer===b.mark.startContainer?tmp:rangeapi.getIndex(b.mark.endContainer,this.editNode).o,
+ endOffset:b.mark.endOffset};
+ }
+ }catch(e){
+ b.mark = null;
+ }
+ }
+ return b;
+ },
+ _beginEditing: function(){
+ // summary:
+ // Called when the user starts typing alphanumeric characters.
+ // Deals with saving undo; see editActionInterval parameter.
+ // tags:
+ // private
+ if(this._steps.length === 0){
+ // You want to use the editor content without post filtering
+ // to make sure selection restores right for the 'initial' state.
+ // and undo is called. So not using this.value, as it was 'processed'
+ // and the line-up for selections may have been altered.
+ this._steps.push({'text':html.getChildrenHtml(this.editNode),'bookmark':this._getBookmark()});
+ }
+ },
+ _endEditing: function(){
+ // summary:
+ // Called when the user stops typing alphanumeric characters.
+ // Deals with saving undo; see editActionInterval parameter.
+ // tags:
+ // private
+
+ // Avoid filtering to make sure selections restore.
+ var v = html.getChildrenHtml(this.editNode);
+
+ this._undoedSteps=[];//clear undoed steps
+ this._steps.push({text: v, bookmark: this._getBookmark()});
+ },
+ onKeyDown: function(e){
+ // summary:
+ // Handler for onkeydown event.
+ // tags:
+ // private
+
+ //We need to save selection if the user TAB away from this editor
+ //no need to call _saveSelection for IE, as that will be taken care of in onBeforeDeactivate
+ if(!has("ie") && !this.iframe && e.keyCode == keys.TAB && !this.tabIndent){
+ this._saveSelection();
+ }
+ if(!this.customUndo){
+ this.inherited(arguments);
+ return;
+ }
+ var k = e.keyCode;
+ if(e.ctrlKey && !e.altKey){//undo and redo only if the special right Alt + z/y are not pressed #5892
+ if(k == 90 || k == 122){ //z
+ event.stop(e);
+ this.undo();
+ return;
+ }else if(k == 89 || k == 121){ //y
+ event.stop(e);
+ this.redo();
+ return;
+ }
+ }
+ this.inherited(arguments);
+
+ switch(k){
+ case keys.ENTER:
+ case keys.BACKSPACE:
+ case keys.DELETE:
+ this.beginEditing();
+ break;
+ case 88: //x
+ case 86: //v
+ if(e.ctrlKey && !e.altKey && !e.metaKey){
+ this.endEditing();//end current typing step if any
+ if(e.keyCode == 88){
+ this.beginEditing('cut');
+ }else{
+ this.beginEditing('paste');
+ }
+ //use timeout to trigger after the paste is complete
+ this.defer("endEditing", 1);
+ break;
+ }
+ //pass through
+ default:
+ if(!e.ctrlKey && !e.altKey && !e.metaKey && (e.keyCode<keys.F1 || e.keyCode>keys.F15)){
+ this.beginEditing();
+ break;
+ }
+ //pass through
+ case keys.ALT:
+ this.endEditing();
+ break;
+ case keys.UP_ARROW:
+ case keys.DOWN_ARROW:
+ case keys.LEFT_ARROW:
+ case keys.RIGHT_ARROW:
+ case keys.HOME:
+ case keys.END:
+ case keys.PAGE_UP:
+ case keys.PAGE_DOWN:
+ this.endEditing(true);
+ break;
+ //maybe ctrl+backspace/delete, so don't endEditing when ctrl is pressed
+ case keys.CTRL:
+ case keys.SHIFT:
+ case keys.TAB:
+ break;
+ }
+ },
+ _onBlur: function(){
+ // summary:
+ // Called from focus manager when focus has moved away from this editor
+ // tags:
+ // protected
+
+ //this._saveSelection();
+ this.inherited(arguments);
+ this.endEditing(true);
+ },
+ _saveSelection: function(){
+ // summary:
+ // Save the currently selected text in _savedSelection attribute
+ // tags:
+ // private
+ try{
+ this._savedSelection=this._getBookmark();
+ }catch(e){ /* Squelch any errors that occur if selection save occurs due to being hidden simultaneously. */}
+ },
+ _restoreSelection: function(){
+ // summary:
+ // Re-select the text specified in _savedSelection attribute;
+ // see _saveSelection().
+ // tags:
+ // private
+ if(this._savedSelection){
+ // Clear off cursor to start, we're deliberately going to a selection.
+ delete this._cursorToStart;
+ // only restore the selection if the current range is collapsed
+ // if not collapsed, then it means the editor does not lose
+ // selection and there is no need to restore it
+ if(win.withGlobal(this.window,'isCollapsed',focusBase)){
+ this._moveToBookmark(this._savedSelection);
+ }
+ delete this._savedSelection;
+ }
+ },
+
+ onClick: function(){
+ // summary:
+ // Handler for when editor is clicked
+ // tags:
+ // protected
+ this.endEditing(true);
+ this.inherited(arguments);
+ },
+
+ replaceValue: function(/*String*/ html){
+ // summary:
+ // over-ride of replaceValue to support custom undo and stack maintenance.
+ // tags:
+ // protected
+ if(!this.customUndo){
+ this.inherited(arguments);
+ }else{
+ if(this.isClosed){
+ this.setValue(html);
+ }else{
+ this.beginEditing();
+ if(!html){
+ html = "&#160;"; // &nbsp;
+ }
+ this.setValue(html);
+ this.endEditing();
+ }
+ }
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ value){
+ this.setValueDeferred.then(lang.hitch(this, function(){
+ if((!this.disabled && value) || (!this._buttonEnabledPlugins && value)){
+ // Disable editor: disable all enabled buttons and remember that list
+ array.forEach(this._plugins, function(p){
+ p.set("disabled", true);
+ });
+ }else if(this.disabled && !value){
+ // Restore plugins to being active.
+ array.forEach(this._plugins, function(p){
+ p.set("disabled", false);
+ });
+ }
+ }));
+ this.inherited(arguments);
+ },
+
+ _setStateClass: function(){
+ try{
+ this.inherited(arguments);
+
+ // Let theme set the editor's text color based on editor enabled/disabled state.
+ // We need to jump through hoops because the main document (where the theme CSS is)
+ // is separate from the iframe's document.
+ if(this.document && this.document.body){
+ domStyle.set(this.document.body, "color", domStyle.get(this.iframe, "color"));
+ }
+ }catch(e){ /* Squelch any errors caused by focus change if hidden during a state change */}
+ }
+ });
+
+ // Register the "default plugins", ie, the built-in editor commands
+ function simplePluginFactory(args){
+ return new _Plugin({ command: args.name });
+ }
+ function togglePluginFactory(args){
+ return new _Plugin({ buttonClass: ToggleButton, command: args.name });
+ }
+ lang.mixin(_Plugin.registry, {
+ "undo": simplePluginFactory,
+ "redo": simplePluginFactory,
+ "cut": simplePluginFactory,
+ "copy": simplePluginFactory,
+ "paste": simplePluginFactory,
+ "insertOrderedList": simplePluginFactory,
+ "insertUnorderedList": simplePluginFactory,
+ "indent": simplePluginFactory,
+ "outdent": simplePluginFactory,
+ "justifyCenter": simplePluginFactory,
+ "justifyFull": simplePluginFactory,
+ "justifyLeft": simplePluginFactory,
+ "justifyRight": simplePluginFactory,
+ "delete": simplePluginFactory,
+ "selectAll": simplePluginFactory,
+ "removeFormat": simplePluginFactory,
+ "unlink": simplePluginFactory,
+ "insertHorizontalRule": simplePluginFactory,
+
+ "bold": togglePluginFactory,
+ "italic": togglePluginFactory,
+ "underline": togglePluginFactory,
+ "strikethrough": togglePluginFactory,
+ "subscript": togglePluginFactory,
+ "superscript": togglePluginFactory,
+
+ "|": function(){
+ return new _Plugin({
+ setEditor: function(editor){
+ this.editor = editor;
+ this.button = new ToolbarSeparator({ownerDocument: editor.ownerDocument});
+ }
+ });
+ }
+ });
+
+ return Editor;
+});
diff --git a/lib/dijit/InlineEditBox.js b/lib/dijit/InlineEditBox.js
index 58f842efb..1034989d5 100644
--- a/lib/dijit/InlineEditBox.js
+++ b/lib/dijit/InlineEditBox.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/InlineEditBox.html":"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdata-dojo-attach-event=\"onkeypress: _onKeyPress\"\n\t><span data-dojo-attach-point=\"editorPlaceholder\"></span\n\t><span data-dojo-attach-point=\"buttonContainer\"\n\t\t><button data-dojo-type=\"dijit.form.Button\" data-dojo-props=\"label: '${buttonSave}', 'class': 'saveButton'\"\n\t\t\tdata-dojo-attach-point=\"saveButton\" data-dojo-attach-event=\"onClick:save\"></button\n\t\t><button data-dojo-type=\"dijit.form.Button\" data-dojo-props=\"label: '${buttonCancel}', 'class': 'cancelButton'\"\n\t\t\tdata-dojo-attach-point=\"cancelButton\" data-dojo-attach-event=\"onClick:cancel\"></button\n\t></span\n></span>\n"}});define("dijit/InlineEditBox",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/_base/sniff","./focus","./_Widget","./_TemplatedMixin","./_WidgetsInTemplateMixin","./_Container","./form/Button","./form/_TextBoxMixin","./form/TextBox","dojo/text!./templates/InlineEditBox.html","dojo/i18n!./nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,fm,_d,_e,_f,_10,_11,_12,_13,_14){var _15=_2("dijit._InlineEditor",[_d,_e,_f],{templateString:_14,postMixInProperties:function(){this.inherited(arguments);this.messages=_8.getLocalization("dijit","common",this.lang);_1.forEach(["buttonSave","buttonCancel"],function(_16){if(!this[_16]){this[_16]=this.messages[_16];}},this);},buildRendering:function(){this.inherited(arguments);var cls=typeof this.editor=="string"?_b.getObject(this.editor):this.editor;var _17=this.sourceStyle,_18="line-height:"+_17.lineHeight+";",_19=_6.getComputedStyle(this.domNode);_1.forEach(["Weight","Family","Size","Style"],function(_1a){var _1b=_17["font"+_1a],_1c=_19["font"+_1a];if(_1c!=_1b){_18+="font-"+_1a+":"+_17["font"+_1a]+";";}},this);_1.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(_1d){this.domNode.style[_1d]=_17[_1d];},this);var _1e=this.inlineEditBox.width;if(_1e=="100%"){_18+="width:100%;";this.domNode.style.display="block";}else{_18+="width:"+(_1e+(Number(_1e)==_1e?"px":""))+";";}var _1f=_b.delegate(this.inlineEditBox.editorParams,{style:_18,dir:this.dir,lang:this.lang,textDir:this.textDir});_1f["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;this.editWidget=new cls(_1f,this.editorPlaceholder);if(this.inlineEditBox.autoSave){_5.destroy(this.buttonContainer);}},postCreate:function(){this.inherited(arguments);var ew=this.editWidget;if(this.inlineEditBox.autoSave){this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in ew){ew.set("intermediateChanges",true);this.connect(ew,"onChange","_onIntermediateChange");this.saveButton.set("disabled",true);}}},_onIntermediateChange:function(){this.saveButton.set("disabled",(this.getValue()==this._resetValue)||!this.enableSave());},destroy:function(){this.editWidget.destroy(true);this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return String(ew.get("displayedValue" in ew?"displayedValue":"value"));},_onKeyPress:function(e){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(e.altKey||e.ctrlKey){return;}if(e.charOrCode==_a.ESCAPE){_7.stop(e);this.cancel(true);}else{if(e.charOrCode==_a.ENTER&&e.target.tagName=="INPUT"){_7.stop(e);this._onChange();}}}},_onBlur:function(){this.inherited(arguments);if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(this.getValue()==this._resetValue){this.cancel(false);}else{if(this.enableSave()){this.save(false);}}}},_onChange:function(){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing&&this.enableSave()){fm.focus(this.inlineEditBox.displayNode);}},enableSave:function(){return (this.editWidget.isValid?this.editWidget.isValid():true);},focus:function(){this.editWidget.focus();setTimeout(_b.hitch(this,function(){if(this.editWidget.focusNode&&this.editWidget.focusNode.tagName=="INPUT"){_12.selectInputText(this.editWidget.focusNode);}}),0);}});var _20=_2("dijit.InlineEditBox",_d,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:_13,editorWrapper:_15,editorParams:{},disabled:false,onChange:function(){},onCancel:function(){},width:"100%",value:"",noValueIndicator:_c("ie")<=6?"<span style='font-family: wingdings; text-decoration: underline;'>&#160;&#160;&#160;&#160;&#x270d;&#160;&#160;&#160;&#160;</span>":"<span style='text-decoration: underline;'>&#160;&#160;&#160;&#160;&#x270d;&#160;&#160;&#160;&#160;</span>",constructor:function(){this.editorParams={};},postMixInProperties:function(){this.inherited(arguments);this.displayNode=this.srcNodeRef;var _21={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var _22 in _21){this.connect(this.displayNode,_22,_21[_22]);}this.displayNode.setAttribute("role","button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}if(!this.value&&!("value" in this.params)){this.value=_b.trim(this.renderAsHtml?this.displayNode.innerHTML:(this.displayNode.innerText||this.displayNode.textContent||""));}if(!this.value){this.displayNode.innerHTML=this.noValueIndicator;}_4.add(this.displayNode,"dijitInlineEditBoxDisplayMode");},setDisabled:function(_23){_9.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_23);},_setDisabledAttr:function(_24){this.domNode.setAttribute("aria-disabled",_24);if(_24){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}_4.toggle(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_24);this._set("disabled",_24);},_onMouseOver:function(){if(!this.disabled){_4.add(this.displayNode,"dijitInlineEditBoxDisplayModeHover");}},_onMouseOut:function(){_4.remove(this.displayNode,"dijitInlineEditBoxDisplayModeHover");},_onClick:function(e){if(this.disabled){return;}if(e){_7.stop(e);}this._onMouseOut();setTimeout(_b.hitch(this,"edit"),0);},edit:function(){if(this.disabled||this.editing){return;}this._set("editing",true);this._savedPosition=_6.get(this.displayNode,"position")||"static";this._savedOpacity=_6.get(this.displayNode,"opacity")||"1";this._savedTabIndex=_3.get(this.displayNode,"tabIndex")||"0";if(this.wrapperWidget){var ew=this.wrapperWidget.editWidget;ew.set("displayedValue" in ew?"displayedValue":"value",this.value);}else{var _25=_5.create("span",null,this.domNode,"before");var ewc=typeof this.editorWrapper=="string"?_b.getObject(this.editorWrapper):this.editorWrapper;this.wrapperWidget=new ewc({value:this.value,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,dir:this.dir,lang:this.lang,tabIndex:this._savedTabIndex,editor:this.editor,inlineEditBox:this,sourceStyle:_6.getComputedStyle(this.displayNode),save:_b.hitch(this,"save"),cancel:_b.hitch(this,"cancel"),textDir:this.textDir},_25);if(!this._started){this.startup();}}var ww=this.wrapperWidget;_6.set(this.displayNode,{position:"absolute",opacity:"0"});_6.set(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});_3.set(this.displayNode,"tabIndex","-1");setTimeout(_b.hitch(ww,function(){this.focus();this._resetValue=this.getValue();}),0);},_onBlur:function(){this.inherited(arguments);if(!this.editing){}},destroy:function(){if(this.wrapperWidget&&!this.wrapperWidget._destroyed){this.wrapperWidget.destroy();delete this.wrapperWidget;}this.inherited(arguments);},_showText:function(_26){var ww=this.wrapperWidget;_6.set(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});_6.set(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity});_3.set(this.displayNode,"tabIndex",this._savedTabIndex);if(_26){fm.focus(this.displayNode);}},save:function(_27){if(this.disabled||!this.editing){return;}this._set("editing",false);var ww=this.wrapperWidget;var _28=ww.getValue();this.set("value",_28);this._showText(_27);},setValue:function(val){_9.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){val=_b.trim(val);var _29=this.renderAsHtml?val:val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");this.displayNode.innerHTML=_29||this.noValueIndicator;this._set("value",val);if(this._started){setTimeout(_b.hitch(this,"onChange",val),0);}if(this.textDir=="auto"){this.applyTextDir(this.displayNode,this.displayNode.innerText);}},getValue:function(){_9.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_2a){if(this.disabled||!this.editing){return;}this._set("editing",false);setTimeout(_b.hitch(this,"onCancel"),0);this._showText(_2a);},_setTextDirAttr:function(_2b){if(!this._created||this.textDir!=_2b){this._set("textDir",_2b);this.applyTextDir(this.displayNode,this.displayNode.innerText);this.displayNode.align=this.dir=="rtl"?"right":"left";}}});_20._InlineEditor=_15;return _20;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/InlineEditBox.html":"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" class=\"dijitReset dijitInline dijitOffScreen\"\n\tdata-dojo-attach-event=\"onkeypress: _onKeyPress\"\n\t><span data-dojo-attach-point=\"editorPlaceholder\"></span\n\t><span data-dojo-attach-point=\"buttonContainer\"\n\t\t><button data-dojo-type=\"dijit/form/Button\" data-dojo-props=\"label: '${buttonSave}', 'class': 'saveButton'\"\n\t\t\tdata-dojo-attach-point=\"saveButton\" data-dojo-attach-event=\"onClick:save\"></button\n\t\t><button data-dojo-type=\"dijit/form/Button\" data-dojo-props=\"label: '${buttonCancel}', 'class': 'cancelButton'\"\n\t\t\tdata-dojo-attach-point=\"cancelButton\" data-dojo-attach-event=\"onClick:cancel\"></button\n\t></span\n></span>\n"}});define("dijit/InlineEditBox",["require","dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/when","./focus","./_Widget","./_TemplatedMixin","./_WidgetsInTemplateMixin","./_Container","./form/Button","./form/_TextBoxMixin","./form/TextBox","dojo/text!./templates/InlineEditBox.html","dojo/i18n!./nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,fm,_f,_10,_11,_12,_13,_14,_15,_16){var _17=_3("dijit._InlineEditor",[_f,_10,_11],{templateString:_16,postMixInProperties:function(){this.inherited(arguments);this.messages=_9.getLocalization("dijit","common",this.lang);_2.forEach(["buttonSave","buttonCancel"],function(_18){if(!this[_18]){this[_18]=this.messages[_18];}},this);},buildRendering:function(){this.inherited(arguments);var Cls=typeof this.editor=="string"?(_c.getObject(this.editor)||_1(this.editor)):this.editor;var _19=this.sourceStyle,_1a="line-height:"+_19.lineHeight+";",_1b=_7.getComputedStyle(this.domNode);_2.forEach(["Weight","Family","Size","Style"],function(_1c){var _1d=_19["font"+_1c],_1e=_1b["font"+_1c];if(_1e!=_1d){_1a+="font-"+_1c+":"+_19["font"+_1c]+";";}},this);_2.forEach(["marginTop","marginBottom","marginLeft","marginRight","position","left","top","right","bottom","float","clear","display"],function(_1f){this.domNode.style[_1f]=_19[_1f];},this);var _20=this.inlineEditBox.width;if(_20=="100%"){_1a+="width:100%;";this.domNode.style.display="block";}else{_1a+="width:"+(_20+(Number(_20)==_20?"px":""))+";";}var _21=_c.delegate(this.inlineEditBox.editorParams,{style:_1a,dir:this.dir,lang:this.lang,textDir:this.textDir});_21["displayedValue" in Cls.prototype?"displayedValue":"value"]=this.value;this.editWidget=new Cls(_21,this.editorPlaceholder);if(this.inlineEditBox.autoSave){_6.destroy(this.buttonContainer);}},postCreate:function(){this.inherited(arguments);var ew=this.editWidget;if(this.inlineEditBox.autoSave){this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in ew){ew.set("intermediateChanges",true);this.connect(ew,"onChange","_onIntermediateChange");this.saveButton.set("disabled",true);}}},startup:function(){this.editWidget.startup();this.inherited(arguments);},_onIntermediateChange:function(){this.saveButton.set("disabled",(this.getValue()==this._resetValue)||!this.enableSave());},destroy:function(){this.editWidget.destroy(true);this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return String(ew.get("displayedValue" in ew?"displayedValue":"value"));},_onKeyPress:function(e){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(e.altKey||e.ctrlKey){return;}if(e.charOrCode==_b.ESCAPE){_8.stop(e);this.cancel(true);}else{if(e.charOrCode==_b.ENTER&&e.target.tagName=="INPUT"){_8.stop(e);this._onChange();}}}},_onBlur:function(){this.inherited(arguments);if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(this.getValue()==this._resetValue){this.cancel(false);}else{if(this.enableSave()){this.save(false);}}}},_onChange:function(){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing&&this.enableSave()){fm.focus(this.inlineEditBox.displayNode);}},enableSave:function(){return this.editWidget.isValid?this.editWidget.isValid():true;},focus:function(){this.editWidget.focus();if(this.editWidget.focusNode){fm._onFocusNode(this.editWidget.focusNode);if(this.editWidget.focusNode.tagName=="INPUT"){this.defer(function(){_14.selectInputText(this.editWidget.focusNode);});}}}});var _22=_3("dijit.InlineEditBox",_f,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:_15,editorWrapper:_17,editorParams:{},disabled:false,onChange:function(){},onCancel:function(){},width:"100%",value:"",noValueIndicator:_d("ie")<=6?"<span style='font-family: wingdings; text-decoration: underline;'>&#160;&#160;&#160;&#160;&#x270d;&#160;&#160;&#160;&#160;</span>":"<span style='text-decoration: underline;'>&#160;&#160;&#160;&#160;&#x270d;&#160;&#160;&#160;&#160;</span>",constructor:function(){this.editorParams={};},postMixInProperties:function(){this.inherited(arguments);this.displayNode=this.srcNodeRef;var _23={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var _24 in _23){this.connect(this.displayNode,_24,_23[_24]);}this.displayNode.setAttribute("role","button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}if(!this.value&&!("value" in this.params)){this.value=_c.trim(this.renderAsHtml?this.displayNode.innerHTML:(this.displayNode.innerText||this.displayNode.textContent||""));}if(!this.value){this.displayNode.innerHTML=this.noValueIndicator;}_5.add(this.displayNode,"dijitInlineEditBoxDisplayMode");},setDisabled:function(_25){_a.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_25);},_setDisabledAttr:function(_26){this.domNode.setAttribute("aria-disabled",_26?"true":"false");if(_26){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}_5.toggle(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_26);this._set("disabled",_26);},_onMouseOver:function(){if(!this.disabled){_5.add(this.displayNode,"dijitInlineEditBoxDisplayModeHover");}},_onMouseOut:function(){_5.remove(this.displayNode,"dijitInlineEditBoxDisplayModeHover");},_onClick:function(e){if(this.disabled){return;}if(e){_8.stop(e);}this._onMouseOut();this.defer("edit");},edit:function(){if(this.disabled||this.editing){return;}this._set("editing",true);this._savedTabIndex=_4.get(this.displayNode,"tabIndex")||"0";if(this.wrapperWidget){var ew=this.wrapperWidget.editWidget;ew.set("displayedValue" in ew?"displayedValue":"value",this.value);}else{var _27=_6.create("span",null,this.domNode,"before");var Ewc=typeof this.editorWrapper=="string"?_c.getObject(this.editorWrapper):this.editorWrapper;this.wrapperWidget=new Ewc({value:this.value,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,dir:this.dir,lang:this.lang,tabIndex:this._savedTabIndex,editor:this.editor,inlineEditBox:this,sourceStyle:_7.getComputedStyle(this.displayNode),save:_c.hitch(this,"save"),cancel:_c.hitch(this,"cancel"),textDir:this.textDir},_27);if(!this.wrapperWidget._started){this.wrapperWidget.startup();}if(!this._started){this.startup();}}var ww=this.wrapperWidget;_5.add(this.displayNode,"dijitOffScreen");_5.remove(ww.domNode,"dijitOffScreen");_7.set(ww.domNode,{visibility:"visible"});_4.set(this.displayNode,"tabIndex","-1");_e(ww.editWidget.onLoadDeferred,_c.hitch(ww,function(){this.defer(function(){this.focus();this._resetValue=this.getValue();});}));},_onBlur:function(){this.inherited(arguments);if(!this.editing){}},destroy:function(){if(this.wrapperWidget&&!this.wrapperWidget._destroyed){this.wrapperWidget.destroy();delete this.wrapperWidget;}this.inherited(arguments);},_showText:function(_28){var ww=this.wrapperWidget;_7.set(ww.domNode,{visibility:"hidden"});_5.add(ww.domNode,"dijitOffScreen");_5.remove(this.displayNode,"dijitOffScreen");_4.set(this.displayNode,"tabIndex",this._savedTabIndex);if(_28){fm.focus(this.displayNode);}},save:function(_29){if(this.disabled||!this.editing){return;}this._set("editing",false);var ww=this.wrapperWidget;var _2a=ww.getValue();this.set("value",_2a);this._showText(_29);},setValue:function(val){_a.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){val=_c.trim(val);var _2b=this.renderAsHtml?val:val.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;").replace(/\n/g,"<br>");this.displayNode.innerHTML=_2b||this.noValueIndicator;this._set("value",val);if(this._started){this.defer(function(){this.onChange(val);});}if(this.textDir=="auto"){this.applyTextDir(this.displayNode,this.displayNode.innerText);}},getValue:function(){_a.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_2c){if(this.disabled||!this.editing){return;}this._set("editing",false);this.defer("onCancel");this._showText(_2c);},_setTextDirAttr:function(_2d){if(!this._created||this.textDir!=_2d){this._set("textDir",_2d);this.applyTextDir(this.displayNode,this.displayNode.innerText);this.displayNode.align=this.dir=="rtl"?"right":"left";}}});_22._InlineEditor=_17;return _22;}); \ No newline at end of file
diff --git a/lib/dijit/InlineEditBox.js.uncompressed.js b/lib/dijit/InlineEditBox.js.uncompressed.js
new file mode 100644
index 000000000..212d909da
--- /dev/null
+++ b/lib/dijit/InlineEditBox.js.uncompressed.js
@@ -0,0 +1,659 @@
+require({cache:{
+'url:dijit/templates/InlineEditBox.html':"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" class=\"dijitReset dijitInline dijitOffScreen\"\n\tdata-dojo-attach-event=\"onkeypress: _onKeyPress\"\n\t><span data-dojo-attach-point=\"editorPlaceholder\"></span\n\t><span data-dojo-attach-point=\"buttonContainer\"\n\t\t><button data-dojo-type=\"dijit/form/Button\" data-dojo-props=\"label: '${buttonSave}', 'class': 'saveButton'\"\n\t\t\tdata-dojo-attach-point=\"saveButton\" data-dojo-attach-event=\"onClick:save\"></button\n\t\t><button data-dojo-type=\"dijit/form/Button\" data-dojo-props=\"label: '${buttonCancel}', 'class': 'cancelButton'\"\n\t\t\tdata-dojo-attach-point=\"cancelButton\" data-dojo-attach-event=\"onClick:cancel\"></button\n\t></span\n></span>\n"}});
+define("dijit/InlineEditBox", [
+ "require",
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set domAttr.get
+ "dojo/dom-class", // domClass.add domClass.remove domClass.toggle
+ "dojo/dom-construct", // domConstruct.create domConstruct.destroy
+ "dojo/dom-style", // domStyle.getComputedStyle domStyle.set domStyle.get
+ "dojo/_base/event", // event.stop
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/keys", // keys.ENTER keys.ESCAPE
+ "dojo/_base/lang", // lang.getObject
+ "dojo/sniff", // has("ie")
+ "dojo/when",
+ "./focus",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_WidgetsInTemplateMixin",
+ "./_Container",
+ "./form/Button",
+ "./form/_TextBoxMixin",
+ "./form/TextBox",
+ "dojo/text!./templates/InlineEditBox.html",
+ "dojo/i18n!./nls/common"
+], function(require, array, declare, domAttr, domClass, domConstruct, domStyle, event, i18n, kernel, keys, lang, has, when,
+ fm, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _Container, Button, _TextBoxMixin, TextBox, template){
+
+ // module:
+ // dijit/InlineEditBox
+
+ var InlineEditor = declare("dijit._InlineEditor", [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], {
+ // summary:
+ // Internal widget used by InlineEditBox, displayed when in editing mode
+ // to display the editor and maybe save/cancel buttons. Calling code should
+ // connect to save/cancel methods to detect when editing is finished
+ //
+ // Has mainly the same parameters as InlineEditBox, plus these values:
+ //
+ // style: Object
+ // Set of CSS attributes of display node, to replicate in editor
+ //
+ // value: String
+ // Value as an HTML string or plain text string, depending on renderAsHTML flag
+
+ templateString: template,
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.messages = i18n.getLocalization("dijit", "common", this.lang);
+ array.forEach(["buttonSave", "buttonCancel"], function(prop){
+ if(!this[prop]){
+ this[prop] = this.messages[prop];
+ }
+ }, this);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // Create edit widget in place in the template
+ // TODO: remove getObject() for 2.0
+ var Cls = typeof this.editor == "string" ? (lang.getObject(this.editor) || require(this.editor)) : this.editor;
+
+ // Copy the style from the source
+ // Don't copy ALL properties though, just the necessary/applicable ones.
+ // wrapperStyle/destStyle code is to workaround IE bug where getComputedStyle().fontSize
+ // is a relative value like 200%, rather than an absolute value like 24px, and
+ // the 200% can refer *either* to a setting on the node or it's ancestor (see #11175)
+ var srcStyle = this.sourceStyle,
+ editStyle = "line-height:" + srcStyle.lineHeight + ";",
+ destStyle = domStyle.getComputedStyle(this.domNode);
+ array.forEach(["Weight", "Family", "Size", "Style"], function(prop){
+ var textStyle = srcStyle["font" + prop],
+ wrapperStyle = destStyle["font" + prop];
+ if(wrapperStyle != textStyle){
+ editStyle += "font-" + prop + ":" + srcStyle["font" + prop] + ";";
+ }
+ }, this);
+ array.forEach(["marginTop", "marginBottom", "marginLeft", "marginRight", "position", "left", "top", "right", "bottom", "float", "clear", "display"], function(prop){
+ this.domNode.style[prop] = srcStyle[prop];
+ }, this);
+ var width = this.inlineEditBox.width;
+ if(width == "100%"){
+ // block mode
+ editStyle += "width:100%;";
+ this.domNode.style.display = "block";
+ }else{
+ // inline-block mode
+ editStyle += "width:" + (width + (Number(width) == width ? "px" : "")) + ";";
+ }
+ var editorParams = lang.delegate(this.inlineEditBox.editorParams, {
+ style: editStyle,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir
+ });
+ editorParams[ "displayedValue" in Cls.prototype ? "displayedValue" : "value"] = this.value;
+ this.editWidget = new Cls(editorParams, this.editorPlaceholder);
+
+ if(this.inlineEditBox.autoSave){
+ // Remove the save/cancel buttons since saving is done by simply tabbing away or
+ // selecting a value from the drop down list
+ domConstruct.destroy(this.buttonContainer);
+ }
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ var ew = this.editWidget;
+
+ if(this.inlineEditBox.autoSave){
+ // Selecting a value from a drop down list causes an onChange event and then we save
+ this.connect(ew, "onChange", "_onChange");
+
+ // ESC and TAB should cancel and save. Note that edit widgets do a stopEvent() on ESC key (to
+ // prevent Dialog from closing when the user just wants to revert the value in the edit widget),
+ // so this is the only way we can see the key press event.
+ this.connect(ew, "onKeyPress", "_onKeyPress");
+ }else{
+ // If possible, enable/disable save button based on whether the user has changed the value
+ if("intermediateChanges" in ew){
+ ew.set("intermediateChanges", true);
+ this.connect(ew, "onChange", "_onIntermediateChange");
+ this.saveButton.set("disabled", true);
+ }
+ }
+ },
+
+ startup: function(){
+ this.editWidget.startup();
+ this.inherited(arguments);
+ },
+
+ _onIntermediateChange: function(/*===== val =====*/){
+ // summary:
+ // Called for editor widgets that support the intermediateChanges=true flag as a way
+ // to detect when to enable/disabled the save button
+ this.saveButton.set("disabled", (this.getValue() == this._resetValue) || !this.enableSave());
+ },
+
+ destroy: function(){
+ this.editWidget.destroy(true); // let the parent wrapper widget clean up the DOM
+ this.inherited(arguments);
+ },
+
+ getValue: function(){
+ // summary:
+ // Return the [display] value of the edit widget
+ var ew = this.editWidget;
+ return String(ew.get("displayedValue" in ew ? "displayedValue" : "value"));
+ },
+
+ _onKeyPress: function(e){
+ // summary:
+ // Handler for keypress in the edit box in autoSave mode.
+ // description:
+ // For autoSave widgets, if Esc/Enter, call cancel/save.
+ // tags:
+ // private
+
+ if(this.inlineEditBox.autoSave && this.inlineEditBox.editing){
+ if(e.altKey || e.ctrlKey){
+ return;
+ }
+ // If Enter/Esc pressed, treat as save/cancel.
+ if(e.charOrCode == keys.ESCAPE){
+ event.stop(e);
+ this.cancel(true); // sets editing=false which short-circuits _onBlur processing
+ }else if(e.charOrCode == keys.ENTER && e.target.tagName == "INPUT"){
+ event.stop(e);
+ this._onChange(); // fire _onBlur and then save
+ }
+
+ // _onBlur will handle TAB automatically by allowing
+ // the TAB to change focus before we mess with the DOM: #6227
+ // Expounding by request:
+ // The current focus is on the edit widget input field.
+ // save() will hide and destroy this widget.
+ // We want the focus to jump from the currently hidden
+ // displayNode, but since it's hidden, it's impossible to
+ // unhide it, focus it, and then have the browser focus
+ // away from it to the next focusable element since each
+ // of these events is asynchronous and the focus-to-next-element
+ // is already queued.
+ // So we allow the browser time to unqueue the move-focus event
+ // before we do all the hide/show stuff.
+ }
+ },
+
+ _onBlur: function(){
+ // summary:
+ // Called when focus moves outside the editor
+ // tags:
+ // private
+
+ this.inherited(arguments);
+ if(this.inlineEditBox.autoSave && this.inlineEditBox.editing){
+ if(this.getValue() == this._resetValue){
+ this.cancel(false);
+ }else if(this.enableSave()){
+ this.save(false);
+ }
+ }
+ },
+
+ _onChange: function(){
+ // summary:
+ // Called when the underlying widget fires an onChange event,
+ // such as when the user selects a value from the drop down list of a ComboBox,
+ // which means that the user has finished entering the value and we should save.
+ // tags:
+ // private
+
+ if(this.inlineEditBox.autoSave && this.inlineEditBox.editing && this.enableSave()){
+ fm.focus(this.inlineEditBox.displayNode); // fires _onBlur which will save the formatted value
+ }
+ },
+
+ enableSave: function(){
+ // summary:
+ // User overridable function returning a Boolean to indicate
+ // if the Save button should be enabled or not - usually due to invalid conditions
+ // tags:
+ // extension
+ return this.editWidget.isValid ? this.editWidget.isValid() : true;
+ },
+
+ focus: function(){
+ // summary:
+ // Focus the edit widget.
+ // tags:
+ // protected
+
+ this.editWidget.focus();
+
+ if(this.editWidget.focusNode){
+ // IE can take 30ms to report the focus event, but focus manager needs to know before a 0ms timeout.
+ fm._onFocusNode(this.editWidget.focusNode);
+
+ if(this.editWidget.focusNode.tagName == "INPUT"){
+ this.defer(function(){
+ _TextBoxMixin.selectInputText(this.editWidget.focusNode);
+ });
+ }
+ }
+ }
+ });
+
+
+ var InlineEditBox = declare("dijit.InlineEditBox", _Widget, {
+ // summary:
+ // An element with in-line edit capabilities
+ //
+ // description:
+ // Behavior for an existing node (`<p>`, `<div>`, `<span>`, etc.) so that
+ // when you click it, an editor shows up in place of the original
+ // text. Optionally, Save and Cancel button are displayed below the edit widget.
+ // When Save is clicked, the text is pulled from the edit
+ // widget and redisplayed and the edit widget is again hidden.
+ // By default a plain Textarea widget is used as the editor (or for
+ // inline values a TextBox), but you can specify an editor such as
+ // dijit.Editor (for editing HTML) or a Slider (for adjusting a number).
+ // An edit widget must support the following API to be used:
+ //
+ // - displayedValue or value as initialization parameter,
+ // and available through set('displayedValue') / set('value')
+ // - void focus()
+ // - DOM-node focusNode = node containing editable text
+
+ // editing: [readonly] Boolean
+ // Is the node currently in edit mode?
+ editing: false,
+
+ // autoSave: Boolean
+ // Changing the value automatically saves it; don't have to push save button
+ // (and save button isn't even displayed)
+ autoSave: true,
+
+ // buttonSave: String
+ // Save button label
+ buttonSave: "",
+
+ // buttonCancel: String
+ // Cancel button label
+ buttonCancel: "",
+
+ // renderAsHtml: Boolean
+ // Set this to true if the specified Editor's value should be interpreted as HTML
+ // rather than plain text (ex: `dijit.Editor`)
+ renderAsHtml: false,
+
+ // editor: String|Function
+ // MID (ex: "dijit/form/TextBox") or constructor for editor widget
+ editor: TextBox,
+
+ // editorWrapper: String|Function
+ // Class name (or reference to the Class) for widget that wraps the editor widget, displaying save/cancel
+ // buttons.
+ editorWrapper: InlineEditor,
+
+ // editorParams: Object
+ // Set of parameters for editor, like {required: true}
+ editorParams: {},
+
+ // disabled: Boolean
+ // If true, clicking the InlineEditBox to edit it will have no effect.
+ disabled: false,
+
+ onChange: function(/*===== value =====*/){
+ // summary:
+ // Set this handler to be notified of changes to value.
+ // tags:
+ // callback
+ },
+
+ onCancel: function(){
+ // summary:
+ // Set this handler to be notified when editing is cancelled.
+ // tags:
+ // callback
+ },
+
+ // width: String
+ // Width of editor. By default it's width=100% (ie, block mode).
+ width: "100%",
+
+ // value: String
+ // The display value of the widget in read-only mode
+ value: "",
+
+ // noValueIndicator: [const] String
+ // The text that gets displayed when there is no value (so that the user has a place to click to edit)
+ noValueIndicator: has("ie") <= 6 ? // font-family needed on IE6 but it messes up IE8
+ "<span style='font-family: wingdings; text-decoration: underline;'>&#160;&#160;&#160;&#160;&#x270d;&#160;&#160;&#160;&#160;</span>" :
+ "<span style='text-decoration: underline;'>&#160;&#160;&#160;&#160;&#x270d;&#160;&#160;&#160;&#160;</span>", // &#160; == &nbsp;
+
+ 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:
+ //
+ // - use srcNodeRef.innerHTML as my value
+ // - replace srcNodeRef with my generated DOM tree
+
+ this.editorParams = {};
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+
+ // save pointer to original source node, since Widget nulls-out srcNodeRef
+ this.displayNode = this.srcNodeRef;
+
+ // connect handlers to the display node
+ var events = {
+ ondijitclick: "_onClick",
+ onmouseover: "_onMouseOver",
+ onmouseout: "_onMouseOut",
+ onfocus: "_onMouseOver",
+ onblur: "_onMouseOut"
+ };
+ for(var name in events){
+ this.connect(this.displayNode, name, events[name]);
+ }
+ this.displayNode.setAttribute("role", "button");
+ if(!this.displayNode.getAttribute("tabIndex")){
+ this.displayNode.setAttribute("tabIndex", 0);
+ }
+
+ if(!this.value && !("value" in this.params)){ // "" is a good value if specified directly so check params){
+ this.value = lang.trim(this.renderAsHtml ? this.displayNode.innerHTML :
+ (this.displayNode.innerText || this.displayNode.textContent || ""));
+ }
+ if(!this.value){
+ this.displayNode.innerHTML = this.noValueIndicator;
+ }
+
+ domClass.add(this.displayNode, 'dijitInlineEditBoxDisplayMode');
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Deprecated. Use set('disabled', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.", "", "2.0");
+ this.set('disabled', disabled);
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ disabled){
+ // summary:
+ // Hook to make set("disabled", ...) work.
+ // Set disabled state of widget.
+ this.domNode.setAttribute("aria-disabled", disabled ? "true" : "false");
+ if(disabled){
+ this.displayNode.removeAttribute("tabIndex");
+ }else{
+ this.displayNode.setAttribute("tabIndex", 0);
+ }
+ domClass.toggle(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled);
+ this._set("disabled", disabled);
+ },
+
+ _onMouseOver: function(){
+ // summary:
+ // Handler for onmouseover and onfocus event.
+ // tags:
+ // private
+ if(!this.disabled){
+ domClass.add(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
+ }
+ },
+
+ _onMouseOut: function(){
+ // summary:
+ // Handler for onmouseout and onblur event.
+ // tags:
+ // private
+ domClass.remove(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
+ },
+
+ _onClick: function(/*Event*/ e){
+ // summary:
+ // Handler for onclick event.
+ // tags:
+ // private
+ if(this.disabled){
+ return;
+ }
+ if(e){
+ event.stop(e);
+ }
+ this._onMouseOut();
+
+ // Since FF gets upset if you move a node while in an event handler for that node...
+ this.defer("edit");
+ },
+
+ edit: function(){
+ // summary:
+ // Display the editor widget in place of the original (read only) markup.
+ // tags:
+ // private
+
+ if(this.disabled || this.editing){
+ return;
+ }
+ this._set('editing', true);
+
+ // save some display node values that can be restored later
+ this._savedTabIndex = domAttr.get(this.displayNode, "tabIndex") || "0";
+
+ if(this.wrapperWidget){
+ var ew = this.wrapperWidget.editWidget;
+ ew.set("displayedValue" in ew ? "displayedValue" : "value", this.value);
+ }else{
+ // Placeholder for edit widget
+ // Put place holder (and eventually editWidget) before the display node so that it's positioned correctly
+ // when Calendar dropdown appears, which happens automatically on focus.
+ var placeholder = domConstruct.create("span", null, this.domNode, "before");
+
+ // Create the editor wrapper (the thing that holds the editor widget and the save/cancel buttons)
+ var Ewc = typeof this.editorWrapper == "string" ? lang.getObject(this.editorWrapper) : this.editorWrapper;
+ this.wrapperWidget = new Ewc({
+ value: this.value,
+ buttonSave: this.buttonSave,
+ buttonCancel: this.buttonCancel,
+ dir: this.dir,
+ lang: this.lang,
+ tabIndex: this._savedTabIndex,
+ editor: this.editor,
+ inlineEditBox: this,
+ sourceStyle: domStyle.getComputedStyle(this.displayNode),
+ save: lang.hitch(this, "save"),
+ cancel: lang.hitch(this, "cancel"),
+ textDir: this.textDir
+ }, placeholder);
+ if(!this.wrapperWidget._started){
+ this.wrapperWidget.startup();
+ }
+ if(!this._started){
+ this.startup();
+ }
+ }
+ var ww = this.wrapperWidget;
+
+ // to avoid screen jitter, we first create the editor with position: absolute, visibility: hidden,
+ // and then when it's finished rendering, we switch from display mode to editor
+ // position: absolute releases screen space allocated to the display node
+ // opacity:0 is the same as visibility: hidden but is still focusable
+ // visibility: hidden removes focus outline
+
+ domClass.add(this.displayNode, "dijitOffScreen");
+ domClass.remove(ww.domNode, "dijitOffScreen");
+ domStyle.set(ww.domNode, { visibility: "visible" });
+ domAttr.set(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode
+
+ // After edit widget has finished initializing (in particular need to wait for dijit.Editor),
+ // or immediately if there is no onLoadDeferred Deferred,
+ // replace the display widget with edit widget, leaving them both displayed for a brief time so that
+ // focus can be shifted without incident.
+ when(ww.editWidget.onLoadDeferred, lang.hitch(ww, function(){
+ this.defer(function(){ // defer needed so that the change of focus doesn't happen on mousedown which also sets focus
+ this.focus(); // both nodes are showing, so we can switch focus safely
+ this._resetValue = this.getValue();
+ });
+ }));
+ },
+
+ _onBlur: function(){
+ // summary:
+ // Called when focus moves outside the InlineEditBox.
+ // Performs garbage collection.
+ // tags:
+ // private
+
+ this.inherited(arguments);
+ if(!this.editing){
+ /* causes IE focus problems, see TooltipDialog_a11y.html...
+ this.defer(function(){
+ if(this.wrapperWidget){
+ this.wrapperWidget.destroy();
+ delete this.wrapperWidget;
+ }
+ });
+ */
+ }
+ },
+
+ destroy: function(){
+ if(this.wrapperWidget && !this.wrapperWidget._destroyed){
+ this.wrapperWidget.destroy();
+ delete this.wrapperWidget;
+ }
+ this.inherited(arguments);
+ },
+
+ _showText: function(/*Boolean*/ focus){
+ // summary:
+ // Revert to display mode, and optionally focus on display node
+ // tags:
+ // private
+
+ var ww = this.wrapperWidget;
+ domStyle.set(ww.domNode, { visibility: "hidden" }); // hide the editor from mouse/keyboard events
+ domClass.add(ww.domNode, "dijitOffScreen");
+ domClass.remove(this.displayNode, "dijitOffScreen");
+ domAttr.set(this.displayNode, "tabIndex", this._savedTabIndex);
+ if(focus){
+ fm.focus(this.displayNode);
+ }
+ },
+
+ save: function(/*Boolean*/ focus){
+ // summary:
+ // Save the contents of the editor and revert to display mode.
+ // focus: Boolean
+ // Focus on the display mode text
+ // tags:
+ // private
+
+ if(this.disabled || !this.editing){
+ return;
+ }
+ this._set('editing', false);
+
+ var ww = this.wrapperWidget;
+ var value = ww.getValue();
+ this.set('value', value); // display changed, formatted value
+
+ this._showText(focus); // set focus as needed
+ },
+
+ setValue: function(/*String*/ val){
+ // summary:
+ // Deprecated. Use set('value', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.", "", "2.0");
+ return this.set("value", val);
+ },
+
+ _setValueAttr: function(/*String*/ val){
+ // summary:
+ // Hook to make set("value", ...) work.
+ // Inserts specified HTML value into this node, or an "input needed" character if node is blank.
+
+ val = lang.trim(val);
+ var renderVal = this.renderAsHtml ? val : val.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;").replace(/\n/g, "<br>");
+ this.displayNode.innerHTML = renderVal || this.noValueIndicator;
+ this._set("value", val);
+
+ if(this._started){
+ // tell the world that we have changed
+ this.defer(function(){
+ this.onChange(val);
+ }); // defer prevents browser freeze for long-running event handlers
+ }
+ // contextual (auto) text direction depends on the text value
+ if(this.textDir == "auto"){
+ this.applyTextDir(this.displayNode, this.displayNode.innerText);
+ }
+ },
+
+ getValue: function(){
+ // summary:
+ // Deprecated. Use get('value') instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.", "", "2.0");
+ return this.get("value");
+ },
+
+ cancel: function(/*Boolean*/ focus){
+ // summary:
+ // Revert to display mode, discarding any changes made in the editor
+ // tags:
+ // private
+
+ if(this.disabled || !this.editing){
+ return;
+ }
+ this._set('editing', false);
+
+ // tell the world that we have no changes
+ this.defer("onCancel"); // defer prevents browser freeze for long-running event handlers
+
+ this._showText(focus);
+ },
+
+ _setTextDirAttr: function(/*String*/ textDir){
+ // summary:
+ // Setter for textDir.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // set('textDir', value)
+ // tags:
+ // private
+ if(!this._created || this.textDir != textDir){
+ this._set("textDir", textDir);
+ this.applyTextDir(this.displayNode, this.displayNode.innerText);
+ this.displayNode.align = this.dir == "rtl" ? "right" : "left"; //fix the text alignment
+ }
+ }
+ });
+
+ InlineEditBox._InlineEditor = InlineEditor; // for monkey patching
+
+ return InlineEditBox;
+}); \ No newline at end of file
diff --git a/lib/dijit/LICENSE b/lib/dijit/LICENSE
index aa6b39f8c..483ea9b52 100644
--- a/lib/dijit/LICENSE
+++ b/lib/dijit/LICENSE
@@ -13,7 +13,7 @@ The text of the AFL and BSD licenses is reproduced below.
The "New" BSD License:
**********************
-Copyright (c) 2005-2011, The Dojo Foundation
+Copyright (c) 2005-2012, The Dojo Foundation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/lib/dijit/Menu.js b/lib/dijit/Menu.js
index a576da5c3..8e9ade0e9 100644
--- a/lib/dijit/Menu.js
+++ b/lib/dijit/Menu.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/Menu",["require","dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/dom","dojo/dom-attr","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","dojo/window","./popup","./DropDownMenu","dojo/ready"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,on,_c,_d,_e,pm,_f,_10){if(!_9.isAsync){_10(0,function(){var _11=["dijit/MenuItem","dijit/PopupMenuItem","dijit/CheckedMenuItem","dijit/MenuSeparator"];_1(_11);});}return _3("dijit.Menu",_f,{constructor:function(){this._bindings=[];},targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(_d.body());}else{_2.forEach(this.targetNodeIds,this.bindDomNode,this);}this.inherited(arguments);},_iframeContentWindow:function(_12){return _e.get(this._iframeContentDocument(_12))||this._iframeContentDocument(_12)["__parent__"]||(_12.name&&_d.doc.frames[_12.name])||null;},_iframeContentDocument:function(_13){return _13.contentDocument||(_13.contentWindow&&_13.contentWindow.document)||(_13.name&&_d.doc.frames[_13.name]&&_d.doc.frames[_13.name].document)||null;},bindDomNode:function(_14){_14=_5.byId(_14);var cn;if(_14.tagName.toLowerCase()=="iframe"){var _15=_14,_16=this._iframeContentWindow(_15);cn=_d.withGlobal(_16,_d.body);}else{cn=(_14==_d.body()?_d.doc.documentElement:_14);}var _17={node:_14,iframe:_15};_6.set(_14,"_dijitMenu"+this.id,this._bindings.push(_17));var _18=_b.hitch(this,function(cn){return [on(cn,this.leftClickToOpen?"click":"contextmenu",_b.hitch(this,function(evt){_4.stop(evt);this._scheduleOpen(evt.target,_15,{x:evt.pageX,y:evt.pageY});})),on(cn,"keydown",_b.hitch(this,function(evt){if(evt.shiftKey&&evt.keyCode==_a.F10){_4.stop(evt);this._scheduleOpen(evt.target,_15);}}))];});_17.connects=cn?_18(cn):[];if(_15){_17.onloadHandler=_b.hitch(this,function(){var _19=this._iframeContentWindow(_15);cn=_d.withGlobal(_19,_d.body);_17.connects=_18(cn);});if(_15.addEventListener){_15.addEventListener("load",_17.onloadHandler,false);}else{_15.attachEvent("onload",_17.onloadHandler);}}},unBindDomNode:function(_1a){var _1b;try{_1b=_5.byId(_1a);}catch(e){return;}var _1c="_dijitMenu"+this.id;if(_1b&&_6.has(_1b,_1c)){var bid=_6.get(_1b,_1c)-1,b=this._bindings[bid],h;while(h=b.connects.pop()){h.remove();}var _1d=b.iframe;if(_1d){if(_1d.removeEventListener){_1d.removeEventListener("load",b.onloadHandler,false);}else{_1d.detachEvent("onload",b.onloadHandler);}}_6.remove(_1b,_1c);delete this._bindings[bid];}},_scheduleOpen:function(_1e,_1f,_20){if(!this._openTimer){this._openTimer=setTimeout(_b.hitch(this,function(){delete this._openTimer;this._openMyself({target:_1e,iframe:_1f,coords:_20});}),1);}},_openMyself:function(_21){var _22=_21.target,_23=_21.iframe,_24=_21.coords;if(_24){if(_23){var ifc=_7.position(_23,true),_25=this._iframeContentWindow(_23),_26=_d.withGlobal(_25,"_docScroll",dojo);var cs=_8.getComputedStyle(_23),tp=_8.toPixelValue,_27=(_c("ie")&&_c("quirks")?0:tp(_23,cs.paddingLeft))+(_c("ie")&&_c("quirks")?tp(_23,cs.borderLeftWidth):0),top=(_c("ie")&&_c("quirks")?0:tp(_23,cs.paddingTop))+(_c("ie")&&_c("quirks")?tp(_23,cs.borderTopWidth):0);_24.x+=ifc.x+_27-_26.x;_24.y+=ifc.y+top-_26.y;}}else{_24=_7.position(_22,true);_24.x+=10;_24.y+=10;}var _28=this;var _29=this._focusManager.get("prevNode");var _2a=this._focusManager.get("curNode");var _2b=!_2a||(_5.isDescendant(_2a,this.domNode))?_29:_2a;function _2c(){if(_28.refocus&&_2b){_2b.focus();}pm.close(_28);};pm.open({popup:this,x:_24.x,y:_24.y,onExecute:_2c,onCancel:_2c,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);pm.close(this);};},uninitialize:function(){_2.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/Menu",["require","dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/dom","dojo/dom-attr","dojo/dom-geometry","dojo/dom-style","dojo/keys","dojo/_base/lang","dojo/on","dojo/sniff","dojo/_base/window","dojo/window","./popup","./DropDownMenu","dojo/ready"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,on,_b,_c,_d,pm,_e,_f){if(_b("dijit-legacy-requires")){_f(0,function(){var _10=["dijit/MenuItem","dijit/PopupMenuItem","dijit/CheckedMenuItem","dijit/MenuSeparator"];_1(_10);});}return _3("dijit.Menu",_e,{constructor:function(){this._bindings=[];},targetNodeIds:[],selector:"",contextMenuForWindow:false,leftClickToOpen:false,refocus:true,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(this.ownerDocumentBody);}else{_2.forEach(this.targetNodeIds,this.bindDomNode,this);}this.inherited(arguments);},_iframeContentWindow:function(_11){return _d.get(this._iframeContentDocument(_11))||this._iframeContentDocument(_11)["__parent__"]||(_11.name&&_c.doc.frames[_11.name])||null;},_iframeContentDocument:function(_12){return _12.contentDocument||(_12.contentWindow&&_12.contentWindow.document)||(_12.name&&_c.doc.frames[_12.name]&&_c.doc.frames[_12.name].document)||null;},bindDomNode:function(_13){_13=_5.byId(_13,this.ownerDocument);var cn;if(_13.tagName.toLowerCase()=="iframe"){var _14=_13,_15=this._iframeContentWindow(_14);cn=_c.body(_15.document);}else{cn=(_13==_c.body(this.ownerDocument)?this.ownerDocument.documentElement:_13);}var _16={node:_13,iframe:_14};_6.set(_13,"_dijitMenu"+this.id,this._bindings.push(_16));var _17=_a.hitch(this,function(cn){var _18=this.selector,_19=_18?function(_1a){return on.selector(_18,_1a);}:function(_1b){return _1b;},_1c=this;return [on(cn,_19(this.leftClickToOpen?"click":"contextmenu"),function(evt){_4.stop(evt);_1c._scheduleOpen(this,_14,{x:evt.pageX,y:evt.pageY});}),on(cn,_19("keydown"),function(evt){if(evt.shiftKey&&evt.keyCode==_9.F10){_4.stop(evt);_1c._scheduleOpen(this,_14);}})];});_16.connects=cn?_17(cn):[];if(_14){_16.onloadHandler=_a.hitch(this,function(){var _1d=this._iframeContentWindow(_14);cn=_c.body(_1d.document);_16.connects=_17(cn);});if(_14.addEventListener){_14.addEventListener("load",_16.onloadHandler,false);}else{_14.attachEvent("onload",_16.onloadHandler);}}},unBindDomNode:function(_1e){var _1f;try{_1f=_5.byId(_1e,this.ownerDocument);}catch(e){return;}var _20="_dijitMenu"+this.id;if(_1f&&_6.has(_1f,_20)){var bid=_6.get(_1f,_20)-1,b=this._bindings[bid],h;while((h=b.connects.pop())){h.remove();}var _21=b.iframe;if(_21){if(_21.removeEventListener){_21.removeEventListener("load",b.onloadHandler,false);}else{_21.detachEvent("onload",b.onloadHandler);}}_6.remove(_1f,_20);delete this._bindings[bid];}},_scheduleOpen:function(_22,_23,_24){if(!this._openTimer){this._openTimer=this.defer(function(){delete this._openTimer;this._openMyself({target:_22,iframe:_23,coords:_24});},1);}},_openMyself:function(_25){var _26=_25.target,_27=_25.iframe,_28=_25.coords;this.currentTarget=_26;if(_28){if(_27){var ifc=_7.position(_27,true),_29=this._iframeContentWindow(_27),_2a=_7.docScroll(_29.document);var cs=_8.getComputedStyle(_27),tp=_8.toPixelValue,_2b=(_b("ie")&&_b("quirks")?0:tp(_27,cs.paddingLeft))+(_b("ie")&&_b("quirks")?tp(_27,cs.borderLeftWidth):0),top=(_b("ie")&&_b("quirks")?0:tp(_27,cs.paddingTop))+(_b("ie")&&_b("quirks")?tp(_27,cs.borderTopWidth):0);_28.x+=ifc.x+_2b-_2a.x;_28.y+=ifc.y+top-_2a.y;}}else{_28=_7.position(_26,true);_28.x+=10;_28.y+=10;}var _2c=this;var _2d=this._focusManager.get("prevNode");var _2e=this._focusManager.get("curNode");var _2f=!_2e||(_5.isDescendant(_2e,this.domNode))?_2d:_2e;function _30(){if(_2c.refocus&&_2f){_2f.focus();}pm.close(_2c);};pm.open({popup:this,x:_28.x,y:_28.y,onExecute:_30,onCancel:_30,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);pm.close(this);};},destroy:function(){_2.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/Menu.js.uncompressed.js b/lib/dijit/Menu.js.uncompressed.js
new file mode 100644
index 000000000..b823a0c86
--- /dev/null
+++ b/lib/dijit/Menu.js.uncompressed.js
@@ -0,0 +1,349 @@
+define("dijit/Menu", [
+ "require",
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/dom", // dom.byId dom.isDescendant
+ "dojo/dom-attr", // domAttr.get domAttr.set domAttr.has domAttr.remove
+ "dojo/dom-geometry", // domStyle.getComputedStyle domGeometry.position
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/keys", // keys.F10
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/sniff", // has("ie"), has("quirks")
+ "dojo/_base/window", // win.body win.doc.documentElement win.doc.frames
+ "dojo/window", // winUtils.get
+ "./popup",
+ "./DropDownMenu",
+ "dojo/ready"
+], function(require, array, declare, event, dom, domAttr, domGeometry, domStyle, keys, lang, on,
+ has, win, winUtils, pm, DropDownMenu, ready){
+
+// module:
+// dijit/Menu
+
+// Back compat w/1.6, remove for 2.0
+if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/MenuItem", "dijit/PopupMenuItem", "dijit/CheckedMenuItem", "dijit/MenuSeparator"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+return declare("dijit.Menu", DropDownMenu, {
+ // summary:
+ // A context menu you can assign to multiple elements
+
+ 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:
+ //
+ // - use srcNodeRef.innerHTML as my contents
+ // - replace srcNodeRef with my generated DOM tree
+
+ this._bindings = [];
+ },
+
+ // targetNodeIds: [const] String[]
+ // Array of dom node ids of nodes to attach to.
+ // Fill this with nodeIds upon widget creation and it becomes context menu for those nodes.
+ targetNodeIds: [],
+
+ // selector: String?
+ // CSS expression to apply this Menu to descendants of targetNodeIds, rather than to
+ // the nodes specified by targetNodeIds themselves. Useful for applying a Menu to
+ // a range of rows in a table, tree, etc.
+ //
+ // The application must require() an appropriate level of dojo/query to handle the selector.
+ selector: "",
+
+ // TODO: in 2.0 remove support for multiple targetNodeIds. selector gives the same effect.
+ // So, change targetNodeIds to a targetNodeId: "", remove bindDomNode()/unBindDomNode(), etc.
+
+/*=====
+ // currentTarget: [readonly] DOMNode
+ // For context menus, set to the current node that the Menu is being displayed for.
+ // Useful so that the menu actions can be tailored according to the node
+ currentTarget: null,
+=====*/
+
+ // contextMenuForWindow: [const] Boolean
+ // If true, right clicking anywhere on the window will cause this context menu to open.
+ // If false, must specify targetNodeIds.
+ contextMenuForWindow: false,
+
+ // leftClickToOpen: [const] Boolean
+ // If true, menu will open on left click instead of right click, similar to a file menu.
+ leftClickToOpen: false,
+
+ // refocus: Boolean
+ // When this menu closes, re-focus the element which had focus before it was opened.
+ refocus: true,
+
+ postCreate: function(){
+ if(this.contextMenuForWindow){
+ this.bindDomNode(this.ownerDocumentBody);
+ }else{
+ // TODO: should have _setTargetNodeIds() method to handle initialization and a possible
+ // later set('targetNodeIds', ...) call. There's also a problem that targetNodeIds[]
+ // gets stale after calls to bindDomNode()/unBindDomNode() as it still is just the original list (see #9610)
+ array.forEach(this.targetNodeIds, this.bindDomNode, this);
+ }
+ this.inherited(arguments);
+ },
+
+ // thanks burstlib!
+ _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
+ // summary:
+ // Returns the window reference of the passed iframe
+ // tags:
+ // private
+ return winUtils.get(this._iframeContentDocument(iframe_el)) ||
+ // Moz. TODO: is this available when defaultView isn't?
+ this._iframeContentDocument(iframe_el)['__parent__'] ||
+ (iframe_el.name && win.doc.frames[iframe_el.name]) || null; // Window
+ },
+
+ _iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
+ // summary:
+ // Returns a reference to the document object inside iframe_el
+ // tags:
+ // protected
+ return iframe_el.contentDocument // W3
+ || (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE
+ || (iframe_el.name && win.doc.frames[iframe_el.name] && win.doc.frames[iframe_el.name].document)
+ || null; // HTMLDocument
+ },
+
+ bindDomNode: function(/*String|DomNode*/ node){
+ // summary:
+ // Attach menu to given node
+ node = dom.byId(node, this.ownerDocument);
+
+ var cn; // Connect node
+
+ // Support context menus on iframes. Rather than binding to the iframe itself we need
+ // to bind to the <body> node inside the iframe.
+ if(node.tagName.toLowerCase() == "iframe"){
+ var iframe = node,
+ window = this._iframeContentWindow(iframe);
+ cn = win.body(window.document);
+ }else{
+ // To capture these events at the top level, attach to <html>, not <body>.
+ // Otherwise right-click context menu just doesn't work.
+ cn = (node == win.body(this.ownerDocument) ? this.ownerDocument.documentElement : node);
+ }
+
+
+ // "binding" is the object to track our connection to the node (ie, the parameter to bindDomNode())
+ var binding = {
+ node: node,
+ iframe: iframe
+ };
+
+ // Save info about binding in _bindings[], and make node itself record index(+1) into
+ // _bindings[] array. Prefix w/_dijitMenu to avoid setting an attribute that may
+ // start with a number, which fails on FF/safari.
+ domAttr.set(node, "_dijitMenu" + this.id, this._bindings.push(binding));
+
+ // Setup the connections to monitor click etc., unless we are connecting to an iframe which hasn't finished
+ // loading yet, in which case we need to wait for the onload event first, and then connect
+ // On linux Shift-F10 produces the oncontextmenu event, but on Windows it doesn't, so
+ // we need to monitor keyboard events in addition to the oncontextmenu event.
+ var doConnects = lang.hitch(this, function(cn){
+ var selector = this.selector,
+ delegatedEvent = selector ?
+ function(eventType){ return on.selector(selector, eventType); } :
+ function(eventType){ return eventType; },
+ self = this;
+ return [
+ // TODO: when leftClickToOpen is true then shouldn't space/enter key trigger the menu,
+ // rather than shift-F10?
+ on(cn, delegatedEvent(this.leftClickToOpen ? "click" : "contextmenu"), function(evt){
+ // Schedule context menu to be opened unless it's already been scheduled from onkeydown handler
+ event.stop(evt);
+ self._scheduleOpen(this, iframe, {x: evt.pageX, y: evt.pageY});
+ }),
+ on(cn, delegatedEvent("keydown"), function(evt){
+ if(evt.shiftKey && evt.keyCode == keys.F10){
+ event.stop(evt);
+ self._scheduleOpen(this, iframe); // no coords - open near target node
+ }
+ })
+ ];
+ });
+ binding.connects = cn ? doConnects(cn) : [];
+
+ if(iframe){
+ // Setup handler to [re]bind to the iframe when the contents are initially loaded,
+ // and every time the contents change.
+ // Need to do this b/c we are actually binding to the iframe's <body> node.
+ // Note: can't use connect.connect(), see #9609.
+
+ binding.onloadHandler = lang.hitch(this, function(){
+ // want to remove old connections, but IE throws exceptions when trying to
+ // access the <body> node because it's already gone, or at least in a state of limbo
+
+ var window = this._iframeContentWindow(iframe);
+ cn = win.body(window.document)
+ binding.connects = doConnects(cn);
+ });
+ if(iframe.addEventListener){
+ iframe.addEventListener("load", binding.onloadHandler, false);
+ }else{
+ iframe.attachEvent("onload", binding.onloadHandler);
+ }
+ }
+ },
+
+ unBindDomNode: function(/*String|DomNode*/ nodeName){
+ // summary:
+ // Detach menu from given node
+
+ var node;
+ try{
+ node = dom.byId(nodeName, this.ownerDocument);
+ }catch(e){
+ // On IE the dom.byId() call will get an exception if the attach point was
+ // the <body> node of an <iframe> that has since been reloaded (and thus the
+ // <body> node is in a limbo state of destruction.
+ return;
+ }
+
+ // node["_dijitMenu" + this.id] contains index(+1) into my _bindings[] array
+ var attrName = "_dijitMenu" + this.id;
+ if(node && domAttr.has(node, attrName)){
+ var bid = domAttr.get(node, attrName)-1, b = this._bindings[bid], h;
+ while((h = b.connects.pop())){
+ h.remove();
+ }
+
+ // Remove listener for iframe onload events
+ var iframe = b.iframe;
+ if(iframe){
+ if(iframe.removeEventListener){
+ iframe.removeEventListener("load", b.onloadHandler, false);
+ }else{
+ iframe.detachEvent("onload", b.onloadHandler);
+ }
+ }
+
+ domAttr.remove(node, attrName);
+ delete this._bindings[bid];
+ }
+ },
+
+ _scheduleOpen: function(/*DomNode?*/ target, /*DomNode?*/ iframe, /*Object?*/ coords){
+ // summary:
+ // Set timer to display myself. Using a timer rather than displaying immediately solves
+ // two problems:
+ //
+ // 1. IE: without the delay, focus work in "open" causes the system
+ // context menu to appear in spite of stopEvent.
+ //
+ // 2. Avoid double-shows on linux, where shift-F10 generates an oncontextmenu event
+ // even after a event.stop(e). (Shift-F10 on windows doesn't generate the
+ // oncontextmenu event.)
+
+ if(!this._openTimer){
+ this._openTimer = this.defer(function(){
+ delete this._openTimer;
+ this._openMyself({
+ target: target,
+ iframe: iframe,
+ coords: coords
+ });
+ }, 1);
+ }
+ },
+
+ _openMyself: function(args){
+ // summary:
+ // Internal function for opening myself when the user does a right-click or something similar.
+ // args:
+ // This is an Object containing:
+ //
+ // - target: The node that is being clicked
+ // - iframe: If an `<iframe>` is being clicked, iframe points to that iframe
+ // - coords: Put menu at specified x/y position in viewport, or if iframe is
+ // specified, then relative to iframe.
+ //
+ // _openMyself() formerly took the event object, and since various code references
+ // evt.target (after connecting to _openMyself()), using an Object for parameters
+ // (so that old code still works).
+
+ var target = args.target,
+ iframe = args.iframe,
+ coords = args.coords;
+
+ // To be used by MenuItem event handlers to tell which node the menu was opened on
+ this.currentTarget = target;
+
+ // Get coordinates to open menu, either at specified (mouse) position or (if triggered via keyboard)
+ // then near the node the menu is assigned to.
+ if(coords){
+ if(iframe){
+ // Specified coordinates are on <body> node of an <iframe>, convert to match main document
+ var ifc = domGeometry.position(iframe, true),
+ window = this._iframeContentWindow(iframe),
+ scroll = domGeometry.docScroll(window.document);
+
+ var cs = domStyle.getComputedStyle(iframe),
+ tp = domStyle.toPixelValue,
+ left = (has("ie") && has("quirks") ? 0 : tp(iframe, cs.paddingLeft)) + (has("ie") && has("quirks") ? tp(iframe, cs.borderLeftWidth) : 0),
+ top = (has("ie") && has("quirks") ? 0 : tp(iframe, cs.paddingTop)) + (has("ie") && has("quirks") ? tp(iframe, cs.borderTopWidth) : 0);
+
+ coords.x += ifc.x + left - scroll.x;
+ coords.y += ifc.y + top - scroll.y;
+ }
+ }else{
+ coords = domGeometry.position(target, true);
+ coords.x += 10;
+ coords.y += 10;
+ }
+
+ var self=this;
+ var prevFocusNode = this._focusManager.get("prevNode");
+ var curFocusNode = this._focusManager.get("curNode");
+ var savedFocusNode = !curFocusNode || (dom.isDescendant(curFocusNode, this.domNode)) ? prevFocusNode : curFocusNode;
+
+ function closeAndRestoreFocus(){
+ // user has clicked on a menu or popup
+ if(self.refocus && savedFocusNode){
+ savedFocusNode.focus();
+ }
+ pm.close(self);
+ }
+ pm.open({
+ popup: this,
+ x: coords.x,
+ y: coords.y,
+ onExecute: closeAndRestoreFocus,
+ onCancel: closeAndRestoreFocus,
+ orient: this.isLeftToRight() ? 'L' : 'R'
+ });
+ this.focus();
+
+ this._onBlur = function(){
+ this.inherited('_onBlur', arguments);
+ // Usually the parent closes the child widget but if this is a context
+ // menu then there is no parent
+ pm.close(this);
+ // don't try to restore focus; user has clicked another part of the screen
+ // and set focus there
+ };
+ },
+
+ destroy: function(){
+ array.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this);
+ this.inherited(arguments);
+ }
+});
+
+});
diff --git a/lib/dijit/MenuBar.js b/lib/dijit/MenuBar.js
index b6a1dfebe..8483d34db 100644
--- a/lib/dijit/MenuBar.js
+++ b/lib/dijit/MenuBar.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/MenuBar.html":"<div class=\"dijitMenuBar dijitMenuPassive\" data-dojo-attach-point=\"containerNode\" role=\"menubar\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress: _onKeyPress\"></div>\n"}});define("dijit/MenuBar",["dojo/_base/declare","dojo/_base/event","dojo/keys","./_MenuBase","dojo/text!./templates/MenuBar.html"],function(_1,_2,_3,_4,_5){return _1("dijit.MenuBar",_4,{templateString:_5,baseClass:"dijitMenuBar",_isMenuBar:true,postCreate:function(){var l=this.isLeftToRight();this.connectKeyNavHandlers(l?[_3.LEFT_ARROW]:[_3.RIGHT_ARROW],l?[_3.RIGHT_ARROW]:[_3.LEFT_ARROW]);this._orient=["below"];},focusChild:function(_6){var _7=this.focusedChild,_8=_7&&_7.popup&&_7.popup.isShowingNow;this.inherited(arguments);if(_8&&_6.popup&&!_6.disabled){this._openPopup();}},_onKeyPress:function(_9){if(_9.ctrlKey||_9.altKey){return;}switch(_9.charOrCode){case _3.DOWN_ARROW:this._moveToPopup(_9);_2.stop(_9);}},onItemClick:function(_a,_b){if(_a.popup&&_a.popup.isShowingNow){_a.popup.onCancel();}else{this.inherited(arguments);}}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/MenuBar.html":"<div class=\"dijitMenuBar dijitMenuPassive\" data-dojo-attach-point=\"containerNode\" role=\"menubar\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress: _onKeyPress\"></div>\n"}});define("dijit/MenuBar",["dojo/_base/declare","dojo/_base/event","dojo/keys","./_MenuBase","dojo/text!./templates/MenuBar.html"],function(_1,_2,_3,_4,_5){return _1("dijit.MenuBar",_4,{templateString:_5,baseClass:"dijitMenuBar",_isMenuBar:true,postCreate:function(){this.inherited(arguments);var l=this.isLeftToRight();this.connectKeyNavHandlers(l?[_3.LEFT_ARROW]:[_3.RIGHT_ARROW],l?[_3.RIGHT_ARROW]:[_3.LEFT_ARROW]);this._orient=["below"];},_moveToPopup:function(_6){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.onItemClick(this.focusedChild,_6);}},focusChild:function(_7){var _8=this.focusedChild,_9=_8&&_8.popup&&_8.popup.isShowingNow;this.inherited(arguments);if(_9&&_7.popup&&!_7.disabled){this._openPopup(true);}},_onKeyPress:function(_a){if(_a.ctrlKey||_a.altKey){return;}switch(_a.charOrCode){case _3.DOWN_ARROW:this._moveToPopup(_a);_2.stop(_a);}},onItemClick:function(_b,_c){if(_b.popup&&_b.popup.isShowingNow&&(_c.type!=="keypress"||_c.keyCode!==_3.DOWN_ARROW)){_b.popup.onCancel();}else{this.inherited(arguments);}}});}); \ No newline at end of file
diff --git a/lib/dijit/MenuBar.js.uncompressed.js b/lib/dijit/MenuBar.js.uncompressed.js
new file mode 100644
index 000000000..b71c1ceb1
--- /dev/null
+++ b/lib/dijit/MenuBar.js.uncompressed.js
@@ -0,0 +1,92 @@
+require({cache:{
+'url:dijit/templates/MenuBar.html':"<div class=\"dijitMenuBar dijitMenuPassive\" data-dojo-attach-point=\"containerNode\" role=\"menubar\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress: _onKeyPress\"></div>\n"}});
+define("dijit/MenuBar", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys.DOWN_ARROW
+ "./_MenuBase",
+ "dojo/text!./templates/MenuBar.html"
+], function(declare, event, keys, _MenuBase, template){
+
+// module:
+// dijit/MenuBar
+
+return declare("dijit.MenuBar", _MenuBase, {
+ // summary:
+ // A menu bar, listing menu choices horizontally, like the "File" menu in most desktop applications
+
+ templateString: template,
+
+ baseClass: "dijitMenuBar",
+
+ // _isMenuBar: [protected] Boolean
+ // This is a MenuBar widget, not a (vertical) Menu widget.
+ _isMenuBar: true,
+
+ postCreate: function(){
+ this.inherited(arguments);
+ var l = this.isLeftToRight();
+ this.connectKeyNavHandlers(
+ l ? [keys.LEFT_ARROW] : [keys.RIGHT_ARROW],
+ l ? [keys.RIGHT_ARROW] : [keys.LEFT_ARROW]
+ );
+
+ // parameter to dijit.popup.open() about where to put popup (relative to this.domNode)
+ this._orient = ["below"];
+ },
+
+ _moveToPopup: function(/*Event*/ evt){
+ // summary:
+ // This handles the down arrow key, opening a submenu if one exists.
+ // Unlike _MenuBase._moveToPopup(), will never move to the next item in the MenuBar.
+ // tags:
+ // private
+
+ if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
+ this.onItemClick(this.focusedChild, evt);
+ }
+ },
+
+ focusChild: function(item){
+ // overload focusChild so that whenever the focus is moved to a new item,
+ // check the previous focused whether it has its popup open, if so, after
+ // focusing the new item, open its submenu immediately
+ var prev_item = this.focusedChild,
+ showpopup = prev_item && prev_item.popup && prev_item.popup.isShowingNow;
+ this.inherited(arguments);
+ if(showpopup && item.popup && !item.disabled){
+ this._openPopup(true); // TODO: on down arrow, _openPopup() is called here and in onItemClick()
+ }
+ },
+
+ _onKeyPress: function(/*Event*/ evt){
+ // summary:
+ // Handle keyboard based menu navigation.
+ // tags:
+ // protected
+
+ if(evt.ctrlKey || evt.altKey){ return; }
+
+ switch(evt.charOrCode){
+ case keys.DOWN_ARROW:
+ this._moveToPopup(evt);
+ event.stop(evt);
+ }
+ },
+
+ onItemClick: function(/*dijit/_WidgetBase*/ item, /*Event*/ evt){
+ // summary:
+ // Handle clicks on an item. Also called by _moveToPopup() due to a down-arrow key on the item.
+ // Cancels a dropdown if already open and click is either mouse or space/enter.
+ // Don't close dropdown due to down arrow.
+ // tags:
+ // private
+ if(item.popup && item.popup.isShowingNow && (evt.type !== "keypress" || evt.keyCode !== keys.DOWN_ARROW)){
+ item.popup.onCancel();
+ }else{
+ this.inherited(arguments);
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/MenuBarItem.js b/lib/dijit/MenuBarItem.js
index 27038e623..dc4e451c1 100644
--- a/lib/dijit/MenuBarItem.js
+++ b/lib/dijit/MenuBarItem.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/MenuBarItem.html":"<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span data-dojo-attach-point=\"containerNode\"></span>\n</div>\n"}});define("dijit/MenuBarItem",["dojo/_base/declare","./MenuItem","dojo/text!./templates/MenuBarItem.html"],function(_1,_2,_3){var _4=_1("dijit._MenuBarItemMixin",null,{templateString:_3,_setIconClassAttr:null});var _5=_1("dijit.MenuBarItem",[_2,_4],{});_5._MenuBarItemMixin=_4;return _5;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/MenuBarItem.html":"<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" data-dojo-attach-point=\"focusNode\"\n\t \trole=\"menuitem\" tabIndex=\"-1\">\n\t<span data-dojo-attach-point=\"containerNode\"></span>\n</div>\n"}});define("dijit/MenuBarItem",["dojo/_base/declare","./MenuItem","dojo/text!./templates/MenuBarItem.html"],function(_1,_2,_3){var _4=_1("dijit._MenuBarItemMixin",null,{templateString:_3,_setIconClassAttr:null});var _5=_1("dijit.MenuBarItem",[_2,_4],{});_5._MenuBarItemMixin=_4;return _5;}); \ No newline at end of file
diff --git a/lib/dijit/MenuBarItem.js.uncompressed.js b/lib/dijit/MenuBarItem.js.uncompressed.js
new file mode 100644
index 000000000..74294b06c
--- /dev/null
+++ b/lib/dijit/MenuBarItem.js.uncompressed.js
@@ -0,0 +1,28 @@
+require({cache:{
+'url:dijit/templates/MenuBarItem.html':"<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" data-dojo-attach-point=\"focusNode\"\n\t \trole=\"menuitem\" tabIndex=\"-1\">\n\t<span data-dojo-attach-point=\"containerNode\"></span>\n</div>\n"}});
+define("dijit/MenuBarItem", [
+ "dojo/_base/declare", // declare
+ "./MenuItem",
+ "dojo/text!./templates/MenuBarItem.html"
+], function(declare, MenuItem, template){
+
+ // module:
+ // dijit/MenuBarItem
+
+ var _MenuBarItemMixin = declare("dijit._MenuBarItemMixin", null, {
+ templateString: template,
+
+ // Map widget attributes to DOMNode attributes.
+ _setIconClassAttr: null // cancel MenuItem setter because we don't have a place for an icon
+ });
+
+ var MenuBarItem = declare("dijit.MenuBarItem", [MenuItem, _MenuBarItemMixin], {
+ // summary:
+ // Item in a MenuBar that's clickable, and doesn't spawn a submenu when pressed (or hovered)
+
+ });
+ MenuBarItem._MenuBarItemMixin = _MenuBarItemMixin; // dojox.mobile is accessing this
+
+
+ return MenuBarItem;
+});
diff --git a/lib/dijit/MenuItem.js b/lib/dijit/MenuItem.js
index d68ed0557..ffc1999f1 100644
--- a/lib/dijit/MenuItem.js
+++ b/lib/dijit/MenuItem.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/MenuItem.html":"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div data-dojo-attach-point=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\"/>\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n"}});define("dijit/MenuItem",["dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/_base/event","dojo/_base/kernel","dojo/_base/sniff","./_Widget","./_TemplatedMixin","./_Contained","./_CssStateMixin","dojo/text!./templates/MenuItem.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){return _1("dijit.MenuItem",[_8,_9,_a,_b],{templateString:_c,baseClass:"dijitMenuItem",label:"",_setLabelAttr:{node:"containerNode",type:"innerHTML"},iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},accelKey:"",disabled:false,_fillContent:function(_d){if(_d&&!("label" in this.params)){this.set("label",_d.innerHTML);}},buildRendering:function(){this.inherited(arguments);var _e=this.id+"_text";_3.set(this.containerNode,"id",_e);if(this.accelKeyNode){_3.set(this.accelKeyNode,"id",this.id+"_accel");_e+=" "+this.id+"_accel";}this.domNode.setAttribute("aria-labelledby",_e);_2.setSelectable(this.domNode,false);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._set("hovering",false);},_onClick:function(_f){this.getParent().onItemClick(this,_f);_5.stop(_f);},onClick:function(){},focus:function(){try{if(_7("ie")==8){this.containerNode.focus();}this.focusNode.focus();}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_10){_4.toggle(this.domNode,"dijitMenuItemSelected",_10);},setLabel:function(_11){_6.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_11);},setDisabled:function(_12){_6.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_12);},_setDisabledAttr:function(_13){this.focusNode.setAttribute("aria-disabled",_13?"true":"false");this._set("disabled",_13);},_setAccelKeyAttr:function(_14){this.accelKeyNode.style.display=_14?"":"none";this.accelKeyNode.innerHTML=_14;_3.set(this.containerNode,"colSpan",_14?"1":"2");this._set("accelKey",_14);}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/MenuItem.html":"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div data-dojo-attach-point=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\"/>\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n"}});define("dijit/MenuItem",["dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/_base/kernel","dojo/sniff","./_Widget","./_TemplatedMixin","./_Contained","./_CssStateMixin","dojo/text!./templates/MenuItem.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){return _1("dijit.MenuItem",[_7,_8,_9,_a],{templateString:_b,baseClass:"dijitMenuItem",label:"",_setLabelAttr:function(_c){this.containerNode.innerHTML=_c;this._set("label",_c);if(this.textDir==="auto"){this.applyTextDir(this.focusNode,this.label);}},iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},accelKey:"",disabled:false,_fillContent:function(_d){if(_d&&!("label" in this.params)){this.set("label",_d.innerHTML);}},buildRendering:function(){this.inherited(arguments);var _e=this.id+"_text";_3.set(this.containerNode,"id",_e);if(this.accelKeyNode){_3.set(this.accelKeyNode,"id",this.id+"_accel");_e+=" "+this.id+"_accel";}this.domNode.setAttribute("aria-labelledby",_e);_2.setSelectable(this.domNode,false);},onClick:function(){},focus:function(){try{if(_6("ie")==8){this.containerNode.focus();}this.focusNode.focus();}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_f){_4.toggle(this.domNode,"dijitMenuItemSelected",_f);},setLabel:function(_10){_5.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_10);},setDisabled:function(_11){_5.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_11);},_setDisabledAttr:function(_12){this.focusNode.setAttribute("aria-disabled",_12?"true":"false");this._set("disabled",_12);},_setAccelKeyAttr:function(_13){this.accelKeyNode.style.display=_13?"":"none";this.accelKeyNode.innerHTML=_13;_3.set(this.containerNode,"colSpan",_13?"1":"2");this._set("accelKey",_13);},_setTextDirAttr:function(_14){if(!this._created||this.textDir!=_14){this._set("textDir",_14);this.applyTextDir(this.focusNode,this.label);}}});}); \ No newline at end of file
diff --git a/lib/dijit/MenuItem.js.uncompressed.js b/lib/dijit/MenuItem.js.uncompressed.js
new file mode 100644
index 000000000..3d5ff3908
--- /dev/null
+++ b/lib/dijit/MenuItem.js.uncompressed.js
@@ -0,0 +1,187 @@
+require({cache:{
+'url:dijit/templates/MenuItem.html':"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" data-dojo-attach-point=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" data-dojo-attach-point=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div data-dojo-attach-point=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\"/>\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n"}});
+define("dijit/MenuItem", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.toggle
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/sniff", // has("ie")
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_Contained",
+ "./_CssStateMixin",
+ "dojo/text!./templates/MenuItem.html"
+], function(declare, dom, domAttr, domClass, kernel, has,
+ _Widget, _TemplatedMixin, _Contained, _CssStateMixin, template){
+
+ // module:
+ // dijit/MenuItem
+
+ return declare("dijit.MenuItem",
+ [_Widget, _TemplatedMixin, _Contained, _CssStateMixin],
+ {
+ // summary:
+ // A line item in a Menu Widget
+
+ // Make 3 columns
+ // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
+ templateString: template,
+
+ baseClass: "dijitMenuItem",
+
+ // label: String
+ // Menu text
+ label: "",
+ _setLabelAttr: function(val){
+ this.containerNode.innerHTML = val;
+ this._set("label", val);
+ if(this.textDir === "auto"){
+ this.applyTextDir(this.focusNode, this.label);
+ }
+ },
+
+ // iconClass: String
+ // Class to apply to DOMNode to make it display an icon.
+ iconClass: "dijitNoIcon",
+ _setIconClassAttr: { node: "iconNode", type: "class" },
+
+ // accelKey: String
+ // Text for the accelerator (shortcut) key combination.
+ // Note that although Menu can display accelerator keys there
+ // is no infrastructure to actually catch and execute these
+ // accelerators.
+ accelKey: "",
+
+ // disabled: Boolean
+ // If true, the menu item is disabled.
+ // If false, the menu item is enabled.
+ disabled: false,
+
+ _fillContent: function(/*DomNode*/ source){
+ // If button label is specified as srcNodeRef.innerHTML rather than
+ // this.params.label, handle it here.
+ if(source && !("label" in this.params)){
+ this.set('label', source.innerHTML);
+ }
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ var label = this.id+"_text";
+ domAttr.set(this.containerNode, "id", label);
+ if(this.accelKeyNode){
+ domAttr.set(this.accelKeyNode, "id", this.id + "_accel");
+ label += " " + this.id + "_accel";
+ }
+ this.domNode.setAttribute("aria-labelledby", label);
+ dom.setSelectable(this.domNode, false);
+ },
+
+ onClick: function(/*Event*/){
+ // summary:
+ // User defined function to handle clicks
+ // tags:
+ // callback
+ },
+
+ focus: function(){
+ // summary:
+ // Focus on this MenuItem
+ try{
+ if(has("ie") == 8){
+ // needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275)
+ this.containerNode.focus();
+ }
+ this.focusNode.focus();
+ }catch(e){
+ // this throws on IE (at least) in some scenarios
+ }
+ },
+
+ _onFocus: function(){
+ // summary:
+ // This is called by the focus manager when focus
+ // goes to this MenuItem or a child menu.
+ // tags:
+ // protected
+ this._setSelected(true);
+ this.getParent()._onItemFocus(this);
+
+ this.inherited(arguments);
+ },
+
+ _setSelected: function(selected){
+ // summary:
+ // Indicate that this node is the currently selected one
+ // tags:
+ // private
+
+ /***
+ * TODO: remove this method and calls to it, when _onBlur() is working for MenuItem.
+ * Currently _onBlur() gets called when focus is moved from the MenuItem to a child menu.
+ * That's not supposed to happen, but the problem is:
+ * In order to allow dijit.popup's getTopPopup() to work,a sub menu's popupParent
+ * points to the parent Menu, bypassing the parent MenuItem... thus the
+ * MenuItem is not in the chain of active widgets and gets a premature call to
+ * _onBlur()
+ */
+
+ domClass.toggle(this.domNode, "dijitMenuItemSelected", selected);
+ },
+
+ setLabel: function(/*String*/ content){
+ // summary:
+ // Deprecated. Use set('label', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0");
+ this.set("label", content);
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Deprecated. Use set('disabled', bool) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.", "", "2.0");
+ this.set('disabled', disabled);
+ },
+ _setDisabledAttr: function(/*Boolean*/ value){
+ // summary:
+ // Hook for attr('disabled', ...) to work.
+ // Enable or disable this menu item.
+
+ this.focusNode.setAttribute('aria-disabled', value ? 'true' : 'false');
+ this._set("disabled", value);
+ },
+ _setAccelKeyAttr: function(/*String*/ value){
+ // summary:
+ // Hook for attr('accelKey', ...) to work.
+ // Set accelKey on this menu item.
+
+ this.accelKeyNode.style.display=value?"":"none";
+ this.accelKeyNode.innerHTML=value;
+ //have to use colSpan to make it work in IE
+ domAttr.set(this.containerNode,'colSpan',value?"1":"2");
+
+ this._set("accelKey", value);
+ },
+ _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);
+ this.applyTextDir(this.focusNode, this.label);
+ }
+ }
+ });
+});
diff --git a/lib/dijit/MenuSeparator.js.uncompressed.js b/lib/dijit/MenuSeparator.js.uncompressed.js
new file mode 100644
index 000000000..8e7bf8405
--- /dev/null
+++ b/lib/dijit/MenuSeparator.js.uncompressed.js
@@ -0,0 +1,35 @@
+require({cache:{
+'url:dijit/templates/MenuSeparator.html':"<tr class=\"dijitMenuSeparator\">\n\t<td class=\"dijitMenuSeparatorIconCell\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n\t<td colspan=\"3\" class=\"dijitMenuSeparatorLabelCell\">\n\t\t<div class=\"dijitMenuSeparatorTop dijitMenuSeparatorLabel\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>"}});
+define("dijit/MenuSeparator", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "./_WidgetBase",
+ "./_TemplatedMixin",
+ "./_Contained",
+ "dojo/text!./templates/MenuSeparator.html"
+], function(declare, dom, _WidgetBase, _TemplatedMixin, _Contained, template){
+
+ // module:
+ // dijit/MenuSeparator
+
+ return declare("dijit.MenuSeparator", [_WidgetBase, _TemplatedMixin, _Contained], {
+ // summary:
+ // A line between two menu items
+
+ templateString: template,
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ dom.setSelectable(this.domNode, false);
+ },
+
+ isFocusable: function(){
+ // summary:
+ // Override to always return false
+ // tags:
+ // protected
+
+ return false; // Boolean
+ }
+ });
+});
diff --git a/lib/dijit/PopupMenuBarItem.js.uncompressed.js b/lib/dijit/PopupMenuBarItem.js.uncompressed.js
new file mode 100644
index 000000000..1e097ffcd
--- /dev/null
+++ b/lib/dijit/PopupMenuBarItem.js.uncompressed.js
@@ -0,0 +1,16 @@
+define("dijit/PopupMenuBarItem", [
+ "dojo/_base/declare", // declare
+ "./PopupMenuItem",
+ "./MenuBarItem"
+], function(declare, PopupMenuItem, MenuBarItem){
+
+ // module:
+ // dijit/PopupMenuBarItem
+
+ var _MenuBarItemMixin = MenuBarItem._MenuBarItemMixin;
+
+ return declare("dijit.PopupMenuBarItem", [PopupMenuItem, _MenuBarItemMixin], {
+ // summary:
+ // Item in a MenuBar like "File" or "Edit", that spawns a submenu when pressed (or hovered)
+ });
+});
diff --git a/lib/dijit/PopupMenuItem.js b/lib/dijit/PopupMenuItem.js
index 296da1a2e..665fa5b94 100644
--- a/lib/dijit/PopupMenuItem.js
+++ b/lib/dijit/PopupMenuItem.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/PopupMenuItem",["dojo/_base/declare","dojo/dom-style","dojo/query","dojo/_base/window","./registry","./MenuItem","./hccss"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.PopupMenuItem",_6,{_fillContent:function(){if(this.srcNodeRef){var _7=_3("*",this.srcNodeRef);this.inherited(arguments,[_7[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}this.inherited(arguments);if(!this.popup){var _8=_3("[widgetId]",this.dropDownContainer)[0];this.popup=_5.byNode(_8);}_4.body().appendChild(this.popup.domNode);this.popup.startup();this.popup.domNode.style.display="none";if(this.arrowWrapper){_2.set(this.arrowWrapper,"visibility","");}this.focusNode.setAttribute("aria-haspopup","true");},destroyDescendants:function(_9){if(this.popup){if(!this.popup._destroyed){this.popup.destroyRecursive(_9);}delete this.popup;}this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/PopupMenuItem",["dojo/_base/declare","dojo/dom-style","dojo/query","./registry","./MenuItem","./hccss"],function(_1,_2,_3,_4,_5){return _1("dijit.PopupMenuItem",_5,{_fillContent:function(){if(this.srcNodeRef){var _6=_3("*",this.srcNodeRef);this.inherited(arguments,[_6[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}this.inherited(arguments);if(!this.popup){var _7=_3("[widgetId]",this.dropDownContainer)[0];this.popup=_4.byNode(_7);}this.ownerDocumentBody.appendChild(this.popup.domNode);this.popup.startup();this.popup.domNode.style.display="none";if(this.arrowWrapper){_2.set(this.arrowWrapper,"visibility","");}this.focusNode.setAttribute("aria-haspopup","true");},destroyDescendants:function(_8){if(this.popup){if(!this.popup._destroyed){this.popup.destroyRecursive(_8);}delete this.popup;}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/PopupMenuItem.js.uncompressed.js b/lib/dijit/PopupMenuItem.js.uncompressed.js
new file mode 100644
index 000000000..d8250152d
--- /dev/null
+++ b/lib/dijit/PopupMenuItem.js.uncompressed.js
@@ -0,0 +1,73 @@
+define("dijit/PopupMenuItem", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-style", // domStyle.set
+ "dojo/query", // query
+ "./registry", // registry.byNode
+ "./MenuItem",
+ "./hccss"
+], function(declare, domStyle, query, registry, MenuItem){
+
+ // module:
+ // dijit/PopupMenuItem
+
+ return declare("dijit.PopupMenuItem", MenuItem, {
+ // summary:
+ // An item in a Menu that spawn a drop down (usually a drop down menu)
+
+ _fillContent: function(){
+ // summary:
+ // When Menu is declared in markup, this code gets the menu label and
+ // the popup widget from the srcNodeRef.
+ // description:
+ // srcNodeRefinnerHTML contains both the menu item text and a popup widget
+ // The first part holds the menu item text and the second part is the popup
+ // example:
+ // | <div data-dojo-type="dijit/PopupMenuItem">
+ // | <span>pick me</span>
+ // | <popup> ... </popup>
+ // | </div>
+ // tags:
+ // protected
+
+ if(this.srcNodeRef){
+ 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; }
+ this.inherited(arguments);
+
+ // we didn't copy the dropdown widget from the this.srcNodeRef, so it's in no-man's
+ // land now. move it to win.doc.body.
+ if(!this.popup){
+ var node = query("[widgetId]", this.dropDownContainer)[0];
+ this.popup = registry.byNode(node);
+ }
+ this.ownerDocumentBody.appendChild(this.popup.domNode);
+ this.popup.startup();
+
+ this.popup.domNode.style.display="none";
+ if(this.arrowWrapper){
+ domStyle.set(this.arrowWrapper, "visibility", "");
+ }
+ this.focusNode.setAttribute("aria-haspopup", "true");
+ },
+
+ destroyDescendants: function(/*Boolean*/ preserveDom){
+ if(this.popup){
+ // Destroy the popup, unless it's already been destroyed. This can happen because
+ // the popup is a direct child of <body> even though it's logically my child.
+ if(!this.popup._destroyed){
+ this.popup.destroyRecursive(preserveDom);
+ }
+ delete this.popup;
+ }
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/ProgressBar.js b/lib/dijit/ProgressBar.js
index ff60e1da1..3f5f77339 100644
--- a/lib/dijit/ProgressBar.js
+++ b/lib/dijit/ProgressBar.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/ProgressBar.html":"<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div data-dojo-attach-point=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\" role=\"presentation\"></div\n\t\t><span style=\"visibility:hidden\">&#160;</span\n\t></div\n\t><div data-dojo-attach-point=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img data-dojo-attach-point=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"}});define("dijit/ProgressBar",["require","dojo/_base/declare","dojo/dom-class","dojo/_base/lang","dojo/number","./_Widget","./_TemplatedMixin","dojo/text!./templates/ProgressBar.html"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _2("dijit.ProgressBar",[_6,_7],{progress:"0",value:"",maximum:100,places:0,indeterminate:false,label:"",name:"",templateString:_8,_indeterminateHighContrastImagePath:_1.toUrl("./themes/a11y/indeterminate_progress.gif"),postMixInProperties:function(){this.inherited(arguments);if(!("value" in this.params)){this.value=this.indeterminate?Infinity:this.progress;}},buildRendering:function(){this.inherited(arguments);this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());this.update();},update:function(_9){_4.mixin(this,_9||{});var _a=this.internalProgress,ap=this.domNode;var _b=1;if(this.indeterminate){ap.removeAttribute("aria-valuenow");ap.removeAttribute("aria-valuemin");ap.removeAttribute("aria-valuemax");}else{if(String(this.progress).indexOf("%")!=-1){_b=Math.min(parseFloat(this.progress)/100,1);this.progress=_b*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_b=this.maximum?this.progress/this.maximum:0;}ap.setAttribute("aria-describedby",this.labelNode.id);ap.setAttribute("aria-valuenow",this.progress);ap.setAttribute("aria-valuemin",0);ap.setAttribute("aria-valuemax",this.maximum);}this.labelNode.innerHTML=this.report(_b);_3.toggle(this.domNode,"dijitProgressBarIndeterminate",this.indeterminate);_a.style.width=(_b*100)+"%";this.onChange();},_setValueAttr:function(v){this._set("value",v);if(v==Infinity){this.update({indeterminate:true});}else{this.update({indeterminate:false,progress:v});}},_setLabelAttr:function(_c){this._set("label",_c);this.update();},_setIndeterminateAttr:function(_d){this.indeterminate=_d;this.update();},report:function(_e){return this.label?this.label:(this.indeterminate?"&#160;":_5.format(_e,{type:"percent",places:this.places,locale:this.lang}));},onChange:function(){}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/ProgressBar.html":"<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div data-dojo-attach-point=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\" role=\"presentation\"></div\n\t\t><span style=\"visibility:hidden\">&#160;</span\n\t></div\n\t><div data-dojo-attach-point=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img data-dojo-attach-point=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"}});define("dijit/ProgressBar",["require","dojo/_base/declare","dojo/dom-class","dojo/_base/lang","dojo/number","./_Widget","./_TemplatedMixin","dojo/text!./templates/ProgressBar.html"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _2("dijit.ProgressBar",[_6,_7],{progress:"0",value:"",maximum:100,places:0,indeterminate:false,label:"",name:"",templateString:_8,_indeterminateHighContrastImagePath:_1.toUrl("./themes/a11y/indeterminate_progress.gif"),postMixInProperties:function(){this.inherited(arguments);if(!(this.params&&"value" in this.params)){this.value=this.indeterminate?Infinity:this.progress;}},buildRendering:function(){this.inherited(arguments);this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());this.update();},update:function(_9){_4.mixin(this,_9||{});var _a=this.internalProgress,ap=this.domNode;var _b=1;if(this.indeterminate){ap.removeAttribute("aria-valuenow");}else{if(String(this.progress).indexOf("%")!=-1){_b=Math.min(parseFloat(this.progress)/100,1);this.progress=_b*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_b=this.maximum?this.progress/this.maximum:0;}ap.setAttribute("aria-valuenow",this.progress);}ap.setAttribute("aria-describedby",this.labelNode.id);ap.setAttribute("aria-valuemin",0);ap.setAttribute("aria-valuemax",this.maximum);this.labelNode.innerHTML=this.report(_b);_3.toggle(this.domNode,"dijitProgressBarIndeterminate",this.indeterminate);_a.style.width=(_b*100)+"%";this.onChange();},_setValueAttr:function(v){this._set("value",v);if(v==Infinity){this.update({indeterminate:true});}else{this.update({indeterminate:false,progress:v});}},_setLabelAttr:function(_c){this._set("label",_c);this.update();},_setIndeterminateAttr:function(_d){this.indeterminate=_d;this.update();},report:function(_e){return this.label?this.label:(this.indeterminate?"&#160;":_5.format(_e,{type:"percent",places:this.places,locale:this.lang}));},onChange:function(){}});}); \ No newline at end of file
diff --git a/lib/dijit/ProgressBar.js.uncompressed.js b/lib/dijit/ProgressBar.js.uncompressed.js
new file mode 100644
index 000000000..567e17fcb
--- /dev/null
+++ b/lib/dijit/ProgressBar.js.uncompressed.js
@@ -0,0 +1,171 @@
+require({cache:{
+'url:dijit/templates/ProgressBar.html':"<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div data-dojo-attach-point=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\" role=\"presentation\"></div\n\t\t><span style=\"visibility:hidden\">&#160;</span\n\t></div\n\t><div data-dojo-attach-point=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img data-dojo-attach-point=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"}});
+define("dijit/ProgressBar", [
+ "require", // require.toUrl
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.toggle
+ "dojo/_base/lang", // lang.mixin
+ "dojo/number", // number.format
+ "./_Widget",
+ "./_TemplatedMixin",
+ "dojo/text!./templates/ProgressBar.html"
+], function(require, declare, domClass, lang, number, _Widget, _TemplatedMixin, template){
+
+// module:
+// dijit/ProgressBar
+
+
+return declare("dijit.ProgressBar", [_Widget, _TemplatedMixin], {
+ // summary:
+ // A progress indication widget, showing the amount completed
+ // (often the percentage completed) of a task.
+ //
+ // example:
+ // | <div data-dojo-type="ProgressBar"
+ // | places="0"
+ // | value="..." maximum="...">
+ // | </div>
+
+ // progress: [const] String (Percentage or Number)
+ // Number or percentage indicating amount of task completed.
+ // Deprecated. Use "value" instead.
+ progress: "0",
+
+ // value: String (Percentage or Number)
+ // Number or percentage indicating amount of task completed.
+ // With "%": percentage value, 0% <= progress <= 100%, or
+ // without "%": absolute value, 0 <= progress <= maximum.
+ // Infinity means that the progress bar is indeterminate.
+ value: "",
+
+ // maximum: [const] Float
+ // Max sample number
+ maximum: 100,
+
+ // places: [const] Number
+ // Number of places to show in values; 0 by default
+ places: 0,
+
+ // indeterminate: [const] Boolean
+ // If false: show progress value (number or percentage).
+ // If true: show that a process is underway but that the amount completed is unknown.
+ // Deprecated. Use "value" instead.
+ indeterminate: false,
+
+ // label: String?
+ // Label on progress bar. Defaults to percentage for determinate progress bar and
+ // blank for indeterminate progress bar.
+ label:"",
+
+ // name: String
+ // this is the field name (for a form) if set. This needs to be set if you want to use
+ // this widget in a dijit/form/Form widget (such as dijit/Dialog)
+ name: '',
+
+ templateString: template,
+
+ // _indeterminateHighContrastImagePath: [private] URL
+ // URL to image to use for indeterminate progress bar when display is in high contrast mode
+ _indeterminateHighContrastImagePath:
+ require.toUrl("./themes/a11y/indeterminate_progress.gif"),
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+
+ // Back-compat for when constructor specifies indeterminate or progress, rather than value. Remove for 2.0.
+ if(!(this.params && "value" in this.params)){
+ this.value = this.indeterminate ? Infinity : this.progress;
+ }
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ this.indeterminateHighContrastImage.setAttribute("src",
+ this._indeterminateHighContrastImagePath.toString());
+ this.update();
+ },
+
+ update: function(/*Object?*/attributes){
+ // summary:
+ // Internal method to change attributes of ProgressBar, similar to set(hash). Users should call
+ // set("value", ...) rather than calling this method directly.
+ // attributes:
+ // May provide progress and/or maximum properties on this parameter;
+ // see attribute specs for details.
+ // example:
+ // | myProgressBar.update({'indeterminate': true});
+ // | myProgressBar.update({'progress': 80});
+ // | myProgressBar.update({'indeterminate': true, label:"Loading ..." })
+ // tags:
+ // private
+
+ // TODO: deprecate this method and use set() instead
+
+ lang.mixin(this, attributes || {});
+ var tip = this.internalProgress, ap = this.domNode;
+ var percent = 1;
+ if(this.indeterminate){
+ ap.removeAttribute("aria-valuenow");
+ }else{
+ if(String(this.progress).indexOf("%") != -1){
+ percent = Math.min(parseFloat(this.progress)/100, 1);
+ this.progress = percent * this.maximum;
+ }else{
+ this.progress = Math.min(this.progress, this.maximum);
+ percent = this.maximum ? this.progress / this.maximum : 0;
+ }
+ ap.setAttribute("aria-valuenow", this.progress);
+ }
+
+ // Even indeterminate ProgressBars should have these attributes
+ ap.setAttribute("aria-describedby", this.labelNode.id);
+ ap.setAttribute("aria-valuemin", 0);
+ ap.setAttribute("aria-valuemax", this.maximum);
+
+ this.labelNode.innerHTML = this.report(percent);
+
+ domClass.toggle(this.domNode, "dijitProgressBarIndeterminate", this.indeterminate);
+ tip.style.width = (percent * 100) + "%";
+ this.onChange();
+ },
+
+ _setValueAttr: function(v){
+ this._set("value", v);
+ if(v == Infinity){
+ this.update({indeterminate:true});
+ }else{
+ this.update({indeterminate:false, progress:v});
+ }
+ },
+
+ _setLabelAttr: function(label){
+ this._set("label", label);
+ this.update();
+ },
+
+ _setIndeterminateAttr: function(indeterminate){
+ // Deprecated, use set("value", ...) instead
+ this.indeterminate = indeterminate;
+ this.update();
+ },
+
+ report: function(/*float*/percent){
+ // summary:
+ // Generates message to show inside progress bar (normally indicating amount of task completed).
+ // May be overridden.
+ // tags:
+ // extension
+
+ return this.label ? this.label :
+ (this.indeterminate ? "&#160;" : number.format(percent, { type: "percent", places: this.places, locale: this.lang }));
+ },
+
+ onChange: function(){
+ // summary:
+ // Callback fired when progress updates.
+ // tags:
+ // extension
+ }
+});
+
+});
diff --git a/lib/dijit/TitlePane.js b/lib/dijit/TitlePane.js
index 917af039d..ebd3a5a20 100644
--- a/lib/dijit/TitlePane.js
+++ b/lib/dijit/TitlePane.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/TitlePane.html":"<div>\n\t<div data-dojo-attach-event=\"onclick:_onTitleClick, onkeypress:_onTitleKey\"\n\t\t\tclass=\"dijitTitlePaneTitle\" data-dojo-attach-point=\"titleBarNode\">\n\t\t<div class=\"dijitTitlePaneTitleFocus\" data-dojo-attach-point=\"focusNode\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"arrowNode\" class=\"dijitArrowNode\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span\n\t\t\t><span data-dojo-attach-point=\"titleNode\" class=\"dijitTitlePaneTextNode\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" data-dojo-attach-point=\"hideNode\" role=\"presentation\">\n\t\t<div class=\"dijitReset\" data-dojo-attach-point=\"wipeNode\" role=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" data-dojo-attach-point=\"containerNode\" role=\"region\" id=\"${id}_pane\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"}});define("dijit/TitlePane",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/_base/event","dojo/fx","dojo/_base/kernel","dojo/keys","./_CssStateMixin","./_TemplatedMixin","./layout/ContentPane","dojo/text!./templates/TitlePane.html","./_base/manager"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){return _2("dijit.TitlePane",[_d,_c,_b],{title:"",_setTitleAttr:{node:"titleNode",type:"innerHTML"},open:true,toggleable:true,tabIndex:"0",duration:_f.defaultDuration,baseClass:"dijitTitlePane",templateString:_e,doLayout:false,_setTooltipAttr:{node:"focusNode",type:"attribute",attribute:"title"},buildRendering:function(){this.inherited(arguments);_3.setSelectable(this.titleNode,false);},postCreate:function(){this.inherited(arguments);if(this.toggleable){this._trackMouseState(this.titleBarNode,"dijitTitlePaneTitle");}var _10=this.hideNode,_11=this.wipeNode;this._wipeIn=_8.wipeIn({node:_11,duration:this.duration,beforeBegin:function(){_10.style.display="";}});this._wipeOut=_8.wipeOut({node:_11,duration:this.duration,onEnd:function(){_10.style.display="none";}});},_setOpenAttr:function(_12,_13){_1.forEach([this._wipeIn,this._wipeOut],function(_14){if(_14&&_14.status()=="playing"){_14.stop();}});if(_13){var _15=this[_12?"_wipeIn":"_wipeOut"];_15.play();}else{this.hideNode.style.display=this.wipeNode.style.display=_12?"":"none";}if(this._started){if(_12){this._onShow();}else{this.onHide();}}this.arrowNodeInner.innerHTML=_12?"-":"+";this.containerNode.setAttribute("aria-hidden",_12?"false":"true");this.focusNode.setAttribute("aria-pressed",_12?"true":"false");this._set("open",_12);this._setCss();},_setToggleableAttr:function(_16){this.focusNode.setAttribute("role",_16?"button":"heading");if(_16){this.focusNode.setAttribute("aria-controls",this.id+"_pane");_4.set(this.focusNode,"tabIndex",this.tabIndex);}else{_4.remove(this.focusNode,"tabIndex");}this._set("toggleable",_16);this._setCss();},_setContentAttr:function(_17){if(!this.open||!this._wipeOut||this._wipeOut.status()=="playing"){this.inherited(arguments);}else{if(this._wipeIn&&this._wipeIn.status()=="playing"){this._wipeIn.stop();}_6.setMarginBox(this.wipeNode,{h:_6.getMarginBox(this.wipeNode).h});this.inherited(arguments);if(this._wipeIn){this._wipeIn.play();}else{this.hideNode.style.display="";}}},toggle:function(){this._setOpenAttr(!this.open,true);},_setCss:function(){var _18=this.titleBarNode||this.focusNode;var _19=this._titleBarClass;this._titleBarClass="dijit"+(this.toggleable?"":"Fixed")+(this.open?"Open":"Closed");_5.replace(_18,this._titleBarClass,_19||"");this.arrowNodeInner.innerHTML=this.open?"-":"+";},_onTitleKey:function(e){if(e.charOrCode==_a.ENTER||e.charOrCode==" "){if(this.toggleable){this.toggle();}_7.stop(e);}else{if(e.charOrCode==_a.DOWN_ARROW&&this.open){this.containerNode.focus();e.preventDefault();}}},_onTitleClick:function(){if(this.toggleable){this.toggle();}},setTitle:function(_1a){_9.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.","","2.0");this.set("title",_1a);}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/TitlePane.html":"<div>\n\t<div data-dojo-attach-event=\"onclick:_onTitleClick, onkeydown:_onTitleKey\"\n\t\t\tclass=\"dijitTitlePaneTitle\" data-dojo-attach-point=\"titleBarNode\" id=\"${id}_titleBarNode\">\n\t\t<div class=\"dijitTitlePaneTitleFocus\" data-dojo-attach-point=\"focusNode\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"arrowNode\" class=\"dijitArrowNode\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span\n\t\t\t><span data-dojo-attach-point=\"titleNode\" class=\"dijitTitlePaneTextNode\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" data-dojo-attach-point=\"hideNode\" role=\"presentation\">\n\t\t<div class=\"dijitReset\" data-dojo-attach-point=\"wipeNode\" role=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" data-dojo-attach-point=\"containerNode\" role=\"region\" id=\"${id}_pane\" aria-labelledby=\"${id}_titleBarNode\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"}});define("dijit/TitlePane",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/_base/event","dojo/fx","dojo/_base/kernel","dojo/keys","./_CssStateMixin","./_TemplatedMixin","./layout/ContentPane","dojo/text!./templates/TitlePane.html","./_base/manager"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){return _2("dijit.TitlePane",[_d,_c,_b],{title:"",_setTitleAttr:{node:"titleNode",type:"innerHTML"},open:true,toggleable:true,tabIndex:"0",duration:_f.defaultDuration,baseClass:"dijitTitlePane",templateString:_e,doLayout:false,_setTooltipAttr:{node:"focusNode",type:"attribute",attribute:"title"},buildRendering:function(){this.inherited(arguments);_3.setSelectable(this.titleNode,false);},postCreate:function(){this.inherited(arguments);if(this.toggleable){this._trackMouseState(this.titleBarNode,"dijitTitlePaneTitle");}var _10=this.hideNode,_11=this.wipeNode;this._wipeIn=_8.wipeIn({node:_11,duration:this.duration,beforeBegin:function(){_10.style.display="";}});this._wipeOut=_8.wipeOut({node:_11,duration:this.duration,onEnd:function(){_10.style.display="none";}});},_setOpenAttr:function(_12,_13){_1.forEach([this._wipeIn,this._wipeOut],function(_14){if(_14&&_14.status()=="playing"){_14.stop();}});if(_13){var _15=this[_12?"_wipeIn":"_wipeOut"];_15.play();}else{this.hideNode.style.display=this.wipeNode.style.display=_12?"":"none";}if(this._started){if(_12){this._onShow();}else{this.onHide();}}this.containerNode.setAttribute("aria-hidden",_12?"false":"true");this.focusNode.setAttribute("aria-pressed",_12?"true":"false");this._set("open",_12);this._setCss();},_setToggleableAttr:function(_16){this.focusNode.setAttribute("role",_16?"button":"heading");if(_16){this.focusNode.setAttribute("aria-controls",this.id+"_pane");this.focusNode.setAttribute("tabIndex",this.tabIndex);this.focusNode.setAttribute("aria-pressed",this.open);}else{_4.remove(this.focusNode,"aria-controls");_4.remove(this.focusNode,"tabIndex");_4.remove(this.focusNode,"aria-pressed");}this._set("toggleable",_16);this._setCss();},_setContentAttr:function(_17){if(!this.open||!this._wipeOut||this._wipeOut.status()=="playing"){this.inherited(arguments);}else{if(this._wipeIn&&this._wipeIn.status()=="playing"){this._wipeIn.stop();}_6.setMarginBox(this.wipeNode,{h:_6.getMarginBox(this.wipeNode).h});this.inherited(arguments);if(this._wipeIn){this._wipeIn.play();}else{this.hideNode.style.display="";}}},toggle:function(){this._setOpenAttr(!this.open,true);},_setCss:function(){var _18=this.titleBarNode||this.focusNode;var _19=this._titleBarClass;this._titleBarClass="dijit"+(this.toggleable?"":"Fixed")+(this.open?"Open":"Closed");_5.replace(_18,this._titleBarClass,_19||"");this.arrowNodeInner.innerHTML=this.open?"-":"+";},_onTitleKey:function(e){if(e.keyCode==_a.ENTER||e.keyCode==_a.SPACE){if(this.toggleable){this.toggle();_7.stop(e);}}else{if(e.keyCode==_a.DOWN_ARROW&&this.open){this.containerNode.focus();e.preventDefault();}}},_onTitleClick:function(){if(this.toggleable){this.toggle();}},setTitle:function(_1a){_9.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.","","2.0");this.set("title",_1a);}});}); \ No newline at end of file
diff --git a/lib/dijit/TitlePane.js.uncompressed.js b/lib/dijit/TitlePane.js.uncompressed.js
new file mode 100644
index 000000000..c78cd4c99
--- /dev/null
+++ b/lib/dijit/TitlePane.js.uncompressed.js
@@ -0,0 +1,268 @@
+require({cache:{
+'url:dijit/templates/TitlePane.html':"<div>\n\t<div data-dojo-attach-event=\"onclick:_onTitleClick, onkeydown:_onTitleKey\"\n\t\t\tclass=\"dijitTitlePaneTitle\" data-dojo-attach-point=\"titleBarNode\" id=\"${id}_titleBarNode\">\n\t\t<div class=\"dijitTitlePaneTitleFocus\" data-dojo-attach-point=\"focusNode\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"arrowNode\" class=\"dijitArrowNode\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span\n\t\t\t><span data-dojo-attach-point=\"titleNode\" class=\"dijitTitlePaneTextNode\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" data-dojo-attach-point=\"hideNode\" role=\"presentation\">\n\t\t<div class=\"dijitReset\" data-dojo-attach-point=\"wipeNode\" role=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" data-dojo-attach-point=\"containerNode\" role=\"region\" id=\"${id}_pane\" aria-labelledby=\"${id}_titleBarNode\">\n\t\t\t\t<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n"}});
+define("dijit/TitlePane", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-attr", // domAttr.set or get domAttr.remove
+ "dojo/dom-class", // domClass.replace
+ "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.getMarginBox
+ "dojo/_base/event", // event.stop
+ "dojo/fx", // fxUtils.wipeIn fxUtils.wipeOut
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/keys", // keys.DOWN_ARROW keys.ENTER
+ "./_CssStateMixin",
+ "./_TemplatedMixin",
+ "./layout/ContentPane",
+ "dojo/text!./templates/TitlePane.html",
+ "./_base/manager" // defaultDuration
+], function(array, declare, dom, domAttr, domClass, domGeometry, event, fxUtils, kernel, keys,
+ _CssStateMixin, _TemplatedMixin, ContentPane, template, manager){
+
+// module:
+// dijit/TitlePane
+
+
+return declare("dijit.TitlePane", [ContentPane, _TemplatedMixin, _CssStateMixin], {
+ // summary:
+ // A pane with a title on top, that can be expanded or collapsed.
+ //
+ // description:
+ // An accessible container with a title Heading, and a content
+ // section that slides open and closed. TitlePane is an extension to
+ // `dijit/layout/ContentPane`, providing all the useful content-control aspects from it.
+ //
+ // example:
+ // | // load a TitlePane from remote file:
+ // | var foo = new dijit.TitlePane({ href: "foobar.html", title:"Title" });
+ // | foo.startup();
+ //
+ // example:
+ // | <!-- markup href example: -->
+ // | <div data-dojo-type="dijit/TitlePane" data-dojo-props="href: 'foobar.html', title: 'Title'"></div>
+ //
+ // example:
+ // | <!-- markup with inline data -->
+ // | <div data-dojo-type="dijit/TitlePane" title="Title">
+ // | <p>I am content</p>
+ // | </div>
+
+ // title: String
+ // Title of the pane
+ title: "",
+ _setTitleAttr: { node: "titleNode", type: "innerHTML" }, // override default where title becomes a hover tooltip
+
+ // open: Boolean
+ // Whether pane is opened or closed.
+ open: true,
+
+ // toggleable: Boolean
+ // Whether pane can be opened or closed by clicking the title bar.
+ toggleable: true,
+
+ // tabIndex: String
+ // Tabindex setting for the title (so users can tab to the title then
+ // use space/enter to open/close the title pane)
+ tabIndex: "0",
+
+ // duration: Integer
+ // Time in milliseconds to fade in/fade out
+ duration: manager.defaultDuration,
+
+ // baseClass: [protected] String
+ // The root className to be placed on this widget's domNode.
+ baseClass: "dijitTitlePane",
+
+ templateString: template,
+
+ // doLayout: [protected] Boolean
+ // Don't change this parameter from the default value.
+ // This ContentPane parameter doesn't make sense for TitlePane, since TitlePane
+ // is never a child of a layout container, nor should TitlePane try to control
+ // the size of an inner widget.
+ doLayout: false,
+
+ // Tooltip is defined in _WidgetBase but we need to handle the mapping to DOM here
+ _setTooltipAttr: {node: "focusNode", type: "attribute", attribute: "title"}, // focusNode spans the entire width, titleNode doesn't
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ dom.setSelectable(this.titleNode, false);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Hover and focus effect on title bar, except for non-toggleable TitlePanes
+ // This should really be controlled from _setToggleableAttr() but _CssStateMixin
+ // doesn't provide a way to disconnect a previous _trackMouseState() call
+ if(this.toggleable){
+ this._trackMouseState(this.titleBarNode, "dijitTitlePaneTitle");
+ }
+
+ // setup open/close animations
+ var hideNode = this.hideNode, wipeNode = this.wipeNode;
+ this._wipeIn = fxUtils.wipeIn({
+ node: wipeNode,
+ duration: this.duration,
+ beforeBegin: function(){
+ hideNode.style.display="";
+ }
+ });
+ this._wipeOut = fxUtils.wipeOut({
+ node: wipeNode,
+ duration: this.duration,
+ onEnd: function(){
+ hideNode.style.display="none";
+ }
+ });
+ },
+
+ _setOpenAttr: function(/*Boolean*/ open, /*Boolean*/ animate){
+ // summary:
+ // Hook to make set("open", boolean) control the open/closed state of the pane.
+ // open: Boolean
+ // True if you want to open the pane, false if you want to close it.
+
+ array.forEach([this._wipeIn, this._wipeOut], function(animation){
+ if(animation && animation.status() == "playing"){
+ animation.stop();
+ }
+ });
+
+ if(animate){
+ var anim = this[open ? "_wipeIn" : "_wipeOut"];
+ anim.play();
+ }else{
+ this.hideNode.style.display = this.wipeNode.style.display = open ? "" : "none";
+ }
+
+ // load content (if this is the first time we are opening the TitlePane
+ // and content is specified as an href, or href was set when hidden)
+ if(this._started){
+ if(open){
+ this._onShow();
+ }else{
+ this.onHide();
+ }
+ }
+
+ this.containerNode.setAttribute("aria-hidden", open ? "false" : "true");
+ this.focusNode.setAttribute("aria-pressed", open ? "true" : "false");
+
+ this._set("open", open);
+
+ this._setCss();
+ },
+
+ _setToggleableAttr: function(/*Boolean*/ canToggle){
+ // summary:
+ // Hook to make set("toggleable", boolean) work.
+ // canToggle: Boolean
+ // True to allow user to open/close pane by clicking title bar.
+
+ this.focusNode.setAttribute("role", canToggle ? "button" : "heading");
+ if(canToggle){
+ this.focusNode.setAttribute("aria-controls", this.id+"_pane");
+ this.focusNode.setAttribute("tabIndex", this.tabIndex);
+ this.focusNode.setAttribute("aria-pressed", this.open);
+ }else{
+ domAttr.remove(this.focusNode, "aria-controls");
+ domAttr.remove(this.focusNode, "tabIndex");
+ domAttr.remove(this.focusNode, "aria-pressed");
+ }
+
+ this._set("toggleable", canToggle);
+
+ this._setCss();
+ },
+
+ _setContentAttr: function(/*String|DomNode|Nodelist*/ content){
+ // summary:
+ // Hook to make set("content", ...) work.
+ // Typically called when an href is loaded. Our job is to make the animation smooth.
+
+ if(!this.open || !this._wipeOut || this._wipeOut.status() == "playing"){
+ // we are currently *closing* the pane (or the pane is closed), so just let that continue
+ this.inherited(arguments);
+ }else{
+ if(this._wipeIn && this._wipeIn.status() == "playing"){
+ this._wipeIn.stop();
+ }
+
+ // freeze container at current height so that adding new content doesn't make it jump
+ domGeometry.setMarginBox(this.wipeNode, { h: domGeometry.getMarginBox(this.wipeNode).h });
+
+ // add the new content (erasing the old content, if any)
+ this.inherited(arguments);
+
+ // call _wipeIn.play() to animate from current height to new height
+ if(this._wipeIn){
+ this._wipeIn.play();
+ }else{
+ this.hideNode.style.display = "";
+ }
+ }
+ },
+
+ toggle: function(){
+ // summary:
+ // Switches between opened and closed state
+ // tags:
+ // private
+
+ this._setOpenAttr(!this.open, true);
+ },
+
+ _setCss: function(){
+ // summary:
+ // Set the open/close css state for the TitlePane
+ // tags:
+ // private
+
+ var node = this.titleBarNode || this.focusNode;
+ var oldCls = this._titleBarClass;
+ this._titleBarClass = "dijit" + (this.toggleable ? "" : "Fixed") + (this.open ? "Open" : "Closed");
+ domClass.replace(node, this._titleBarClass, oldCls || "");
+
+ this.arrowNodeInner.innerHTML = this.open ? "-" : "+";
+ },
+
+ _onTitleKey: function(/*Event*/ e){
+ // summary:
+ // Handler for when user hits a key
+ // tags:
+ // private
+
+ if(e.keyCode == keys.ENTER || e.keyCode == keys.SPACE){
+ if(this.toggleable){
+ this.toggle();
+ event.stop(e);
+ }
+ }else if(e.keyCode == keys.DOWN_ARROW && this.open){
+ this.containerNode.focus();
+ e.preventDefault();
+ }
+ },
+
+ _onTitleClick: function(){
+ // summary:
+ // Handler when user clicks the title bar
+ // tags:
+ // private
+ if(this.toggleable){
+ this.toggle();
+ }
+ },
+
+ setTitle: function(/*String*/ title){
+ // summary:
+ // Deprecated. Use set('title', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.", "", "2.0");
+ this.set("title", title);
+ }
+});
+
+});
diff --git a/lib/dijit/Toolbar.js b/lib/dijit/Toolbar.js
index e0904f0a2..f01f8e996 100644
--- a/lib/dijit/Toolbar.js
+++ b/lib/dijit/Toolbar.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/Toolbar",["require","dojo/_base/declare","dojo/_base/kernel","dojo/keys","dojo/ready","./_Widget","./_KeyNavContainer","./_TemplatedMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8){if(!_3.isAsync){_5(0,function(){var _9=["dijit/ToolbarSeparator"];_1(_9);});}return _2("dijit.Toolbar",[_6,_8,_7],{templateString:"<div class=\"dijit\" role=\"toolbar\" tabIndex=\"${tabIndex}\" data-dojo-attach-point=\"containerNode\">"+"</div>",baseClass:"dijitToolbar",postCreate:function(){this.inherited(arguments);this.connectKeyNavHandlers(this.isLeftToRight()?[_4.LEFT_ARROW]:[_4.RIGHT_ARROW],this.isLeftToRight()?[_4.RIGHT_ARROW]:[_4.LEFT_ARROW]);}});}); \ No newline at end of file
+define("dijit/Toolbar",["require","dojo/_base/declare","dojo/has","dojo/keys","dojo/ready","./_Widget","./_KeyNavContainer","./_TemplatedMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8){if(_3("dijit-legacy-requires")){_5(0,function(){var _9=["dijit/ToolbarSeparator"];_1(_9);});}return _2("dijit.Toolbar",[_6,_8,_7],{templateString:"<div class=\"dijit\" role=\"toolbar\" tabIndex=\"${tabIndex}\" data-dojo-attach-point=\"containerNode\">"+"</div>",baseClass:"dijitToolbar",postCreate:function(){this.inherited(arguments);this.connectKeyNavHandlers(this.isLeftToRight()?[_4.LEFT_ARROW]:[_4.RIGHT_ARROW],this.isLeftToRight()?[_4.RIGHT_ARROW]:[_4.LEFT_ARROW]);}});}); \ No newline at end of file
diff --git a/lib/dijit/Toolbar.js.uncompressed.js b/lib/dijit/Toolbar.js.uncompressed.js
new file mode 100644
index 000000000..47e051bb4
--- /dev/null
+++ b/lib/dijit/Toolbar.js.uncompressed.js
@@ -0,0 +1,43 @@
+define("dijit/Toolbar", [
+ "require",
+ "dojo/_base/declare", // declare
+ "dojo/has",
+ "dojo/keys", // keys.LEFT_ARROW keys.RIGHT_ARROW
+ "dojo/ready",
+ "./_Widget",
+ "./_KeyNavContainer",
+ "./_TemplatedMixin"
+], function(require, declare, has, keys, ready, _Widget, _KeyNavContainer, _TemplatedMixin){
+
+ // module:
+ // dijit/Toolbar
+
+
+ // Back compat w/1.6, remove for 2.0
+ if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/ToolbarSeparator"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+ }
+
+ return declare("dijit.Toolbar", [_Widget, _TemplatedMixin, _KeyNavContainer], {
+ // summary:
+ // A Toolbar widget, used to hold things like `dijit.Editor` buttons
+
+ templateString:
+ '<div class="dijit" role="toolbar" tabIndex="${tabIndex}" data-dojo-attach-point="containerNode">' +
+ '</div>',
+
+ baseClass: "dijitToolbar",
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ this.connectKeyNavHandlers(
+ this.isLeftToRight() ? [keys.LEFT_ARROW] : [keys.RIGHT_ARROW],
+ this.isLeftToRight() ? [keys.RIGHT_ARROW] : [keys.LEFT_ARROW]
+ );
+ }
+ });
+});
diff --git a/lib/dijit/ToolbarSeparator.js.uncompressed.js b/lib/dijit/ToolbarSeparator.js.uncompressed.js
new file mode 100644
index 000000000..e1b97d851
--- /dev/null
+++ b/lib/dijit/ToolbarSeparator.js.uncompressed.js
@@ -0,0 +1,31 @@
+define("dijit/ToolbarSeparator", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "./_Widget",
+ "./_TemplatedMixin"
+], function(declare, dom, _Widget, _TemplatedMixin){
+
+ // module:
+ // dijit/ToolbarSeparator
+
+
+ return declare("dijit.ToolbarSeparator", [_Widget, _TemplatedMixin], {
+ // summary:
+ // A spacer between two `dijit.Toolbar` items
+
+ templateString: '<div class="dijitToolbarSeparator dijitInline" role="presentation"></div>',
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ dom.setSelectable(this.domNode, false);
+ },
+
+ isFocusable: function(){
+ // summary:
+ // This widget isn't focusable, so pass along that fact.
+ // tags:
+ // protected
+ return false;
+ }
+ });
+});
diff --git a/lib/dijit/Tooltip.js b/lib/dijit/Tooltip.js
index 94a8d1c15..5b91d8b0a 100644
--- a/lib/dijit/Tooltip.js
+++ b/lib/dijit/Tooltip.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/Tooltip.html":"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" data-dojo-attach-point=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" data-dojo-attach-point=\"connectorNode\"></div\n></div>\n"}});define("dijit/Tooltip",["dojo/_base/array","dojo/_base/declare","dojo/_base/fx","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","./_base/manager","./place","./_Widget","./_TemplatedMixin","./BackgroundIframe","dojo/text!./templates/Tooltip.html","."],function(_1,_2,fx,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit._MasterTooltip",[_c,_d],{duration:_a.defaultDuration,templateString:_f,postCreate:function(){_9.body().appendChild(this.domNode);this.bgIframe=new _e(this.domNode);this.fadeIn=fx.fadeIn({node:this.domNode,duration:this.duration,onEnd:_7.hitch(this,"_onShow")});this.fadeOut=fx.fadeOut({node:this.domNode,duration:this.duration,onEnd:_7.hitch(this,"_onHide")});},show:function(_12,_13,_14,rtl,_15){if(this.aroundNode&&this.aroundNode===_13&&this.containerNode.innerHTML==_12){return;}this.domNode.width="auto";if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_12;this.set("textDir",_15);this.containerNode.align=rtl?"right":"left";var pos=_b.around(this.domNode,_13,_14&&_14.length?_14:_16.defaultPosition,!rtl,_7.hitch(this,"orient"));var _17=pos.aroundNodePos;if(pos.corner.charAt(0)=="M"&&pos.aroundCorner.charAt(0)=="M"){this.connectorNode.style.top=_17.y+((_17.h-this.connectorNode.offsetHeight)>>1)-pos.y+"px";this.connectorNode.style.left="";}else{if(pos.corner.charAt(1)=="M"&&pos.aroundCorner.charAt(1)=="M"){this.connectorNode.style.left=_17.x+((_17.w-this.connectorNode.offsetWidth)>>1)-pos.x+"px";}}_6.set(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_13;},orient:function(_18,_19,_1a,_1b,_1c){this.connectorNode.style.top="";var _1d=_1b.w-this.connectorNode.offsetWidth;_18.className="dijitTooltip "+{"MR-ML":"dijitTooltipRight","ML-MR":"dijitTooltipLeft","TM-BM":"dijitTooltipAbove","BM-TM":"dijitTooltipBelow","BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_19+"-"+_1a];this.domNode.style.width="auto";var _1e=_5.getContentBox(this.domNode);var _1f=Math.min((Math.max(_1d,1)),_1e.w);var _20=_1f<_1e.w;this.domNode.style.width=_1f+"px";if(_20){this.containerNode.style.overflow="auto";var _21=this.containerNode.scrollWidth;this.containerNode.style.overflow="visible";if(_21>_1f){_21=_21+_6.get(this.domNode,"paddingLeft")+_6.get(this.domNode,"paddingRight");this.domNode.style.width=_21+"px";}}if(_1a.charAt(0)=="B"&&_19.charAt(0)=="B"){var mb=_5.getMarginBox(_18);var _22=this.connectorNode.offsetHeight;if(mb.h>_1b.h){var _23=_1b.h-((_1c.h+_22)>>1);this.connectorNode.style.top=_23+"px";this.connectorNode.style.bottom="";}else{this.connectorNode.style.bottom=Math.min(Math.max(_1c.h/2-_22/2,0),mb.h-_22)+"px";this.connectorNode.style.top="";}}else{this.connectorNode.style.top="";this.connectorNode.style.bottom="";}return Math.max(0,_1e.w-_1d);},_onShow:function(){if(_8("ie")){this.domNode.style.filter="";}},hide:function(_24){if(this._onDeck&&this._onDeck[1]==_24){this._onDeck=null;}else{if(this.aroundNode===_24){this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();}else{}}},_onHide:function(){this.domNode.style.cssText="";this.containerNode.innerHTML="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}},_setAutoTextDir:function(_25){this.applyTextDir(_25,_8("ie")?_25.outerText:_25.textContent);_1.forEach(_25.children,function(_26){this._setAutoTextDir(_26);},this);},_setTextDirAttr:function(_27){this._set("textDir",typeof _27!="undefined"?_27:"");if(_27=="auto"){this._setAutoTextDir(this.containerNode);}else{this.containerNode.dir=this.textDir;}}});_10.showTooltip=function(_28,_29,_2a,rtl,_2b){if(_2a){_2a=_1.map(_2a,function(val){return {after:"after-centered",before:"before-centered"}[val]||val;});}if(!_16._masterTT){_10._masterTT=_16._masterTT=new _11();}return _16._masterTT.show(_28,_29,_2a,rtl,_2b);};_10.hideTooltip=function(_2c){return _16._masterTT&&_16._masterTT.hide(_2c);};var _16=_2("dijit.Tooltip",_c,{label:"",showDelay:400,connectId:[],position:[],_setConnectIdAttr:function(_2d){_1.forEach(this._connections||[],function(_2e){_1.forEach(_2e,_7.hitch(this,"disconnect"));},this);this._connectIds=_1.filter(_7.isArrayLike(_2d)?_2d:(_2d?[_2d]:[]),function(id){return _3.byId(id);});this._connections=_1.map(this._connectIds,function(id){var _2f=_3.byId(id);return [this.connect(_2f,"onmouseenter","_onHover"),this.connect(_2f,"onmouseleave","_onUnHover"),this.connect(_2f,"onfocus","_onHover"),this.connect(_2f,"onblur","_onUnHover")];},this);this._set("connectId",_2d);},addTarget:function(_30){var id=_30.id||_30;if(_1.indexOf(this._connectIds,id)==-1){this.set("connectId",this._connectIds.concat(id));}},removeTarget:function(_31){var id=_31.id||_31,idx=_1.indexOf(this._connectIds,id);if(idx>=0){this._connectIds.splice(idx,1);this.set("connectId",this._connectIds);}},buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitTooltipData");},startup:function(){this.inherited(arguments);var ids=this.connectId;_1.forEach(_7.isArrayLike(ids)?ids:[ids],this.addTarget,this);},_onHover:function(e){if(!this._showTimer){var _32=e.target;this._showTimer=setTimeout(_7.hitch(this,function(){this.open(_32);}),this.showDelay);}},_onUnHover:function(){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_33){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}_16.show(this.label||this.domNode.innerHTML,_33,this.position,!this.isLeftToRight(),this.textDir);this._connectNode=_33;this.onShow(_33,this.position);},close:function(){if(this._connectNode){_16.hide(this._connectNode);delete this._connectNode;this.onHide();}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},onShow:function(){},onHide:function(){},uninitialize:function(){this.close();this.inherited(arguments);}});_16._MasterTooltip=_11;_16.show=_10.showTooltip;_16.hide=_10.hideTooltip;_16.defaultPosition=["after-centered","before-centered"];return _16;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/Tooltip.html":"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" data-dojo-attach-point=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" data-dojo-attach-point=\"connectorNode\"></div\n></div>\n"}});define("dijit/Tooltip",["dojo/_base/array","dojo/_base/declare","dojo/_base/fx","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang","dojo/mouse","dojo/on","dojo/sniff","./_base/manager","./place","./_Widget","./_TemplatedMixin","./BackgroundIframe","dojo/text!./templates/Tooltip.html","./main"],function(_1,_2,fx,_3,_4,_5,_6,_7,_8,on,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit._MasterTooltip",[_c,_d],{duration:_a.defaultDuration,templateString:_f,postCreate:function(){this.ownerDocumentBody.appendChild(this.domNode);this.bgIframe=new _e(this.domNode);this.fadeIn=fx.fadeIn({node:this.domNode,duration:this.duration,onEnd:_7.hitch(this,"_onShow")});this.fadeOut=fx.fadeOut({node:this.domNode,duration:this.duration,onEnd:_7.hitch(this,"_onHide")});},show:function(_12,_13,_14,rtl,_15){if(this.aroundNode&&this.aroundNode===_13&&this.containerNode.innerHTML==_12){return;}if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_12;if(_15){this.set("textDir",_15);}this.containerNode.align=rtl?"right":"left";var pos=_b.around(this.domNode,_13,_14&&_14.length?_14:_16.defaultPosition,!rtl,_7.hitch(this,"orient"));var _17=pos.aroundNodePos;if(pos.corner.charAt(0)=="M"&&pos.aroundCorner.charAt(0)=="M"){this.connectorNode.style.top=_17.y+((_17.h-this.connectorNode.offsetHeight)>>1)-pos.y+"px";this.connectorNode.style.left="";}else{if(pos.corner.charAt(1)=="M"&&pos.aroundCorner.charAt(1)=="M"){this.connectorNode.style.left=_17.x+((_17.w-this.connectorNode.offsetWidth)>>1)-pos.x+"px";}else{this.connectorNode.style.left="";this.connectorNode.style.top="";}}_6.set(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_13;},orient:function(_18,_19,_1a,_1b,_1c){this.connectorNode.style.top="";var _1d=_1b.h,_1e=_1b.w;_18.className="dijitTooltip "+{"MR-ML":"dijitTooltipRight","ML-MR":"dijitTooltipLeft","TM-BM":"dijitTooltipAbove","BM-TM":"dijitTooltipBelow","BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_19+"-"+_1a];this.domNode.style.width="auto";var _1f=_5.position(this.domNode);if(_9("ie")==9){_1f.w+=2;}var _20=Math.min((Math.max(_1e,1)),_1f.w);_5.setMarginBox(this.domNode,{w:_20});if(_1a.charAt(0)=="B"&&_19.charAt(0)=="B"){var bb=_5.position(_18);var _21=this.connectorNode.offsetHeight;if(bb.h>_1d){var _22=_1d-((_1c.h+_21)>>1);this.connectorNode.style.top=_22+"px";this.connectorNode.style.bottom="";}else{this.connectorNode.style.bottom=Math.min(Math.max(_1c.h/2-_21/2,0),bb.h-_21)+"px";this.connectorNode.style.top="";}}else{this.connectorNode.style.top="";this.connectorNode.style.bottom="";}return Math.max(0,_1f.w-_1e);},_onShow:function(){if(_9("ie")){this.domNode.style.filter="";}},hide:function(_23){if(this._onDeck&&this._onDeck[1]==_23){this._onDeck=null;}else{if(this.aroundNode===_23){this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();}else{}}},_onHide:function(){this.domNode.style.cssText="";this.containerNode.innerHTML="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}},_setAutoTextDir:function(_24){this.applyTextDir(_24,_9("ie")?_24.outerText:_24.textContent);_1.forEach(_24.children,function(_25){this._setAutoTextDir(_25);},this);},_setTextDirAttr:function(_26){this._set("textDir",_26);if(_26=="auto"){this._setAutoTextDir(this.containerNode);}else{this.containerNode.dir=this.textDir;}}});_10.showTooltip=function(_27,_28,_29,rtl,_2a){if(_29){_29=_1.map(_29,function(val){return {after:"after-centered",before:"before-centered"}[val]||val;});}if(!_16._masterTT){_10._masterTT=_16._masterTT=new _11();}return _16._masterTT.show(_27,_28,_29,rtl,_2a);};_10.hideTooltip=function(_2b){return _16._masterTT&&_16._masterTT.hide(_2b);};var _16=_2("dijit.Tooltip",_c,{label:"",showDelay:400,connectId:[],position:[],selector:"",_setConnectIdAttr:function(_2c){_1.forEach(this._connections||[],function(_2d){_1.forEach(_2d,function(_2e){_2e.remove();});},this);this._connectIds=_1.filter(_7.isArrayLike(_2c)?_2c:(_2c?[_2c]:[]),function(id){return _3.byId(id,this.ownerDocument);},this);this._connections=_1.map(this._connectIds,function(id){var _2f=_3.byId(id,this.ownerDocument),_30=this.selector,_31=_30?function(_32){return on.selector(_30,_32);}:function(_33){return _33;},_34=this;return [on(_2f,_31(_8.enter),function(){_34._onHover(this);}),on(_2f,_31("focusin"),function(){_34._onHover(this);}),on(_2f,_31(_8.leave),_7.hitch(_34,"_onUnHover")),on(_2f,_31("focusout"),_7.hitch(_34,"_onUnHover"))];},this);this._set("connectId",_2c);},addTarget:function(_35){var id=_35.id||_35;if(_1.indexOf(this._connectIds,id)==-1){this.set("connectId",this._connectIds.concat(id));}},removeTarget:function(_36){var id=_36.id||_36,idx=_1.indexOf(this._connectIds,id);if(idx>=0){this._connectIds.splice(idx,1);this.set("connectId",this._connectIds);}},buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitTooltipData");},startup:function(){this.inherited(arguments);var ids=this.connectId;_1.forEach(_7.isArrayLike(ids)?ids:[ids],this.addTarget,this);},getContent:function(_37){return this.label||this.domNode.innerHTML;},_onHover:function(_38){if(!this._showTimer){this._showTimer=this.defer(function(){this.open(_38);},this.showDelay);}},_onUnHover:function(){if(this._showTimer){this._showTimer.remove();delete this._showTimer;}this.close();},open:function(_39){if(this._showTimer){this._showTimer.remove();delete this._showTimer;}var _3a=this.getContent(_39);if(!_3a){return;}_16.show(_3a,_39,this.position,!this.isLeftToRight(),this.textDir);this._connectNode=_39;this.onShow(_39,this.position);},close:function(){if(this._connectNode){_16.hide(this._connectNode);delete this._connectNode;this.onHide();}if(this._showTimer){this._showTimer.remove();delete this._showTimer;}},onShow:function(){},onHide:function(){},destroy:function(){this.close();_1.forEach(this._connections||[],function(_3b){_1.forEach(_3b,function(_3c){_3c.remove();});},this);this.inherited(arguments);}});_16._MasterTooltip=_11;_16.show=_10.showTooltip;_16.hide=_10.hideTooltip;_16.defaultPosition=["after-centered","before-centered"];return _16;}); \ No newline at end of file
diff --git a/lib/dijit/Tooltip.js.uncompressed.js b/lib/dijit/Tooltip.js.uncompressed.js
new file mode 100644
index 000000000..3a181b360
--- /dev/null
+++ b/lib/dijit/Tooltip.js.uncompressed.js
@@ -0,0 +1,542 @@
+require({cache:{
+'url:dijit/templates/Tooltip.html':"<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" data-dojo-attach-point=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" data-dojo-attach-point=\"connectorNode\"></div\n></div>\n"}});
+define("dijit/Tooltip", [
+ "dojo/_base/array", // array.forEach array.indexOf array.map
+ "dojo/_base/declare", // declare
+ "dojo/_base/fx", // fx.fadeIn fx.fadeOut
+ "dojo/dom", // dom.byId
+ "dojo/dom-class", // domClass.add
+ "dojo/dom-geometry", // domGeometry.position
+ "dojo/dom-style", // domStyle.set, domStyle.get
+ "dojo/_base/lang", // lang.hitch lang.isArrayLike
+ "dojo/mouse",
+ "dojo/on",
+ "dojo/sniff", // has("ie")
+ "./_base/manager", // manager.defaultDuration
+ "./place",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./BackgroundIframe",
+ "dojo/text!./templates/Tooltip.html",
+ "./main" // sets dijit.showTooltip etc. for back-compat
+], function(array, declare, fx, dom, domClass, domGeometry, domStyle, lang, mouse, on, has,
+ manager, place, _Widget, _TemplatedMixin, BackgroundIframe, template, dijit){
+
+ // module:
+ // dijit/Tooltip
+
+
+ // TODO: Tooltip should really share more positioning code with TooltipDialog, like:
+ // - the orient() method
+ // - the connector positioning code in show()
+ // - the dijitTooltip[Dialog] class
+ //
+ // The problem is that Tooltip's implementation supplies it's own <iframe> and interacts directly
+ // with dijit/place, rather than going through dijit/popup like TooltipDialog and other popups (ex: Menu).
+
+ var MasterTooltip = declare("dijit._MasterTooltip", [_Widget, _TemplatedMixin], {
+ // summary:
+ // Internal widget that holds the actual tooltip markup,
+ // which occurs once per page.
+ // Called by Tooltip widgets which are just containers to hold
+ // the markup
+ // tags:
+ // protected
+
+ // duration: Integer
+ // Milliseconds to fade in/fade out
+ duration: manager.defaultDuration,
+
+ templateString: template,
+
+ postCreate: function(){
+ this.ownerDocumentBody.appendChild(this.domNode);
+
+ this.bgIframe = new BackgroundIframe(this.domNode);
+
+ // Setup fade-in and fade-out functions.
+ this.fadeIn = fx.fadeIn({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, "_onShow") });
+ this.fadeOut = fx.fadeOut({ node: this.domNode, duration: this.duration, onEnd: lang.hitch(this, "_onHide") });
+ },
+
+ show: function(innerHTML, aroundNode, position, rtl, textDir){
+ // summary:
+ // Display tooltip w/specified contents to right of specified node
+ // (To left if there's no space on the right, or if rtl == true)
+ // innerHTML: String
+ // Contents of the tooltip
+ // aroundNode: DomNode|dijit/place.__Rectangle
+ // Specifies that tooltip should be next to this node / area
+ // position: String[]?
+ // List of positions to try to position tooltip (ex: ["right", "above"])
+ // rtl: Boolean?
+ // Corresponds to `WidgetBase.dir` attribute, where false means "ltr" and true
+ // means "rtl"; specifies GUI direction, not text direction.
+ // textDir: String?
+ // Corresponds to `WidgetBase.textdir` attribute; specifies direction of text.
+
+
+ if(this.aroundNode && this.aroundNode === aroundNode && this.containerNode.innerHTML == innerHTML){
+ return;
+ }
+
+ if(this.fadeOut.status() == "playing"){
+ // previous tooltip is being hidden; wait until the hide completes then show new one
+ this._onDeck=arguments;
+ return;
+ }
+ this.containerNode.innerHTML=innerHTML;
+
+ if(textDir){
+ this.set("textDir", textDir);
+ }
+
+ this.containerNode.align = rtl? "right" : "left"; //fix the text alignment
+
+ var pos = place.around(this.domNode, aroundNode,
+ position && position.length ? position : Tooltip.defaultPosition, !rtl, lang.hitch(this, "orient"));
+
+ // Position the tooltip connector for middle alignment.
+ // This could not have been done in orient() since the tooltip wasn't positioned at that time.
+ var aroundNodeCoords = pos.aroundNodePos;
+ if(pos.corner.charAt(0) == 'M' && pos.aroundCorner.charAt(0) == 'M'){
+ this.connectorNode.style.top = aroundNodeCoords.y + ((aroundNodeCoords.h - this.connectorNode.offsetHeight) >> 1) - pos.y + "px";
+ this.connectorNode.style.left = "";
+ }else if(pos.corner.charAt(1) == 'M' && pos.aroundCorner.charAt(1) == 'M'){
+ this.connectorNode.style.left = aroundNodeCoords.x + ((aroundNodeCoords.w - this.connectorNode.offsetWidth) >> 1) - pos.x + "px";
+ }else{
+ // Not *-centered, but just above/below/after/before
+ this.connectorNode.style.left = "";
+ this.connectorNode.style.top = "";
+ }
+
+ // show it
+ domStyle.set(this.domNode, "opacity", 0);
+ this.fadeIn.play();
+ this.isShowingNow = true;
+ this.aroundNode = aroundNode;
+ },
+
+ orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ tooltipCorner, /*Object*/ spaceAvailable, /*Object*/ aroundNodeCoords){
+ // summary:
+ // Private function to set CSS for tooltip node based on which position it's in.
+ // This is called by the dijit popup code. It will also reduce the tooltip's
+ // width to whatever width is available
+ // tags:
+ // protected
+
+ this.connectorNode.style.top = ""; //reset to default
+
+ var heightAvailable = spaceAvailable.h,
+ widthAvailable = spaceAvailable.w;
+
+ node.className = "dijitTooltip " +
+ {
+ "MR-ML": "dijitTooltipRight",
+ "ML-MR": "dijitTooltipLeft",
+ "TM-BM": "dijitTooltipAbove",
+ "BM-TM": "dijitTooltipBelow",
+ "BL-TL": "dijitTooltipBelow dijitTooltipABLeft",
+ "TL-BL": "dijitTooltipAbove dijitTooltipABLeft",
+ "BR-TR": "dijitTooltipBelow dijitTooltipABRight",
+ "TR-BR": "dijitTooltipAbove dijitTooltipABRight",
+ "BR-BL": "dijitTooltipRight",
+ "BL-BR": "dijitTooltipLeft"
+ }[aroundCorner + "-" + tooltipCorner];
+
+ // reset width; it may have been set by orient() on a previous tooltip show()
+ this.domNode.style.width = "auto";
+
+ // Reduce tooltip's width to the amount of width available, so that it doesn't overflow screen.
+ // Note that sometimes widthAvailable is negative, but we guard against setting style.width to a
+ // negative number since that causes an exception on IE.
+ var size = domGeometry.position(this.domNode);
+ if(has("ie") == 9){
+ // workaround strange IE9 bug where setting width to offsetWidth causes words to wrap
+ size.w += 2;
+ }
+
+ var width = Math.min((Math.max(widthAvailable,1)), size.w);
+
+ domGeometry.setMarginBox(this.domNode, {w: width});
+
+ // Reposition the tooltip connector.
+ if(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){
+ var bb = domGeometry.position(node);
+ var tooltipConnectorHeight = this.connectorNode.offsetHeight;
+ if(bb.h > heightAvailable){
+ // The tooltip starts at the top of the page and will extend past the aroundNode
+ var aroundNodePlacement = heightAvailable - ((aroundNodeCoords.h + tooltipConnectorHeight) >> 1);
+ this.connectorNode.style.top = aroundNodePlacement + "px";
+ this.connectorNode.style.bottom = "";
+ }else{
+ // Align center of connector with center of aroundNode, except don't let bottom
+ // of connector extend below bottom of tooltip content, or top of connector
+ // extend past top of tooltip content
+ this.connectorNode.style.bottom = Math.min(
+ Math.max(aroundNodeCoords.h/2 - tooltipConnectorHeight/2, 0),
+ bb.h - tooltipConnectorHeight) + "px";
+ this.connectorNode.style.top = "";
+ }
+ }else{
+ // reset the tooltip back to the defaults
+ this.connectorNode.style.top = "";
+ this.connectorNode.style.bottom = "";
+ }
+
+ return Math.max(0, size.w - widthAvailable);
+ },
+
+ _onShow: function(){
+ // summary:
+ // Called at end of fade-in operation
+ // tags:
+ // protected
+ if(has("ie")){
+ // the arrow won't show up on a node w/an opacity filter
+ this.domNode.style.filter="";
+ }
+ },
+
+ hide: function(aroundNode){
+ // summary:
+ // Hide the tooltip
+
+ if(this._onDeck && this._onDeck[1] == aroundNode){
+ // this hide request is for a show() that hasn't even started yet;
+ // just cancel the pending show()
+ this._onDeck=null;
+ }else if(this.aroundNode === aroundNode){
+ // this hide request is for the currently displayed tooltip
+ this.fadeIn.stop();
+ this.isShowingNow = false;
+ this.aroundNode = null;
+ this.fadeOut.play();
+ }else{
+ // just ignore the call, it's for a tooltip that has already been erased
+ }
+ },
+
+ _onHide: function(){
+ // summary:
+ // Called at end of fade-out operation
+ // tags:
+ // protected
+
+ this.domNode.style.cssText=""; // to position offscreen again
+ this.containerNode.innerHTML="";
+ if(this._onDeck){
+ // a show request has been queued up; do it now
+ this.show.apply(this, this._onDeck);
+ this._onDeck=null;
+ }
+ },
+
+ _setAutoTextDir: function(/*Object*/node){
+ // summary:
+ // Resolve "auto" text direction for children nodes
+ // tags:
+ // private
+
+ this.applyTextDir(node, has("ie") ? node.outerText : node.textContent);
+ array.forEach(node.children, function(child){this._setAutoTextDir(child); }, this);
+ },
+
+ _setTextDirAttr: function(/*String*/ textDir){
+ // summary:
+ // Setter for textDir.
+ // description:
+ // Users shouldn't call this function; they should be calling
+ // set('textDir', value)
+ // tags:
+ // private
+
+ this._set("textDir", textDir);
+
+ if (textDir == "auto"){
+ this._setAutoTextDir(this.containerNode);
+ }else{
+ this.containerNode.dir = this.textDir;
+ }
+ }
+ });
+
+ dijit.showTooltip = function(innerHTML, aroundNode, position, rtl, textDir){
+ // summary:
+ // Static method to display tooltip w/specified contents in specified position.
+ // See description of dijit/Tooltip.defaultPosition for details on position parameter.
+ // If position is not specified then dijit/Tooltip.defaultPosition is used.
+ // innerHTML: String
+ // Contents of the tooltip
+ // aroundNode: place.__Rectangle
+ // Specifies that tooltip should be next to this node / area
+ // position: String[]?
+ // List of positions to try to position tooltip (ex: ["right", "above"])
+ // rtl: Boolean?
+ // Corresponds to `WidgetBase.dir` attribute, where false means "ltr" and true
+ // means "rtl"; specifies GUI direction, not text direction.
+ // textDir: String?
+ // Corresponds to `WidgetBase.textdir` attribute; specifies direction of text.
+
+ // After/before don't work, but for back-compat convert them to the working after-centered, before-centered.
+ // Possibly remove this in 2.0. Alternately, get before/after to work.
+ if(position){
+ position = array.map(position, function(val){
+ return {after: "after-centered", before: "before-centered"}[val] || val;
+ });
+ }
+
+ if(!Tooltip._masterTT){ dijit._masterTT = Tooltip._masterTT = new MasterTooltip(); }
+ return Tooltip._masterTT.show(innerHTML, aroundNode, position, rtl, textDir);
+ };
+
+ dijit.hideTooltip = function(aroundNode){
+ // summary:
+ // Static method to hide the tooltip displayed via showTooltip()
+ return Tooltip._masterTT && Tooltip._masterTT.hide(aroundNode);
+ };
+
+ var Tooltip = declare("dijit.Tooltip", _Widget, {
+ // summary:
+ // Pops up a tooltip (a help message) when you hover over a node.
+ // Also provides static show() and hide() methods that can be used without instantiating a dijit/Tooltip.
+
+ // label: String
+ // Text to display in the tooltip.
+ // Specified as innerHTML when creating the widget from markup.
+ label: "",
+
+ // showDelay: Integer
+ // Number of milliseconds to wait after hovering over/focusing on the object, before
+ // the tooltip is displayed.
+ showDelay: 400,
+
+ // connectId: String|String[]|DomNode|DomNode[]
+ // Id of domNode(s) to attach the tooltip to.
+ // When user hovers over specified dom node(s), the tooltip will appear.
+ connectId: [],
+
+ // position: String[]
+ // See description of `dijit/Tooltip.defaultPosition` for details on position parameter.
+ position: [],
+
+ // selector: String?
+ // CSS expression to apply this Tooltip to descendants of connectIds, rather than to
+ // the nodes specified by connectIds themselves. Useful for applying a Tooltip to
+ // a range of rows in a table, tree, etc. Use in conjunction with getContent() parameter.
+ // Ex: connectId: myTable, selector: "tr", getContent: function(node){ return ...; }
+ //
+ // The application must require() an appropriate level of dojo/query to handle the selector.
+ selector: "",
+
+ // TODO: in 2.0 remove support for multiple connectIds. selector gives the same effect.
+ // So, change connectId to a "", remove addTarget()/removeTarget(), etc.
+
+ _setConnectIdAttr: function(/*String|String[]}DomNode|DomNode[]*/ newId){
+ // summary:
+ // Connect to specified node(s)
+
+ // Remove connections to old nodes (if there are any)
+ array.forEach(this._connections || [], function(nested){
+ array.forEach(nested, function(handle){ handle.remove(); });
+ }, this);
+
+ // Make array of id's to connect to, excluding entries for nodes that don't exist yet, see startup()
+ this._connectIds = array.filter(lang.isArrayLike(newId) ? newId : (newId ? [newId] : []),
+ function(id){ return dom.byId(id, this.ownerDocument); }, this);
+
+ // Make connections
+ this._connections = array.map(this._connectIds, function(id){
+ var node = dom.byId(id, this.ownerDocument),
+ selector = this.selector,
+ delegatedEvent = selector ?
+ function(eventType){ return on.selector(selector, eventType); } :
+ function(eventType){ return eventType; },
+ self = this;
+ return [
+ on(node, delegatedEvent(mouse.enter), function(){
+ self._onHover(this);
+ }),
+ on(node, delegatedEvent("focusin"), function(){
+ self._onHover(this);
+ }),
+ on(node, delegatedEvent(mouse.leave), lang.hitch(self, "_onUnHover")),
+ on(node, delegatedEvent("focusout"), lang.hitch(self, "_onUnHover"))
+ ];
+ }, this);
+
+ this._set("connectId", newId);
+ },
+
+ addTarget: function(/*OomNode|String*/ node){
+ // summary:
+ // Attach tooltip to specified node if it's not already connected
+
+ // TODO: remove in 2.0 and just use set("connectId", ...) interface
+
+ var id = node.id || node;
+ if(array.indexOf(this._connectIds, id) == -1){
+ this.set("connectId", this._connectIds.concat(id));
+ }
+ },
+
+ removeTarget: function(/*DomNode|String*/ node){
+ // summary:
+ // Detach tooltip from specified node
+
+ // TODO: remove in 2.0 and just use set("connectId", ...) interface
+
+ var id = node.id || node, // map from DOMNode back to plain id string
+ idx = array.indexOf(this._connectIds, id);
+ if(idx >= 0){
+ // remove id (modifies original this._connectIds but that's OK in this case)
+ this._connectIds.splice(idx, 1);
+ this.set("connectId", this._connectIds);
+ }
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ domClass.add(this.domNode,"dijitTooltipData");
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+
+ // If this tooltip was created in a template, or for some other reason the specified connectId[s]
+ // didn't exist during the widget's initialization, then connect now.
+ var ids = this.connectId;
+ array.forEach(lang.isArrayLike(ids) ? ids : [ids], this.addTarget, this);
+ },
+
+ getContent: function(/*DomNode*/ node){
+ // summary:
+ // User overridable function that return the text to display in the tooltip.
+ // tags:
+ // extension
+ return this.label || this.domNode.innerHTML;
+ },
+
+ _onHover: function(/*DomNode*/ target){
+ // summary:
+ // Despite the name of this method, it actually handles both hover and focus
+ // events on the target node, setting a timer to show the tooltip.
+ // tags:
+ // private
+ if(!this._showTimer){
+ this._showTimer = this.defer(function(){ this.open(target); }, this.showDelay);
+ }
+ },
+
+ _onUnHover: function(){
+ // summary:
+ // Despite the name of this method, it actually handles both mouseleave and blur
+ // events on the target node, hiding the tooltip.
+ // tags:
+ // private
+
+ if(this._showTimer){
+ this._showTimer.remove();
+ delete this._showTimer;
+ }
+ this.close();
+ },
+
+ open: function(/*DomNode*/ target){
+ // summary:
+ // Display the tooltip; usually not called directly.
+ // tags:
+ // private
+
+ if(this._showTimer){
+ this._showTimer.remove();
+ delete this._showTimer;
+ }
+
+ var content = this.getContent(target);
+ if(!content){
+ return;
+ }
+ Tooltip.show(content, target, this.position, !this.isLeftToRight(), this.textDir);
+
+ this._connectNode = target; // _connectNode means "tooltip currently displayed for this node"
+ this.onShow(target, this.position);
+ },
+
+ close: function(){
+ // summary:
+ // Hide the tooltip or cancel timer for show of tooltip
+ // tags:
+ // private
+
+ if(this._connectNode){
+ // if tooltip is currently shown
+ Tooltip.hide(this._connectNode);
+ delete this._connectNode;
+ this.onHide();
+ }
+ if(this._showTimer){
+ // if tooltip is scheduled to be shown (after a brief delay)
+ this._showTimer.remove();
+ delete this._showTimer;
+ }
+ },
+
+ onShow: function(/*===== target, position =====*/){
+ // summary:
+ // Called when the tooltip is shown
+ // tags:
+ // callback
+ },
+
+ onHide: function(){
+ // summary:
+ // Called when the tooltip is hidden
+ // tags:
+ // callback
+ },
+
+ destroy: function(){
+ this.close();
+
+ // Remove connections manually since they aren't registered to be removed by _WidgetBase
+ array.forEach(this._connections || [], function(nested){
+ array.forEach(nested, function(handle){ handle.remove(); });
+ }, this);
+
+ this.inherited(arguments);
+ }
+ });
+
+ Tooltip._MasterTooltip = MasterTooltip; // for monkey patching
+ Tooltip.show = dijit.showTooltip; // export function through module return value
+ Tooltip.hide = dijit.hideTooltip; // export function through module return value
+
+ Tooltip.defaultPosition = ["after-centered", "before-centered"];
+
+ /*=====
+ lang.mixin(Tooltip, {
+ // defaultPosition: String[]
+ // This variable controls the position of tooltips, if the position is not specified to
+ // the Tooltip widget or *TextBox widget itself. It's an array of strings with the values
+ // possible for `dijit/place.around()`. The recommended values are:
+ //
+ // - before-centered: centers tooltip to the left of the anchor node/widget, or to the right
+ // in the case of RTL scripts like Hebrew and Arabic
+ // - after-centered: centers tooltip to the right of the anchor node/widget, or to the left
+ // in the case of RTL scripts like Hebrew and Arabic
+ // - above-centered: tooltip is centered above anchor node
+ // - below-centered: tooltip is centered above anchor node
+ //
+ // The list is positions is tried, in order, until a position is found where the tooltip fits
+ // within the viewport.
+ //
+ // Be careful setting this parameter. A value of "above-centered" may work fine until the user scrolls
+ // the screen so that there's no room above the target node. Nodes with drop downs, like
+ // DropDownButton or FilteringSelect, are especially problematic, in that you need to be sure
+ // that the drop down and tooltip don't overlap, even when the viewport is scrolled so that there
+ // is only room below (or above) the target node, but not both.
+ });
+ =====*/
+ return Tooltip;
+});
diff --git a/lib/dijit/TooltipDialog.js b/lib/dijit/TooltipDialog.js
index df4d9893e..b4cd2c599 100644
--- a/lib/dijit/TooltipDialog.js
+++ b/lib/dijit/TooltipDialog.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/TooltipDialog.html":"<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" data-dojo-attach-point=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\"></div>\n</div>\n"}});define("dijit/TooltipDialog",["dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/keys","dojo/_base/lang","./focus","./layout/ContentPane","./_DialogMixin","./form/_FormMixin","./_TemplatedMixin","dojo/text!./templates/TooltipDialog.html","."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){return _1("dijit.TooltipDialog",[_7,_a,_9,_8],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:_b,_setTitleAttr:function(_d){this.containerNode.title=_d;this._set("title",_d);},postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");},orient:function(_e,_f,_10){var _11="dijitTooltipAB"+(_10.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_10.charAt(0)=="T"?"Below":"Above");_2.replace(this.domNode,_11,this._currentOrientClass||"");this._currentOrientClass=_11;},focus:function(){this._getFocusItems(this.containerNode);_6.focus(this._firstFocusItem);},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);this._onShow();},onClose:function(){this.onHide();},_onKey:function(evt){var _12=evt.target;if(evt.charOrCode===_4.TAB){this._getFocusItems(this.containerNode);}var _13=(this._firstFocusItem==this._lastFocusItem);if(evt.charOrCode==_4.ESCAPE){setTimeout(_5.hitch(this,"onCancel"),0);_3.stop(evt);}else{if(_12==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===_4.TAB){if(!_13){_6.focus(this._lastFocusItem);}_3.stop(evt);}else{if(_12==this._lastFocusItem&&evt.charOrCode===_4.TAB&&!evt.shiftKey){if(!_13){_6.focus(this._firstFocusItem);}_3.stop(evt);}else{if(evt.charOrCode===_4.TAB){evt.stopPropagation();}}}}}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/TooltipDialog.html":"<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" data-dojo-attach-point=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\" data-dojo-attach-point=\"connectorNode\"></div>\n</div>\n"}});define("dijit/TooltipDialog",["dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/keys","dojo/_base/lang","./focus","./layout/ContentPane","./_DialogMixin","./form/_FormMixin","./_TemplatedMixin","dojo/text!./templates/TooltipDialog.html","./main"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){return _1("dijit.TooltipDialog",[_7,_a,_9,_8],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:_b,_setTitleAttr:function(_d){this.containerNode.title=_d;this._set("title",_d);},postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");},orient:function(_e,_f,_10){var _11={"MR-ML":"dijitTooltipRight","ML-MR":"dijitTooltipLeft","TM-BM":"dijitTooltipAbove","BM-TM":"dijitTooltipBelow","BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_f+"-"+_10];_2.replace(this.domNode,_11,this._currentOrientClass||"");this._currentOrientClass=_11;},focus:function(){this._getFocusItems(this.containerNode);_6.focus(this._firstFocusItem);},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);var _12=pos.aroundNodePos;if(pos.corner.charAt(0)=="M"&&pos.aroundCorner.charAt(0)=="M"){this.connectorNode.style.top=_12.y+((_12.h-this.connectorNode.offsetHeight)>>1)-pos.y+"px";this.connectorNode.style.left="";}else{if(pos.corner.charAt(1)=="M"&&pos.aroundCorner.charAt(1)=="M"){this.connectorNode.style.left=_12.x+((_12.w-this.connectorNode.offsetWidth)>>1)-pos.x+"px";}}this._onShow();},onClose:function(){this.onHide();},_onKey:function(evt){var _13=evt.target;if(evt.charOrCode===_4.TAB){this._getFocusItems(this.containerNode);}var _14=(this._firstFocusItem==this._lastFocusItem);if(evt.charOrCode==_4.ESCAPE){this.defer("onCancel");_3.stop(evt);}else{if(_13==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===_4.TAB){if(!_14){_6.focus(this._lastFocusItem);}_3.stop(evt);}else{if(_13==this._lastFocusItem&&evt.charOrCode===_4.TAB&&!evt.shiftKey){if(!_14){_6.focus(this._firstFocusItem);}_3.stop(evt);}else{if(evt.charOrCode===_4.TAB){evt.stopPropagation();}}}}}});}); \ No newline at end of file
diff --git a/lib/dijit/TooltipDialog.js.uncompressed.js b/lib/dijit/TooltipDialog.js.uncompressed.js
new file mode 100644
index 000000000..c11e38e9d
--- /dev/null
+++ b/lib/dijit/TooltipDialog.js.uncompressed.js
@@ -0,0 +1,174 @@
+require({cache:{
+'url:dijit/templates/TooltipDialog.html':"<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" data-dojo-attach-point=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\" data-dojo-attach-point=\"connectorNode\"></div>\n</div>\n"}});
+define("dijit/TooltipDialog", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.replace
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.hitch
+ "./focus",
+ "./layout/ContentPane",
+ "./_DialogMixin",
+ "./form/_FormMixin",
+ "./_TemplatedMixin",
+ "dojo/text!./templates/TooltipDialog.html",
+ "./main" // exports methods to dijit global
+], function(declare, domClass, event, keys, lang,
+ focus, ContentPane, _DialogMixin, _FormMixin, _TemplatedMixin, template, dijit){
+
+ // module:
+ // dijit/TooltipDialog
+
+
+ return declare("dijit.TooltipDialog",
+ [ContentPane, _TemplatedMixin, _FormMixin, _DialogMixin], {
+ // summary:
+ // Pops up a dialog that appears like a Tooltip
+
+ // title: String
+ // Description of tooltip dialog (required for a11y)
+ title: "",
+
+ // doLayout: [protected] Boolean
+ // Don't change this parameter from the default value.
+ // This ContentPane parameter doesn't make sense for TooltipDialog, since TooltipDialog
+ // is never a child of a layout container, nor can you specify the size of
+ // TooltipDialog in order to control the size of an inner widget.
+ doLayout: false,
+
+ // autofocus: Boolean
+ // A Toggle to modify the default focus behavior of a Dialog, which
+ // is to focus on the first dialog element after opening the dialog.
+ // False will disable autofocusing. Default: true.
+ autofocus: true,
+
+ // baseClass: [protected] String
+ // The root className to use for the various states of this widget
+ baseClass: "dijitTooltipDialog",
+
+ // _firstFocusItem: [private readonly] DomNode
+ // The pointer to the first focusable node in the dialog.
+ // Set by `dijit/_DialogMixin._getFocusItems()`.
+ _firstFocusItem: null,
+
+ // _lastFocusItem: [private readonly] DomNode
+ // The pointer to which node has focus prior to our dialog.
+ // Set by `dijit/_DialogMixin._getFocusItems()`.
+ _lastFocusItem: null,
+
+ templateString: template,
+
+ _setTitleAttr: function(/*String*/ title){
+ this.containerNode.title = title;
+ this._set("title", title);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.connect(this.containerNode, "onkeypress", "_onKey");
+ },
+
+ orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ tooltipCorner){
+ // summary:
+ // Configure widget to be displayed in given position relative to the button.
+ // This is called from the dijit.popup code, and should not be called
+ // directly.
+ // tags:
+ // protected
+
+ // Note: intentionally not using dijitTooltip class since that sets position:absolute, which
+ // confuses dijit/popup trying to get the size of the tooltip.
+ var newC = {
+ "MR-ML": "dijitTooltipRight",
+ "ML-MR": "dijitTooltipLeft",
+ "TM-BM": "dijitTooltipAbove",
+ "BM-TM": "dijitTooltipBelow",
+ "BL-TL": "dijitTooltipBelow dijitTooltipABLeft",
+ "TL-BL": "dijitTooltipAbove dijitTooltipABLeft",
+ "BR-TR": "dijitTooltipBelow dijitTooltipABRight",
+ "TR-BR": "dijitTooltipAbove dijitTooltipABRight",
+ "BR-BL": "dijitTooltipRight",
+ "BL-BR": "dijitTooltipLeft"
+ }[aroundCorner + "-" + tooltipCorner];
+
+ domClass.replace(this.domNode, newC, this._currentOrientClass || "");
+ this._currentOrientClass = newC;
+
+ // Tooltip.orient() has code to reposition connector for when Tooltip is before/after anchor.
+ // Not putting here to avoid code bloat, and since TooltipDialogs are generally above/below.
+ // Should combine code from Tooltip and TooltipDialog.
+ },
+
+ focus: function(){
+ // summary:
+ // Focus on first field
+ this._getFocusItems(this.containerNode);
+ focus.focus(this._firstFocusItem);
+ },
+
+ onOpen: function(/*Object*/ pos){
+ // summary:
+ // Called when dialog is displayed.
+ // This is called from the dijit.popup code, and should not be called directly.
+ // tags:
+ // protected
+
+ this.orient(this.domNode,pos.aroundCorner, pos.corner);
+
+ // Position the tooltip connector for middle alignment.
+ // This could not have been done in orient() since the tooltip wasn't positioned at that time.
+ var aroundNodeCoords = pos.aroundNodePos;
+ if(pos.corner.charAt(0) == 'M' && pos.aroundCorner.charAt(0) == 'M'){
+ this.connectorNode.style.top = aroundNodeCoords.y + ((aroundNodeCoords.h - this.connectorNode.offsetHeight) >> 1) - pos.y + "px";
+ this.connectorNode.style.left = "";
+ }else if(pos.corner.charAt(1) == 'M' && pos.aroundCorner.charAt(1) == 'M'){
+ this.connectorNode.style.left = aroundNodeCoords.x + ((aroundNodeCoords.w - this.connectorNode.offsetWidth) >> 1) - pos.x + "px";
+ }
+
+ this._onShow(); // lazy load trigger (TODO: shouldn't we load before positioning?)
+ },
+
+ onClose: function(){
+ // summary:
+ // Called when dialog is hidden.
+ // This is called from the dijit.popup code, and should not be called directly.
+ // tags:
+ // protected
+ this.onHide();
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary:
+ // Handler for keyboard events
+ // description:
+ // Keep keyboard focus in dialog; close dialog on escape key
+ // tags:
+ // private
+
+ var node = evt.target;
+ if(evt.charOrCode === keys.TAB){
+ this._getFocusItems(this.containerNode);
+ }
+ var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
+ if(evt.charOrCode == keys.ESCAPE){
+ // Use defer to avoid crash on IE, see #10396.
+ this.defer("onCancel");
+ event.stop(evt);
+ }else if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === keys.TAB){
+ if(!singleFocusItem){
+ focus.focus(this._lastFocusItem); // send focus to last item in dialog
+ }
+ event.stop(evt);
+ }else if(node == this._lastFocusItem && evt.charOrCode === keys.TAB && !evt.shiftKey){
+ if(!singleFocusItem){
+ focus.focus(this._firstFocusItem); // send focus to first item in dialog
+ }
+ event.stop(evt);
+ }else if(evt.charOrCode === keys.TAB){
+ // we want the browser's default tab handling to move focus
+ // but we don't want the tab to propagate upwards
+ evt.stopPropagation();
+ }
+ }
+ });
+});
diff --git a/lib/dijit/Tree.js b/lib/dijit/Tree.js
index 25c44568a..4eb9e4ba8 100644
--- a/lib/dijit/Tree.js
+++ b/lib/dijit/Tree.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/TreeNode.html":"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" data-dojo-attach-event=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span data-dojo-attach-point=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span data-dojo-attach-point=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\" data-dojo-attach-event=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n","url:dijit/templates/Tree.html":"<div class=\"dijitTree dijitTreeContainer\" role=\"tree\"\n\tdata-dojo-attach-event=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" data-dojo-attach-point=\"indentDetector\"></div>\n</div>\n"}});define("dijit/Tree",["dojo/_base/array","dojo/_base/connect","dojo/cookie","dojo/_base/declare","dojo/_base/Deferred","dojo/DeferredList","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/fx","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/topic","./focus","./registry","./_base/manager","./_Widget","./_TemplatedMixin","./_Container","./_Contained","./_CssStateMixin","dojo/text!./templates/TreeNode.html","dojo/text!./templates/Tree.html","./tree/TreeStoreModel","./tree/ForestStoreModel","./tree/_dndSelector"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_1a,_1b,_1c,_1d){var _1e=_4("dijit._TreeNode",[_14,_15,_16,_17,_18],{item:null,isTreeNode:true,label:"",_setLabelAttr:{node:"labelNode",type:"innerText"},isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:_19,baseClass:"dijitTreeNode",cssStateNodes:{rowNode:"dijitTreeRow",labelNode:"dijitTreeLabel"},_setTooltipAttr:{node:"rowNode",type:"attribute",attribute:"title"},buildRendering:function(){this.inherited(arguments);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){this.labelNode.setAttribute("aria-expanded",this.isExpanded);}this.setSelected(false);},_setIndentAttr:function(_1f){var _20=(Math.max(_1f,0)*this.tree._nodePixelIndent)+"px";_a.set(this.domNode,"backgroundPosition",_20+" 0px");_a.set(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_20);_1.forEach(this.getChildren(),function(_21){_21.set("indent",_1f+1);});this._set("indent",_1f);},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(_22){var _23=this.tree,_24=_23.model;if(_23._v10Compat&&_22===_24.root){_22=null;}this._applyClassAndStyle(_22,"icon","Icon");this._applyClassAndStyle(_22,"label","Label");this._applyClassAndStyle(_22,"row","Row");},_applyClassAndStyle:function(_25,_26,_27){var _28="_"+_26+"Class";var _29=_26+"Node";var _2a=this[_28];this[_28]=this.tree["get"+_27+"Class"](_25,this.isExpanded);_8.replace(this[_29],this[_28]||"",_2a||"");_a.set(this[_29],this.tree["get"+_27+"Style"](_25,this.isExpanded)||{});},_updateLayout:function(){var _2b=this.getParent();if(!_2b||!_2b.rowNode||_2b.rowNode.style.display=="none"){_8.add(this.domNode,"dijitTreeIsRoot");}else{_8.toggle(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_2c){var _2d=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_2e=["*","-","+","*"],idx=_2c?0:(this.isExpandable?(this.isExpanded?1:2):3);_8.replace(this.expandoNode,_2d[idx],_2d);this.expandoNodeText.innerHTML=_2e[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;this.labelNode.setAttribute("aria-expanded","true");if(this.tree.showRoot||this!==this.tree.rootNode){this.containerNode.setAttribute("role","group");}_8.add(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode){this.tree.domNode.setAttribute("aria-expanded","true");}var def,_2f=_c.wipeIn({node:this.containerNode,duration:_13.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new _5(function(){_2f.stop();}));_2f.play();return def;},collapse:function(){if(!this.isExpanded){return;}if(this._expandDeferred){this._expandDeferred.cancel();delete this._expandDeferred;}this.isExpanded=false;this.labelNode.setAttribute("aria-expanded","false");if(this==this.tree.rootNode){this.tree.domNode.setAttribute("aria-expanded","false");}_8.remove(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(!this._wipeOut){this._wipeOut=_c.wipeOut({node:this.containerNode,duration:_13.defaultDuration});}this._wipeOut.play();},indent:0,setChildItems:function(_30){var _31=this.tree,_32=_31.model,_33=[];_1.forEach(this.getChildren(),function(_34){_16.prototype.removeChild.call(this,_34);},this);this.state="LOADED";if(_30&&_30.length>0){this.isExpandable=true;_1.forEach(_30,function(_35){var id=_32.getIdentity(_35),_36=_31._itemNodesMap[id],_37;if(_36){for(var i=0;i<_36.length;i++){if(_36[i]&&!_36[i].getParent()){_37=_36[i];_37.set("indent",this.indent+1);break;}}}if(!_37){_37=this.tree._createTreeNode({item:_35,tree:_31,isExpandable:_32.mayHaveChildren(_35),label:_31.getLabel(_35),tooltip:_31.getTooltip(_35),dir:_31.dir,lang:_31.lang,textDir:_31.textDir,indent:this.indent+1});if(_36){_36.push(_37);}else{_31._itemNodesMap[id]=[_37];}}this.addChild(_37);if(this.tree.autoExpand||this.tree._state(_37)){_33.push(_31._expandNode(_37));}},this);_1.forEach(this.getChildren(),function(_38){_38._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}this._updateItemClasses(this.item);if(this==_31.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setFocusable(true);_31.lastFocused=fc;}else{_31.domNode.setAttribute("tabIndex","0");}}return new _6(_33);},getTreePath:function(){var _39=this;var _3a=[];while(_39&&_39!==this.tree.rootNode){_3a.unshift(_39.item);_39=_39.getParent();}_3a.unshift(this.tree.rootNode.item);return _3a;},getIdentity:function(){return this.tree.model.getIdentity(this.item);},removeChild:function(_3b){this.inherited(arguments);var _3c=this.getChildren();if(_3c.length==0){this.isExpandable=false;this.collapse();}_1.forEach(_3c,function(_3d){_3d._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(){this.tree._onNodeFocus(this);},setSelected:function(_3e){this.labelNode.setAttribute("aria-selected",_3e);_8.toggle(this.rowNode,"dijitTreeRowSelected",_3e);},setFocusable:function(_3f){this.labelNode.setAttribute("tabIndex",_3f?"0":"-1");},_onClick:function(evt){this.tree._onClick(this,evt);},_onDblClick:function(evt){this.tree._onDblClick(this,evt);},_onMouseEnter:function(evt){this.tree._onNodeMouseEnter(this,evt);},_onMouseLeave:function(evt){this.tree._onNodeMouseLeave(this,evt);},_setTextDirAttr:function(_40){if(_40&&((this.textDir!=_40)||!this._created)){this._set("textDir",_40);this.applyTextDir(this.labelNode,this.labelNode.innerText||this.labelNode.textContent||"");_1.forEach(this.getChildren(),function(_41){_41.set("textDir",_40);},this);}}});var _42=_4("dijit.Tree",[_14,_15],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],paths:[],path:[],selectedItems:null,selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:_1a,persist:true,autoExpand:false,dndController:_1d,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance","dragThreshold","betweenThreshold"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,dragThreshold:5,betweenThreshold:0,_nodePixelIndent:19,_publish:function(_43,_44){_10.publish(this.id,_f.mixin({tree:this,event:_43},_44||{}));},postMixInProperties:function(){this.tree=this;if(this.autoExpand){this.persist=false;}this._itemNodesMap={};if(!this.cookieName&&this.id){this.cookieName=this.id+"SaveStateCookie";}this._loadDeferred=new _5();this.inherited(arguments);},postCreate:function(){this._initState();if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this.connect(this.model,"onDelete","_onItemDelete");this._load();this.inherited(arguments);if(this.dndController){if(_f.isString(this.dndController)){this.dndController=_f.getObject(this.dndController);}var _45={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_45[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_45);}},_store2model:function(){this._v10Compat=true;_d.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _46={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_46.mayHaveChildren=_f.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_46.getChildren=_f.hitch(this,function(_47,_48,_49){this.getItemChildren((this._v10Compat&&_47===this.model.root)?null:_47,_48,_49);});}this.model=new _1c(_46);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){this.model.getRoot(_f.hitch(this,function(_4a){var rn=(this.rootNode=this.tree._createTreeNode({item:_4a,tree:this,isExpandable:true,label:this.label||this.getLabel(_4a),textDir:this.textDir,indent:this.showRoot?0:-1}));if(!this.showRoot){rn.rowNode.style.display="none";this.domNode.setAttribute("role","presentation");rn.labelNode.setAttribute("role","presentation");rn.containerNode.setAttribute("role","tree");}this.domNode.appendChild(rn.domNode);var _4b=this.model.getIdentity(_4a);if(this._itemNodesMap[_4b]){this._itemNodesMap[_4b].push(rn);}else{this._itemNodesMap[_4b]=[rn];}rn._updateLayout();this._expandNode(rn).addCallback(_f.hitch(this,function(){this._loadDeferred.callback(true);this.onLoad();}));}),function(err){console.error(this,": error loading root: ",err);});},getNodesByItem:function(_4c){if(!_4c){return [];}var _4d=_f.isString(_4c)?_4c:this.model.getIdentity(_4c);return [].concat(this._itemNodesMap[_4d]);},_setSelectedItemAttr:function(_4e){this.set("selectedItems",[_4e]);},_setSelectedItemsAttr:function(_4f){var _50=this;this._loadDeferred.addCallback(_f.hitch(this,function(){var _51=_1.map(_4f,function(_52){return (!_52||_f.isString(_52))?_52:_50.model.getIdentity(_52);});var _53=[];_1.forEach(_51,function(id){_53=_53.concat(_50._itemNodesMap[id]||[]);});this.set("selectedNodes",_53);}));},_setPathAttr:function(_54){if(_54.length){return this.set("paths",[_54]);}else{return this.set("paths",[]);}},_setPathsAttr:function(_55){var _56=this;return new _6(_1.map(_55,function(_57){var d=new _5();_57=_1.map(_57,function(_58){return _f.isString(_58)?_58:_56.model.getIdentity(_58);});if(_57.length){_56._loadDeferred.addCallback(function(){_59(_57,[_56.rootNode],d);});}else{d.errback("Empty path");}return d;})).addCallback(_5a);function _59(_5b,_5c,def){var _5d=_5b.shift();var _5e=_1.filter(_5c,function(_5f){return _5f.getIdentity()==_5d;})[0];if(!!_5e){if(_5b.length){_56._expandNode(_5e).addCallback(function(){_59(_5b,_5e.getChildren(),def);});}else{def.callback(_5e);}}else{def.errback("Could not expand path at "+_5d);}};function _5a(_60){_56.set("selectedNodes",_1.map(_1.filter(_60,function(x){return x[0];}),function(x){return x[1];}));};},_setSelectedNodeAttr:function(_61){this.set("selectedNodes",[_61]);},_setSelectedNodesAttr:function(_62){this._loadDeferred.addCallback(_f.hitch(this,function(){this.dndController.setSelection(_62);}));},mayHaveChildren:function(){},getItemChildren:function(){},getLabel:function(_63){return this.model.getLabel(_63);},getIconClass:function(_64,_65){return (!_64||this.model.mayHaveChildren(_64))?(_65?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(){},getRowClass:function(){},getIconStyle:function(){},getLabelStyle:function(){},getRowStyle:function(){},getTooltip:function(){return "";},_onKeyPress:function(e){if(e.altKey){return;}var _66=_12.getEnclosingWidget(e.target);if(!_66){return;}var key=e.charOrCode;if(typeof key=="string"&&key!=" "){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_66,key:key.toLowerCase()});_b.stop(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[_e.ENTER]="_onEnterKey";map[_e.SPACE]=map[" "]="_onEnterKey";map[this.isLeftToRight()?_e.LEFT_ARROW:_e.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?_e.RIGHT_ARROW:_e.LEFT_ARROW]="_onRightArrow";map[_e.UP_ARROW]="_onUpArrow";map[_e.DOWN_ARROW]="_onDownArrow";map[_e.HOME]="_onHomeKey";map[_e.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[key]){this[this._keyHandlerMap[key]]({node:_66,item:_66.item,evt:e});_b.stop(e);}}},_onEnterKey:function(_67){this._publish("execute",{item:_67.item,node:_67.node});this.dndController.userSelect(_67.node,_2.isCopyKey(_67.evt),_67.evt.shiftKey);this.onClick(_67.item,_67.node,_67.evt);},_onDownArrow:function(_68){var _69=this._getNextNode(_68.node);if(_69&&_69.isTreeNode){this.focusNode(_69);}},_onUpArrow:function(_6a){var _6b=_6a.node;var _6c=_6b.getPreviousSibling();if(_6c){_6b=_6c;while(_6b.isExpandable&&_6b.isExpanded&&_6b.hasChildren()){var _6d=_6b.getChildren();_6b=_6d[_6d.length-1];}}else{var _6e=_6b.getParent();if(!(!this.showRoot&&_6e===this.rootNode)){_6b=_6e;}}if(_6b&&_6b.isTreeNode){this.focusNode(_6b);}},_onRightArrow:function(_6f){var _70=_6f.node;if(_70.isExpandable&&!_70.isExpanded){this._expandNode(_70);}else{if(_70.hasChildren()){_70=_70.getChildren()[0];if(_70&&_70.isTreeNode){this.focusNode(_70);}}}},_onLeftArrow:function(_71){var _72=_71.node;if(_72.isExpandable&&_72.isExpanded){this._collapseNode(_72);}else{var _73=_72.getParent();if(_73&&_73.isTreeNode&&!(!this.showRoot&&_73===this.rootNode)){this.focusNode(_73);}}},_onHomeKey:function(){var _74=this._getRootOrFirstNode();if(_74){this.focusNode(_74);}},_onEndKey:function(){var _75=this.rootNode;while(_75.isExpanded){var c=_75.getChildren();_75=c[c.length-1];}if(_75&&_75.isTreeNode){this.focusNode(_75);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_76){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_76.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_76.key,startNode:_76.node};}var _77=this;cs.timer=setTimeout(function(){delete _77._curSearch;},this.multiCharSearchDuration);var _78=cs.startNode;do{_78=this._getNextNode(_78);if(!_78){_78=this._getRootOrFirstNode();}}while(_78!==cs.startNode&&(_78.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(_78&&_78.isTreeNode){if(_78!==cs.startNode){this.focusNode(_78);}}},isExpandoNode:function(_79,_7a){return _7.isDescendant(_79,_7a.expandoNode);},_onClick:function(_7b,e){var _7c=e.target,_7d=this.isExpandoNode(_7c,_7b);if((this.openOnClick&&_7b.isExpandable)||_7d){if(_7b.isExpandable){this._onExpandoClick({node:_7b});}}else{this._publish("execute",{item:_7b.item,node:_7b,evt:e});this.onClick(_7b.item,_7b,e);this.focusNode(_7b);}_b.stop(e);},_onDblClick:function(_7e,e){var _7f=e.target,_80=(_7f==_7e.expandoNode||_7f==_7e.expandoNodeText);if((this.openOnDblClick&&_7e.isExpandable)||_80){if(_7e.isExpandable){this._onExpandoClick({node:_7e});}}else{this._publish("execute",{item:_7e.item,node:_7e,evt:e});this.onDblClick(_7e.item,_7e,e);this.focusNode(_7e);}_b.stop(e);},_onExpandoClick:function(_81){var _82=_81.node;this.focusNode(_82);if(_82.isExpanded){this._collapseNode(_82);}else{this._expandNode(_82);}},onClick:function(){},onDblClick:function(){},onOpen:function(){},onClose:function(){},_getNextNode:function(_83){if(_83.isExpandable&&_83.isExpanded&&_83.hasChildren()){return _83.getChildren()[0];}else{while(_83&&_83.isTreeNode){var _84=_83.getNextSibling();if(_84){return _84;}_83=_83.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(_85){if(_85._expandNodeDeferred){delete _85._expandNodeDeferred;}if(_85.isExpandable){if(_85.state=="LOADING"){return;}_85.collapse();this.onClose(_85.item,_85);this._state(_85,false);}},_expandNode:function(_86,_87){if(_86._expandNodeDeferred&&!_87){return _86._expandNodeDeferred;}var _88=this.model,_89=_86.item,_8a=this;switch(_86.state){case "UNCHECKED":_86.markProcessing();var def=(_86._expandNodeDeferred=new _5());_88.getChildren(_89,function(_8b){_86.unmarkProcessing();var _8c=_86.setChildItems(_8b);var ed=_8a._expandNode(_86,true);_8c.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_8a,": error loading root children: ",err);});break;default:def=(_86._expandNodeDeferred=_86.expand());this.onOpen(_86.item,_86);this._state(_86,true);}return def;},focusNode:function(_8d){_11.focus(_8d.labelNode);},_onNodeFocus:function(_8e){if(_8e&&_8e!=this.lastFocused){if(this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setFocusable(false);}_8e.setFocusable(true);this.lastFocused=_8e;}},_onNodeMouseEnter:function(){},_onNodeMouseLeave:function(){},_onItemChange:function(_8f){var _90=this.model,_91=_90.getIdentity(_8f),_92=this._itemNodesMap[_91];if(_92){var _93=this.getLabel(_8f),_94=this.getTooltip(_8f);_1.forEach(_92,function(_95){_95.set({item:_8f,label:_93,tooltip:_94});_95._updateItemClasses(_8f);});}},_onItemChildrenChange:function(_96,_97){var _98=this.model,_99=_98.getIdentity(_96),_9a=this._itemNodesMap[_99];if(_9a){_1.forEach(_9a,function(_9b){_9b.setChildItems(_97);});}},_onItemDelete:function(_9c){var _9d=this.model,_9e=_9d.getIdentity(_9c),_9f=this._itemNodesMap[_9e];if(_9f){_1.forEach(_9f,function(_a0){this.dndController.removeTreeNode(_a0);var _a1=_a0.getParent();if(_a1){_a1.removeChild(_a0);}_a0.destroyRecursive();},this);delete this._itemNodesMap[_9e];}},_initState:function(){this._openedNodes={};if(this.persist&&this.cookieName){var _a2=_3(this.cookieName);if(_a2){_1.forEach(_a2.split(","),function(_a3){this._openedNodes[_a3]=true;},this);}}},_state:function(_a4,_a5){if(!this.persist){return false;}var _a6=_1.map(_a4.getTreePath(),function(_a7){return this.model.getIdentity(_a7);},this).join("/");if(arguments.length===1){return this._openedNodes[_a6];}else{if(_a5){this._openedNodes[_a6]=true;}else{delete this._openedNodes[_a6];}var ary=[];for(var id in this._openedNodes){ary.push(id);}_3(this.cookieName,ary.join(","),{expires:365});}},destroy:function(){if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}if(this.rootNode){this.rootNode.destroyRecursive();}if(this.dndController&&!_f.isString(this.dndController)){this.dndController.destroy();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();},resize:function(_a8){if(_a8){_9.setMarginBox(this.domNode,_a8);}this._nodePixelIndent=_9.position(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.set("indent",this.showRoot?0:-1);}},_createTreeNode:function(_a9){return new _1e(_a9);},_setTextDirAttr:function(_aa){if(_aa&&this.textDir!=_aa){this._set("textDir",_aa);this.rootNode.set("textDir",_aa);}}});_42._TreeNode=_1e;return _42;}); \ No newline at end of file
+require({cache:{"url:dijit/templates/TreeNode.html":"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow dijitInline\" role=\"presentation\"\n\t\t><div data-dojo-attach-point=\"indentNode\" class=\"dijitInline\"></div\n\t\t><img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span data-dojo-attach-point=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span data-dojo-attach-point=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\"></span>\n\t\t</span\n\t></div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n","url:dijit/templates/Tree.html":"<div class=\"dijitTree dijitTreeContainer\" role=\"tree\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" data-dojo-attach-point=\"indentDetector\"></div>\n</div>\n"}});define("dijit/Tree",["dojo/_base/array","dojo/_base/connect","dojo/cookie","dojo/_base/declare","dojo/Deferred","dojo/DeferredList","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/errors/create","dojo/fx","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/topic","dojo/touch","dojo/when","./focus","./registry","./_base/manager","./_Widget","./_TemplatedMixin","./_Container","./_Contained","./_CssStateMixin","dojo/text!./templates/TreeNode.html","dojo/text!./templates/Tree.html","./tree/TreeStoreModel","./tree/ForestStoreModel","./tree/_dndSelector"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,on,_11,_12,_13,_14,_15,_16,_17,_18,_19,_1a,_1b,_1c,_1d,_1e,_1f,_20){_5=_4(_5,{addCallback:function(_21){this.then(_21);},addErrback:function(_22){this.then(null,_22);}});var _23=_4("dijit._TreeNode",[_17,_18,_19,_1a,_1b],{item:null,isTreeNode:true,label:"",_setLabelAttr:{node:"labelNode",type:"innerText"},isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:_1c,baseClass:"dijitTreeNode",cssStateNodes:{rowNode:"dijitTreeRow"},_setTooltipAttr:{node:"rowNode",type:"attribute",attribute:"title"},buildRendering:function(){this.inherited(arguments);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){this.labelNode.setAttribute("aria-expanded",this.isExpanded);}this.setSelected(false);},_setIndentAttr:function(_24){var _25=(Math.max(_24,0)*this.tree._nodePixelIndent)+"px";_a.set(this.domNode,"backgroundPosition",_25+" 0px");_a.set(this.indentNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_25);_1.forEach(this.getChildren(),function(_26){_26.set("indent",_24+1);});this._set("indent",_24);},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(_27){var _28=this.tree,_29=_28.model;if(_28._v10Compat&&_27===_29.root){_27=null;}this._applyClassAndStyle(_27,"icon","Icon");this._applyClassAndStyle(_27,"label","Label");this._applyClassAndStyle(_27,"row","Row");this.tree._startPaint(true);},_applyClassAndStyle:function(_2a,_2b,_2c){var _2d="_"+_2b+"Class";var _2e=_2b+"Node";var _2f=this[_2d];this[_2d]=this.tree["get"+_2c+"Class"](_2a,this.isExpanded);_8.replace(this[_2e],this[_2d]||"",_2f||"");_a.set(this[_2e],this.tree["get"+_2c+"Style"](_2a,this.isExpanded)||{});},_updateLayout:function(){var _30=this.getParent();if(!_30||!_30.rowNode||_30.rowNode.style.display=="none"){_8.add(this.domNode,"dijitTreeIsRoot");}else{_8.toggle(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_31){var _32=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_33=["*","-","+","*"],idx=_31?0:(this.isExpandable?(this.isExpanded?1:2):3);_8.replace(this.expandoNode,_32[idx],_32);this.expandoNodeText.innerHTML=_33[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}if(this._collapseDeferred){this._collapseDeferred.cancel();delete this._collapseDeferred;}this.isExpanded=true;this.labelNode.setAttribute("aria-expanded","true");if(this.tree.showRoot||this!==this.tree.rootNode){this.containerNode.setAttribute("role","group");}_8.add(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode&&this.tree.showRoot){this.tree.domNode.setAttribute("aria-expanded","true");}var def,_34=_d.wipeIn({node:this.containerNode,duration:_16.defaultDuration,onEnd:function(){def.resolve(true);}});def=(this._expandDeferred=new _5(function(){_34.stop();}));_34.play();return def;},collapse:function(){if(this._collapseDeferred){return this._collapseDeferred;}if(this._expandDeferred){this._expandDeferred.cancel();delete this._expandDeferred;}this.isExpanded=false;this.labelNode.setAttribute("aria-expanded","false");if(this==this.tree.rootNode&&this.tree.showRoot){this.tree.domNode.setAttribute("aria-expanded","false");}_8.remove(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);var def,_35=_d.wipeOut({node:this.containerNode,duration:_16.defaultDuration,onEnd:function(){def.resolve(true);}});def=(this._collapseDeferred=new _5(function(){_35.stop();}));_35.play();return def;},indent:0,setChildItems:function(_36){var _37=this.tree,_38=_37.model,_39=[];var _3a=this.getChildren();_1.forEach(_3a,function(_3b){_19.prototype.removeChild.call(this,_3b);},this);this.defer(function(){_1.forEach(_3a,function(_3c){if(!_3c._destroyed&&!_3c.getParent()){_37.dndController.removeTreeNode(_3c);var id=_38.getIdentity(_3c.item),ary=_37._itemNodesMap[id];if(ary.length==1){delete _37._itemNodesMap[id];}else{var _3d=_1.indexOf(ary,_3c);if(_3d!=-1){ary.splice(_3d,1);}}_3c.destroyRecursive();}});});this.state="LOADED";if(_36&&_36.length>0){this.isExpandable=true;_1.forEach(_36,function(_3e){var id=_38.getIdentity(_3e),_3f=_37._itemNodesMap[id],_40;if(_3f){for(var i=0;i<_3f.length;i++){if(_3f[i]&&!_3f[i].getParent()){_40=_3f[i];_40.set("indent",this.indent+1);break;}}}if(!_40){_40=this.tree._createTreeNode({item:_3e,tree:_37,isExpandable:_38.mayHaveChildren(_3e),label:_37.getLabel(_3e),tooltip:_37.getTooltip(_3e),ownerDocument:_37.ownerDocument,dir:_37.dir,lang:_37.lang,textDir:_37.textDir,indent:this.indent+1});if(_3f){_3f.push(_40);}else{_37._itemNodesMap[id]=[_40];}}this.addChild(_40);if(this.tree.autoExpand||this.tree._state(_40)){_39.push(_37._expandNode(_40));}},this);_1.forEach(this.getChildren(),function(_41){_41._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}this._updateItemClasses(this.item);if(this==_37.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setFocusable(true);_37.lastFocused=fc;}else{_37.domNode.setAttribute("tabIndex","0");}}var def=new _6(_39);this.tree._startPaint(def);return def;},getTreePath:function(){var _42=this;var _43=[];while(_42&&_42!==this.tree.rootNode){_43.unshift(_42.item);_42=_42.getParent();}_43.unshift(this.tree.rootNode.item);return _43;},getIdentity:function(){return this.tree.model.getIdentity(this.item);},removeChild:function(_44){this.inherited(arguments);var _45=this.getChildren();if(_45.length==0){this.isExpandable=false;this.collapse();}_1.forEach(_45,function(_46){_46._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},setSelected:function(_47){this.labelNode.setAttribute("aria-selected",_47?"true":"false");_8.toggle(this.rowNode,"dijitTreeRowSelected",_47);},setFocusable:function(_48){this.labelNode.setAttribute("tabIndex",_48?"0":"-1");},_setTextDirAttr:function(_49){if(_49&&((this.textDir!=_49)||!this._created)){this._set("textDir",_49);this.applyTextDir(this.labelNode,this.labelNode.innerText||this.labelNode.textContent||"");_1.forEach(this.getChildren(),function(_4a){_4a.set("textDir",_49);},this);}}});var _4b=_4("dijit.Tree",[_17,_18],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],paths:[],path:[],selectedItems:null,selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:_1d,persist:true,autoExpand:false,dndController:_20,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance","dragThreshold","betweenThreshold"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,dragThreshold:5,betweenThreshold:0,_nodePixelIndent:19,_publish:function(_4c,_4d){_11.publish(this.id,_10.mixin({tree:this,event:_4c},_4d||{}));},postMixInProperties:function(){this.tree=this;if(this.autoExpand){this.persist=false;}this._itemNodesMap={};if(!this.cookieName&&this.id){this.cookieName=this.id+"SaveStateCookie";}this.expandChildrenDeferred=new _5();this.pendingCommandsDeferred=this.expandChildrenDeferred;this.inherited(arguments);},postCreate:function(){this._initState();var _4e=this;this.own(on(this.domNode,on.selector(".dijitTreeNode",_12.enter),function(evt){_4e._onNodeMouseEnter(_15.byNode(this),evt);}),on(this.domNode,on.selector(".dijitTreeNode",_12.leave),function(evt){_4e._onNodeMouseLeave(_15.byNode(this),evt);}),on(this.domNode,on.selector(".dijitTreeNode","click"),function(evt){_4e._onClick(_15.byNode(this),evt);}),on(this.domNode,on.selector(".dijitTreeNode","dblclick"),function(evt){_4e._onDblClick(_15.byNode(this),evt);}),on(this.domNode,on.selector(".dijitTreeNode","keypress"),function(evt){_4e._onKeyPress(_15.byNode(this),evt);}),on(this.domNode,on.selector(".dijitTreeNode","keydown"),function(evt){_4e._onKeyDown(_15.byNode(this),evt);}),on(this.domNode,on.selector(".dijitTreeRow","focusin"),function(evt){_4e._onNodeFocus(_15.getEnclosingWidget(this),evt);}));if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this.connect(this.model,"onDelete","_onItemDelete");this.inherited(arguments);if(this.dndController){if(_10.isString(this.dndController)){this.dndController=_10.getObject(this.dndController);}var _4f={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_4f[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_4f);}this._load();if(!this.params.path&&!this.params.paths&&this.persist){this.set("paths",this.dndController._getSavedPaths());}this.onLoadDeferred=this.pendingCommandsDeferred;this.onLoadDeferred.then(_10.hitch(this,"onLoad"));},_store2model:function(){this._v10Compat=true;_e.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _50={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_50.mayHaveChildren=_10.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_50.getChildren=_10.hitch(this,function(_51,_52,_53){this.getItemChildren((this._v10Compat&&_51===this.model.root)?null:_51,_52,_53);});}this.model=new _1f(_50);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){this.model.getRoot(_10.hitch(this,function(_54){var rn=(this.rootNode=this.tree._createTreeNode({item:_54,tree:this,isExpandable:true,label:this.label||this.getLabel(_54),textDir:this.textDir,indent:this.showRoot?0:-1}));if(!this.showRoot){rn.rowNode.style.display="none";this.domNode.setAttribute("role","presentation");this.domNode.removeAttribute("aria-expanded");this.domNode.removeAttribute("aria-multiselectable");rn.labelNode.setAttribute("role","presentation");rn.containerNode.setAttribute("role","tree");rn.containerNode.setAttribute("aria-expanded","true");rn.containerNode.setAttribute("aria-multiselectable",!this.dndController.singular);}else{this.domNode.setAttribute("aria-multiselectable",!this.dndController.singular);}this.domNode.appendChild(rn.domNode);var _55=this.model.getIdentity(_54);if(this._itemNodesMap[_55]){this._itemNodesMap[_55].push(rn);}else{this._itemNodesMap[_55]=[rn];}rn._updateLayout();this._expandNode(rn).then(_10.hitch(this,function(){this.expandChildrenDeferred.resolve(true);}));}),_10.hitch(this,function(err){console.error(this,": error loading root: ",err);}));},getNodesByItem:function(_56){if(!_56){return [];}var _57=_10.isString(_56)?_56:this.model.getIdentity(_56);return [].concat(this._itemNodesMap[_57]);},_setSelectedItemAttr:function(_58){this.set("selectedItems",[_58]);},_setSelectedItemsAttr:function(_59){var _5a=this;return this.pendingCommandsDeferred=this.pendingCommandsDeferred.then(_10.hitch(this,function(){var _5b=_1.map(_59,function(_5c){return (!_5c||_10.isString(_5c))?_5c:_5a.model.getIdentity(_5c);});var _5d=[];_1.forEach(_5b,function(id){_5d=_5d.concat(_5a._itemNodesMap[id]||[]);});this.set("selectedNodes",_5d);}));},_setPathAttr:function(_5e){if(_5e.length){return this.set("paths",[_5e]);}else{return this.set("paths",[]);}},_setPathsAttr:function(_5f){var _60=this;return this.pendingCommandsDeferred=this.pendingCommandsDeferred.then(function(){return new _6(_1.map(_5f,function(_61){var d=new _5();_61=_1.map(_61,function(_62){return _10.isString(_62)?_62:_60.model.getIdentity(_62);});if(_61.length){_63(_61,[_60.rootNode],d);}else{d.reject(new _4b.PathError("Empty path"));}return d;}));}).then(_64);function _63(_65,_66,def){var _67=_65.shift();var _68=_1.filter(_66,function(_69){return _69.getIdentity()==_67;})[0];if(!!_68){if(_65.length){_60._expandNode(_68).then(function(){_63(_65,_68.getChildren(),def);});}else{def.resolve(_68);}}else{def.reject(new _4b.PathError("Could not expand path at "+_67));}};function _64(_6a){_60.set("selectedNodes",_1.map(_1.filter(_6a,function(x){return x[0];}),function(x){return x[1];}));};},_setSelectedNodeAttr:function(_6b){this.set("selectedNodes",[_6b]);},_setSelectedNodesAttr:function(_6c){this.dndController.setSelection(_6c);},expandAll:function(){var _6d=this;function _6e(_6f){var def=new dojo.Deferred();_6d._expandNode(_6f).then(function(){var _70=_1.filter(_6f.getChildren()||[],function(_71){return _71.isExpandable;}),_72=_1.map(_70,_6e);new dojo.DeferredList(_72).then(function(){def.resolve(true);});});return def;};return _6e(this.rootNode);},collapseAll:function(){var _73=this;function _74(_75){var def=new dojo.Deferred();def.label="collapseAllDeferred";var _76=_1.filter(_75.getChildren()||[],function(_77){return _77.isExpandable;}),_78=_1.map(_76,_74);new dojo.DeferredList(_78).then(function(){if(!_75.isExpanded||(_75==_73.rootNode&&!_73.showRoot)){def.resolve(true);}else{_73._collapseNode(_75).then(function(){def.resolve(true);});}});return def;};return _74(this.rootNode);},mayHaveChildren:function(){},getItemChildren:function(){},getLabel:function(_79){return this.model.getLabel(_79);},getIconClass:function(_7a,_7b){return (!_7a||this.model.mayHaveChildren(_7a))?(_7b?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(){},getRowClass:function(){},getIconStyle:function(){},getLabelStyle:function(){},getRowStyle:function(){},getTooltip:function(){return "";},_onKeyPress:function(_7c,e){if(e.charCode<=32){return;}if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){var c=String.fromCharCode(e.charCode);this._onLetterKeyNav({node:_7c,key:c.toLowerCase()});_b.stop(e);}},_onKeyDown:function(_7d,e){var key=e.keyCode;var map=this._keyHandlerMap;if(!map){map={};map[_f.ENTER]=map[_f.SPACE]=map[" "]="_onEnterKey";map[this.isLeftToRight()?_f.LEFT_ARROW:_f.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?_f.RIGHT_ARROW:_f.LEFT_ARROW]="_onRightArrow";map[_f.UP_ARROW]="_onUpArrow";map[_f.DOWN_ARROW]="_onDownArrow";map[_f.HOME]="_onHomeKey";map[_f.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[key]){if(this._curSearch){this._curSearch.timer.remove();delete this._curSearch;}this[this._keyHandlerMap[key]]({node:_7d,item:_7d.item,evt:e});_b.stop(e);}},_onEnterKey:function(_7e){this._publish("execute",{item:_7e.item,node:_7e.node});this.dndController.userSelect(_7e.node,_2.isCopyKey(_7e.evt),_7e.evt.shiftKey);this.onClick(_7e.item,_7e.node,_7e.evt);},_onDownArrow:function(_7f){var _80=this._getNextNode(_7f.node);if(_80&&_80.isTreeNode){this.focusNode(_80);}},_onUpArrow:function(_81){var _82=_81.node;var _83=_82.getPreviousSibling();if(_83){_82=_83;while(_82.isExpandable&&_82.isExpanded&&_82.hasChildren()){var _84=_82.getChildren();_82=_84[_84.length-1];}}else{var _85=_82.getParent();if(!(!this.showRoot&&_85===this.rootNode)){_82=_85;}}if(_82&&_82.isTreeNode){this.focusNode(_82);}},_onRightArrow:function(_86){var _87=_86.node;if(_87.isExpandable&&!_87.isExpanded){this._expandNode(_87);}else{if(_87.hasChildren()){_87=_87.getChildren()[0];if(_87&&_87.isTreeNode){this.focusNode(_87);}}}},_onLeftArrow:function(_88){var _89=_88.node;if(_89.isExpandable&&_89.isExpanded){this._collapseNode(_89);}else{var _8a=_89.getParent();if(_8a&&_8a.isTreeNode&&!(!this.showRoot&&_8a===this.rootNode)){this.focusNode(_8a);}}},_onHomeKey:function(){var _8b=this._getRootOrFirstNode();if(_8b){this.focusNode(_8b);}},_onEndKey:function(){var _8c=this.rootNode;while(_8c.isExpanded){var c=_8c.getChildren();_8c=c[c.length-1];}if(_8c&&_8c.isTreeNode){this.focusNode(_8c);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_8d){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_8d.key;cs.timer.remove();}else{cs=this._curSearch={pattern:_8d.key,startNode:_8d.node};}cs.timer=this.defer(function(){delete this._curSearch;},this.multiCharSearchDuration);var _8e=cs.startNode;do{_8e=this._getNextNode(_8e);if(!_8e){_8e=this._getRootOrFirstNode();}}while(_8e!==cs.startNode&&(_8e.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(_8e&&_8e.isTreeNode){if(_8e!==cs.startNode){this.focusNode(_8e);}}},isExpandoNode:function(_8f,_90){return _7.isDescendant(_8f,_90.expandoNode)||_7.isDescendant(_8f,_90.expandoNodeText);},_onClick:function(_91,e){var _92=e.target,_93=this.isExpandoNode(_92,_91);if((this.openOnClick&&_91.isExpandable)||_93){if(_91.isExpandable){this._onExpandoClick({node:_91});}}else{this._publish("execute",{item:_91.item,node:_91,evt:e});this.onClick(_91.item,_91,e);this.focusNode(_91);}_b.stop(e);},_onDblClick:function(_94,e){var _95=e.target,_96=(_95==_94.expandoNode||_95==_94.expandoNodeText);if((this.openOnDblClick&&_94.isExpandable)||_96){if(_94.isExpandable){this._onExpandoClick({node:_94});}}else{this._publish("execute",{item:_94.item,node:_94,evt:e});this.onDblClick(_94.item,_94,e);this.focusNode(_94);}_b.stop(e);},_onExpandoClick:function(_97){var _98=_97.node;this.focusNode(_98);if(_98.isExpanded){this._collapseNode(_98);}else{this._expandNode(_98);}},onClick:function(){},onDblClick:function(){},onOpen:function(){},onClose:function(){},_getNextNode:function(_99){if(_99.isExpandable&&_99.isExpanded&&_99.hasChildren()){return _99.getChildren()[0];}else{while(_99&&_99.isTreeNode){var _9a=_99.getNextSibling();if(_9a){return _9a;}_99=_99.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(_9b){if(_9b._expandNodeDeferred){delete _9b._expandNodeDeferred;}if(_9b.state=="LOADING"){return;}if(_9b.isExpanded){var ret=_9b.collapse();this.onClose(_9b.item,_9b);this._state(_9b,false);this._startPaint(ret);return ret;}},_expandNode:function(_9c){var def=new _5();if(_9c._expandNodeDeferred){return _9c._expandNodeDeferred;}var _9d=this.model,_9e=_9c.item,_9f=this;if(!_9c._loadDeferred){_9c.markProcessing();_9c._loadDeferred=new _5();_9d.getChildren(_9e,function(_a0){_9c.unmarkProcessing();_9c.setChildItems(_a0).then(function(){_9c._loadDeferred.resolve(_a0);});},function(err){console.error(_9f,": error loading "+_9c.label+" children: ",err);_9c._loadDeferred.reject(err);});}_9c._loadDeferred.then(_10.hitch(this,function(){_9c.expand().then(function(){def.resolve(true);});this.onOpen(_9c.item,_9c);this._state(_9c,true);}));this._startPaint(def);return def;},focusNode:function(_a1){_14.focus(_a1.labelNode);},_onNodeFocus:function(_a2){if(_a2&&_a2!=this.lastFocused){if(this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setFocusable(false);}_a2.setFocusable(true);this.lastFocused=_a2;}},_onNodeMouseEnter:function(){},_onNodeMouseLeave:function(){},_onItemChange:function(_a3){var _a4=this.model,_a5=_a4.getIdentity(_a3),_a6=this._itemNodesMap[_a5];if(_a6){var _a7=this.getLabel(_a3),_a8=this.getTooltip(_a3);_1.forEach(_a6,function(_a9){_a9.set({item:_a3,label:_a7,tooltip:_a8});_a9._updateItemClasses(_a3);});}},_onItemChildrenChange:function(_aa,_ab){var _ac=this.model,_ad=_ac.getIdentity(_aa),_ae=this._itemNodesMap[_ad];if(_ae){_1.forEach(_ae,function(_af){_af.setChildItems(_ab);});}},_onItemDelete:function(_b0){var _b1=this.model,_b2=_b1.getIdentity(_b0),_b3=this._itemNodesMap[_b2];if(_b3){_1.forEach(_b3,function(_b4){this.dndController.removeTreeNode(_b4);var _b5=_b4.getParent();if(_b5){_b5.removeChild(_b4);}_b4.destroyRecursive();},this);delete this._itemNodesMap[_b2];}},_initState:function(){this._openedNodes={};if(this.persist&&this.cookieName){var _b6=_3(this.cookieName);if(_b6){_1.forEach(_b6.split(","),function(_b7){this._openedNodes[_b7]=true;},this);}}},_state:function(_b8,_b9){if(!this.persist){return false;}var _ba=_1.map(_b8.getTreePath(),function(_bb){return this.model.getIdentity(_bb);},this).join("/");if(arguments.length===1){return this._openedNodes[_ba];}else{if(_b9){this._openedNodes[_ba]=true;}else{delete this._openedNodes[_ba];}if(this.persist&&this.cookieName){var ary=[];for(var id in this._openedNodes){ary.push(id);}_3(this.cookieName,ary.join(","),{expires:365});}}},destroy:function(){if(this._curSearch){this._curSearch.timer.remove();delete this._curSearch;}if(this.rootNode){this.rootNode.destroyRecursive();}if(this.dndController&&!_10.isString(this.dndController)){this.dndController.destroy();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();},resize:function(_bc){if(_bc){_9.setMarginBox(this.domNode,_bc);}this._nodePixelIndent=_9.position(this.tree.indentDetector).w||this._nodePixelIndent;this.expandChildrenDeferred.then(_10.hitch(this,function(){this.rootNode.set("indent",this.showRoot?0:-1);this._adjustWidths();}));},_outstandingPaintOperations:0,_startPaint:function(p){this._outstandingPaintOperations++;if(this._adjustWidthsTimer){this._adjustWidthsTimer.remove();delete this._adjustWidthsTimer;}var oc=_10.hitch(this,function(){this._outstandingPaintOperations--;if(this._outstandingPaintOperations<=0&&!this._adjustWidthsTimer&&this._started){this._adjustWidthsTimer=this.defer("_adjustWidths");}});_13(p,oc,oc);},_adjustWidths:function(){if(this._adjustWidthsTimer){this._adjustWidthsTimer.remove();delete this._adjustWidthsTimer;}var _bd=0,_be=[];function _bf(_c0){var _c1=_c0.rowNode;_c1.style.width="auto";_bd=Math.max(_bd,_c1.clientWidth);_be.push(_c1);if(_c0.isExpanded){_1.forEach(_c0.getChildren(),_bf);}};_bf(this.rootNode);_bd=Math.max(_bd,_9.getContentBox(this.domNode).w);_1.forEach(_be,function(_c2){_c2.style.width=_bd+"px";});},_createTreeNode:function(_c3){return new _23(_c3);},_setTextDirAttr:function(_c4){if(_c4&&this.textDir!=_c4){this._set("textDir",_c4);this.rootNode.set("textDir",_c4);}}});_4b.PathError=_c("TreePathError");_4b._TreeNode=_23;return _4b;}); \ No newline at end of file
diff --git a/lib/dijit/Tree.js.uncompressed.js b/lib/dijit/Tree.js.uncompressed.js
new file mode 100644
index 000000000..c1eeaf143
--- /dev/null
+++ b/lib/dijit/Tree.js.uncompressed.js
@@ -0,0 +1,1910 @@
+require({cache:{
+'url:dijit/templates/TreeNode.html':"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow dijitInline\" role=\"presentation\"\n\t\t><div data-dojo-attach-point=\"indentNode\" class=\"dijitInline\"></div\n\t\t><img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span data-dojo-attach-point=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span data-dojo-attach-point=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" data-dojo-attach-point=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span data-dojo-attach-point=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\"></span>\n\t\t</span\n\t></div>\n\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n",
+'url:dijit/templates/Tree.html':"<div class=\"dijitTree dijitTreeContainer\" role=\"tree\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" data-dojo-attach-point=\"indentDetector\"></div>\n</div>\n"}});
+define("dijit/Tree", [
+ "dojo/_base/array", // array.filter array.forEach array.map
+ "dojo/_base/connect", // connect.isCopyKey()
+ "dojo/cookie", // cookie
+ "dojo/_base/declare", // declare
+ "dojo/Deferred", // Deferred
+ "dojo/DeferredList", // DeferredList
+ "dojo/dom", // dom.isDescendant
+ "dojo/dom-class", // domClass.add domClass.remove domClass.replace domClass.toggle
+ "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.position
+ "dojo/dom-style",// domStyle.set
+ "dojo/_base/event", // event.stop
+ "dojo/errors/create", // createError
+ "dojo/fx", // fxUtils.wipeIn fxUtils.wipeOut
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/keys", // arrows etc.
+ "dojo/_base/lang", // lang.getObject lang.mixin lang.hitch
+ "dojo/on", // on(), on.selector()
+ "dojo/topic",
+ "dojo/touch",
+ "dojo/when",
+ "./focus",
+ "./registry", // registry.byNode(), registry.getEnclosingWidget()
+ "./_base/manager", // manager.defaultDuration
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_Container",
+ "./_Contained",
+ "./_CssStateMixin",
+ "dojo/text!./templates/TreeNode.html",
+ "dojo/text!./templates/Tree.html",
+ "./tree/TreeStoreModel",
+ "./tree/ForestStoreModel",
+ "./tree/_dndSelector"
+], function(array, connect, cookie, declare, Deferred, DeferredList,
+ dom, domClass, domGeometry, domStyle, event, createError, fxUtils, kernel, keys, lang, on, topic, touch, when,
+ focus, registry, manager, _Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin,
+ treeNodeTemplate, treeTemplate, TreeStoreModel, ForestStoreModel, _dndSelector){
+
+// module:
+// dijit/Tree
+
+// Back-compat shim
+Deferred = declare(Deferred, {
+ addCallback: function(callback){ this.then(callback); },
+ addErrback: function(errback){ this.then(null, errback); }
+});
+
+var TreeNode = declare(
+ "dijit._TreeNode",
+ [_Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin],
+{
+ // summary:
+ // Single node within a tree. This class is used internally
+ // by Tree and should not be accessed directly.
+ // tags:
+ // private
+
+ // item: [const] Item
+ // the dojo.data entry this tree represents
+ item: null,
+
+ // isTreeNode: [protected] Boolean
+ // Indicates that this is a TreeNode. Used by `dijit.Tree` only,
+ // should not be accessed directly.
+ isTreeNode: true,
+
+ // label: String
+ // Text of this tree node
+ label: "",
+ _setLabelAttr: {node: "labelNode", type: "innerText"},
+
+ // isExpandable: [private] Boolean
+ // This node has children, so show the expando node (+ sign)
+ isExpandable: null,
+
+ // isExpanded: [readonly] Boolean
+ // This node is currently expanded (ie, opened)
+ isExpanded: false,
+
+ // state: [private] String
+ // Dynamic loading-related stuff.
+ // When an empty folder node appears, it is "UNCHECKED" first,
+ // then after dojo.data query it becomes "LOADING" and, finally "LOADED"
+ state: "UNCHECKED",
+
+ templateString: treeNodeTemplate,
+
+ baseClass: "dijitTreeNode",
+
+ // For hover effect for tree node, and focus effect for label
+ cssStateNodes: {
+ rowNode: "dijitTreeRow"
+ },
+
+ // Tooltip is defined in _WidgetBase but we need to handle the mapping to DOM here
+ _setTooltipAttr: {node: "rowNode", type: "attribute", attribute: "title"},
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // set expand icon for leaf
+ this._setExpando();
+
+ // set icon and label class based on item
+ this._updateItemClasses(this.item);
+
+ if(this.isExpandable){
+ this.labelNode.setAttribute("aria-expanded", this.isExpanded);
+ }
+
+ //aria-selected should be false on all selectable elements.
+ this.setSelected(false);
+ },
+
+ _setIndentAttr: function(indent){
+ // summary:
+ // Tell this node how many levels it should be indented
+ // description:
+ // 0 for top level nodes, 1 for their children, 2 for their
+ // grandchildren, etc.
+
+ // Math.max() is to prevent negative padding on hidden root node (when indent == -1)
+ var pixels = (Math.max(indent, 0) * this.tree._nodePixelIndent) + "px";
+
+ domStyle.set(this.domNode, "backgroundPosition", pixels + " 0px"); // TODOC: what is this for???
+ domStyle.set(this.indentNode, this.isLeftToRight() ? "paddingLeft" : "paddingRight", pixels);
+
+ array.forEach(this.getChildren(), function(child){
+ child.set("indent", indent+1);
+ });
+
+ this._set("indent", indent);
+ },
+
+ markProcessing: function(){
+ // summary:
+ // Visually denote that tree is loading data, etc.
+ // tags:
+ // private
+ this.state = "LOADING";
+ this._setExpando(true);
+ },
+
+ unmarkProcessing: function(){
+ // summary:
+ // Clear markup from markProcessing() call
+ // tags:
+ // private
+ this._setExpando(false);
+ },
+
+ _updateItemClasses: function(item){
+ // summary:
+ // Set appropriate CSS classes for icon and label dom node
+ // (used to allow for item updates to change respective CSS)
+ // tags:
+ // private
+ var tree = this.tree, model = tree.model;
+ if(tree._v10Compat && item === model.root){
+ // For back-compat with 1.0, need to use null to specify root item (TODO: remove in 2.0)
+ item = null;
+ }
+ this._applyClassAndStyle(item, "icon", "Icon");
+ this._applyClassAndStyle(item, "label", "Label");
+ this._applyClassAndStyle(item, "row", "Row");
+
+ this.tree._startPaint(true); // signifies paint started and finished (synchronously)
+ },
+
+ _applyClassAndStyle: function(item, lower, upper){
+ // summary:
+ // Set the appropriate CSS classes and styles for labels, icons and rows.
+ //
+ // item:
+ // The data item.
+ //
+ // lower:
+ // The lower case attribute to use, e.g. 'icon', 'label' or 'row'.
+ //
+ // upper:
+ // The upper case attribute to use, e.g. 'Icon', 'Label' or 'Row'.
+ //
+ // tags:
+ // private
+
+ var clsName = "_" + lower + "Class";
+ var nodeName = lower + "Node";
+ var oldCls = this[clsName];
+
+ this[clsName] = this.tree["get" + upper + "Class"](item, this.isExpanded);
+ domClass.replace(this[nodeName], this[clsName] || "", oldCls || "");
+
+ domStyle.set(this[nodeName], this.tree["get" + upper + "Style"](item, this.isExpanded) || {});
+ },
+
+ _updateLayout: function(){
+ // summary:
+ // Set appropriate CSS classes for this.domNode
+ // tags:
+ // private
+ var parent = this.getParent();
+ if(!parent || !parent.rowNode || parent.rowNode.style.display == "none"){
+ /* if we are hiding the root node then make every first level child look like a root node */
+ domClass.add(this.domNode, "dijitTreeIsRoot");
+ }else{
+ domClass.toggle(this.domNode, "dijitTreeIsLast", !this.getNextSibling());
+ }
+ },
+
+ _setExpando: function(/*Boolean*/ processing){
+ // summary:
+ // Set the right image for the expando node
+ // tags:
+ // private
+
+ var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened",
+ "dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"],
+ _a11yStates = ["*","-","+","*"],
+ idx = processing ? 0 : (this.isExpandable ? (this.isExpanded ? 1 : 2) : 3);
+
+ // apply the appropriate class to the expando node
+ domClass.replace(this.expandoNode, styles[idx], styles);
+
+ // provide a non-image based indicator for images-off mode
+ this.expandoNodeText.innerHTML = _a11yStates[idx];
+
+ },
+
+ expand: function(){
+ // summary:
+ // Show my children
+ // returns:
+ // Deferred that fires when expansion is complete
+
+ // If there's already an expand in progress or we are already expanded, just return
+ if(this._expandDeferred){
+ return this._expandDeferred; // dojo/_base/Deferred
+ }
+
+ // cancel in progress collapse operation
+ if(this._collapseDeferred){
+ this._collapseDeferred.cancel();
+ delete this._collapseDeferred;
+ }
+
+ // All the state information for when a node is expanded, maybe this should be
+ // set when the animation completes instead
+ this.isExpanded = true;
+ this.labelNode.setAttribute("aria-expanded", "true");
+ if(this.tree.showRoot || this !== this.tree.rootNode){
+ this.containerNode.setAttribute("role", "group");
+ }
+ domClass.add(this.contentNode,'dijitTreeContentExpanded');
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ if(this == this.tree.rootNode && this.tree.showRoot){
+ this.tree.domNode.setAttribute("aria-expanded", "true");
+ }
+
+ var def,
+ wipeIn = fxUtils.wipeIn({
+ node: this.containerNode,
+ duration: manager.defaultDuration,
+ onEnd: function(){
+ def.resolve(true);
+ }
+ });
+
+ // Deferred that fires when expand is complete
+ def = (this._expandDeferred = new Deferred(function(){
+ // Canceller
+ wipeIn.stop();
+ }));
+
+ wipeIn.play();
+
+ return def; // dojo/_base/Deferred
+ },
+
+ collapse: function(){
+ // summary:
+ // Collapse this node (if it's expanded)
+
+ if(this._collapseDeferred){
+ // Node is already collapsed, or there's a collapse in progress, just return that Deferred
+ return this._collapseDeferred;
+ }
+
+ // cancel in progress expand operation
+ if(this._expandDeferred){
+ this._expandDeferred.cancel();
+ delete this._expandDeferred;
+ }
+
+ this.isExpanded = false;
+ this.labelNode.setAttribute("aria-expanded", "false");
+ if(this == this.tree.rootNode && this.tree.showRoot){
+ this.tree.domNode.setAttribute("aria-expanded", "false");
+ }
+ domClass.remove(this.contentNode,'dijitTreeContentExpanded');
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ var def,
+ wipeOut = fxUtils.wipeOut({
+ node: this.containerNode,
+ duration: manager.defaultDuration,
+ onEnd: function(){
+ def.resolve(true);
+ }
+ });
+
+ // Deferred that fires when expand is complete
+ def = (this._collapseDeferred = new Deferred(function(){
+ // Canceller
+ wipeOut.stop();
+ }));
+
+ wipeOut.play();
+
+ return def; // dojo/_base/Deferred
+ },
+
+ // indent: Integer
+ // Levels from this node to the root node
+ indent: 0,
+
+ setChildItems: function(/* Object[] */ items){
+ // summary:
+ // Sets the child items of this node, removing/adding nodes
+ // from current children to match specified items[] array.
+ // Also, if this.persist == true, expands any children that were previously
+ // opened.
+ // returns:
+ // Deferred object that fires after all previously opened children
+ // have been expanded again (or fires instantly if there are no such children).
+
+ var tree = this.tree,
+ model = tree.model,
+ defs = []; // list of deferreds that need to fire before I am complete
+
+
+ // Orphan all my existing children.
+ // If items contains some of the same items as before then we will reattach them.
+ // Don't call this.removeChild() because that will collapse the tree etc.
+ var oldChildren = this.getChildren();
+ array.forEach(oldChildren, function(child){
+ _Container.prototype.removeChild.call(this, child);
+ }, this);
+
+ // All the old children of this TreeNode are subject for destruction if
+ // 1) they aren't listed in the new children array (items)
+ // 2) they aren't immediately adopted by another node (DnD)
+ this.defer(function(){
+ array.forEach(oldChildren, function(node){
+ if(!node._destroyed && !node.getParent()){
+ // If node is in selection then remove it.
+ tree.dndController.removeTreeNode(node);
+
+ // Deregister mapping from item id --> this node
+ var id = model.getIdentity(node.item),
+ ary = tree._itemNodesMap[id];
+ if(ary.length == 1){
+ delete tree._itemNodesMap[id];
+ }else{
+ var index = array.indexOf(ary, node);
+ if(index != -1){
+ ary.splice(index, 1);
+ }
+ }
+
+ // And finally we can destroy the node
+ node.destroyRecursive();
+ }
+ });
+ });
+
+ this.state = "LOADED";
+
+ if(items && items.length > 0){
+ this.isExpandable = true;
+
+ // Create _TreeNode widget for each specified tree node, unless one already
+ // exists and isn't being used (presumably it's from a DnD move and was recently
+ // released
+ array.forEach(items, function(item){ // MARKER: REUSE NODE
+ var id = model.getIdentity(item),
+ existingNodes = tree._itemNodesMap[id],
+ node;
+ if(existingNodes){
+ for(var i=0;i<existingNodes.length;i++){
+ if(existingNodes[i] && !existingNodes[i].getParent()){
+ node = existingNodes[i];
+ node.set('indent', this.indent+1);
+ break;
+ }
+ }
+ }
+ if(!node){
+ node = this.tree._createTreeNode({
+ item: item,
+ tree: tree,
+ isExpandable: model.mayHaveChildren(item),
+ label: tree.getLabel(item),
+ tooltip: tree.getTooltip(item),
+ ownerDocument: tree.ownerDocument,
+ dir: tree.dir,
+ lang: tree.lang,
+ textDir: tree.textDir,
+ indent: this.indent + 1
+ });
+ if(existingNodes){
+ existingNodes.push(node);
+ }else{
+ tree._itemNodesMap[id] = [node];
+ }
+ }
+ this.addChild(node);
+
+ // If node was previously opened then open it again now (this may trigger
+ // more data store accesses, recursively)
+ if(this.tree.autoExpand || this.tree._state(node)){
+ defs.push(tree._expandNode(node));
+ }
+ }, this);
+
+ // note that updateLayout() needs to be called on each child after
+ // _all_ the children exist
+ array.forEach(this.getChildren(), function(child){
+ child._updateLayout();
+ });
+ }else{
+ this.isExpandable=false;
+ }
+
+ if(this._setExpando){
+ // change expando to/from dot or + icon, as appropriate
+ this._setExpando(false);
+ }
+
+ // Set leaf icon or folder icon, as appropriate
+ this._updateItemClasses(this.item);
+
+ // On initial tree show, make the selected TreeNode as either the root node of the tree,
+ // or the first child, if the root node is hidden
+ if(this == tree.rootNode){
+ var fc = this.tree.showRoot ? this : this.getChildren()[0];
+ if(fc){
+ fc.setFocusable(true);
+ tree.lastFocused = fc;
+ }else{
+ // fallback: no nodes in tree so focus on Tree <div> itself
+ tree.domNode.setAttribute("tabIndex", "0");
+ }
+ }
+
+ var def = new DeferredList(defs);
+ this.tree._startPaint(def); // to reset TreeNode widths after an item is added/removed from the Tree
+ return def; // dojo/_base/Deferred
+ },
+
+ getTreePath: function(){
+ var node = this;
+ var path = [];
+ while(node && node !== this.tree.rootNode){
+ path.unshift(node.item);
+ node = node.getParent();
+ }
+ path.unshift(this.tree.rootNode.item);
+
+ return path;
+ },
+
+ getIdentity: function(){
+ return this.tree.model.getIdentity(this.item);
+ },
+
+ removeChild: function(/* treeNode */ node){
+ this.inherited(arguments);
+
+ var children = this.getChildren();
+ if(children.length == 0){
+ this.isExpandable = false;
+ this.collapse();
+ }
+
+ array.forEach(children, function(child){
+ child._updateLayout();
+ });
+ },
+
+ makeExpandable: function(){
+ // summary:
+ // if this node wasn't already showing the expando node,
+ // turn it into one and call _setExpando()
+
+ // TODO: hmm this isn't called from anywhere, maybe should remove it for 2.0
+
+ this.isExpandable = true;
+ this._setExpando(false);
+ },
+
+ setSelected: function(/*Boolean*/ selected){
+ // summary:
+ // A Tree has a (single) currently selected node.
+ // Mark that this node is/isn't that currently selected node.
+ // description:
+ // In particular, setting a node as selected involves setting tabIndex
+ // so that when user tabs to the tree, focus will go to that node (only).
+ this.labelNode.setAttribute("aria-selected", selected ? "true" : "false");
+ domClass.toggle(this.rowNode, "dijitTreeRowSelected", selected);
+ },
+
+ setFocusable: function(/*Boolean*/ selected){
+ // summary:
+ // A Tree has a (single) node that's focusable.
+ // Mark that this node is/isn't that currently focsuable node.
+ // description:
+ // In particular, setting a node as selected involves setting tabIndex
+ // so that when user tabs to the tree, focus will go to that node (only).
+
+ this.labelNode.setAttribute("tabIndex", selected ? "0" : "-1");
+ },
+
+
+ _setTextDirAttr: function(textDir){
+ if(textDir &&((this.textDir != textDir) || !this._created)){
+ this._set("textDir", textDir);
+ this.applyTextDir(this.labelNode, this.labelNode.innerText || this.labelNode.textContent || "");
+ array.forEach(this.getChildren(), function(childNode){
+ childNode.set("textDir", textDir);
+ }, this);
+ }
+ }
+});
+
+var Tree = declare("dijit.Tree", [_Widget, _TemplatedMixin], {
+ // summary:
+ // This widget displays hierarchical data from a store.
+
+ // store: [deprecated] String|dojo/data/Store
+ // Deprecated. Use "model" parameter instead.
+ // The store to get data to display in the tree.
+ store: null,
+
+ // model: dijit/tree/model
+ // Interface to read tree data, get notifications of changes to tree data,
+ // and for handling drop operations (i.e drag and drop onto the tree)
+ model: null,
+
+ // query: [deprecated] anything
+ // Deprecated. User should specify query to the model directly instead.
+ // Specifies datastore query to return the root item or top items for the tree.
+ query: null,
+
+ // label: [deprecated] String
+ // Deprecated. Use dijit/tree/ForestStoreModel directly instead.
+ // Used in conjunction with query parameter.
+ // If a query is specified (rather than a root node id), and a label is also specified,
+ // then a fake root node is created and displayed, with this label.
+ label: "",
+
+ // showRoot: [const] Boolean
+ // Should the root node be displayed, or hidden?
+ showRoot: true,
+
+ // childrenAttr: [deprecated] String[]
+ // Deprecated. This information should be specified in the model.
+ // One ore more attributes that holds children of a tree node
+ childrenAttr: ["children"],
+
+ // paths: String[][] or Item[][]
+ // Full paths from rootNode to selected nodes expressed as array of items or array of ids.
+ // Since setting the paths may be asynchronous (because of waiting on dojo.data), set("paths", ...)
+ // returns a Deferred to indicate when the set is complete.
+ paths: [],
+
+ // path: String[] or Item[]
+ // Backward compatible singular variant of paths.
+ path: [],
+
+ // selectedItems: [readonly] Item[]
+ // The currently selected items in this tree.
+ // This property can only be set (via set('selectedItems', ...)) when that item is already
+ // visible in the tree. (I.e. the tree has already been expanded to show that node.)
+ // Should generally use `paths` attribute to set the selected items instead.
+ selectedItems: null,
+
+ // selectedItem: [readonly] Item
+ // Backward compatible singular variant of selectedItems.
+ selectedItem: null,
+
+ // openOnClick: Boolean
+ // If true, clicking a folder node's label will open it, rather than calling onClick()
+ openOnClick: false,
+
+ // openOnDblClick: Boolean
+ // If true, double-clicking a folder node's label will open it, rather than calling onDblClick()
+ openOnDblClick: false,
+
+ templateString: treeTemplate,
+
+ // persist: Boolean
+ // Enables/disables use of cookies for state saving.
+ persist: true,
+
+ // autoExpand: Boolean
+ // Fully expand the tree on load. Overrides `persist`.
+ autoExpand: false,
+
+ // dndController: [protected] Function|String
+ // Class to use as as the dnd controller. Specifying this class enables DnD.
+ // Generally you should specify this as dijit/tree/dndSource.
+ // Setting of dijit/tree/_dndSelector handles selection only (no actual DnD).
+ dndController: _dndSelector,
+
+ // parameters to pull off of the tree and pass on to the dndController as its params
+ dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance", "dragThreshold", "betweenThreshold"],
+
+ //declare the above items so they can be pulled from the tree's markup
+
+ // onDndDrop: [protected] Function
+ // Parameter to dndController, see `dijit/tree/dndSource.onDndDrop()`.
+ // Generally this doesn't need to be set.
+ onDndDrop: null,
+
+ itemCreator: null,
+ /*=====
+ itemCreator: function(nodes, target, source){
+ // summary:
+ // Returns objects passed to `Tree.model.newItem()` based on DnD nodes
+ // dropped onto the tree. Developer must override this method to enable
+ // dropping from external sources onto this Tree, unless the Tree.model's items
+ // happen to look like {id: 123, name: "Apple" } with no other attributes.
+ //
+ // For each node in nodes[], which came from source, create a hash of name/value
+ // pairs to be passed to Tree.model.newItem(). Returns array of those hashes.
+ // nodes: DomNode[]
+ // The DOMNodes dragged from the source container
+ // target: DomNode
+ // The target TreeNode.rowNode
+ // source: dojo/dnd/Source
+ // The source container the nodes were dragged from, perhaps another Tree or a plain dojo/dnd/Source
+ // returns: Object[]
+ // Array of name/value hashes for each new item to be added to the Tree, like:
+ // | [
+ // | { id: 123, label: "apple", foo: "bar" },
+ // | { id: 456, label: "pear", zaz: "bam" }
+ // | ]
+ // tags:
+ // extension
+ return [{}];
+ },
+ =====*/
+
+ // onDndCancel: [protected] Function
+ // Parameter to dndController, see `dijit/tree/dndSource.onDndCancel()`.
+ // Generally this doesn't need to be set.
+ onDndCancel: null,
+
+/*=====
+ checkAcceptance: function(source, nodes){
+ // summary:
+ // Checks if the Tree itself can accept nodes from this source
+ // source: dijit/tree/dndSource
+ // The source which provides items
+ // nodes: DOMNode[]
+ // Array of DOM nodes corresponding to nodes being dropped, dijitTreeRow nodes if
+ // source is a dijit/Tree.
+ // tags:
+ // extension
+ return true; // Boolean
+ },
+=====*/
+ checkAcceptance: null,
+
+/*=====
+ checkItemAcceptance: function(target, source, position){
+ // summary:
+ // Stub function to be overridden if one wants to check for the ability to drop at the node/item level
+ // description:
+ // In the base case, this is called to check if target can become a child of source.
+ // When betweenThreshold is set, position="before" or "after" means that we
+ // are asking if the source node can be dropped before/after the target node.
+ // target: DOMNode
+ // The dijitTreeRoot DOM node inside of the TreeNode that we are dropping on to
+ // Use registry.getEnclosingWidget(target) to get the TreeNode.
+ // source: dijit/tree/dndSource
+ // The (set of) nodes we are dropping
+ // position: String
+ // "over", "before", or "after"
+ // tags:
+ // extension
+ return true; // Boolean
+ },
+=====*/
+ checkItemAcceptance: null,
+
+ // dragThreshold: Integer
+ // Number of pixels mouse moves before it's considered the start of a drag operation
+ dragThreshold: 5,
+
+ // betweenThreshold: Integer
+ // Set to a positive value to allow drag and drop "between" nodes.
+ //
+ // If during DnD mouse is over a (target) node but less than betweenThreshold
+ // pixels from the bottom edge, dropping the the dragged node will make it
+ // the next sibling of the target node, rather than the child.
+ //
+ // Similarly, if mouse is over a target node but less that betweenThreshold
+ // pixels from the top edge, dropping the dragged node will make it
+ // the target node's previous sibling rather than the target node's child.
+ betweenThreshold: 0,
+
+ // _nodePixelIndent: Integer
+ // Number of pixels to indent tree nodes (relative to parent node).
+ // Default is 19 but can be overridden by setting CSS class dijitTreeIndent
+ // and calling resize() or startup() on tree after it's in the DOM.
+ _nodePixelIndent: 19,
+
+ _publish: function(/*String*/ topicName, /*Object*/ message){
+ // summary:
+ // Publish a message for this widget/topic
+ topic.publish(this.id, lang.mixin({tree: this, event: topicName}, message || {})); // publish
+ },
+
+ postMixInProperties: function(){
+ this.tree = this;
+
+ if(this.autoExpand){
+ // There's little point in saving opened/closed state of nodes for a Tree
+ // that initially opens all it's nodes.
+ this.persist = false;
+ }
+
+ this._itemNodesMap = {};
+
+ if(!this.cookieName && this.id){
+ this.cookieName = this.id + "SaveStateCookie";
+ }
+
+ // Deferred that fires when all the children have loaded.
+ this.expandChildrenDeferred = new Deferred();
+
+ // Deferred that fires when all pending operations complete.
+ this.pendingCommandsDeferred = this.expandChildrenDeferred;
+
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ this._initState();
+
+ // Catch events on TreeNodes
+ var self = this;
+ this.own(
+ on(this.domNode, on.selector(".dijitTreeNode", touch.enter), function(evt){
+ self._onNodeMouseEnter(registry.byNode(this), evt);
+ }),
+ on(this.domNode, on.selector(".dijitTreeNode", touch.leave), function(evt){
+ self._onNodeMouseLeave(registry.byNode(this), evt);
+ }),
+ on(this.domNode, on.selector(".dijitTreeNode", "click"), function(evt){
+ self._onClick(registry.byNode(this), evt);
+ }),
+ on(this.domNode, on.selector(".dijitTreeNode", "dblclick"), function(evt){
+ self._onDblClick(registry.byNode(this), evt);
+ }),
+ on(this.domNode, on.selector(".dijitTreeNode", "keypress"), function(evt){
+ self._onKeyPress(registry.byNode(this), evt);
+ }),
+ on(this.domNode, on.selector(".dijitTreeNode", "keydown"), function(evt){
+ self._onKeyDown(registry.byNode(this), evt);
+ }),
+ on(this.domNode, on.selector(".dijitTreeRow", "focusin"), function(evt){
+ self._onNodeFocus(registry.getEnclosingWidget(this), evt);
+ })
+ );
+
+ // Create glue between store and Tree, if not specified directly by user
+ if(!this.model){
+ this._store2model();
+ }
+
+ // monitor changes to items
+ this.connect(this.model, "onChange", "_onItemChange");
+ this.connect(this.model, "onChildrenChange", "_onItemChildrenChange");
+ this.connect(this.model, "onDelete", "_onItemDelete");
+
+ this.inherited(arguments);
+
+ if(this.dndController){
+ if(lang.isString(this.dndController)){
+ this.dndController = lang.getObject(this.dndController);
+ }
+ var params={};
+ for(var i=0; i<this.dndParams.length;i++){
+ if(this[this.dndParams[i]]){
+ params[this.dndParams[i]] = this[this.dndParams[i]];
+ }
+ }
+ this.dndController = new this.dndController(this, params);
+ }
+
+ this._load();
+
+ // If no path was specified to the constructor, use path saved in cookie
+ if(!this.params.path && !this.params.paths && this.persist){
+ this.set("paths", this.dndController._getSavedPaths());
+ }
+
+ // onLoadDeferred should fire when all commands that are part of initialization have completed.
+ // It will include all the set("paths", ...) commands that happen during initialization.
+ this.onLoadDeferred = this.pendingCommandsDeferred;
+
+ this.onLoadDeferred.then(lang.hitch(this, "onLoad"));
+ },
+
+ _store2model: function(){
+ // summary:
+ // User specified a store&query rather than model, so create model from store/query
+ this._v10Compat = true;
+ kernel.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");
+
+ var modelParams = {
+ id: this.id + "_ForestStoreModel",
+ store: this.store,
+ query: this.query,
+ childrenAttrs: this.childrenAttr
+ };
+
+ // Only override the model's mayHaveChildren() method if the user has specified an override
+ if(this.params.mayHaveChildren){
+ modelParams.mayHaveChildren = lang.hitch(this, "mayHaveChildren");
+ }
+
+ if(this.params.getItemChildren){
+ modelParams.getChildren = lang.hitch(this, function(item, onComplete, onError){
+ this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError);
+ });
+ }
+ this.model = new ForestStoreModel(modelParams);
+
+ // For backwards compatibility, the visibility of the root node is controlled by
+ // whether or not the user has specified a label
+ this.showRoot = Boolean(this.label);
+ },
+
+ onLoad: function(){
+ // summary:
+ // Called when tree finishes loading and expanding.
+ // description:
+ // If persist == true the loading may encompass many levels of fetches
+ // from the data store, each asynchronous. Waits for all to finish.
+ // tags:
+ // callback
+ },
+
+ _load: function(){
+ // summary:
+ // Initial load of the tree.
+ // Load root node (possibly hidden) and it's children.
+ this.model.getRoot(
+ lang.hitch(this, function(item){
+ var rn = (this.rootNode = this.tree._createTreeNode({
+ item: item,
+ tree: this,
+ isExpandable: true,
+ label: this.label || this.getLabel(item),
+ textDir: this.textDir,
+ indent: this.showRoot ? 0 : -1
+ }));
+
+ if(!this.showRoot){
+ rn.rowNode.style.display="none";
+ // if root is not visible, move tree role to the invisible
+ // root node's containerNode, see #12135
+ this.domNode.setAttribute("role", "presentation");
+ this.domNode.removeAttribute("aria-expanded");
+ this.domNode.removeAttribute("aria-multiselectable");
+
+ rn.labelNode.setAttribute("role", "presentation");
+ rn.containerNode.setAttribute("role", "tree");
+ rn.containerNode.setAttribute("aria-expanded","true");
+ rn.containerNode.setAttribute("aria-multiselectable", !this.dndController.singular);
+ }else{
+ this.domNode.setAttribute("aria-multiselectable", !this.dndController.singular);
+ }
+
+ this.domNode.appendChild(rn.domNode);
+ var identity = this.model.getIdentity(item);
+ if(this._itemNodesMap[identity]){
+ this._itemNodesMap[identity].push(rn);
+ }else{
+ this._itemNodesMap[identity] = [rn];
+ }
+
+ rn._updateLayout(); // sets "dijitTreeIsRoot" CSS classname
+
+ // Load top level children, and if persist==true, all nodes that were previously opened
+ this._expandNode(rn).then(lang.hitch(this, function(){
+ // Then, select the nodes that were selected last time, or
+ // the ones specified by params.paths[].
+
+ this.expandChildrenDeferred.resolve(true);
+ }));
+ }),
+ lang.hitch(this, function(err){
+ console.error(this, ": error loading root: ", err);
+ })
+ );
+ },
+
+ getNodesByItem: function(/*Item or id*/ item){
+ // summary:
+ // Returns all tree nodes that refer to an item
+ // returns:
+ // Array of tree nodes that refer to passed item
+
+ if(!item){ return []; }
+ var identity = lang.isString(item) ? item : this.model.getIdentity(item);
+ // return a copy so widget don't get messed up by changes to returned array
+ return [].concat(this._itemNodesMap[identity]);
+ },
+
+ _setSelectedItemAttr: function(/*Item or id*/ item){
+ this.set('selectedItems', [item]);
+ },
+
+ _setSelectedItemsAttr: function(/*Items or ids*/ items){
+ // summary:
+ // Select tree nodes related to passed items.
+ // WARNING: if model use multi-parented items or desired tree node isn't already loaded
+ // behavior is undefined. Use set('paths', ...) instead.
+ var tree = this;
+ return this.pendingCommandsDeferred = this.pendingCommandsDeferred.then( lang.hitch(this, function(){
+ var identities = array.map(items, function(item){
+ return (!item || lang.isString(item)) ? item : tree.model.getIdentity(item);
+ });
+ var nodes = [];
+ array.forEach(identities, function(id){
+ nodes = nodes.concat(tree._itemNodesMap[id] || []);
+ });
+ this.set('selectedNodes', nodes);
+ }));
+ },
+
+ _setPathAttr: function(/*Item[]|String[]*/ path){
+ // summary:
+ // Singular variant of _setPathsAttr
+ if(path.length){
+ return this.set("paths", [path]);
+ }else{
+ // Empty list is interpreted as "select nothing"
+ return this.set("paths", []);
+ }
+ },
+
+ _setPathsAttr: function(/*Item[][]|String[][]*/ paths){
+ // summary:
+ // Select the tree nodes identified by passed paths.
+ // paths:
+ // Array of arrays of items or item id's
+ // returns:
+ // Deferred to indicate when the set is complete
+
+ var tree = this;
+
+ // Let any previous set("path", ...) commands complete before this one starts.
+ return this.pendingCommandsDeferred = this.pendingCommandsDeferred.then(function(){
+ // We may need to wait for some nodes to expand, so setting
+ // each path will involve a Deferred. We bring those deferreds
+ // together with a DeferredList.
+ return new DeferredList(array.map(paths, function(path){
+ var d = new Deferred();
+
+ // normalize path to use identity
+ path = array.map(path, function(item){
+ return lang.isString(item) ? item : tree.model.getIdentity(item);
+ });
+
+ if(path.length){
+ // Wait for the tree to load, if it hasn't already.
+ selectPath(path, [tree.rootNode], d);
+ }else{
+ d.reject(new Tree.PathError("Empty path"));
+ }
+ return d;
+ }));
+ }).then(setNodes);
+
+ function selectPath(path, nodes, def){
+ // Traverse path; the next path component should be among "nodes".
+ var nextPath = path.shift();
+ var nextNode = array.filter(nodes, function(node){
+ return node.getIdentity() == nextPath;
+ })[0];
+ if(!!nextNode){
+ if(path.length){
+ tree._expandNode(nextNode).then(function(){ selectPath(path, nextNode.getChildren(), def); });
+ }else{
+ // Successfully reached the end of this path
+ def.resolve(nextNode);
+ }
+ }else{
+ def.reject(new Tree.PathError("Could not expand path at " + nextPath));
+ }
+ }
+
+ function setNodes(newNodes){
+ // After all expansion is finished, set the selection to
+ // the set of nodes successfully found.
+ tree.set("selectedNodes", array.map(
+ array.filter(newNodes,function(x){return x[0];}),
+ function(x){return x[1];}));
+ }
+ },
+
+ _setSelectedNodeAttr: function(node){
+ this.set('selectedNodes', [node]);
+ },
+ _setSelectedNodesAttr: function(nodes){
+ // summary:
+ // Marks the specified TreeNodes as selected.
+ // nodes: TreeNode[]
+ // TreeNodes to mark.
+ this.dndController.setSelection(nodes);
+ },
+
+
+ expandAll: function(){
+ // summary:
+ // Expand all nodes in the tree
+ // returns:
+ // Deferred that fires when all nodes have expanded
+
+ var _this = this;
+
+ function expand(node){
+ var def = new dojo.Deferred();
+
+ // Expand the node
+ _this._expandNode(node).then(function(){
+ // When node has expanded, call expand() recursively on each non-leaf child
+ var childBranches = array.filter(node.getChildren() || [], function(node){
+ return node.isExpandable;
+ }),
+ defs = array.map(childBranches, expand);
+
+ // And when all those recursive calls finish, signal that I'm finished
+ new dojo.DeferredList(defs).then(function(){
+ def.resolve(true);
+ });
+ });
+
+ return def;
+ }
+
+ return expand(this.rootNode);
+ },
+
+ collapseAll: function(){
+ // summary:
+ // Collapse all nodes in the tree
+ // returns:
+ // Deferred that fires when all nodes have collapsed
+
+ var _this = this;
+
+ function collapse(node){
+ var def = new dojo.Deferred();
+ def.label = "collapseAllDeferred";
+
+ // Collapse children first
+ var childBranches = array.filter(node.getChildren() || [], function(node){
+ return node.isExpandable;
+ }),
+ defs = array.map(childBranches, collapse);
+
+ // And when all those recursive calls finish, collapse myself, unless I'm the invisible root node,
+ // in which case collapseAll() is finished
+ new dojo.DeferredList(defs).then(function(){
+ if(!node.isExpanded || (node == _this.rootNode && !_this.showRoot)){
+ def.resolve(true);
+ }else{
+ _this._collapseNode(node).then(function(){
+ // When node has collapsed, signal that call is finished
+ def.resolve(true);
+ });
+ }
+ });
+
+
+ return def;
+ }
+
+ return collapse(this.rootNode);
+ },
+
+ ////////////// Data store related functions //////////////////////
+ // These just get passed to the model; they are here for back-compat
+
+ mayHaveChildren: function(/*dojo/data/Item*/ /*===== item =====*/){
+ // summary:
+ // Deprecated. This should be specified on the model itself.
+ //
+ // Overridable function to tell if an item has or may have children.
+ // Controls whether or not +/- expando icon is shown.
+ // (For efficiency reasons we may not want to check if an element actually
+ // has children until user clicks the expando node)
+ // tags:
+ // deprecated
+ },
+
+ getItemChildren: function(/*===== parentItem, onComplete =====*/){
+ // summary:
+ // Deprecated. This should be specified on the model itself.
+ //
+ // Overridable function that return array of child items of given parent item,
+ // or if parentItem==null then return top items in tree
+ // tags:
+ // deprecated
+ },
+
+ ///////////////////////////////////////////////////////
+ // Functions for converting an item to a TreeNode
+ getLabel: function(/*dojo/data/Item*/ item){
+ // summary:
+ // Overridable function to get the label for a tree node (given the item)
+ // tags:
+ // extension
+ return this.model.getLabel(item); // String
+ },
+
+ getIconClass: function(/*dojo/data/Item*/ item, /*Boolean*/ opened){
+ // summary:
+ // Overridable function to return CSS class name to display icon
+ // tags:
+ // extension
+ return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf"
+ },
+
+ getLabelClass: function(/*===== item, opened =====*/){
+ // summary:
+ // Overridable function to return CSS class name to display label
+ // item: dojo/data/Item
+ // opened: Boolean
+ // returns: String
+ // CSS class name
+ // tags:
+ // extension
+ },
+
+ getRowClass: function(/*===== item, opened =====*/){
+ // summary:
+ // Overridable function to return CSS class name to display row
+ // item: dojo/data/Item
+ // opened: Boolean
+ // returns: String
+ // CSS class name
+ // tags:
+ // extension
+ },
+
+ getIconStyle: function(/*===== item, opened =====*/){
+ // summary:
+ // Overridable function to return CSS styles to display icon
+ // item: dojo/data/Item
+ // opened: Boolean
+ // returns: Object
+ // Object suitable for input to dojo.style() like {backgroundImage: "url(...)"}
+ // tags:
+ // extension
+ },
+
+ getLabelStyle: function(/*===== item, opened =====*/){
+ // summary:
+ // Overridable function to return CSS styles to display label
+ // item: dojo/data/Item
+ // opened: Boolean
+ // returns:
+ // Object suitable for input to dojo.style() like {color: "red", background: "green"}
+ // tags:
+ // extension
+ },
+
+ getRowStyle: function(/*===== item, opened =====*/){
+ // summary:
+ // Overridable function to return CSS styles to display row
+ // item: dojo/data/Item
+ // opened: Boolean
+ // returns:
+ // Object suitable for input to dojo.style() like {background-color: "#bbb"}
+ // tags:
+ // extension
+ },
+
+ getTooltip: function(/*dojo/data/Item*/ /*===== item =====*/){
+ // summary:
+ // Overridable function to get the tooltip for a tree node (given the item)
+ // tags:
+ // extension
+ return ""; // String
+ },
+
+ /////////// Keyboard and Mouse handlers ////////////////////
+
+ _onKeyPress: function(/*TreeNode*/ treeNode, /*Event*/ e){
+ // summary:
+ // Handles keystrokes for printable keys, doing search navigation
+
+ if(e.charCode <= 32){
+ // Avoid duplicate events on firefox (this is an arrow key that will be handled by keydown handler)
+ return;
+ }
+
+ if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
+ var c = String.fromCharCode(e.charCode);
+ this._onLetterKeyNav( { node: treeNode, key: c.toLowerCase() } );
+ event.stop(e);
+ }
+ },
+
+ _onKeyDown: function(/*TreeNode*/ treeNode, /*Event*/ e){
+ // summary:
+ // Handles arrow, space, and enter keys
+
+ var key = e.keyCode;
+
+ var map = this._keyHandlerMap;
+ if(!map){
+ // Setup table mapping keys to events.
+ // On WebKit based browsers, the combination ctrl-enter does not get passed through. To allow accessible
+ // multi-select on those browsers, the space key is also used for selection.
+ // Therefore, also allow space key for keyboard "click" operation.
+ map = {};
+ map[keys.ENTER] = map[keys.SPACE] = map[" "] = "_onEnterKey";
+ map[this.isLeftToRight() ? keys.LEFT_ARROW : keys.RIGHT_ARROW] = "_onLeftArrow";
+ map[this.isLeftToRight() ? keys.RIGHT_ARROW : keys.LEFT_ARROW] = "_onRightArrow";
+ map[keys.UP_ARROW] = "_onUpArrow";
+ map[keys.DOWN_ARROW] = "_onDownArrow";
+ map[keys.HOME] = "_onHomeKey";
+ map[keys.END] = "_onEndKey";
+ this._keyHandlerMap = map;
+ }
+
+ if(this._keyHandlerMap[key]){
+ // clear record of recent printables (being saved for multi-char letter navigation),
+ // because "a", down-arrow, "b" shouldn't search for "ab"
+ if(this._curSearch){
+ this._curSearch.timer.remove();
+ delete this._curSearch;
+ }
+
+ this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item, evt: e } );
+ event.stop(e);
+ }
+ },
+
+ _onEnterKey: function(/*Object*/ message){
+ this._publish("execute", { item: message.item, node: message.node } );
+ this.dndController.userSelect(message.node, connect.isCopyKey( message.evt ), message.evt.shiftKey);
+ this.onClick(message.item, message.node, message.evt);
+ },
+
+ _onDownArrow: function(/*Object*/ message){
+ // summary:
+ // down arrow pressed; get next visible node, set focus there
+ var node = this._getNextNode(message.node);
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ },
+
+ _onUpArrow: function(/*Object*/ message){
+ // summary:
+ // Up arrow pressed; move to previous visible node
+
+ var node = message.node;
+
+ // if younger siblings
+ var previousSibling = node.getPreviousSibling();
+ if(previousSibling){
+ node = previousSibling;
+ // if the previous node is expanded, dive in deep
+ while(node.isExpandable && node.isExpanded && node.hasChildren()){
+ // move to the last child
+ var children = node.getChildren();
+ node = children[children.length-1];
+ }
+ }else{
+ // if this is the first child, return the parent
+ // unless the parent is the root of a tree with a hidden root
+ var parent = node.getParent();
+ if(!(!this.showRoot && parent === this.rootNode)){
+ node = parent;
+ }
+ }
+
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ },
+
+ _onRightArrow: function(/*Object*/ message){
+ // summary:
+ // Right arrow pressed; go to child node
+ var node = message.node;
+
+ // if not expanded, expand, else move to 1st child
+ if(node.isExpandable && !node.isExpanded){
+ this._expandNode(node);
+ }else if(node.hasChildren()){
+ node = node.getChildren()[0];
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ }
+ },
+
+ _onLeftArrow: function(/*Object*/ message){
+ // summary:
+ // Left arrow pressed.
+ // If not collapsed, collapse, else move to parent.
+
+ var node = message.node;
+
+ if(node.isExpandable && node.isExpanded){
+ this._collapseNode(node);
+ }else{
+ var parent = node.getParent();
+ if(parent && parent.isTreeNode && !(!this.showRoot && parent === this.rootNode)){
+ this.focusNode(parent);
+ }
+ }
+ },
+
+ _onHomeKey: function(){
+ // summary:
+ // Home key pressed; get first visible node, and set focus there
+ var node = this._getRootOrFirstNode();
+ if(node){
+ this.focusNode(node);
+ }
+ },
+
+ _onEndKey: function(){
+ // summary:
+ // End key pressed; go to last visible node.
+
+ var node = this.rootNode;
+ while(node.isExpanded){
+ var c = node.getChildren();
+ node = c[c.length - 1];
+ }
+
+ if(node && node.isTreeNode){
+ this.focusNode(node);
+ }
+ },
+
+ // multiCharSearchDuration: Number
+ // If multiple characters are typed where each keystroke happens within
+ // multiCharSearchDuration of the previous keystroke,
+ // search for nodes matching all the keystrokes.
+ //
+ // For example, typing "ab" will search for entries starting with
+ // "ab" unless the delay between "a" and "b" is greater than multiCharSearchDuration.
+ multiCharSearchDuration: 250,
+
+ _onLetterKeyNav: function(message){
+ // summary:
+ // Called when user presses a prinatable key; search for node starting with recently typed letters.
+ // message: Object
+ // Like { node: TreeNode, key: 'a' } where key is the key the user pressed.
+
+ // Branch depending on whether this key starts a new search, or modifies an existing search
+ var cs = this._curSearch;
+ if(cs){
+ // We are continuing a search. Ex: user has pressed 'a', and now has pressed
+ // 'b', so we want to search for nodes starting w/"ab".
+ cs.pattern = cs.pattern + message.key;
+ cs.timer.remove();
+ }else{
+ // We are starting a new search
+ cs = this._curSearch = {
+ pattern: message.key,
+ startNode: message.node
+ };
+ }
+
+ // set/reset timer to forget recent keystrokes
+ cs.timer = this.defer(function(){
+ delete this._curSearch;
+ }, this.multiCharSearchDuration);
+
+ // Navigate to TreeNode matching keystrokes [entered so far].
+ var node = cs.startNode;
+ do{
+ node = this._getNextNode(node);
+ //check for last node, jump to first node if necessary
+ if(!node){
+ node = this._getRootOrFirstNode();
+ }
+ }while(node !== cs.startNode && (node.label.toLowerCase().substr(0, cs.pattern.length) != cs.pattern));
+ if(node && node.isTreeNode){
+ // no need to set focus if back where we started
+ if(node !== cs.startNode){
+ this.focusNode(node);
+ }
+ }
+ },
+
+ isExpandoNode: function(node, widget){
+ // summary:
+ // check whether a dom node is the expandoNode for a particular TreeNode widget
+ return dom.isDescendant(node, widget.expandoNode) || dom.isDescendant(node, widget.expandoNodeText);
+ },
+
+ _onClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
+ // summary:
+ // Translates click events into commands for the controller to process
+
+ var domElement = e.target,
+ isExpandoClick = this.isExpandoNode(domElement, nodeWidget);
+
+ if( (this.openOnClick && nodeWidget.isExpandable) || isExpandoClick ){
+ // expando node was clicked, or label of a folder node was clicked; open it
+ if(nodeWidget.isExpandable){
+ this._onExpandoClick({node:nodeWidget});
+ }
+ }else{
+ this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e } );
+ this.onClick(nodeWidget.item, nodeWidget, e);
+ this.focusNode(nodeWidget);
+ }
+ event.stop(e);
+ },
+ _onDblClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
+ // summary:
+ // Translates double-click events into commands for the controller to process
+
+ var domElement = e.target,
+ isExpandoClick = (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText);
+
+ if( (this.openOnDblClick && nodeWidget.isExpandable) ||isExpandoClick ){
+ // expando node was clicked, or label of a folder node was clicked; open it
+ if(nodeWidget.isExpandable){
+ this._onExpandoClick({node:nodeWidget});
+ }
+ }else{
+ this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e } );
+ this.onDblClick(nodeWidget.item, nodeWidget, e);
+ this.focusNode(nodeWidget);
+ }
+ event.stop(e);
+ },
+
+ _onExpandoClick: function(/*Object*/ message){
+ // summary:
+ // User clicked the +/- icon; expand or collapse my children.
+ var node = message.node;
+
+ // If we are collapsing, we might be hiding the currently focused node.
+ // Also, clicking the expando node might have erased focus from the current node.
+ // For simplicity's sake just focus on the node with the expando.
+ this.focusNode(node);
+
+ if(node.isExpanded){
+ this._collapseNode(node);
+ }else{
+ this._expandNode(node);
+ }
+ },
+
+ onClick: function(/*===== item, node, evt =====*/){
+ // summary:
+ // Callback when a tree node is clicked
+ // item: Object
+ // Object from the dojo/store corresponding to this TreeNode
+ // node: TreeNode
+ // The TreeNode itself
+ // evt: Event
+ // The event
+ // tags:
+ // callback
+ },
+ onDblClick: function(/*===== item, node, evt =====*/){
+ // summary:
+ // Callback when a tree node is double-clicked
+ // item: Object
+ // Object from the dojo/store corresponding to this TreeNode
+ // node: TreeNode
+ // The TreeNode itself
+ // evt: Event
+ // The event
+ // tags:
+ // callback
+ },
+ onOpen: function(/*===== item, node =====*/){
+ // summary:
+ // Callback when a node is opened
+ // item: dojo/data/Item
+ // node: TreeNode
+ // tags:
+ // callback
+ },
+ onClose: function(/*===== item, node =====*/){
+ // summary:
+ // Callback when a node is closed
+ // item: Object
+ // Object from the dojo/store corresponding to this TreeNode
+ // node: TreeNode
+ // The TreeNode itself
+ // tags:
+ // callback
+ },
+
+ _getNextNode: function(node){
+ // summary:
+ // Get next visible node
+
+ if(node.isExpandable && node.isExpanded && node.hasChildren()){
+ // if this is an expanded node, get the first child
+ return node.getChildren()[0]; // TreeNode
+ }else{
+ // find a parent node with a sibling
+ while(node && node.isTreeNode){
+ var returnNode = node.getNextSibling();
+ if(returnNode){
+ return returnNode; // TreeNode
+ }
+ node = node.getParent();
+ }
+ return null;
+ }
+ },
+
+ _getRootOrFirstNode: function(){
+ // summary:
+ // Get first visible node
+ return this.showRoot ? this.rootNode : this.rootNode.getChildren()[0];
+ },
+
+ _collapseNode: function(/*TreeNode*/ node){
+ // summary:
+ // Called when the user has requested to collapse the node
+ // returns:
+ // Deferred that fires when the node is closed
+
+ if(node._expandNodeDeferred){
+ delete node._expandNodeDeferred;
+ }
+
+ if(node.state == "LOADING"){
+ // ignore clicks while we are in the process of loading data
+ return;
+ }
+
+ if(node.isExpanded){
+ var ret = node.collapse();
+
+ this.onClose(node.item, node);
+ this._state(node, false);
+
+ this._startPaint(ret); // after this finishes, need to reset widths of TreeNodes
+
+ return ret;
+ }
+ },
+
+ _expandNode: function(/*TreeNode*/ node){
+ // summary:
+ // Called when the user has requested to expand the node
+ // returns:
+ // Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants
+ // that were previously opened too
+
+ // Signal that this call is complete
+ var def = new Deferred();
+
+ if(node._expandNodeDeferred){
+ // there's already an expand in progress, or completed, so just return
+ return node._expandNodeDeferred; // dojo/_base/Deferred
+ }
+
+ var model = this.model,
+ item = node.item,
+ _this = this;
+
+ // Load data if it's not already loaded
+ if(!node._loadDeferred){
+ // need to load all the children before expanding
+ node.markProcessing();
+
+ // Setup deferred to signal when the load and expand are finished.
+ // Save that deferred in this._expandDeferred as a flag that operation is in progress.
+ node._loadDeferred = new Deferred();
+
+ // Get the children
+ model.getChildren(
+ item,
+ function(items){
+ node.unmarkProcessing();
+
+ // Display the children and also start expanding any children that were previously expanded
+ // (if this.persist == true). The returned Deferred will fire when those expansions finish.
+ node.setChildItems(items).then(function(){
+ node._loadDeferred.resolve(items);
+ });
+ },
+ function(err){
+ console.error(_this, ": error loading " + node.label + " children: ", err);
+ node._loadDeferred.reject(err);
+ }
+ );
+ }
+
+ // Expand the node after data has loaded
+ node._loadDeferred.then(lang.hitch(this, function(){
+ node.expand().then(function(){
+ def.resolve(true); // signal that this _expandNode() call is complete
+ });
+
+ // seems like these should be inside of then(), but left here for back-compat about
+ // when this.isOpen flag gets set (ie, at the beginning of the animation)
+ this.onOpen(node.item, node);
+ this._state(node, true);
+ }));
+
+ this._startPaint(def); // after this finishes, need to reset widths of TreeNodes
+
+ return def; // dojo/_base/Deferred
+ },
+
+ ////////////////// Miscellaneous functions ////////////////
+
+ focusNode: function(/* _tree.Node */ node){
+ // summary:
+ // Focus on the specified node (which must be visible)
+ // tags:
+ // protected
+
+ // set focus so that the label will be voiced using screen readers
+ focus.focus(node.labelNode);
+ },
+
+ _onNodeFocus: function(/*dijit/_WidgetBase*/ node){
+ // summary:
+ // Called when a TreeNode gets focus, either by user clicking
+ // it, or programatically by arrow key handling code.
+ // description:
+ // It marks that the current node is the selected one, and the previously
+ // selected node no longer is.
+
+ if(node && node != this.lastFocused){
+ if(this.lastFocused && !this.lastFocused._destroyed){
+ // mark that the previously focsable node is no longer focusable
+ this.lastFocused.setFocusable(false);
+ }
+
+ // mark that the new node is the currently selected one
+ node.setFocusable(true);
+ this.lastFocused = node;
+ }
+ },
+
+ _onNodeMouseEnter: function(/*dijit/_WidgetBase*/ /*===== node =====*/){
+ // summary:
+ // Called when mouse is over a node (onmouseenter event),
+ // this is monitored by the DND code
+ },
+
+ _onNodeMouseLeave: function(/*dijit/_WidgetBase*/ /*===== node =====*/){
+ // summary:
+ // Called when mouse leaves a node (onmouseleave event),
+ // this is monitored by the DND code
+ },
+
+ //////////////// Events from the model //////////////////////////
+
+ _onItemChange: function(/*Item*/ item){
+ // summary:
+ // Processes notification of a change to an item's scalar values like label
+ var model = this.model,
+ identity = model.getIdentity(item),
+ nodes = this._itemNodesMap[identity];
+
+ if(nodes){
+ var label = this.getLabel(item),
+ tooltip = this.getTooltip(item);
+ array.forEach(nodes, function(node){
+ node.set({
+ item: item, // theoretically could be new JS Object representing same item
+ label: label,
+ tooltip: tooltip
+ });
+ node._updateItemClasses(item);
+ });
+ }
+ },
+
+ _onItemChildrenChange: function(/*dojo/data/Item*/ parent, /*dojo/data/Item[]*/ newChildrenList){
+ // summary:
+ // Processes notification of a change to an item's children
+ var model = this.model,
+ identity = model.getIdentity(parent),
+ parentNodes = this._itemNodesMap[identity];
+
+ if(parentNodes){
+ array.forEach(parentNodes,function(parentNode){
+ parentNode.setChildItems(newChildrenList);
+ });
+ }
+ },
+
+ _onItemDelete: function(/*Item*/ item){
+ // summary:
+ // Processes notification of a deletion of an item.
+ // Not called from new dojo.store interface but there's cleanup code in setChildItems() instead.
+
+ var model = this.model,
+ identity = model.getIdentity(item),
+ nodes = this._itemNodesMap[identity];
+
+ if(nodes){
+ array.forEach(nodes,function(node){
+ // Remove node from set of selected nodes (if it's selected)
+ this.dndController.removeTreeNode(node);
+
+ var parent = node.getParent();
+ if(parent){
+ // if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
+ parent.removeChild(node);
+ }
+ node.destroyRecursive();
+ }, this);
+ delete this._itemNodesMap[identity];
+ }
+ },
+
+ /////////////// Miscellaneous funcs
+
+ _initState: function(){
+ // summary:
+ // Load in which nodes should be opened automatically
+ this._openedNodes = {};
+ if(this.persist && this.cookieName){
+ var oreo = cookie(this.cookieName);
+ if(oreo){
+ array.forEach(oreo.split(','), function(item){
+ this._openedNodes[item] = true;
+ }, this);
+ }
+ }
+ },
+ _state: function(node, expanded){
+ // summary:
+ // Query or set expanded state for an node
+ if(!this.persist){
+ return false;
+ }
+ var path = array.map(node.getTreePath(), function(item){
+ return this.model.getIdentity(item);
+ }, this).join("/");
+ if(arguments.length === 1){
+ return this._openedNodes[path];
+ }else{
+ if(expanded){
+ this._openedNodes[path] = true;
+ }else{
+ delete this._openedNodes[path];
+ }
+ if(this.persist && this.cookieName){
+ var ary = [];
+ for(var id in this._openedNodes){
+ ary.push(id);
+ }
+ cookie(this.cookieName, ary.join(","), {expires:365});
+ }
+ }
+ },
+
+ destroy: function(){
+ if(this._curSearch){
+ this._curSearch.timer.remove();
+ delete this._curSearch;
+ }
+ if(this.rootNode){
+ this.rootNode.destroyRecursive();
+ }
+ if(this.dndController && !lang.isString(this.dndController)){
+ this.dndController.destroy();
+ }
+ this.rootNode = null;
+ this.inherited(arguments);
+ },
+
+ destroyRecursive: function(){
+ // A tree is treated as a leaf, not as a node with children (like a grid),
+ // but defining destroyRecursive for back-compat.
+ this.destroy();
+ },
+
+ resize: function(changeSize){
+ if(changeSize){
+ domGeometry.setMarginBox(this.domNode, changeSize);
+ }
+
+ // The main JS sizing involved w/tree is the indentation, which is specified
+ // in CSS and read in through this dummy indentDetector node (tree must be
+ // visible and attached to the DOM to read this).
+ // If the Tree is hidden domGeometry.position(this.tree.indentDetector).w will return 0, in which case just
+ // keep the default value.
+ this._nodePixelIndent = domGeometry.position(this.tree.indentDetector).w || this._nodePixelIndent;
+
+ // resize() may be called before this.rootNode is created, so wait until it's available
+ this.expandChildrenDeferred.then(lang.hitch(this, function(){
+ // If tree has already loaded, then reset indent for all the nodes
+ this.rootNode.set('indent', this.showRoot ? 0 : -1);
+
+ // Also, adjust widths of all rows to match width of Tree
+ this._adjustWidths();
+ }));
+ },
+
+ _outstandingPaintOperations: 0,
+ _startPaint: function(/*Promise|Boolean*/ p){
+ // summary:
+ // Called at the start of an operation that will change what's displayed.
+ // p:
+ // Promise that tells when the operation will complete. Alternately, if it's just a Boolean, it signifies
+ // that the operation was synchronous, and already completed.
+
+ this._outstandingPaintOperations++;
+ if(this._adjustWidthsTimer){
+ this._adjustWidthsTimer.remove();
+ delete this._adjustWidthsTimer;
+ }
+
+ var oc = lang.hitch(this, function(){
+ this._outstandingPaintOperations--;
+
+ if(this._outstandingPaintOperations <= 0 && !this._adjustWidthsTimer && this._started){
+ // Use defer() to avoid a width adjustment when another operation will immediately follow,
+ // such as a sequence of opening a node, then it's children, then it's grandchildren, etc.
+ this._adjustWidthsTimer = this.defer("_adjustWidths");
+ }
+ });
+ when(p, oc, oc);
+ },
+
+ _adjustWidths: function(){
+ // summary:
+ // Get width of widest TreeNode, or the width of the Tree itself, whichever is greater,
+ // and then set all TreeNodes to that width, so that selection/hover highlighting
+ // extends to the edge of the Tree (#13141)
+
+ if(this._adjustWidthsTimer){
+ this._adjustWidthsTimer.remove();
+ delete this._adjustWidthsTimer;
+ }
+
+ var maxWidth = 0,
+ nodes = [];
+ function collect(/*TreeNode*/ parent){
+ var node = parent.rowNode;
+ node.style.width = "auto"; // erase setting from previous run
+ maxWidth = Math.max(maxWidth, node.clientWidth);
+ nodes.push(node);
+ if(parent.isExpanded){
+ array.forEach(parent.getChildren(), collect);
+ }
+ }
+ collect(this.rootNode);
+ maxWidth = Math.max(maxWidth, domGeometry.getContentBox(this.domNode).w); // do after node.style.width="auto"
+ array.forEach(nodes, function(node){
+ node.style.width = maxWidth + "px"; // assumes no horizontal padding, border, or margin on rowNode
+ });
+ },
+
+ _createTreeNode: function(/*Object*/ args){
+ // summary:
+ // creates a TreeNode
+ // description:
+ // Developers can override this method to define their own TreeNode class;
+ // However it will probably be removed in a future release in favor of a way
+ // of just specifying a widget for the label, rather than one that contains
+ // the children too.
+ return new TreeNode(args);
+ },
+
+ _setTextDirAttr: function(textDir){
+ if(textDir && this.textDir!= textDir){
+ this._set("textDir",textDir);
+ this.rootNode.set("textDir", textDir);
+ }
+ }
+});
+
+Tree.PathError = createError("TreePathError");
+Tree._TreeNode = TreeNode; // for monkey patching or creating subclasses of TreeNode
+
+return Tree;
+});
diff --git a/lib/dijit/Viewport.js b/lib/dijit/Viewport.js
new file mode 100644
index 000000000..15b4ba531
--- /dev/null
+++ b/lib/dijit/Viewport.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/Viewport",["dojo/Evented","dojo/on","dojo/ready","dojo/sniff","dojo/_base/window","dojo/window"],function(_1,on,_2,_3,_4,_5){var _6=new _1();_2(200,function(){var _7=_5.getBox();_6._rlh=on(_4.global,"resize",function(){var _8=_5.getBox();if(_7.h==_8.h&&_7.w==_8.w){return;}_7=_8;_6.emit("resize");});if(_3("ie")==8){var _9=screen.deviceXDPI;setInterval(function(){if(screen.deviceXDPI!=_9){_9=screen.deviceXDPI;_6.emit("resize");}},500);}});return _6;}); \ No newline at end of file
diff --git a/lib/dijit/Viewport.js.uncompressed.js b/lib/dijit/Viewport.js.uncompressed.js
new file mode 100644
index 000000000..8de455af2
--- /dev/null
+++ b/lib/dijit/Viewport.js.uncompressed.js
@@ -0,0 +1,50 @@
+define("dijit/Viewport", [
+ "dojo/Evented",
+ "dojo/on",
+ "dojo/ready",
+ "dojo/sniff",
+ "dojo/_base/window", // global
+ "dojo/window" // getBox()
+], function(Evented, on, ready, has, win, winUtils){
+
+ // module:
+ // dijit/Viewport
+
+ /*=====
+ return {
+ // summary:
+ // Utility singleton to watch for viewport resizes, avoiding duplicate notifications
+ // which can lead to infinite loops.
+ // description:
+ // Usage: Viewport.on("resize", myCallback).
+ //
+ // myCallback() is called without arguments in case it's _WidgetBase.resize(),
+ // which would interpret the argument as the size to make the widget.
+ };
+ =====*/
+
+ var Viewport = new Evented();
+
+ ready(200, function(){
+ var oldBox = winUtils.getBox();
+ Viewport._rlh = on(win.global, "resize", function(){
+ var newBox = winUtils.getBox();
+ if(oldBox.h == newBox.h && oldBox.w == newBox.w){ return; }
+ oldBox = newBox;
+ Viewport.emit("resize");
+ });
+
+ // Also catch zoom changes on IE8, since they don't naturally generate resize events
+ if(has("ie") == 8){
+ var deviceXDPI = screen.deviceXDPI;
+ setInterval(function(){
+ if(screen.deviceXDPI != deviceXDPI){
+ deviceXDPI = screen.deviceXDPI;
+ Viewport.emit("resize");
+ }
+ }, 500);
+ }
+ });
+
+ return Viewport;
+});
diff --git a/lib/dijit/WidgetSet.js b/lib/dijit/WidgetSet.js
index bb3a98353..4c5e8622d 100644
--- a/lib/dijit/WidgetSet.js
+++ b/lib/dijit/WidgetSet.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/WidgetSet",["dojo/_base/array","dojo/_base/declare","dojo/_base/window","./registry"],function(_1,_2,_3,_4){var _5=_2("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_6){if(this._hash[_6.id]){throw new Error("Tried to register widget with id=="+_6.id+" but that id is already registered");}this._hash[_6.id]=_6;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_7,_8){_8=_8||_3.global;var i=0,id;for(id in this._hash){_7.call(_8,this._hash[id],i++,this._hash);}return this;},filter:function(_9,_a){_a=_a||_3.global;var _b=new _5(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_9.call(_a,w,i++,this._hash)){_b.add(w);}}return _b;},byId:function(id){return this._hash[id];},byClass:function(_c){var _d=new _5(),id,_e;for(id in this._hash){_e=this._hash[id];if(_e.declaredClass==_c){_d.add(_e);}}return _d;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_f,_10){return _1.map(this.toArray(),_f,_10);},every:function(_11,_12){_12=_12||_3.global;var x=0,i;for(i in this._hash){if(!_11.call(_12,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_13,_14){_14=_14||_3.global;var x=0,i;for(i in this._hash){if(_13.call(_14,this._hash[i],x++,this._hash)){return true;}}return false;}});_1.forEach(["forEach","filter","byClass","map","every","some"],function(_15){_4[_15]=_5.prototype[_15];});return _5;}); \ No newline at end of file
+define("dijit/WidgetSet",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","./registry"],function(_1,_2,_3,_4){var _5=_2("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_6){if(this._hash[_6.id]){throw new Error("Tried to register widget with id=="+_6.id+" but that id is already registered");}this._hash[_6.id]=_6;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_7,_8){_8=_8||_3.global;var i=0,id;for(id in this._hash){_7.call(_8,this._hash[id],i++,this._hash);}return this;},filter:function(_9,_a){_a=_a||_3.global;var _b=new _5(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_9.call(_a,w,i++,this._hash)){_b.add(w);}}return _b;},byId:function(id){return this._hash[id];},byClass:function(_c){var _d=new _5(),id,_e;for(id in this._hash){_e=this._hash[id];if(_e.declaredClass==_c){_d.add(_e);}}return _d;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_f,_10){return _1.map(this.toArray(),_f,_10);},every:function(_11,_12){_12=_12||_3.global;var x=0,i;for(i in this._hash){if(!_11.call(_12,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_13,_14){_14=_14||_3.global;var x=0,i;for(i in this._hash){if(_13.call(_14,this._hash[i],x++,this._hash)){return true;}}return false;}});_1.forEach(["forEach","filter","byClass","map","every","some"],function(_15){_4[_15]=_5.prototype[_15];});return _5;}); \ No newline at end of file
diff --git a/lib/dijit/WidgetSet.js.uncompressed.js b/lib/dijit/WidgetSet.js.uncompressed.js
new file mode 100644
index 000000000..455db6a3e
--- /dev/null
+++ b/lib/dijit/WidgetSet.js.uncompressed.js
@@ -0,0 +1,247 @@
+define("dijit/WidgetSet", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.global
+ "./registry" // to add functions to dijit.registry
+], function(array, declare, kernel, registry){
+
+ // module:
+ // dijit/WidgetSet
+
+ var WidgetSet = declare("dijit.WidgetSet", null, {
+ // summary:
+ // A set of widgets indexed by id.
+ // Deprecated, will be removed in 2.0.
+ //
+ // example:
+ // Create a small list of widgets:
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | var ws = new WidgetSet();
+ // | ws.add(registry.byId("one"));
+ // | ws.add(registry.byId("two"));
+ // | // destroy both:
+ // | ws.forEach(function(w){ w.destroy(); });
+ // | });
+
+ constructor: function(){
+ this._hash = {};
+ this.length = 0;
+ },
+
+ add: function(/*dijit/_WidgetBase*/ widget){
+ // summary:
+ // Add a widget to this list. If a duplicate ID is detected, a error is thrown.
+ //
+ // widget: dijit/_WidgetBase
+ // Any dijit/_WidgetBase subclass.
+ if(this._hash[widget.id]){
+ throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
+ }
+ this._hash[widget.id] = widget;
+ this.length++;
+ },
+
+ remove: function(/*String*/ id){
+ // summary:
+ // Remove a widget from this WidgetSet. Does not destroy the widget; simply
+ // removes the reference.
+ if(this._hash[id]){
+ delete this._hash[id];
+ this.length--;
+ }
+ },
+
+ forEach: function(/*Function*/ func, /* Object? */thisObj){
+ // summary:
+ // Call specified function for each widget in this set.
+ //
+ // func:
+ // A callback function to run for each item. Is passed the widget, the index
+ // in the iteration, and the full hash, similar to `array.forEach`.
+ //
+ // thisObj:
+ // An optional scope parameter
+ //
+ // example:
+ // Using the default `dijit.registry` instance:
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | registry.forEach(function(widget){
+ // | console.log(widget.declaredClass);
+ // | });
+ // | });
+ //
+ // returns:
+ // Returns self, in order to allow for further chaining.
+
+ thisObj = thisObj || kernel.global;
+ var i = 0, id;
+ for(id in this._hash){
+ func.call(thisObj, this._hash[id], i++, this._hash);
+ }
+ return this; // dijit/WidgetSet
+ },
+
+ filter: function(/*Function*/ filter, /* Object? */thisObj){
+ // summary:
+ // Filter down this WidgetSet to a smaller new WidgetSet
+ // Works the same as `array.filter` and `NodeList.filter`
+ //
+ // filter:
+ // Callback function to test truthiness. Is passed the widget
+ // reference and the pseudo-index in the object.
+ //
+ // thisObj: Object?
+ // Option scope to use for the filter function.
+ //
+ // example:
+ // Arbitrary: select the odd widgets in this list
+ // |
+ // |
+ // |
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | registry.filter(function(w, i){
+ // | return i % 2 == 0;
+ // | }).forEach(function(w){ /* odd ones */ });
+ // | });
+
+ thisObj = thisObj || kernel.global;
+ var res = new WidgetSet(), i = 0, id;
+ for(id in this._hash){
+ var w = this._hash[id];
+ if(filter.call(thisObj, w, i++, this._hash)){
+ res.add(w);
+ }
+ }
+ return res; // dijit/WidgetSet
+ },
+
+ byId: function(/*String*/ id){
+ // summary:
+ // Find a widget in this list by it's id.
+ // example:
+ // Test if an id is in a particular WidgetSet
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | var ws = new WidgetSet();
+ // | ws.add(registry.byId("bar"));
+ // | var t = ws.byId("bar") // returns a widget
+ // | var x = ws.byId("foo"); // returns undefined
+ // | });
+
+ return this._hash[id]; // dijit/_WidgetBase
+ },
+
+ byClass: function(/*String*/ cls){
+ // summary:
+ // Reduce this widgetset to a new WidgetSet of a particular `declaredClass`
+ //
+ // cls: String
+ // The Class to scan for. Full dot-notated string.
+ //
+ // example:
+ // Find all `dijit.TitlePane`s in a page:
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
+ // | });
+
+ var res = new WidgetSet(), id, widget;
+ for(id in this._hash){
+ widget = this._hash[id];
+ if(widget.declaredClass == cls){
+ res.add(widget);
+ }
+ }
+ return res; // dijit/WidgetSet
+ },
+
+ toArray: function(){
+ // summary:
+ // Convert this WidgetSet into a true Array
+ //
+ // example:
+ // Work with the widget .domNodes in a real Array
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | array.map(registry.toArray(), function(w){ return w.domNode; });
+ // | });
+
+
+ var ar = [];
+ for(var id in this._hash){
+ ar.push(this._hash[id]);
+ }
+ return ar; // dijit/_WidgetBase[]
+ },
+
+ map: function(/* Function */func, /* Object? */thisObj){
+ // summary:
+ // Create a new Array from this WidgetSet, following the same rules as `array.map`
+ // example:
+ // | require(["dijit/WidgetSet", "dijit/registry"],
+ // | function(WidgetSet, registry){
+ // | var nodes = registry.map(function(w){ return w.domNode; });
+ // | });
+ //
+ // returns:
+ // A new array of the returned values.
+ return array.map(this.toArray(), func, thisObj); // Array
+ },
+
+ every: function(func, thisObj){
+ // summary:
+ // A synthetic clone of `array.every` acting explicitly on this WidgetSet
+ //
+ // func: Function
+ // A callback function run for every widget in this list. Exits loop
+ // when the first false return is encountered.
+ //
+ // thisObj: Object?
+ // Optional scope parameter to use for the callback
+
+ thisObj = thisObj || kernel.global;
+ var x = 0, i;
+ for(i in this._hash){
+ if(!func.call(thisObj, this._hash[i], x++, this._hash)){
+ return false; // Boolean
+ }
+ }
+ return true; // Boolean
+ },
+
+ some: function(func, thisObj){
+ // summary:
+ // A synthetic clone of `array.some` acting explicitly on this WidgetSet
+ //
+ // func: Function
+ // A callback function run for every widget in this list. Exits loop
+ // when the first true return is encountered.
+ //
+ // thisObj: Object?
+ // Optional scope parameter to use for the callback
+
+ thisObj = thisObj || kernel.global;
+ var x = 0, i;
+ for(i in this._hash){
+ if(func.call(thisObj, this._hash[i], x++, this._hash)){
+ return true; // Boolean
+ }
+ }
+ return false; // Boolean
+ }
+
+ });
+
+ // Add in 1.x compatibility methods to dijit/registry.
+ // These functions won't show up in the API doc but since they are deprecated anyway,
+ // that's probably for the best.
+ array.forEach(["forEach", "filter", "byClass", "map", "every", "some"], function(func){
+ registry[func] = WidgetSet.prototype[func];
+ });
+
+
+ return WidgetSet;
+});
diff --git a/lib/dijit/_BidiSupport.js b/lib/dijit/_BidiSupport.js
index e64895551..0176ea586 100644
--- a/lib/dijit/_BidiSupport.js
+++ b/lib/dijit/_BidiSupport.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_BidiSupport",["./_WidgetBase"],function(_1){_1.extend({getTextDir:function(_2){return this.textDir=="auto"?this._checkContextual(_2):this.textDir;},_checkContextual:function(_3){var _4=/[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(_3);return _4?(_4[0]<="z"?"ltr":"rtl"):this.dir?this.dir:this.isLeftToRight()?"ltr":"rtl";},applyTextDir:function(_5,_6){var _7=this.textDir=="auto"?this._checkContextual(_6):this.textDir;if(_5.dir!=_7){_5.dir=_7;}}});return _1;}); \ No newline at end of file
+define("dijit/_BidiSupport",["./_WidgetBase"],function(_1){_1.extend({getTextDir:function(_2){return this.textDir=="auto"?this._checkContextual(_2):this.textDir;},_checkContextual:function(_3){var _4=/[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(_3);return _4?(_4[0]<="z"?"ltr":"rtl"):this.dir?this.dir:this.isLeftToRight()?"ltr":"rtl";},applyTextDir:function(_5,_6){var _7=this.textDir=="auto"?this._checkContextual(_6):this.textDir;if(_5.dir!=_7){_5.dir=_7;}},enforceTextDirWithUcc:function(_8,_9){if(this.textDir){_8.originalText=_9;var _a=this.textDir=="auto"?this._checkContextual(_9):this.textDir;return (_a=="ltr"?_b.LRE:_b.RLE)+_9+_b.PDF;}return _9;},restoreOriginalText:function(_c){if(_c.originalText){_c.text=_c.originalText;delete _c.originalText;}return _c;}});var _b={LRM:"‎",LRE:"‪",PDF:"‬",RLM:"‏",RLE:"‫"};return _1;}); \ No newline at end of file
diff --git a/lib/dijit/_BidiSupport.js.uncompressed.js b/lib/dijit/_BidiSupport.js.uncompressed.js
new file mode 100644
index 000000000..4a43c1f06
--- /dev/null
+++ b/lib/dijit/_BidiSupport.js.uncompressed.js
@@ -0,0 +1,113 @@
+define("dijit/_BidiSupport", ["./_WidgetBase"], function(_WidgetBase){
+
+ // module:
+ // dijit/_BidiSupport
+
+ /*=====
+ return function(){
+ // summary:
+ // Module that deals with BIDI, special with the auto
+ // direction if needed without changing the GUI direction.
+ // Including this module will extend _WidgetBase with BIDI related methods.
+ // description:
+ // There's a special need for displaying BIDI text in rtl direction
+ // in ltr GUI, sometimes needed auto support.
+ // In creation of widget, if it's want to activate this class,
+ // the widget should define the "textDir".
+ };
+ =====*/
+
+ _WidgetBase.extend({
+
+ getTextDir: function(/*String*/ text){
+ // summary:
+ // Gets the right direction of text.
+ // description:
+ // If textDir is ltr or rtl returns the value.
+ // If it's auto, calls to another function that responsible
+ // for checking the value, and defining the direction.
+ // tags:
+ // protected.
+ return this.textDir == "auto" ? this._checkContextual(text) : this.textDir;
+ },
+
+ _checkContextual: function(text){
+ // summary:
+ // Finds the first strong (directional) character, return ltr if isLatin
+ // or rtl if isBidiChar.
+ // tags:
+ // private.
+
+ // look for strong (directional) characters
+ var fdc = /[A-Za-z\u05d0-\u065f\u066a-\u06ef\u06fa-\u07ff\ufb1d-\ufdff\ufe70-\ufefc]/.exec(text);
+ // if found return the direction that defined by the character, else return widgets dir as defult.
+ return fdc ? ( fdc[0] <= 'z' ? "ltr" : "rtl" ) : this.dir ? this.dir : this.isLeftToRight() ? "ltr" : "rtl";
+ },
+
+ applyTextDir: function(/*Object*/ element, /*String*/ text){
+ // summary:
+ // Set element.dir according to this.textDir
+ // element:
+ // The text element to be set. Should have dir property.
+ // text:
+ // Used in case this.textDir is "auto", for calculating the right transformation
+ // description:
+ // If textDir is ltr or rtl returns the value.
+ // If it's auto, calls to another function that responsible
+ // for checking the value, and defining the direction.
+ // tags:
+ // protected.
+
+ var textDir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir;
+ // update only when there's a difference
+ if(element.dir != textDir){
+ element.dir = textDir;
+ }
+ },
+ enforceTextDirWithUcc: function(option, text){
+ // summary:
+ // Wraps by UCC (Unicode control characters) option's text according to this.textDir
+ // option:
+ // The element (`<option>`) we wrapping the text for.
+ // text:
+ // The text to be wrapped.
+ // description:
+ // There's a dir problem with some HTML elements. For some elements (e.g. `<option>`, `<select>`)
+ // defining the dir in different direction then the GUI orientation, won't display correctly.
+ // FF 3.6 will change the alignment of the text in option - this doesn't follow the bidi standards (static text
+ // should be aligned following GUI direction). IE8 and Opera11.10 completely ignore dir setting for `<option>`.
+ // Therefore the only solution is to use UCC (Unicode control characters) to display the text in correct orientation.
+ // This function saves the original text value for later restoration if needed, for example if the textDir will change etc.
+ if(this.textDir){
+ option.originalText = text;
+ var dir = this.textDir == "auto" ? this._checkContextual(text) : this.textDir;
+ return (dir == "ltr" ? bidi_const.LRE : bidi_const.RLE ) + text + bidi_const.PDF;
+ }
+ return text;
+ },
+ restoreOriginalText: function(origObj){
+ // summary:
+ // Restores the text of origObj, if needed, after enforceTextDirWithUcc, e.g. set("textDir", textDir).
+ // origObj:
+ // The element (`<option>`) to restore.
+ // description:
+ // Sets the text of origObj to origObj.originalText, which is the original text, without the UCCs.
+ // The function than removes the originalText from origObj!
+ if(origObj.originalText){
+ origObj.text = origObj.originalText;
+ delete origObj.originalText;
+ }
+ return origObj;
+ }
+ });
+
+ // UCC - constants that will be used by bidi support.
+ var bidi_const = {
+ LRM : '\u200E',
+ LRE : '\u202A',
+ PDF : '\u202C',
+ RLM : '\u200f',
+ RLE : '\u202B'
+ };
+ return _WidgetBase;
+});
diff --git a/lib/dijit/_Calendar.js b/lib/dijit/_Calendar.js
index 2e4d78e3e..a2d7e48d8 100644
--- a/lib/dijit/_Calendar.js
+++ b/lib/dijit/_Calendar.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_Calendar",["dojo/_base/kernel","./Calendar","."],function(_1,_2,_3){_1.deprecated("dijit._Calendar is deprecated","dijit._Calendar moved to dijit.Calendar",2);_3._Calendar=_2;}); \ No newline at end of file
+define("dijit/_Calendar",["dojo/_base/kernel","./Calendar","./main"],function(_1,_2,_3){_1.deprecated("dijit._Calendar is deprecated","dijit._Calendar moved to dijit.Calendar",2);_3._Calendar=_2;}); \ No newline at end of file
diff --git a/lib/dijit/_Calendar.js.uncompressed.js b/lib/dijit/_Calendar.js.uncompressed.js
new file mode 100644
index 000000000..e1c1bb38c
--- /dev/null
+++ b/lib/dijit/_Calendar.js.uncompressed.js
@@ -0,0 +1,22 @@
+define("dijit/_Calendar", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "./Calendar",
+ "./main" // for exporting dijit.Calendar
+], function(kernel, Calendar, dijit){
+
+ // module:
+ // dijit/_Calendar
+
+ /*=====
+ return {
+ // summary:
+ // Deprecated widget, used dijit/Calendar instead. Will be removed in 2.0.
+ };
+ =====*/
+
+ kernel.deprecated("dijit._Calendar is deprecated", "dijit._Calendar moved to dijit.Calendar", 2.0);
+
+ // dijit._Calendar had an underscore all this time merely because it did
+ // not satisfy dijit's a11y policy.
+ dijit._Calendar = Calendar;
+});
diff --git a/lib/dijit/_Contained.js.uncompressed.js b/lib/dijit/_Contained.js.uncompressed.js
new file mode 100644
index 000000000..280a368db
--- /dev/null
+++ b/lib/dijit/_Contained.js.uncompressed.js
@@ -0,0 +1,60 @@
+define("dijit/_Contained", [
+ "dojo/_base/declare", // declare
+ "./registry" // registry.getEnclosingWidget(), registry.byNode()
+], function(declare, registry){
+
+ // module:
+ // dijit/_Contained
+
+ return declare("dijit._Contained", null, {
+ // summary:
+ // Mixin for widgets that are children of a container widget
+ //
+ // example:
+ // | // make a basic custom widget that knows about it's parents
+ // | declare("my.customClass",[dijit._Widget,dijit._Contained],{});
+
+ _getSibling: function(/*String*/ which){
+ // summary:
+ // Returns next or previous sibling
+ // which:
+ // Either "next" or "previous"
+ // tags:
+ // private
+ var node = this.domNode;
+ do{
+ node = node[which+"Sibling"];
+ }while(node && node.nodeType != 1);
+ return node && registry.byNode(node); // dijit/_WidgetBase
+ },
+
+ getPreviousSibling: function(){
+ // summary:
+ // Returns null if this is the first child of the parent,
+ // otherwise returns the next element sibling to the "left".
+
+ return this._getSibling("previous"); // dijit/_WidgetBase
+ },
+
+ getNextSibling: function(){
+ // summary:
+ // Returns null if this is the last child of the parent,
+ // otherwise returns the next element sibling to the "right".
+
+ return this._getSibling("next"); // dijit/_WidgetBase
+ },
+
+ getIndexInParent: function(){
+ // summary:
+ // Returns the index of this widget within its container parent.
+ // It returns -1 if the parent does not exist, or if the parent
+ // is not a dijit._Container
+
+ var p = this.getParent();
+ if(!p || !p.getIndexOfChild){
+ return -1; // int
+ }
+ return p.getIndexOfChild(this); // int
+ }
+ });
+});
diff --git a/lib/dijit/_Container.js b/lib/dijit/_Container.js
index bbe597fcb..0e8256517 100644
--- a/lib/dijit/_Container.js
+++ b/lib/dijit/_Container.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_Container",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct","./registry"],function(_1,_2,_3,_4){return _2("dijit._Container",null,{buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_5,_6){var _7=this.containerNode;if(_6&&typeof _6=="number"){var _8=this.getChildren();if(_8&&_8.length>=_6){_7=_8[_6-1].domNode;_6="after";}}_3.place(_5.domNode,_7,_6);if(this._started&&!_5._started){_5.startup();}},removeChild:function(_9){if(typeof _9=="number"){_9=this.getChildren()[_9];}if(_9){var _a=_9.domNode;if(_a&&_a.parentNode){_a.parentNode.removeChild(_a);}}},hasChildren:function(){return this.getChildren().length>0;},_getSiblingOfChild:function(_b,_c){var _d=_b.domNode,_e=(_c>0?"nextSibling":"previousSibling");do{_d=_d[_e];}while(_d&&(_d.nodeType!=1||!_4.byNode(_d)));return _d&&_4.byNode(_d);},getIndexOfChild:function(_f){return _1.indexOf(this.getChildren(),_f);}});}); \ No newline at end of file
+define("dijit/_Container",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct"],function(_1,_2,_3){return _2("dijit._Container",null,{buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_4,_5){var _6=this.containerNode;if(_5&&typeof _5=="number"){var _7=this.getChildren();if(_7&&_7.length>=_5){_6=_7[_5-1].domNode;_5="after";}}_3.place(_4.domNode,_6,_5);if(this._started&&!_4._started){_4.startup();}},removeChild:function(_8){if(typeof _8=="number"){_8=this.getChildren()[_8];}if(_8){var _9=_8.domNode;if(_9&&_9.parentNode){_9.parentNode.removeChild(_9);}}},hasChildren:function(){return this.getChildren().length>0;},_getSiblingOfChild:function(_a,_b){var _c=this.getChildren(),_d=_1.indexOf(this.getChildren(),_a);return _c[_d+_b];},getIndexOfChild:function(_e){return _1.indexOf(this.getChildren(),_e);}});}); \ No newline at end of file
diff --git a/lib/dijit/_Container.js.uncompressed.js b/lib/dijit/_Container.js.uncompressed.js
new file mode 100644
index 000000000..8d2524001
--- /dev/null
+++ b/lib/dijit/_Container.js.uncompressed.js
@@ -0,0 +1,94 @@
+define("dijit/_Container", [
+ "dojo/_base/array", // array.forEach array.indexOf
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct" // domConstruct.place
+], function(array, declare, domConstruct){
+
+ // module:
+ // dijit/_Container
+
+ return declare("dijit._Container", null, {
+ // summary:
+ // Mixin for widgets that contain HTML and/or a set of widget children.
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ if(!this.containerNode){
+ // all widgets with descendants must set containerNode
+ this.containerNode = this.domNode;
+ }
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ widget, /*int?*/ insertIndex){
+ // summary:
+ // Makes the given widget a child of this widget.
+ // description:
+ // Inserts specified child widget's dom node as a child of this widget's
+ // container node, and possibly does other processing (such as layout).
+ //
+ // Functionality is undefined if this widget contains anything besides
+ // a list of child widgets (ie, if it contains arbitrary non-widget HTML).
+
+ var refNode = this.containerNode;
+ if(insertIndex && typeof insertIndex == "number"){
+ var children = this.getChildren();
+ if(children && children.length >= insertIndex){
+ refNode = children[insertIndex-1].domNode;
+ insertIndex = "after";
+ }
+ }
+ domConstruct.place(widget.domNode, refNode, insertIndex);
+
+ // If I've been started but the child widget hasn't been started,
+ // start it now. Make sure to do this after widget has been
+ // inserted into the DOM tree, so it can see that it's being controlled by me,
+ // so it doesn't try to size itself.
+ if(this._started && !widget._started){
+ widget.startup();
+ }
+ },
+
+ removeChild: function(/*Widget|int*/ widget){
+ // summary:
+ // Removes the passed widget instance from this widget but does
+ // not destroy it. You can also pass in an integer indicating
+ // the index within the container to remove (ie, removeChild(5) removes the sixth widget).
+
+ if(typeof widget == "number"){
+ widget = this.getChildren()[widget];
+ }
+
+ if(widget){
+ var node = widget.domNode;
+ if(node && node.parentNode){
+ node.parentNode.removeChild(node); // detach but don't destroy
+ }
+ }
+ },
+
+ hasChildren: function(){
+ // summary:
+ // Returns true if widget has child widgets, i.e. if this.containerNode contains widgets.
+ return this.getChildren().length > 0; // Boolean
+ },
+
+ _getSiblingOfChild: function(/*dijit/_WidgetBase*/ child, /*int*/ dir){
+ // summary:
+ // Get the next or previous widget sibling of child
+ // dir:
+ // if 1, get the next sibling
+ // if -1, get the previous sibling
+ // tags:
+ // private
+ var children = this.getChildren(),
+ idx = array.indexOf(this.getChildren(), child); // int
+ return children[idx + dir];
+ },
+
+ getIndexOfChild: function(/*dijit/_WidgetBase*/ child){
+ // summary:
+ // Gets the index of the child in this container or -1 if not found
+ return array.indexOf(this.getChildren(), child); // int
+ }
+ });
+});
diff --git a/lib/dijit/_CssStateMixin.js b/lib/dijit/_CssStateMixin.js
index f3e686b41..62a5eb15b 100644
--- a/lib/dijit/_CssStateMixin.js
+++ b/lib/dijit/_CssStateMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_CssStateMixin",["dojo/touch","dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/_base/lang","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6){return _3("dijit._CssStateMixin",[],{cssStateNodes:{},hovering:false,active:false,_applyAttributes:function(){this.inherited(arguments);_2.forEach(["onmouseenter","onmouseleave",_1.press],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);_2.forEach(["disabled","readOnly","checked","selected","focused","state","hovering","active"],function(_7){this.watch(_7,_5.hitch(this,"_setStateClass"));},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_8){if(!this.disabled){switch(_8.type){case "mouseenter":case "mouseover":this._set("hovering",true);this._set("active",this._mouseDown);break;case "mouseleave":case "mouseout":this._set("hovering",false);this._set("active",false);break;case "mousedown":case "touchpress":this._set("active",true);this._mouseDown=true;var _9=this.connect(_6.body(),_1.release,function(){this._mouseDown=false;this._set("active",false);this.disconnect(_9);});break;}}},_setStateClass:function(){var _a=this.baseClass.split(" ");function _b(_c){_a=_a.concat(_2.map(_a,function(c){return c+_c;}),"dijit"+_c);};if(!this.isLeftToRight()){_b("Rtl");}var _d=this.checked=="mixed"?"Mixed":(this.checked?"Checked":"");if(this.checked){_b(_d);}if(this.state){_b(this.state);}if(this.selected){_b("Selected");}if(this.disabled){_b("Disabled");}else{if(this.readOnly){_b("ReadOnly");}else{if(this.active){_b("Active");}else{if(this.hovering){_b("Hover");}}}}if(this.focused){_b("Focused");}var tn=this.stateNode||this.domNode,_e={};_2.forEach(tn.className.split(" "),function(c){_e[c]=true;});if("_stateClasses" in this){_2.forEach(this._stateClasses,function(c){delete _e[c];});}_2.forEach(_a,function(c){_e[c]=true;});var _f=[];for(var c in _e){_f.push(c);}tn.className=_f.join(" ");this._stateClasses=_a;},_trackMouseState:function(_10,_11){var _12=false,_13=false,_14=false;var _15=this,cn=_5.hitch(this,"connect",_10);function _16(){var _17=("disabled" in _15&&_15.disabled)||("readonly" in _15&&_15.readonly);_4.toggle(_10,_11+"Hover",_12&&!_13&&!_17);_4.toggle(_10,_11+"Active",_13&&!_17);_4.toggle(_10,_11+"Focused",_14&&!_17);};cn("onmouseenter",function(){_12=true;_16();});cn("onmouseleave",function(){_12=false;_13=false;_16();});cn(_1.press,function(){_13=true;_16();});cn(_1.release,function(){_13=false;_16();});cn("onfocus",function(){_14=true;_16();});cn("onblur",function(){_14=false;_16();});this.watch("disabled",_16);this.watch("readOnly",_16);}});}); \ No newline at end of file
+define("dijit/_CssStateMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/has","dojo/_base/lang","dojo/on","dojo/ready","dojo/_base/window","./registry"],function(_1,_2,_3,_4,_5,_6,on,_7,_8,_9){var _a=_2("dijit._CssStateMixin",[],{cssStateNodes:{},hovering:false,active:false,_applyAttributes:function(){this.inherited(arguments);_1.forEach(["disabled","readOnly","checked","selected","focused","state","hovering","active","_opened"],function(_b){this.watch(_b,_6.hitch(this,"_setStateClass"));},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._trackMouseState(this.domNode,this.baseClass);this._setStateClass();},_cssMouseEvent:function(_c){if(!this.disabled){switch(_c.type){case "mouseover":this._set("hovering",true);this._set("active",this._mouseDown);break;case "mouseout":this._set("hovering",false);this._set("active",false);break;case "mousedown":case "touchstart":this._set("active",true);break;case "mouseup":case "touchend":this._set("active",false);break;}}},_setStateClass:function(){var _d=this.baseClass.split(" ");function _e(_f){_d=_d.concat(_1.map(_d,function(c){return c+_f;}),"dijit"+_f);};if(!this.isLeftToRight()){_e("Rtl");}var _10=this.checked=="mixed"?"Mixed":(this.checked?"Checked":"");if(this.checked){_e(_10);}if(this.state){_e(this.state);}if(this.selected){_e("Selected");}if(this._opened){_e("Opened");}if(this.disabled){_e("Disabled");}else{if(this.readOnly){_e("ReadOnly");}else{if(this.active){_e("Active");}else{if(this.hovering){_e("Hover");}}}}if(this.focused){_e("Focused");}var tn=this.stateNode||this.domNode,_11={};_1.forEach(tn.className.split(" "),function(c){_11[c]=true;});if("_stateClasses" in this){_1.forEach(this._stateClasses,function(c){delete _11[c];});}_1.forEach(_d,function(c){_11[c]=true;});var _12=[];for(var c in _11){_12.push(c);}tn.className=_12.join(" ");this._stateClasses=_d;},_subnodeCssMouseEvent:function(_13,_14,evt){if(this.disabled||this.readOnly){return;}function _15(_16){_4.toggle(_13,_14+"Hover",_16);};function _17(_18){_4.toggle(_13,_14+"Active",_18);};function _19(_1a){_4.toggle(_13,_14+"Focused",_1a);};switch(evt.type){case "mouseover":_15(true);break;case "mouseout":_15(false);_17(false);break;case "mousedown":case "touchstart":_17(true);break;case "mouseup":case "touchend":_17(false);break;case "focus":case "focusin":_19(true);break;case "blur":case "focusout":_19(false);break;}},_trackMouseState:function(_1b,_1c){_1b._cssState=_1c;}});_7(function(){function _1d(evt){if(!_3.isDescendant(evt.relatedTarget,evt.target)){for(var _1e=evt.target;_1e&&_1e!=evt.relatedTarget;_1e=_1e.parentNode){if(_1e._cssState){var _1f=_9.getEnclosingWidget(_1e);if(_1f){if(_1e==_1f.domNode){_1f._cssMouseEvent(evt);}else{_1f._subnodeCssMouseEvent(_1e,_1e._cssState,evt);}}}}}};function _20(evt){evt.target=evt.srcElement;_1d(evt);};var _21=_8.body(),_22=(_5("touch")?[]:["mouseover","mouseout"]).concat(["mousedown","touchstart","mouseup","touchend"]);_1.forEach(_22,function(_23){if(_21.addEventListener){_21.addEventListener(_23,_1d,true);}else{_21.attachEvent("on"+_23,_20);}});on(_21,"focusin, focusout",function(evt){var _24=evt.target;if(_24._cssState&&!_24.getAttribute("widgetId")){var _25=_9.getEnclosingWidget(_24);_25._subnodeCssMouseEvent(_24,_24._cssState,evt);}});});return _a;}); \ No newline at end of file
diff --git a/lib/dijit/_CssStateMixin.js.uncompressed.js b/lib/dijit/_CssStateMixin.js.uncompressed.js
new file mode 100644
index 000000000..6453c3603
--- /dev/null
+++ b/lib/dijit/_CssStateMixin.js.uncompressed.js
@@ -0,0 +1,324 @@
+define("dijit/_CssStateMixin", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.isDescendant()
+ "dojo/dom-class", // domClass.toggle
+ "dojo/has",
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/ready",
+ "dojo/_base/window", // win.body
+ "./registry"
+], function(array, declare, dom, domClass, has, lang, on, ready, win, registry){
+
+// module:
+// dijit/_CssStateMixin
+
+var CssStateMixin = declare("dijit._CssStateMixin", [], {
+ // summary:
+ // Mixin for widgets to set CSS classes on the widget DOM nodes depending on hover/mouse press/focus
+ // state changes, and also higher-level state changes such becoming disabled or selected.
+ //
+ // description:
+ // By mixing this class into your widget, and setting the this.baseClass attribute, it will automatically
+ // maintain CSS classes on the widget root node (this.domNode) depending on hover,
+ // active, focus, etc. state. Ex: with a baseClass of dijitButton, it will apply the classes
+ // dijitButtonHovered and dijitButtonActive, as the user moves the mouse over the widget and clicks it.
+ //
+ // It also sets CSS like dijitButtonDisabled based on widget semantic state.
+ //
+ // By setting the cssStateNodes attribute, a widget can also track events on subnodes (like buttons
+ // within the widget).
+
+ // cssStateNodes: [protected] Object
+ // List of sub-nodes within the widget that need CSS classes applied on mouse hover/press and focus
+ //
+ // Each entry in the hash is a an attachpoint names (like "upArrowButton") mapped to a CSS class names
+ // (like "dijitUpArrowButton"). Example:
+ // | {
+ // | "upArrowButton": "dijitUpArrowButton",
+ // | "downArrowButton": "dijitDownArrowButton"
+ // | }
+ // The above will set the CSS class dijitUpArrowButton to the this.upArrowButton DOMNode when it
+ // is hovered, etc.
+ cssStateNodes: {},
+
+ // hovering: [readonly] Boolean
+ // True if cursor is over this widget
+ hovering: false,
+
+ // active: [readonly] Boolean
+ // True if mouse was pressed while over this widget, and hasn't been released yet
+ active: false,
+
+ _applyAttributes: function(){
+ // This code would typically be in postCreate(), but putting in _applyAttributes() for
+ // performance: so the class changes happen before DOM is inserted into the document.
+ // Change back to postCreate() in 2.0. See #11635.
+
+ this.inherited(arguments);
+
+ // Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node
+ array.forEach(["disabled", "readOnly", "checked", "selected", "focused", "state", "hovering", "active", "_opened"], function(attr){
+ this.watch(attr, lang.hitch(this, "_setStateClass"));
+ }, this);
+
+ // Track hover and active mouse events on widget root node, plus possibly on subnodes
+ for(var ap in this.cssStateNodes){
+ this._trackMouseState(this[ap], this.cssStateNodes[ap]);
+ }
+ this._trackMouseState(this.domNode, this.baseClass);
+
+ // Set state initially; there's probably no hover/active/focus state but widget might be
+ // disabled/readonly/checked/selected so we want to set CSS classes for those conditions.
+ this._setStateClass();
+ },
+
+ _cssMouseEvent: function(/*Event*/ event){
+ // summary:
+ // Handler for CSS event on this.domNode. Sets hovering and active properties depending on mouse state,
+ // which triggers _setStateClass() to set appropriate CSS classes for this.domNode.
+
+ if(!this.disabled){
+ switch(event.type){
+ case "mouseover":
+ this._set("hovering", true);
+ this._set("active", this._mouseDown);
+ break;
+ case "mouseout":
+ this._set("hovering", false);
+ this._set("active", false);
+ break;
+ case "mousedown":
+ case "touchstart":
+ this._set("active", true);
+ break;
+ case "mouseup":
+ case "touchend":
+ this._set("active", false);
+ break;
+ }
+ }
+ },
+
+ _setStateClass: function(){
+ // summary:
+ // Update the visual state of the widget by setting the css classes on this.domNode
+ // (or this.stateNode if defined) by combining this.baseClass with
+ // various suffixes that represent the current widget state(s).
+ //
+ // description:
+ // In the case where a widget has multiple
+ // states, it sets the class based on all possible
+ // combinations. For example, an invalid form widget that is being hovered
+ // will be "dijitInput dijitInputInvalid dijitInputHover dijitInputInvalidHover".
+ //
+ // The widget may have one or more of the following states, determined
+ // by this.state, this.checked, this.valid, and this.selected:
+ //
+ // - Error - ValidationTextBox sets this.state to "Error" if the current input value is invalid
+ // - Incomplete - ValidationTextBox sets this.state to "Incomplete" if the current input value is not finished yet
+ // - Checked - ex: a checkmark or a ToggleButton in a checked state, will have this.checked==true
+ // - Selected - ex: currently selected tab will have this.selected==true
+ //
+ // In addition, it may have one or more of the following states,
+ // based on this.disabled and flags set in _onMouse (this.active, this.hovering) and from focus manager (this.focused):
+ //
+ // - Disabled - if the widget is disabled
+ // - Active - if the mouse (or space/enter key?) is being pressed down
+ // - Focused - if the widget has focus
+ // - Hover - if the mouse is over the widget
+
+ // Compute new set of classes
+ var newStateClasses = this.baseClass.split(" ");
+
+ function multiply(modifier){
+ newStateClasses = newStateClasses.concat(array.map(newStateClasses, function(c){ return c+modifier; }), "dijit"+modifier);
+ }
+
+ if(!this.isLeftToRight()){
+ // For RTL mode we need to set an addition class like dijitTextBoxRtl.
+ multiply("Rtl");
+ }
+
+ var checkedState = this.checked == "mixed" ? "Mixed" : (this.checked ? "Checked" : "");
+ if(this.checked){
+ multiply(checkedState);
+ }
+ if(this.state){
+ multiply(this.state);
+ }
+ if(this.selected){
+ multiply("Selected");
+ }
+ if(this._opened){
+ multiply("Opened");
+ }
+
+ if(this.disabled){
+ multiply("Disabled");
+ }else if(this.readOnly){
+ multiply("ReadOnly");
+ }else{
+ if(this.active){
+ multiply("Active");
+ }else if(this.hovering){
+ multiply("Hover");
+ }
+ }
+
+ if(this.focused){
+ multiply("Focused");
+ }
+
+ // Remove old state classes and add new ones.
+ // For performance concerns we only write into domNode.className once.
+ var tn = this.stateNode || this.domNode,
+ classHash = {}; // set of all classes (state and otherwise) for node
+
+ array.forEach(tn.className.split(" "), function(c){ classHash[c] = true; });
+
+ if("_stateClasses" in this){
+ array.forEach(this._stateClasses, function(c){ delete classHash[c]; });
+ }
+
+ array.forEach(newStateClasses, function(c){ classHash[c] = true; });
+
+ var newClasses = [];
+ for(var c in classHash){
+ newClasses.push(c);
+ }
+ tn.className = newClasses.join(" ");
+
+ this._stateClasses = newStateClasses;
+ },
+
+ _subnodeCssMouseEvent: function(node, clazz, evt){
+ // summary:
+ // Handler for hover/active mouse event on widget's subnode
+ if(this.disabled || this.readOnly){
+ return;
+ }
+ function hover(isHovering){
+ domClass.toggle(node, clazz+"Hover", isHovering);
+ }
+ function active(isActive){
+ domClass.toggle(node, clazz+"Active", isActive);
+ }
+ function focused(isFocused){
+ domClass.toggle(node, clazz+"Focused", isFocused);
+ }
+ switch(evt.type){
+ case "mouseover":
+ hover(true);
+ break;
+ case "mouseout":
+ hover(false);
+ active(false);
+ break;
+ case "mousedown":
+ case "touchstart":
+ active(true);
+ break;
+ case "mouseup":
+ case "touchend":
+ active(false);
+ break;
+ case "focus":
+ case "focusin":
+ focused(true);
+ break;
+ case "blur":
+ case "focusout":
+ focused(false);
+ break;
+ }
+ },
+
+ _trackMouseState: function(/*DomNode*/ node, /*String*/ clazz){
+ // summary:
+ // Track mouse/focus events on specified node and set CSS class on that node to indicate
+ // current state. Usually not called directly, but via cssStateNodes attribute.
+ // description:
+ // Given class=foo, will set the following CSS class on the node
+ //
+ // - fooActive: if the user is currently pressing down the mouse button while over the node
+ // - fooHover: if the user is hovering the mouse over the node, but not pressing down a button
+ // - fooFocus: if the node is focused
+ //
+ // Note that it won't set any classes if the widget is disabled.
+ // node: DomNode
+ // Should be a sub-node of the widget, not the top node (this.domNode), since the top node
+ // is handled specially and automatically just by mixing in this class.
+ // clazz: String
+ // CSS class name (ex: dijitSliderUpArrow)
+
+ // Flag for listener code below to call this._cssMouseEvent() or this._subnodeCssMouseEvent()
+ // when node is hovered/active
+ node._cssState = clazz;
+ }
+});
+
+ready(function(){
+ // Document level listener to catch hover etc. events on widget root nodes and subnodes.
+ // Note that when the mouse is moved quickly, a single onmouseenter event could signal that multiple widgets
+ // have been hovered or unhovered (try test_Accordion.html)
+ function handler(evt){
+ // Poor man's event propagation. Don't propagate event to ancestors of evt.relatedTarget,
+ // to avoid processing mouseout events moving from a widget's domNode to a descendant node;
+ // such events shouldn't be interpreted as a mouseleave on the widget.
+ if(!dom.isDescendant(evt.relatedTarget, evt.target)){
+ for(var node = evt.target; node && node != evt.relatedTarget; node = node.parentNode){
+ // Process any nodes with _cssState property. They are generally widget root nodes,
+ // but could also be sub-nodes within a widget
+ if(node._cssState){
+ var widget = registry.getEnclosingWidget(node);
+ if(widget){
+ if(node == widget.domNode){
+ // event on the widget's root node
+ widget._cssMouseEvent(evt);
+ }else{
+ // event on widget's sub-node
+ widget._subnodeCssMouseEvent(node, node._cssState, evt);
+ }
+ }
+ }
+ }
+ }
+ }
+ function ieHandler(evt){
+ evt.target = evt.srcElement;
+ handler(evt);
+ }
+
+ // Use addEventListener() (and attachEvent() on IE) to catch the relevant events even if other handlers
+ // (on individual nodes) call evt.stopPropagation() or event.stopEvent().
+ // Currently typematic.js is doing that, not sure why.
+ // Don't monitor mouseover/mouseout on mobile because iOS generates "phantom" mouseover/mouseout events when
+ // drag-scrolling, at the point in the viewport where the drag originated. Test the Tree in api viewer.
+ var body = win.body(),
+ types = (has("touch") ? [] : ["mouseover", "mouseout"]).concat(["mousedown", "touchstart", "mouseup", "touchend"]);
+ array.forEach(types, function(type){
+ if(body.addEventListener){
+ body.addEventListener(type, handler, true); // W3C
+ }else{
+ body.attachEvent("on"+type, ieHandler); // IE
+ }
+ });
+
+ // Track focus events on widget sub-nodes that have been registered via _trackMouseState().
+ // However, don't track focus events on the widget root nodes, because focus is tracked via the
+ // focus manager (and it's not really tracking focus, but rather tracking that focus is on one of the widget's
+ // nodes or a subwidget's node or a popup node, etc.)
+ // Remove for 2.0 (if focus CSS needed, just use :focus pseudo-selector).
+ on(body, "focusin, focusout", function(evt){
+ var node = evt.target;
+ if(node._cssState && !node.getAttribute("widgetId")){
+ var widget = registry.getEnclosingWidget(node);
+ widget._subnodeCssMouseEvent(node, node._cssState, evt);
+ }
+ });
+});
+
+return CssStateMixin;
+});
diff --git a/lib/dijit/_DialogMixin.js.uncompressed.js b/lib/dijit/_DialogMixin.js.uncompressed.js
new file mode 100644
index 000000000..a5a0dabd8
--- /dev/null
+++ b/lib/dijit/_DialogMixin.js.uncompressed.js
@@ -0,0 +1,70 @@
+define("dijit/_DialogMixin", [
+ "dojo/_base/declare", // declare
+ "./a11y" // _getTabNavigable
+], function(declare, a11y){
+
+ // module:
+ // dijit/_DialogMixin
+
+ return declare("dijit._DialogMixin", null, {
+ // summary:
+ // This provides functions useful to Dialog and TooltipDialog
+
+ execute: function(/*Object*/ /*===== formContents =====*/){
+ // summary:
+ // Callback when the user hits the submit button.
+ // Override this method to handle Dialog execution.
+ // description:
+ // After the user has pressed the submit button, the Dialog
+ // first calls onExecute() to notify the container to hide the
+ // dialog and restore focus to wherever it used to be.
+ //
+ // *Then* this method is called.
+ // type:
+ // callback
+ },
+
+ onCancel: function(){
+ // summary:
+ // Called when user has pressed the Dialog's cancel button, to notify container.
+ // description:
+ // Developer shouldn't override or connect to this method;
+ // it's a private communication device between the TooltipDialog
+ // and the thing that opened it (ex: `dijit/form/DropDownButton`)
+ // type:
+ // protected
+ },
+
+ onExecute: function(){
+ // summary:
+ // Called when user has pressed the dialog's OK button, to notify container.
+ // description:
+ // Developer shouldn't override or connect to this method;
+ // it's a private communication device between the TooltipDialog
+ // and the thing that opened it (ex: `dijit/form/DropDownButton`)
+ // type:
+ // protected
+ },
+
+ _onSubmit: function(){
+ // summary:
+ // Callback when user hits submit button
+ // type:
+ // protected
+ this.onExecute(); // notify container that we are about to execute
+ this.execute(this.get('value'));
+ },
+
+ _getFocusItems: function(){
+ // summary:
+ // Finds focusable items in dialog,
+ // and sets this._firstFocusItem and this._lastFocusItem
+ // tags:
+ // protected
+
+ var elems = a11y._getTabNavigable(this.containerNode);
+ this._firstFocusItem = elems.lowest || elems.first || this.closeButtonNode || this.domNode;
+ this._lastFocusItem = elems.last || elems.highest || this._firstFocusItem;
+ }
+ });
+});
diff --git a/lib/dijit/_FocusMixin.js.uncompressed.js b/lib/dijit/_FocusMixin.js.uncompressed.js
new file mode 100644
index 000000000..31c92c139
--- /dev/null
+++ b/lib/dijit/_FocusMixin.js.uncompressed.js
@@ -0,0 +1,66 @@
+define("dijit/_FocusMixin", [
+ "./focus",
+ "./_WidgetBase",
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang" // lang.extend
+], function(focus, _WidgetBase, declare, lang){
+
+ // module:
+ // dijit/_FocusMixin
+
+ // We don't know where _FocusMixin will occur in the inheritance chain, but we need the _onFocus()/_onBlur() below
+ // to be last in the inheritance chain, so mixin to _WidgetBase.
+ lang.extend(_WidgetBase, {
+ // focused: [readonly] Boolean
+ // This widget or a widget it contains has focus, or is "active" because
+ // it was recently clicked.
+ focused: false,
+
+ onFocus: function(){
+ // summary:
+ // Called when the widget becomes "active" because
+ // it or a widget inside of it either has focus, or has recently
+ // been clicked.
+ // tags:
+ // callback
+ },
+
+ onBlur: function(){
+ // summary:
+ // Called when the widget stops being "active" because
+ // focus moved to something outside of it, or the user
+ // clicked somewhere outside of it, or the widget was
+ // hidden.
+ // tags:
+ // callback
+ },
+
+ _onFocus: function(){
+ // summary:
+ // This is where widgets do processing for when they are active,
+ // such as changing CSS classes. See onFocus() for more details.
+ // tags:
+ // protected
+ this.onFocus();
+ },
+
+ _onBlur: function(){
+ // summary:
+ // This is where widgets do processing for when they stop being active,
+ // such as changing CSS classes. See onBlur() for more details.
+ // tags:
+ // protected
+ this.onBlur();
+ }
+ });
+
+ return declare("dijit._FocusMixin", null, {
+ // summary:
+ // Mixin to widget to provide _onFocus() and _onBlur() methods that
+ // fire when a widget or its descendants get/lose focus
+
+ // flag that I want _onFocus()/_onBlur() notifications from focus manager
+ _focusManager: focus
+ });
+
+});
diff --git a/lib/dijit/_HasDropDown.js b/lib/dijit/_HasDropDown.js
index bed09ec07..071344e68 100644
--- a/lib/dijit/_HasDropDown.js
+++ b/lib/dijit/_HasDropDown.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_HasDropDown",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/event","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/has","dojo/keys","dojo/_base/lang","dojo/touch","dojo/_base/window","dojo/window","./registry","./focus","./popup","./_FocusMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12){return _1("dijit._HasDropDown",_12,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouseDown:function(e){if(this.disabled||this.readOnly){return;}e.preventDefault();this._docHandler=this.connect(_d.doc,_c.release,"_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _13=this.dropDown,_14=false;if(e&&this._opened){var c=_7.position(this._buttonNode,true);if(!(e.pageX>=c.x&&e.pageX<=c.x+c.w)||!(e.pageY>=c.y&&e.pageY<=c.y+c.h)){var t=e.target;while(t&&!_14){if(_6.contains(t,"dijitPopup")){_14=true;}else{t=t.parentNode;}}if(_14){t=e.target;if(_13.onItemClick){var _15;while(t&&!(_15=_f.byNode(t))){t=t.parentNode;}if(_15&&_15.onClick&&_15.getParent){_15.getParent().onItemClick(_15,e);}}return;}}}if(this._opened){if(_13.focus&&_13.autoFocus!==false){window.setTimeout(_b.hitch(_13,"focus"),1);}}else{setTimeout(_b.hitch(this,"focus"),0);}if(_9("ios")){this._justGotMouseUp=true;setTimeout(_b.hitch(this,function(){this._justGotMouseUp=false;}),0);}},_onDropDownClick:function(e){if(_9("ios")&&!this._justGotMouseUp){this._onDropDownMouseDown(e);this._onDropDownMouseUp(e);}if(this._stopClickEvents){_3.stop(e);}},buildRendering:function(){this.inherited(arguments);this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;var _16={"after":this.isLeftToRight()?"Right":"Left","before":this.isLeftToRight()?"Left":"Right","above":"Up","below":"Down","left":"Left","right":"Right"}[this.dropDownPosition[0]]||this.dropDownPosition[0]||"Down";_6.add(this._arrowWrapperNode||this._buttonNode,"dijit"+_16+"ArrowButton");},postCreate:function(){this.inherited(arguments);this.connect(this._buttonNode,_c.press,"_onDropDownMouseDown");this.connect(this._buttonNode,"onclick","_onDropDownClick");this.connect(this.focusNode,"onkeypress","_onKey");this.connect(this.focusNode,"onkeyup","_onKeyUp");},destroy:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown,_17=e.target;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){_3.stop(e);return;}}if(d&&this._opened&&e.charOrCode==_a.ESCAPE){this.closeDropDown();_3.stop(e);}else{if(!this._opened&&(e.charOrCode==_a.DOWN_ARROW||((e.charOrCode==_a.ENTER||e.charOrCode==" ")&&((_17.tagName||"").toLowerCase()!=="input"||(_17.type&&_17.type.toLowerCase()!=="text"))))){this._toggleOnKeyUp=true;_3.stop(e);}}},_onKeyUp:function(){if(this._toggleOnKeyUp){delete this._toggleOnKeyUp;this.toggleDropDown();var d=this.dropDown;if(d&&d.focus){setTimeout(_b.hitch(d,"focus"),1);}}},_onBlur:function(){var _18=_10.curNode&&this.dropDown&&_4.isDescendant(_10.curNode,this.dropDown.domNode);this.closeDropDown(_18);this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_19){_19();},loadAndOpenDropDown:function(){var d=new _2(),_1a=_b.hitch(this,function(){this.openDropDown();d.resolve(this.dropDown);});if(!this.isLoaded()){this.loadDropDown(_1a);}else{_1a();}return d;},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}if(!this._opened){this.loadAndOpenDropDown();}else{this.closeDropDown();}},openDropDown:function(){var _1b=this.dropDown,_1c=_1b.domNode,_1d=this._aroundNode||this.domNode,_1e=this;if(!this._preparedNode){this._preparedNode=true;if(_1c.style.width){this._explicitDDWidth=true;}if(_1c.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _1f={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_1f.width="";}if(!this._explicitDDHeight){_1f.height="";}_8.set(_1c,_1f);var _20=this.maxHeight;if(_20==-1){var _21=_e.getBox(),_22=_7.position(_1d,false);_20=Math.floor(Math.max(_22.y,_21.h-(_22.y+_22.h)));}_11.moveOffScreen(_1b);if(_1b.startup&&!_1b._started){_1b.startup();}var mb=_7.getMarginSize(_1c);var _23=(_20&&mb.h>_20);_8.set(_1c,{overflowX:"hidden",overflowY:_23?"auto":"hidden"});if(_23){mb.h=_20;if("w" in mb){mb.w+=16;}}else{delete mb.h;}if(this.forceWidth){mb.w=_1d.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,_1d.offsetWidth);}else{delete mb.w;}}if(_b.isFunction(_1b.resize)){_1b.resize(mb);}else{_7.setMarginBox(_1c,mb);}}var _24=_11.open({parent:this,popup:_1b,around:_1d,orient:this.dropDownPosition,onExecute:function(){_1e.closeDropDown(true);},onCancel:function(){_1e.closeDropDown(true);},onClose:function(){_5.set(_1e._popupStateNode,"popupActive",false);_6.remove(_1e._popupStateNode,"dijitHasDropDownOpen");_1e._opened=false;}});_5.set(this._popupStateNode,"popupActive","true");_6.add(_1e._popupStateNode,"dijitHasDropDownOpen");this._opened=true;return _24;},closeDropDown:function(_25){if(this._opened){if(_25){this.focus();}_11.close(this.dropDown);this._opened=false;}}});}); \ No newline at end of file
+define("dijit/_HasDropDown",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/event","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/has","dojo/keys","dojo/_base/lang","dojo/on","dojo/window","./registry","./focus","./popup","./_FocusMixin"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,on,_c,_d,_e,_f,_10){return _1("dijit._HasDropDown",_10,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouseDown:function(e){if(this.disabled||this.readOnly){return;}e.preventDefault();this._docHandler=this.connect(this.ownerDocument,"mouseup","_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _11=this.dropDown,_12=false;if(e&&this._opened){var c=_7.position(this._buttonNode,true);if(!(e.pageX>=c.x&&e.pageX<=c.x+c.w)||!(e.pageY>=c.y&&e.pageY<=c.y+c.h)){var t=e.target;while(t&&!_12){if(_6.contains(t,"dijitPopup")){_12=true;}else{t=t.parentNode;}}if(_12){t=e.target;if(_11.onItemClick){var _13;while(t&&!(_13=_d.byNode(t))){t=t.parentNode;}if(_13&&_13.onClick&&_13.getParent){_13.getParent().onItemClick(_13,e);}}return;}}}if(this._opened){if(_11.focus&&_11.autoFocus!==false){this._focusDropDownTimer=this.defer(function(){_11.focus();delete this._focusDropDownTimer;});}}else{this.defer("focus");}if(_9("touch")){this._justGotMouseUp=true;this.defer(function(){this._justGotMouseUp=false;});}},_onDropDownClick:function(e){if(_9("touch")&&!this._justGotMouseUp){this._onDropDownMouseDown(e);this._onDropDownMouseUp(e);}if(this._stopClickEvents){_3.stop(e);}},buildRendering:function(){this.inherited(arguments);this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;var _14={"after":this.isLeftToRight()?"Right":"Left","before":this.isLeftToRight()?"Left":"Right","above":"Up","below":"Down","left":"Left","right":"Right"}[this.dropDownPosition[0]]||this.dropDownPosition[0]||"Down";_6.add(this._arrowWrapperNode||this._buttonNode,"dijit"+_14+"ArrowButton");},postCreate:function(){this.inherited(arguments);var _15=this.focusNode||this.domNode;this.own(on(this._buttonNode,"mousedown",_b.hitch(this,"_onDropDownMouseDown")),on(this._buttonNode,"click",_b.hitch(this,"_onDropDownClick")),on(_15,"keydown",_b.hitch(this,"_onKey")),on(_15,"keyup",_b.hitch(this,"_onKeyUp")));},destroy:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown,_16=e.target;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){_3.stop(e);return;}}if(d&&this._opened&&e.keyCode==_a.ESCAPE){this.closeDropDown();_3.stop(e);}else{if(!this._opened&&(e.keyCode==_a.DOWN_ARROW||((e.keyCode==_a.ENTER||e.keyCode==_a.SPACE)&&((_16.tagName||"").toLowerCase()!=="input"||(_16.type&&_16.type.toLowerCase()!=="text"))))){this._toggleOnKeyUp=true;_3.stop(e);}}},_onKeyUp:function(){if(this._toggleOnKeyUp){delete this._toggleOnKeyUp;this.toggleDropDown();var d=this.dropDown;if(d&&d.focus){this.defer(_b.hitch(d,"focus"),1);}}},_onBlur:function(){var _17=_e.curNode&&this.dropDown&&_4.isDescendant(_e.curNode,this.dropDown.domNode);this.closeDropDown(_17);this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_18){_18();},loadAndOpenDropDown:function(){var d=new _2(),_19=_b.hitch(this,function(){this.openDropDown();d.resolve(this.dropDown);});if(!this.isLoaded()){this.loadDropDown(_19);}else{_19();}return d;},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}if(!this._opened){this.loadAndOpenDropDown();}else{this.closeDropDown();}},openDropDown:function(){var _1a=this.dropDown,_1b=_1a.domNode,_1c=this._aroundNode||this.domNode,_1d=this;if(!this._preparedNode){this._preparedNode=true;if(_1b.style.width){this._explicitDDWidth=true;}if(_1b.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _1e={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_1e.width="";}if(!this._explicitDDHeight){_1e.height="";}_8.set(_1b,_1e);var _1f=this.maxHeight;if(_1f==-1){var _20=_c.getBox(this.ownerDocument),_21=_7.position(_1c,false);_1f=Math.floor(Math.max(_21.y,_20.h-(_21.y+_21.h)));}_f.moveOffScreen(_1a);if(_1a.startup&&!_1a._started){_1a.startup();}var mb=_7.getMarginSize(_1b);var _22=(_1f&&mb.h>_1f);_8.set(_1b,{overflowX:"visible",overflowY:_22?"auto":"visible"});if(_22){mb.h=_1f;if("w" in mb){mb.w+=16;}}else{delete mb.h;}if(this.forceWidth){mb.w=_1c.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,_1c.offsetWidth);}else{delete mb.w;}}if(_b.isFunction(_1a.resize)){_1a.resize(mb);}else{_7.setMarginBox(_1b,mb);}}var _23=_f.open({parent:this,popup:_1a,around:_1c,orient:this.dropDownPosition,onExecute:function(){_1d.closeDropDown(true);},onCancel:function(){_1d.closeDropDown(true);},onClose:function(){_5.set(_1d._popupStateNode,"popupActive",false);_6.remove(_1d._popupStateNode,"dijitHasDropDownOpen");_1d._set("_opened",false);}});_5.set(this._popupStateNode,"popupActive","true");_6.add(this._popupStateNode,"dijitHasDropDownOpen");this._set("_opened",true);this.domNode.setAttribute("aria-expanded","true");return _23;},closeDropDown:function(_24){if(this._focusDropDownTimer){this._focusDropDownTimer.remove();delete this._focusDropDownTimer;}if(this._opened){this.domNode.setAttribute("aria-expanded","false");if(_24){this.focus();}_f.close(this.dropDown);this._opened=false;}}});}); \ No newline at end of file
diff --git a/lib/dijit/_HasDropDown.js.uncompressed.js b/lib/dijit/_HasDropDown.js.uncompressed.js
new file mode 100644
index 000000000..6cc6b8731
--- /dev/null
+++ b/lib/dijit/_HasDropDown.js.uncompressed.js
@@ -0,0 +1,509 @@
+define("dijit/_HasDropDown", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred",
+ "dojo/_base/event", // event.stop
+ "dojo/dom", // dom.isDescendant
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.add domClass.contains domClass.remove
+ "dojo/dom-geometry", // domGeometry.marginBox domGeometry.position
+ "dojo/dom-style", // domStyle.set
+ "dojo/has", // has("touch")
+ "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE
+ "dojo/_base/lang", // lang.hitch lang.isFunction
+ "dojo/on",
+ "dojo/window", // winUtils.getBox
+ "./registry", // registry.byNode()
+ "./focus",
+ "./popup",
+ "./_FocusMixin"
+], function(declare, Deferred, event,dom, domAttr, domClass, domGeometry, domStyle, has, keys, lang, on,
+ winUtils, registry, focus, popup, _FocusMixin){
+
+
+ // module:
+ // dijit/_HasDropDown
+
+ return declare("dijit._HasDropDown", _FocusMixin, {
+ // summary:
+ // Mixin for widgets that need drop down ability.
+
+ // _buttonNode: [protected] DomNode
+ // The button/icon/node to click to display the drop down.
+ // Can be set via a data-dojo-attach-point assignment.
+ // If missing, then either focusNode or domNode (if focusNode is also missing) will be used.
+ _buttonNode: null,
+
+ // _arrowWrapperNode: [protected] DomNode
+ // Will set CSS class dijitUpArrow, dijitDownArrow, dijitRightArrow etc. on this node depending
+ // on where the drop down is set to be positioned.
+ // Can be set via a data-dojo-attach-point assignment.
+ // If missing, then _buttonNode will be used.
+ _arrowWrapperNode: null,
+
+ // _popupStateNode: [protected] DomNode
+ // The node to set the popupActive class on.
+ // Can be set via a data-dojo-attach-point assignment.
+ // If missing, then focusNode or _buttonNode (if focusNode is missing) will be used.
+ _popupStateNode: null,
+
+ // _aroundNode: [protected] DomNode
+ // The node to display the popup around.
+ // Can be set via a data-dojo-attach-point assignment.
+ // If missing, then domNode will be used.
+ _aroundNode: null,
+
+ // dropDown: [protected] Widget
+ // The widget to display as a popup. This widget *must* be
+ // defined before the startup function is called.
+ dropDown: null,
+
+ // autoWidth: [protected] Boolean
+ // Set to true to make the drop down at least as wide as this
+ // widget. Set to false if the drop down should just be its
+ // default width
+ autoWidth: true,
+
+ // forceWidth: [protected] Boolean
+ // Set to true to make the drop down exactly as wide as this
+ // widget. Overrides autoWidth.
+ forceWidth: false,
+
+ // maxHeight: [protected] Integer
+ // The max height for our dropdown.
+ // Any dropdown taller than this will have scrollbars.
+ // Set to 0 for no max height, or -1 to limit height to available space in viewport
+ maxHeight: 0,
+
+ // dropDownPosition: [const] String[]
+ // This variable controls the position of the drop down.
+ // It's an array of strings with the following values:
+ //
+ // - before: places drop down to the left of the target node/widget, or to the right in
+ // the case of RTL scripts like Hebrew and Arabic
+ // - after: places drop down to the right of the target node/widget, or to the left in
+ // the case of RTL scripts like Hebrew and Arabic
+ // - above: drop down goes above target node
+ // - below: drop down goes below target node
+ //
+ // The list is positions is tried, in order, until a position is found where the drop down fits
+ // within the viewport.
+ //
+ dropDownPosition: ["below","above"],
+
+ // _stopClickEvents: Boolean
+ // When set to false, the click events will not be stopped, in
+ // case you want to use them in your subclass
+ _stopClickEvents: true,
+
+ _onDropDownMouseDown: function(/*Event*/ e){
+ // summary:
+ // Callback when the user mousedown's on the arrow icon
+ if(this.disabled || this.readOnly){ return; }
+
+ // Prevent default to stop things like text selection, but don't stop propagation, so that:
+ // 1. TimeTextBox etc. can focus the <input> on mousedown
+ // 2. dropDownButtonActive class applied by _CssStateMixin (on button depress)
+ // 3. user defined onMouseDown handler fires
+ e.preventDefault();
+
+ this._docHandler = this.connect(this.ownerDocument, "mouseup", "_onDropDownMouseUp");
+
+ this.toggleDropDown();
+ },
+
+ _onDropDownMouseUp: function(/*Event?*/ e){
+ // summary:
+ // Callback when the user lifts their mouse after mouse down on the arrow icon.
+ // If the drop down is a simple menu and the mouse is over the menu, we execute it, otherwise, we focus our
+ // drop down widget. If the event is missing, then we are not
+ // a mouseup event.
+ //
+ // This is useful for the common mouse movement pattern
+ // with native browser `<select>` nodes:
+ //
+ // 1. mouse down on the select node (probably on the arrow)
+ // 2. move mouse to a menu item while holding down the mouse button
+ // 3. mouse up. this selects the menu item as though the user had clicked it.
+ if(e && this._docHandler){
+ this.disconnect(this._docHandler);
+ }
+ var dropDown = this.dropDown, overMenu = false;
+
+ if(e && this._opened){
+ // This code deals with the corner-case when the drop down covers the original widget,
+ // because it's so large. In that case mouse-up shouldn't select a value from the menu.
+ // Find out if our target is somewhere in our dropdown widget,
+ // but not over our _buttonNode (the clickable node)
+ var c = domGeometry.position(this._buttonNode, true);
+ if(!(e.pageX >= c.x && e.pageX <= c.x + c.w) ||
+ !(e.pageY >= c.y && e.pageY <= c.y + c.h)){
+ var t = e.target;
+ while(t && !overMenu){
+ if(domClass.contains(t, "dijitPopup")){
+ overMenu = true;
+ }else{
+ t = t.parentNode;
+ }
+ }
+ if(overMenu){
+ t = e.target;
+ if(dropDown.onItemClick){
+ var menuItem;
+ while(t && !(menuItem = registry.byNode(t))){
+ t = t.parentNode;
+ }
+ if(menuItem && menuItem.onClick && menuItem.getParent){
+ menuItem.getParent().onItemClick(menuItem, e);
+ }
+ }
+ return;
+ }
+ }
+ }
+ if(this._opened){
+ if(dropDown.focus && dropDown.autoFocus !== false){
+ // Focus the dropdown widget - do it on a delay so that we
+ // don't steal back focus from the dropdown.
+ this._focusDropDownTimer = this.defer(function(){
+ dropDown.focus();
+ delete this._focusDropDownTimer;
+ });
+ }
+ }else{
+ // The drop down arrow icon probably can't receive focus, but widget itself should get focus.
+ // defer() needed to make it work on IE (test DateTextBox)
+ this.defer("focus");
+ }
+
+ if(has("touch")){
+ this._justGotMouseUp = true;
+ this.defer(function(){
+ this._justGotMouseUp = false;
+ });
+ }
+ },
+
+ _onDropDownClick: function(/*Event*/ e){
+ if(has("touch") && !this._justGotMouseUp){
+ // If there was no preceding mousedown/mouseup (like on android), then simulate them to
+ // toggle the drop down.
+ //
+ // The if(has("touch") is necessary since IE and desktop safari get spurious onclick events
+ // when there are nested tables (specifically, clicking on a table that holds a dijit/form/Select,
+ // but not on the Select itself, causes an onclick event on the Select)
+ this._onDropDownMouseDown(e);
+ this._onDropDownMouseUp(e);
+ }
+
+ // The drop down was already opened on mousedown/keydown; just need to call stopEvent().
+ if(this._stopClickEvents){
+ event.stop(e);
+ }
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ this._buttonNode = this._buttonNode || this.focusNode || this.domNode;
+ this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode;
+
+ // Add a class to the "dijitDownArrowButton" type class to _buttonNode so theme can set direction of arrow
+ // based on where drop down will normally appear
+ var defaultPos = {
+ "after" : this.isLeftToRight() ? "Right" : "Left",
+ "before" : this.isLeftToRight() ? "Left" : "Right",
+ "above" : "Up",
+ "below" : "Down",
+ "left" : "Left",
+ "right" : "Right"
+ }[this.dropDownPosition[0]] || this.dropDownPosition[0] || "Down";
+ domClass.add(this._arrowWrapperNode || this._buttonNode, "dijit" + defaultPos + "ArrowButton");
+ },
+
+ postCreate: function(){
+ // summary:
+ // set up nodes and connect our mouse and keyboard events
+
+ this.inherited(arguments);
+
+ var keyboardEventNode = this.focusNode || this.domNode;
+ this.own(
+ on(this._buttonNode, "mousedown", lang.hitch(this, "_onDropDownMouseDown")),
+ on(this._buttonNode, "click", lang.hitch(this, "_onDropDownClick")),
+ on(keyboardEventNode, "keydown", lang.hitch(this, "_onKey")),
+ on(keyboardEventNode, "keyup", lang.hitch(this, "_onKeyUp"))
+ );
+ },
+
+ destroy: function(){
+ if(this.dropDown){
+ // Destroy the drop down, unless it's already been destroyed. This can happen because
+ // the drop down is a direct child of <body> even though it's logically my child.
+ if(!this.dropDown._destroyed){
+ this.dropDown.destroyRecursive();
+ }
+ delete this.dropDown;
+ }
+ this.inherited(arguments);
+ },
+
+ _onKey: function(/*Event*/ e){
+ // summary:
+ // Callback when the user presses a key while focused on the button node
+
+ if(this.disabled || this.readOnly){ return; }
+ var d = this.dropDown, target = e.target;
+ if(d && this._opened && d.handleKey){
+ if(d.handleKey(e) === false){
+ /* false return code means that the drop down handled the key */
+ event.stop(e);
+ return;
+ }
+ }
+ if(d && this._opened && e.keyCode == keys.ESCAPE){
+ this.closeDropDown();
+ event.stop(e);
+ }else if(!this._opened &&
+ (e.keyCode == keys.DOWN_ARROW ||
+ ( (e.keyCode == keys.ENTER || e.keyCode == keys.SPACE) &&
+ //ignore enter and space if the event is for a text input
+ ((target.tagName || "").toLowerCase() !== 'input' ||
+ (target.type && target.type.toLowerCase() !== 'text'))))){
+ // Toggle the drop down, but wait until keyup so that the drop down doesn't
+ // get a stray keyup event, or in the case of key-repeat (because user held
+ // down key for too long), stray keydown events
+ this._toggleOnKeyUp = true;
+ event.stop(e);
+ }
+ },
+
+ _onKeyUp: function(){
+ if(this._toggleOnKeyUp){
+ delete this._toggleOnKeyUp;
+ this.toggleDropDown();
+ var d = this.dropDown; // drop down may not exist until toggleDropDown() call
+ if(d && d.focus){
+ this.defer(lang.hitch(d, "focus"), 1);
+ }
+ }
+ },
+
+ _onBlur: function(){
+ // summary:
+ // Called magically when focus has shifted away from this widget and it's dropdown
+
+ // Don't focus on button if the user has explicitly focused on something else (happens
+ // when user clicks another control causing the current popup to close)..
+ // But if focus is inside of the drop down then reset focus to me, because IE doesn't like
+ // it when you display:none a node with focus.
+ var focusMe = focus.curNode && this.dropDown && dom.isDescendant(focus.curNode, this.dropDown.domNode);
+
+ this.closeDropDown(focusMe);
+
+ this.inherited(arguments);
+ },
+
+ isLoaded: function(){
+ // summary:
+ // Returns true if the dropdown exists and it's data is loaded. This can
+ // be overridden in order to force a call to loadDropDown().
+ // tags:
+ // protected
+
+ return true;
+ },
+
+ loadDropDown: function(/*Function*/ loadCallback){
+ // summary:
+ // Creates the drop down if it doesn't exist, loads the data
+ // if there's an href and it hasn't been loaded yet, and then calls
+ // the given callback.
+ // tags:
+ // protected
+
+ // TODO: for 2.0, change API to return a Deferred, instead of calling loadCallback?
+ loadCallback();
+ },
+
+ loadAndOpenDropDown: function(){
+ // summary:
+ // Creates the drop down if it doesn't exist, loads the data
+ // if there's an href and it hasn't been loaded yet, and
+ // then opens the drop down. This is basically a callback when the
+ // user presses the down arrow button to open the drop down.
+ // returns: Deferred
+ // Deferred for the drop down widget that
+ // fires when drop down is created and loaded
+ // tags:
+ // protected
+ var d = new Deferred(),
+ afterLoad = lang.hitch(this, function(){
+ this.openDropDown();
+ d.resolve(this.dropDown);
+ });
+ if(!this.isLoaded()){
+ this.loadDropDown(afterLoad);
+ }else{
+ afterLoad();
+ }
+ return d;
+ },
+
+ toggleDropDown: function(){
+ // summary:
+ // Callback when the user presses the down arrow button or presses
+ // the down arrow key to open/close the drop down.
+ // Toggle the drop-down widget; if it is up, close it, if not, open it
+ // tags:
+ // protected
+
+ if(this.disabled || this.readOnly){ return; }
+ if(!this._opened){
+ this.loadAndOpenDropDown();
+ }else{
+ this.closeDropDown();
+ }
+ },
+
+ openDropDown: function(){
+ // summary:
+ // Opens the dropdown for this widget. To be called only when this.dropDown
+ // has been created and is ready to display (ie, it's data is loaded).
+ // returns:
+ // return value of dijit/popup.open()
+ // tags:
+ // protected
+
+ var dropDown = this.dropDown,
+ ddNode = dropDown.domNode,
+ aroundNode = this._aroundNode || this.domNode,
+ self = this;
+
+ // Prepare our popup's height and honor maxHeight if it exists.
+
+ // TODO: isn't maxHeight dependent on the return value from dijit/popup.open(),
+ // ie, dependent on how much space is available (BK)
+
+ if(!this._preparedNode){
+ this._preparedNode = true;
+ // Check if we have explicitly set width and height on the dropdown widget dom node
+ if(ddNode.style.width){
+ this._explicitDDWidth = true;
+ }
+ if(ddNode.style.height){
+ this._explicitDDHeight = true;
+ }
+ }
+
+ // Code for resizing dropdown (height limitation, or increasing width to match my width)
+ if(this.maxHeight || this.forceWidth || this.autoWidth){
+ var myStyle = {
+ display: "",
+ visibility: "hidden"
+ };
+ if(!this._explicitDDWidth){
+ myStyle.width = "";
+ }
+ if(!this._explicitDDHeight){
+ myStyle.height = "";
+ }
+ domStyle.set(ddNode, myStyle);
+
+ // Figure out maximum height allowed (if there is a height restriction)
+ var maxHeight = this.maxHeight;
+ if(maxHeight == -1){
+ // limit height to space available in viewport either above or below my domNode
+ // (whichever side has more room)
+ var viewport = winUtils.getBox(this.ownerDocument),
+ position = domGeometry.position(aroundNode, false);
+ maxHeight = Math.floor(Math.max(position.y, viewport.h - (position.y + position.h)));
+ }
+
+ // Attach dropDown to DOM and make make visibility:hidden rather than display:none
+ // so we call startup() and also get the size
+ popup.moveOffScreen(dropDown);
+
+ if(dropDown.startup && !dropDown._started){
+ dropDown.startup(); // this has to be done after being added to the DOM
+ }
+ // Get size of drop down, and determine if vertical scroll bar needed. If no scroll bar needed,
+ // use overflow:visible rather than overflow:hidden so off-by-one errors don't hide drop down border.
+ var mb = domGeometry.getMarginSize(ddNode);
+ var overHeight = (maxHeight && mb.h > maxHeight);
+ domStyle.set(ddNode, {
+ overflowX: "visible",
+ overflowY: overHeight ? "auto" : "visible"
+ });
+ if(overHeight){
+ mb.h = maxHeight;
+ if("w" in mb){
+ mb.w += 16; // room for vertical scrollbar
+ }
+ }else{
+ delete mb.h;
+ }
+
+ // Adjust dropdown width to match or be larger than my width
+ if(this.forceWidth){
+ mb.w = aroundNode.offsetWidth;
+ }else if(this.autoWidth){
+ mb.w = Math.max(mb.w, aroundNode.offsetWidth);
+ }else{
+ delete mb.w;
+ }
+
+ // And finally, resize the dropdown to calculated height and width
+ if(lang.isFunction(dropDown.resize)){
+ dropDown.resize(mb);
+ }else{
+ domGeometry.setMarginBox(ddNode, mb);
+ }
+ }
+
+ var retVal = popup.open({
+ parent: this,
+ popup: dropDown,
+ around: aroundNode,
+ orient: this.dropDownPosition,
+ onExecute: function(){
+ self.closeDropDown(true);
+ },
+ onCancel: function(){
+ self.closeDropDown(true);
+ },
+ onClose: function(){
+ domAttr.set(self._popupStateNode, "popupActive", false);
+ domClass.remove(self._popupStateNode, "dijitHasDropDownOpen");
+ self._set("_opened", false); // use set() because _CssStateMixin is watching
+ }
+ });
+ domAttr.set(this._popupStateNode, "popupActive", "true");
+ domClass.add(this._popupStateNode, "dijitHasDropDownOpen");
+ this._set("_opened", true); // use set() because _CssStateMixin is watching
+ this.domNode.setAttribute("aria-expanded", "true");
+
+ return retVal;
+ },
+
+ closeDropDown: function(/*Boolean*/ focus){
+ // summary:
+ // Closes the drop down on this widget
+ // focus:
+ // If true, refocuses the button widget
+ // tags:
+ // protected
+
+ if(this._focusDropDownTimer){
+ this._focusDropDownTimer.remove();
+ delete this._focusDropDownTimer;
+ }
+ if(this._opened){
+ this.domNode.setAttribute("aria-expanded", "false");
+ if(focus){ this.focus(); }
+ popup.close(this.dropDown);
+ this._opened = false;
+ }
+ }
+
+ });
+});
diff --git a/lib/dijit/_KeyNavContainer.js.uncompressed.js b/lib/dijit/_KeyNavContainer.js.uncompressed.js
new file mode 100644
index 000000000..9fa80c18d
--- /dev/null
+++ b/lib/dijit/_KeyNavContainer.js.uncompressed.js
@@ -0,0 +1,257 @@
+define("dijit/_KeyNavContainer", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "./_Container",
+ "./_FocusMixin",
+ "dojo/_base/array", // array.forEach
+ "dojo/keys", // keys.END keys.HOME
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/lang" // lang.hitch
+], function(kernel, _Container, _FocusMixin, array, keys, declare, event, domAttr, lang){
+
+
+ // module:
+ // dijit/_KeyNavContainer
+
+ return declare("dijit._KeyNavContainer", [_FocusMixin, _Container], {
+ // summary:
+ // A _Container with keyboard navigation of its children.
+ // description:
+ // To use this mixin, call connectKeyNavHandlers() in
+ // postCreate().
+ // It provides normalized keyboard and focusing code for Container
+ // widgets.
+
+/*=====
+ // focusedChild: [protected] Widget
+ // The currently focused child widget, or null if there isn't one
+ focusedChild: null,
+=====*/
+
+ // tabIndex: String
+ // Tab index of the container; same as HTML tabIndex attribute.
+ // Note then when user tabs into the container, focus is immediately
+ // moved to the first item in the container.
+ tabIndex: "0",
+
+ connectKeyNavHandlers: function(/*keys[]*/ prevKeyCodes, /*keys[]*/ nextKeyCodes){
+ // summary:
+ // Call in postCreate() to attach the keyboard handlers
+ // to the container.
+ // preKeyCodes: keys[]
+ // Key codes for navigating to the previous child.
+ // nextKeyCodes: keys[]
+ // Key codes for navigating to the next child.
+ // tags:
+ // protected
+
+ // TODO: call this automatically from my own postCreate()
+
+ var keyCodes = (this._keyNavCodes = {});
+ var prev = lang.hitch(this, "focusPrev");
+ var next = lang.hitch(this, "focusNext");
+ array.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev; });
+ array.forEach(nextKeyCodes, function(code){ keyCodes[code] = next; });
+ keyCodes[keys.HOME] = lang.hitch(this, "focusFirstChild");
+ keyCodes[keys.END] = lang.hitch(this, "focusLastChild");
+ this.connect(this.domNode, "onkeypress", "_onContainerKeypress");
+ this.connect(this.domNode, "onfocus", "_onContainerFocus");
+ },
+
+ startupKeyNavChildren: function(){
+ kernel.deprecated("startupKeyNavChildren() call no longer needed", "", "2.0");
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ array.forEach(this.getChildren(), lang.hitch(this, "_startupChild"));
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ widget, /*int?*/ insertIndex){
+ this.inherited(arguments);
+ this._startupChild(widget);
+ },
+
+ focus: function(){
+ // summary:
+ // Default focus() implementation: focus the first child.
+ this.focusFirstChild();
+ },
+
+ focusFirstChild: function(){
+ // summary:
+ // Focus the first focusable child in the container.
+ // tags:
+ // protected
+ this.focusChild(this._getFirstFocusableChild());
+ },
+
+ focusLastChild: function(){
+ // summary:
+ // Focus the last focusable child in the container.
+ // tags:
+ // protected
+ this.focusChild(this._getLastFocusableChild());
+ },
+
+ focusNext: function(){
+ // summary:
+ // Focus the next widget
+ // tags:
+ // protected
+ this.focusChild(this._getNextFocusableChild(this.focusedChild, 1));
+ },
+
+ focusPrev: function(){
+ // summary:
+ // Focus the last focusable node in the previous widget
+ // (ex: go to the ComboButton icon section rather than button section)
+ // tags:
+ // protected
+ this.focusChild(this._getNextFocusableChild(this.focusedChild, -1), true);
+ },
+
+ focusChild: function(/*dijit/_WidgetBase*/ widget, /*Boolean*/ last){
+ // summary:
+ // Focus specified child widget.
+ // widget:
+ // Reference to container's child widget
+ // last:
+ // If true and if widget has multiple focusable nodes, focus the
+ // last one instead of the first one
+ // tags:
+ // protected
+
+ if(!widget){ return; }
+
+ if(this.focusedChild && widget !== this.focusedChild){
+ this._onChildBlur(this.focusedChild); // used by _MenuBase
+ }
+ widget.set("tabIndex", this.tabIndex); // for IE focus outline to appear, must set tabIndex before focs
+ widget.focus(last ? "end" : "start");
+ this._set("focusedChild", widget);
+ },
+
+ _startupChild: function(/*dijit/_WidgetBase*/ widget){
+ // summary:
+ // Setup for each child widget
+ // description:
+ // Sets tabIndex=-1 on each child, so that the tab key will
+ // leave the container rather than visiting each child.
+ // tags:
+ // private
+
+ widget.set("tabIndex", "-1");
+
+ this.connect(widget, "_onFocus", function(){
+ // Set valid tabIndex so tabbing away from widget goes to right place, see #10272
+ widget.set("tabIndex", this.tabIndex);
+ });
+ this.connect(widget, "_onBlur", function(){
+ widget.set("tabIndex", "-1");
+ });
+ },
+
+ _onContainerFocus: function(evt){
+ // summary:
+ // Handler for when the container gets focus
+ // description:
+ // Initially the container itself has a tabIndex, but when it gets
+ // focus, switch focus to first child...
+ // tags:
+ // private
+
+ // Note that we can't use _onFocus() because switching focus from the
+ // _onFocus() handler confuses the focus.js code
+ // (because it causes _onFocusNode() to be called recursively)
+ // Also, _onFocus() would fire when focus went directly to a child widget due to mouse click.
+
+ // Ignore spurious focus events:
+ // 1. focus on a child widget bubbles on FF
+ // 2. on IE, clicking the scrollbar of a select dropdown moves focus from the focused child item to me
+ if(evt.target !== this.domNode || this.focusedChild){ return; }
+
+ this.focusFirstChild();
+
+ // and then set the container's tabIndex to -1,
+ // (don't remove as that breaks Safari 4)
+ // so that tab or shift-tab will go to the fields after/before
+ // the container, rather than the container itself
+ domAttr.set(this.domNode, "tabIndex", "-1");
+ },
+
+ _onBlur: function(evt){
+ // When focus is moved away the container, and its descendant (popup) widgets,
+ // then restore the container's tabIndex so that user can tab to it again.
+ // Note that using _onBlur() so that this doesn't happen when focus is shifted
+ // to one of my child widgets (typically a popup)
+ if(this.tabIndex){
+ domAttr.set(this.domNode, "tabIndex", this.tabIndex);
+ }
+ this.focusedChild = null;
+ this.inherited(arguments);
+ },
+
+ _onContainerKeypress: function(evt){
+ // summary:
+ // When a key is pressed, if it's an arrow key etc. then
+ // it's handled here.
+ // tags:
+ // private
+ if(evt.ctrlKey || evt.altKey){ return; }
+ var func = this._keyNavCodes[evt.charOrCode];
+ if(func){
+ func();
+ event.stop(evt);
+ }
+ },
+
+ _onChildBlur: function(/*dijit/_WidgetBase*/ /*===== widget =====*/){
+ // summary:
+ // Called when focus leaves a child widget to go
+ // to a sibling widget.
+ // Used by MenuBase.js (TODO: move code there)
+ // tags:
+ // protected
+ },
+
+ _getFirstFocusableChild: function(){
+ // summary:
+ // Returns first child that can be focused
+ return this._getNextFocusableChild(null, 1); // dijit/_WidgetBase
+ },
+
+ _getLastFocusableChild: function(){
+ // summary:
+ // Returns last child that can be focused
+ return this._getNextFocusableChild(null, -1); // dijit/_WidgetBase
+ },
+
+ _getNextFocusableChild: function(child, dir){
+ // summary:
+ // Returns the next or previous focusable child, compared
+ // to "child"
+ // child: Widget
+ // The current widget
+ // dir: Integer
+ // - 1 = after
+ // - -1 = before
+ if(child){
+ child = this._getSiblingOfChild(child, dir);
+ }
+ var children = this.getChildren();
+ for(var i=0; i < children.length; i++){
+ if(!child){
+ child = children[(dir>0) ? 0 : (children.length-1)];
+ }
+ if(child.isFocusable()){
+ return child; // dijit/_WidgetBase
+ }
+ child = this._getSiblingOfChild(child, dir);
+ }
+ // no focusable child found
+ return null; // dijit/_WidgetBase
+ }
+ });
+});
diff --git a/lib/dijit/_MenuBase.js b/lib/dijit/_MenuBase.js
index 3e459f994..70e60b150 100644
--- a/lib/dijit/_MenuBase.js
+++ b/lib/dijit/_MenuBase.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_MenuBase",["./popup","dojo/window","./_Widget","./_KeyNavContainer","./_TemplatedMixin","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/_base/lang","dojo/_base/array"],function(pm,_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _5("dijit._MenuBase",[_2,_4,_3],{parentMenu:null,popupDelay:500,onExecute:function(){},onCancel:function(){},_moveToPopup:function(_b){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(_b);}else{var _c=this._getTopMenu();if(_c&&_c._isMenuBar){_c.focusNext();}}},_onPopupHover:function(){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _d=this.currentPopup.parentMenu;if(_d.focusedChild){_d.focusedChild._setSelected(false);}_d.focusedChild=this.currentPopup.from_item;_d.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(_e){if(this.isActive){this.focusChild(_e);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=setTimeout(_9.hitch(this,"_openPopup"),this.popupDelay);}}if(this.focusedChild){this.focusChild(_e);}this._hoveredChild=_e;},_onChildBlur:function(_f){this._stopPopupTimer();_f._setSelected(false);var _10=_f.popup;if(_10){this._stopPendingCloseTimer(_10);_10._pendingClose_timer=setTimeout(function(){_10._pendingClose_timer=null;if(_10.parentMenu){_10.parentMenu.currentPopup=null;}pm.close(_10);},this.popupDelay);}},onItemUnhover:function(_11){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==_11){this._hoveredChild=null;}},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_stopPendingCloseTimer:function(_12){if(_12._pendingClose_timer){clearTimeout(_12._pendingClose_timer);_12._pendingClose_timer=null;}},_stopFocusTimer:function(){if(this._focus_timer){clearTimeout(this._focus_timer);this._focus_timer=null;}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(_13,evt){if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(_13);if(_13.disabled){return false;}if(_13.popup){this._openPopup();}else{this.onExecute();_13.onClick(evt);}},_openPopup:function(){this._stopPopupTimer();var _14=this.focusedChild;if(!_14){return;}var _15=_14.popup;if(_15.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);pm.close(this.currentPopup);}_15.parentMenu=this;_15.from_item=_14;var _16=this;pm.open({parent:this,popup:_15,around:_14.domNode,orient:this._orient||["after","before"],onCancel:function(){_16.focusChild(_14);_16._cleanUp();_14._setSelected(true);_16.focusedChild=_14;},onExecute:_9.hitch(this,"_cleanUp")});this.currentPopup=_15;_15.connect(_15.domNode,"onmouseenter",_9.hitch(_16,"_onPopupHover"));if(_15.focus){_15._focus_timer=setTimeout(_9.hitch(_15,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;_8.replace(this.domNode,"dijitMenuActive","dijitMenuPassive");},onOpen:function(){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;_8.replace(this.domNode,"dijitMenuPassive","dijitMenuActive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();if(this.currentPopup){if(_a.indexOf(this._focusManager.activeStack,this.id)>=0){_7.set(this.focusedChild.focusNode,"tabIndex",this.tabIndex);this.focusedChild.focusNode.focus();}pm.close(this.currentPopup);this.currentPopup=null;}if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}},_onItemFocus:function(_17){if(this._hoveredChild&&this._hoveredChild!=_17){this._hoveredChild._onUnhover();}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});}); \ No newline at end of file
+define("dijit/_MenuBase",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/_base/lang","dojo/mouse","dojo/on","dojo/window","./a11yclick","./popup","./registry","./_Widget","./_KeyNavContainer","./_TemplatedMixin"],function(_1,_2,_3,_4,_5,_6,_7,on,_8,_9,pm,_a,_b,_c,_d){return _2("dijit._MenuBase",[_b,_d,_c],{parentMenu:null,popupDelay:500,autoFocus:false,childSelector:function(_e){var _f=_a.byNode(_e);return _e.parentNode==this.containerNode&&_f&&_f.focus;},postCreate:function(){var _10=this,_11=typeof this.childSelector=="string"?this.childSelector:_6.hitch(this,"childSelector");this.own(on(this.containerNode,on.selector(_11,_7.enter),function(){_10.onItemHover(_a.byNode(this));}),on(this.containerNode,on.selector(_11,_7.leave),function(){_10.onItemUnhover(_a.byNode(this));}),on(this.containerNode,on.selector(_11,_9),function(evt){_10.onItemClick(_a.byNode(this),evt);evt.stopPropagation();evt.preventDefault();}));this.inherited(arguments);},onExecute:function(){},onCancel:function(){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.onItemClick(this.focusedChild,evt);}else{var _12=this._getTopMenu();if(_12&&_12._isMenuBar){_12.focusNext();}}},_onPopupHover:function(){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _13=this.currentPopup.parentMenu;if(_13.focusedChild){_13.focusedChild._setSelected(false);}_13.focusedChild=this.currentPopup.from_item;_13.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(_14){if(this.isActive){this.focusChild(_14);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=this.defer("_openPopup",this.popupDelay);}}if(this.focusedChild){this.focusChild(_14);}this._hoveredChild=_14;_14._set("hovering",true);},_onChildBlur:function(_15){this._stopPopupTimer();_15._setSelected(false);var _16=_15.popup;if(_16){this._stopPendingCloseTimer(_16);_16._pendingClose_timer=this.defer(function(){_16._pendingClose_timer=null;if(_16.parentMenu){_16.parentMenu.currentPopup=null;}pm.close(_16);},this.popupDelay);}},onItemUnhover:function(_17){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==_17){this._hoveredChild=null;}_17._set("hovering",false);},_stopPopupTimer:function(){if(this.hover_timer){this.hover_timer=this.hover_timer.remove();}},_stopPendingCloseTimer:function(_18){if(_18._pendingClose_timer){_18._pendingClose_timer=_18._pendingClose_timer.remove();}},_stopFocusTimer:function(){if(this._focus_timer){this._focus_timer=this._focus_timer.remove();}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(_19,evt){if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(_19);if(_19.disabled){return false;}if(_19.popup){this._openPopup(evt.type=="keypress");}else{this.onExecute();_19._onClick?_19._onClick(evt):_19.onClick(evt);}},_openPopup:function(_1a){this._stopPopupTimer();var _1b=this.focusedChild;if(!_1b){return;}var _1c=_1b.popup;if(!_1c.isShowingNow){if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);pm.close(this.currentPopup);}_1c.parentMenu=this;_1c.from_item=_1b;var _1d=this;pm.open({parent:this,popup:_1c,around:_1b.domNode,orient:this._orient||["after","before"],onCancel:function(){_1d.focusChild(_1b);_1d._cleanUp();_1b._setSelected(true);_1d.focusedChild=_1b;},onExecute:_6.hitch(this,"_cleanUp")});this.currentPopup=_1c;_1c.connect(_1c.domNode,"onmouseenter",_6.hitch(_1d,"_onPopupHover"));}if(_1a&&_1c.focus){_1c._focus_timer=this.defer(_6.hitch(_1c,function(){this._focus_timer=null;this.focus();}));}},_markActive:function(){this.isActive=true;_5.replace(this.domNode,"dijitMenuActive","dijitMenuPassive");},onOpen:function(){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;_5.replace(this.domNode,"dijitMenuPassive","dijitMenuActive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();if(this.currentPopup){if(_1.indexOf(this._focusManager.activeStack,this.id)>=0){_4.set(this.focusedChild.focusNode,"tabIndex",this.tabIndex);this.focusedChild.focusNode.focus();}pm.close(this.currentPopup);this.currentPopup=null;}if(this.focusedChild){this.focusedChild._setSelected(false);this.onItemUnhover(this.focusedChild);this.focusedChild=null;}},_onItemFocus:function(_1e){if(this._hoveredChild&&this._hoveredChild!=_1e){this.onItemUnhover(this._hoveredChild);}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});}); \ No newline at end of file
diff --git a/lib/dijit/_MenuBase.js.uncompressed.js b/lib/dijit/_MenuBase.js.uncompressed.js
new file mode 100644
index 000000000..4a0719e6a
--- /dev/null
+++ b/lib/dijit/_MenuBase.js.uncompressed.js
@@ -0,0 +1,429 @@
+define("dijit/_MenuBase", [
+ "dojo/_base/array", // array.indexOf
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.isDescendant domClass.replace
+ "dojo/dom-attr",
+ "dojo/dom-class", // domClass.replace
+ "dojo/_base/lang", // lang.hitch
+ "dojo/mouse", // mouse.enter, mouse.leave
+ "dojo/on",
+ "dojo/window",
+ "./a11yclick",
+ "./popup",
+ "./registry",
+ "./_Widget",
+ "./_KeyNavContainer",
+ "./_TemplatedMixin"
+], function(array, declare, dom, domAttr, domClass, lang, mouse, on, winUtils,
+ a11yclick, pm, registry, _Widget, _KeyNavContainer, _TemplatedMixin){
+
+
+// module:
+// dijit/_MenuBase
+
+return declare("dijit._MenuBase",
+ [_Widget, _TemplatedMixin, _KeyNavContainer],
+{
+ // summary:
+ // Base class for Menu and MenuBar
+
+ // parentMenu: [readonly] Widget
+ // pointer to menu that displayed me
+ parentMenu: null,
+
+ // popupDelay: Integer
+ // number of milliseconds before hovering (without clicking) causes the popup to automatically open.
+ popupDelay: 500,
+
+ // autoFocus: Boolean
+ // A toggle to control whether or not a Menu gets focused when opened as a drop down from a MenuBar
+ // or DropDownButton/ComboButton. Note though that it always get focused when opened via the keyboard.
+ autoFocus: false,
+
+ childSelector: function(/*DOMNode*/ node){
+ // summary:
+ // Selector (passed to on.selector()) used to identify MenuItem child widgets, but exclude inert children
+ // like MenuSeparator. If subclass overrides to a string (ex: "> *"), the subclass must require dojo/query.
+ // tags:
+ // protected
+
+ var widget = registry.byNode(node);
+ return node.parentNode == this.containerNode && widget && widget.focus;
+ },
+
+ postCreate: function(){
+ var self = this,
+ matches = typeof this.childSelector == "string" ? this.childSelector : lang.hitch(this, "childSelector");
+ this.own(
+ on(this.containerNode, on.selector(matches, mouse.enter), function(){
+ self.onItemHover(registry.byNode(this));
+ }),
+ on(this.containerNode, on.selector(matches, mouse.leave), function(){
+ self.onItemUnhover(registry.byNode(this));
+ }),
+ on(this.containerNode, on.selector(matches, a11yclick), function(evt){
+ self.onItemClick(registry.byNode(this), evt);
+ evt.stopPropagation();
+ evt.preventDefault();
+ })
+ );
+ this.inherited(arguments);
+ },
+
+ onExecute: function(){
+ // summary:
+ // Attach point for notification about when a menu item has been executed.
+ // This is an internal mechanism used for Menus to signal to their parent to
+ // close them, because they are about to execute the onClick handler. In
+ // general developers should not attach to or override this method.
+ // tags:
+ // protected
+ },
+
+ onCancel: function(/*Boolean*/ /*===== closeAll =====*/){
+ // summary:
+ // Attach point for notification about when the user cancels the current menu
+ // This is an internal mechanism used for Menus to signal to their parent to
+ // close them. In general developers should not attach to or override this method.
+ // tags:
+ // protected
+ },
+
+ _moveToPopup: function(/*Event*/ evt){
+ // summary:
+ // This handles the right arrow key (left arrow key on RTL systems),
+ // which will either open a submenu, or move to the next item in the
+ // ancestor MenuBar
+ // tags:
+ // private
+
+ if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
+ this.onItemClick(this.focusedChild, evt);
+ }else{
+ var topMenu = this._getTopMenu();
+ if(topMenu && topMenu._isMenuBar){
+ topMenu.focusNext();
+ }
+ }
+ },
+
+ _onPopupHover: function(/*Event*/ /*===== evt =====*/){
+ // summary:
+ // This handler is called when the mouse moves over the popup.
+ // tags:
+ // private
+
+ // if the mouse hovers over a menu popup that is in pending-close state,
+ // then stop the close operation.
+ // This can't be done in onItemHover since some popup targets don't have MenuItems (e.g. ColorPicker)
+ if(this.currentPopup && this.currentPopup._pendingClose_timer){
+ var parentMenu = this.currentPopup.parentMenu;
+ // highlight the parent menu item pointing to this popup
+ if(parentMenu.focusedChild){
+ parentMenu.focusedChild._setSelected(false);
+ }
+ parentMenu.focusedChild = this.currentPopup.from_item;
+ parentMenu.focusedChild._setSelected(true);
+ // cancel the pending close
+ this._stopPendingCloseTimer(this.currentPopup);
+ }
+ },
+
+ onItemHover: function(/*MenuItem*/ item){
+ // summary:
+ // Called when cursor is over a MenuItem.
+ // tags:
+ // protected
+
+ // Don't do anything unless user has "activated" the menu by:
+ // 1) clicking it
+ // 2) opening it from a parent menu (which automatically focuses it)
+ if(this.isActive){
+ this.focusChild(item);
+ if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
+ this.hover_timer = this.defer("_openPopup", this.popupDelay);
+ }
+ }
+ // if the user is mixing mouse and keyboard navigation,
+ // then the menu may not be active but a menu item has focus,
+ // but it's not the item that the mouse just hovered over.
+ // To avoid both keyboard and mouse selections, use the latest.
+ if(this.focusedChild){
+ this.focusChild(item);
+ }
+ this._hoveredChild = item;
+
+ item._set("hovering", true);
+ },
+
+ _onChildBlur: function(item){
+ // summary:
+ // Called when a child MenuItem becomes inactive because focus
+ // has been removed from the MenuItem *and* it's descendant menus.
+ // tags:
+ // private
+ this._stopPopupTimer();
+ item._setSelected(false);
+ // Close all popups that are open and descendants of this menu
+ var itemPopup = item.popup;
+ if(itemPopup){
+ this._stopPendingCloseTimer(itemPopup);
+ itemPopup._pendingClose_timer = this.defer(function(){
+ itemPopup._pendingClose_timer = null;
+ if(itemPopup.parentMenu){
+ itemPopup.parentMenu.currentPopup = null;
+ }
+ pm.close(itemPopup); // this calls onClose
+ }, this.popupDelay);
+ }
+ },
+
+ onItemUnhover: function(/*MenuItem*/ item){
+ // summary:
+ // Callback fires when mouse exits a MenuItem
+ // tags:
+ // protected
+
+ if(this.isActive){
+ this._stopPopupTimer();
+ }
+ if(this._hoveredChild == item){ this._hoveredChild = null; }
+
+ item._set("hovering", false);
+ },
+
+ _stopPopupTimer: function(){
+ // summary:
+ // Cancels the popup timer because the user has stop hovering
+ // on the MenuItem, etc.
+ // tags:
+ // private
+ if(this.hover_timer){
+ this.hover_timer = this.hover_timer.remove();
+ }
+ },
+
+ _stopPendingCloseTimer: function(/*dijit/_WidgetBase*/ popup){
+ // summary:
+ // Cancels the pending-close timer because the close has been preempted
+ // tags:
+ // private
+ if(popup._pendingClose_timer){
+ popup._pendingClose_timer = popup._pendingClose_timer.remove();
+ }
+ },
+
+ _stopFocusTimer: function(){
+ // summary:
+ // Cancels the pending-focus timer because the menu was closed before focus occured
+ // tags:
+ // private
+ if(this._focus_timer){
+ this._focus_timer = this._focus_timer.remove();
+ }
+ },
+
+ _getTopMenu: function(){
+ // summary:
+ // Returns the top menu in this chain of Menus
+ // tags:
+ // private
+ for(var top=this; top.parentMenu; top=top.parentMenu);
+ return top;
+ },
+
+ onItemClick: function(/*dijit/_WidgetBase*/ item, /*Event*/ evt){
+ // summary:
+ // Handle clicks on an item.
+ // tags:
+ // private
+
+ // this can't be done in _onFocus since the _onFocus events occurs asynchronously
+ if(typeof this.isShowingNow == 'undefined'){ // non-popup menu
+ this._markActive();
+ }
+
+ this.focusChild(item);
+
+ if(item.disabled){ return false; }
+
+ if(item.popup){
+ this._openPopup(evt.type == "keypress");
+ }else{
+ // before calling user defined handler, close hierarchy of menus
+ // and restore focus to place it was when menu was opened
+ this.onExecute();
+
+ // user defined handler for click
+ item._onClick ? item._onClick(evt) : item.onClick(evt);
+ }
+ },
+
+ _openPopup: function(/*Boolean*/ focus){
+ // summary:
+ // Open the popup to the side of/underneath the current menu item, and optionally focus first item
+ // tags:
+ // protected
+
+ this._stopPopupTimer();
+ var from_item = this.focusedChild;
+ if(!from_item){ return; } // the focused child lost focus since the timer was started
+ var popup = from_item.popup;
+ if(!popup.isShowingNow){
+ if(this.currentPopup){
+ this._stopPendingCloseTimer(this.currentPopup);
+ pm.close(this.currentPopup);
+ }
+ popup.parentMenu = this;
+ popup.from_item = from_item; // helps finding the parent item that should be focused for this popup
+ var self = this;
+ pm.open({
+ parent: this,
+ popup: popup,
+ around: from_item.domNode,
+ orient: this._orient || ["after", "before"],
+ onCancel: function(){ // called when the child menu is canceled
+ // set isActive=false (_closeChild vs _cleanUp) so that subsequent hovering will NOT open child menus
+ // which seems aligned with the UX of most applications (e.g. notepad, wordpad, paint shop pro)
+ self.focusChild(from_item); // put focus back on my node
+ self._cleanUp(); // close the submenu (be sure this is done _after_ focus is moved)
+ from_item._setSelected(true); // oops, _cleanUp() deselected the item
+ self.focusedChild = from_item; // and unset focusedChild
+ },
+ onExecute: lang.hitch(this, "_cleanUp")
+ });
+
+ this.currentPopup = popup;
+ // detect mouseovers to handle lazy mouse movements that temporarily focus other menu items
+ popup.connect(popup.domNode, "onmouseenter", lang.hitch(self, "_onPopupHover")); // cleaned up when the popped-up widget is destroyed on close
+ }
+
+ if(focus && popup.focus){
+ // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar), then focus the popup.
+ // If the cursor happens to collide with the popup, it will generate an onmouseover event
+ // even though the mouse wasn't moved. Use defer() to call popup.focus so that
+ // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742)
+ popup._focus_timer = this.defer(lang.hitch(popup, function(){
+ this._focus_timer = null;
+ this.focus();
+ }));
+ }
+ },
+
+ _markActive: function(){
+ // summary:
+ // Mark this menu's state as active.
+ // Called when this Menu gets focus from:
+ //
+ // 1. clicking it (mouse or via space/arrow key)
+ // 2. being opened by a parent menu.
+ //
+ // This is not called just from mouse hover.
+ // Focusing a menu via TAB does NOT automatically set isActive
+ // since TAB is a navigation operation and not a selection one.
+ // For Windows apps, pressing the ALT key focuses the menubar
+ // menus (similar to TAB navigation) but the menu is not active
+ // (ie no dropdown) until an item is clicked.
+ this.isActive = true;
+ domClass.replace(this.domNode, "dijitMenuActive", "dijitMenuPassive");
+ },
+
+ onOpen: function(/*Event*/ /*===== e =====*/){
+ // summary:
+ // Callback when this menu is opened.
+ // This is called by the popup manager as notification that the menu
+ // was opened.
+ // tags:
+ // private
+
+ this.isShowingNow = true;
+ this._markActive();
+ },
+
+ _markInactive: function(){
+ // summary:
+ // Mark this menu's state as inactive.
+ this.isActive = false; // don't do this in _onBlur since the state is pending-close until we get here
+ domClass.replace(this.domNode, "dijitMenuPassive", "dijitMenuActive");
+ },
+
+ onClose: function(){
+ // summary:
+ // Callback when this menu is closed.
+ // This is called by the popup manager as notification that the menu
+ // was closed.
+ // tags:
+ // private
+
+ this._stopFocusTimer();
+ this._markInactive();
+ this.isShowingNow = false;
+ this.parentMenu = null;
+ },
+
+ _closeChild: function(){
+ // summary:
+ // Called when submenu is clicked or focus is lost. Close hierarchy of menus.
+ // tags:
+ // private
+ this._stopPopupTimer();
+
+ if(this.currentPopup){
+ // If focus is on a descendant MenuItem then move focus to me,
+ // because IE doesn't like it when you display:none a node with focus,
+ // and also so keyboard users don't lose control.
+ // Likely, immediately after a user defined onClick handler will move focus somewhere
+ // else, like a Dialog.
+ if(array.indexOf(this._focusManager.activeStack, this.id) >= 0){
+ domAttr.set(this.focusedChild.focusNode, "tabIndex", this.tabIndex);
+ this.focusedChild.focusNode.focus();
+ }
+ // Close all popups that are open and descendants of this menu
+ pm.close(this.currentPopup);
+ this.currentPopup = null;
+ }
+
+ if(this.focusedChild){ // unhighlight the focused item
+ this.focusedChild._setSelected(false);
+ this.onItemUnhover(this.focusedChild);
+ this.focusedChild = null;
+ }
+ },
+
+ _onItemFocus: function(/*MenuItem*/ item){
+ // summary:
+ // Called when child of this Menu gets focus from:
+ //
+ // 1. clicking it
+ // 2. tabbing into it
+ // 3. being opened by a parent menu.
+ //
+ // This is not called just from mouse hover.
+ if(this._hoveredChild && this._hoveredChild != item){
+ this.onItemUnhover(this._hoveredChild); // any previous mouse movement is trumped by focus selection
+ }
+ },
+
+ _onBlur: function(){
+ // summary:
+ // Called when focus is moved away from this Menu and it's submenus.
+ // tags:
+ // protected
+ this._cleanUp();
+ this.inherited(arguments);
+ },
+
+ _cleanUp: function(){
+ // summary:
+ // Called when the user is done with this menu. Closes hierarchy of menus.
+ // tags:
+ // private
+
+ this._closeChild(); // don't call this.onClose since that's incorrect for MenuBar's that never close
+ if(typeof this.isShowingNow == 'undefined'){ // non-popup menu doesn't call onClose
+ this._markInactive();
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/_OnDijitClickMixin.js b/lib/dijit/_OnDijitClickMixin.js
index d4d8c966d..d2cde3bf9 100644
--- a/lib/dijit/_OnDijitClickMixin.js
+++ b/lib/dijit/_OnDijitClickMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_OnDijitClickMixin",["dojo/on","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window"],function(on,_1,_2,_3,_4,_5,_6){var _7=null;if(_4("ie")){(function(){var _8=function(_9){_7=_9.srcElement;};_6.doc.attachEvent("onkeydown",_8);_5.addOnWindowUnload(function(){_6.doc.detachEvent("onkeydown",_8);});})();}else{_6.doc.addEventListener("keydown",function(_a){_7=_a.target;},true);}var _b=function(_c,_d){if(/input|button/i.test(_c.nodeName)){return on(_c,"click",_d);}else{function _e(e){return (e.keyCode==_2.ENTER||e.keyCode==_2.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey;};var _f=[on(_c,"keypress",function(e){if(_e(e)){_7=e.target;e.preventDefault();}}),on(_c,"keyup",function(e){if(_e(e)&&e.target==_7){_7=null;_d.call(this,e);}}),on(_c,"click",function(e){_d.call(this,e);})];return {remove:function(){_1.forEach(_f,function(h){h.remove();});}};}};return _3("dijit._OnDijitClickMixin",null,{connect:function(obj,_10,_11){return this.inherited(arguments,[obj,_10=="ondijitclick"?_b:_10,_11]);}});}); \ No newline at end of file
+define("dijit/_OnDijitClickMixin",["dojo/on","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/has","dojo/_base/unload","dojo/_base/window","./a11yclick"],function(on,_1,_2,_3,_4,_5,_6,_7){var _8=_3("dijit._OnDijitClickMixin",null,{connect:function(_9,_a,_b){return this.inherited(arguments,[_9,_a=="ondijitclick"?_7:_a,_b]);}});_8.a11yclick=_7;return _8;}); \ No newline at end of file
diff --git a/lib/dijit/_OnDijitClickMixin.js.uncompressed.js b/lib/dijit/_OnDijitClickMixin.js.uncompressed.js
new file mode 100644
index 000000000..5d2a9d5a2
--- /dev/null
+++ b/lib/dijit/_OnDijitClickMixin.js.uncompressed.js
@@ -0,0 +1,50 @@
+define("dijit/_OnDijitClickMixin", [
+ "dojo/on",
+ "dojo/_base/array", // array.forEach
+ "dojo/keys", // keys.ENTER keys.SPACE
+ "dojo/_base/declare", // declare
+ "dojo/has", // has("dom-addeventlistener")
+ "dojo/_base/unload", // unload.addOnWindowUnload
+ "dojo/_base/window", // win.doc.addEventListener win.doc.attachEvent win.doc.detachEvent
+ "./a11yclick"
+], function(on, array, keys, declare, has, unload, win, a11yclick){
+
+ // module:
+ // dijit/_OnDijitClickMixin
+
+ var ret = declare("dijit._OnDijitClickMixin", null, {
+ connect: function(
+ /*Object|null*/ obj,
+ /*String|Function*/ event,
+ /*String|Function*/ method){
+ // summary:
+ // Connects specified obj/event to specified method of this object
+ // and registers for disconnect() on widget destroy.
+ // description:
+ // Provide widget-specific analog to connect.connect, except with the
+ // implicit use of this widget as the target object.
+ // This version of connect also provides a special "ondijitclick"
+ // event which triggers on a click or space or enter keyup.
+ // Events connected with `this.connect` are disconnected upon
+ // destruction.
+ // returns:
+ // A handle that can be passed to `disconnect` in order to disconnect before
+ // the widget is destroyed.
+ // example:
+ // | var btn = new Button();
+ // | // when foo.bar() is called, call the listener we're going to
+ // | // provide in the scope of btn
+ // | btn.connect(foo, "bar", function(){
+ // | console.debug(this.toString());
+ // | });
+ // tags:
+ // protected
+
+ return this.inherited(arguments, [obj, event == "ondijitclick" ? a11yclick : event, method]);
+ }
+ });
+
+ ret.a11yclick = a11yclick; // back compat
+
+ return ret;
+});
diff --git a/lib/dijit/_PaletteMixin.js b/lib/dijit/_PaletteMixin.js
index 22b66fa81..ebb2f0d96 100644
--- a/lib/dijit/_PaletteMixin.js
+++ b/lib/dijit/_PaletteMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_PaletteMixin",["dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/_base/event","dojo/keys","dojo/_base/lang","./_CssStateMixin","./focus","./typematic"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _1("dijit._PaletteMixin",[_8],{defaultTimeout:500,timeoutChangeRate:0.9,value:"",_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:"",summary:"",_setSummaryAttr:"paletteTableNode",_dyeFactory:function(_b){var _c=_7.getObject(this.dyeClass);return new _c(_b);},_preparePalette:function(_d,_e){this._cells=[];var _f=this._blankGif;this.connect(this.gridNode,"ondijitclick","_onCellClick");for(var row=0;row<_d.length;row++){var _10=_4.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_d[row].length;col++){var _11=_d[row][col];if(_11){var _12=this._dyeFactory(_11,row,col);var _13=_4.create("td",{"class":this.cellClass,tabIndex:"-1",title:_e[_11],role:"gridcell"});_12.fillCell(_13,_f);_4.place(_13,_10);_13.index=this._cells.length;this._cells.push({node:_13,dye:_12});}}}this._xDim=_d[0].length;this._yDim=_d.length;var _14={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _14){this._connects.push(_a.addKeyListener(this.domNode,{charOrCode:_6[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _15=_14[key];return function(_16){this._navigateByKey(_15,_16);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._setCurrent(this._cells[0].node);},focus:function(){_9.focus(this._currentFocus);},_onCellClick:function(evt){var _17=evt.target;while(_17.tagName!="TD"){if(!_17.parentNode||_17==this.gridNode){return;}_17=_17.parentNode;}var _18=this._getDye(_17).getValue();this._setCurrent(_17);_9.focus(_17);this._setValueAttr(_18,true);_5.stop(evt);},_setCurrent:function(_19){if("_currentFocus" in this){_2.set(this._currentFocus,"tabIndex","-1");}this._currentFocus=_19;if(_19){_2.set(_19,"tabIndex",this.tabIndex);}},_setValueAttr:function(_1a,_1b){if(this._selectedCell>=0){_3.remove(this._cells[this._selectedCell].node,this.cellClass+"Selected");}this._selectedCell=-1;if(_1a){for(var i=0;i<this._cells.length;i++){if(_1a==this._cells[i].dye.getValue()){this._selectedCell=i;_3.add(this._cells[i].node,this.cellClass+"Selected");break;}}}this._set("value",this._selectedCell>=0?_1a:null);if(_1b||_1b===undefined){this.onChange(_1a);}},onChange:function(){},_navigateByKey:function(_1c,_1d){if(_1d==-1){return;}var _1e=this._currentFocus.index+_1c;if(_1e<this._cells.length&&_1e>-1){var _1f=this._cells[_1e].node;this._setCurrent(_1f);setTimeout(_7.hitch(dijit,"focus",_1f),0);}},_getDye:function(_20){return this._cells[_20.index].dye;}});}); \ No newline at end of file
+define("dijit/_PaletteMixin",["dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/_base/event","dojo/keys","dojo/_base/lang","./_CssStateMixin","./focus","./typematic"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _1("dijit._PaletteMixin",[_8],{defaultTimeout:500,timeoutChangeRate:0.9,value:"",_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:null,summary:"",_setSummaryAttr:"paletteTableNode",_dyeFactory:function(_b){var _c=typeof this.dyeClass=="string"?_7.getObject(this.dyeClass):this.dyeClass;return new _c(_b);},_preparePalette:function(_d,_e){this._cells=[];var _f=this._blankGif;this.connect(this.gridNode,"ondijitclick","_onCellClick");for(var row=0;row<_d.length;row++){var _10=_4.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_d[row].length;col++){var _11=_d[row][col];if(_11){var _12=this._dyeFactory(_11,row,col,_e[_11]);var _13=_4.create("td",{"class":this.cellClass,tabIndex:"-1",title:_e[_11],role:"gridcell"},_10);_12.fillCell(_13,_f);_13.idx=this._cells.length;this._cells.push({node:_13,dye:_12});}}}this._xDim=_d[0].length;this._yDim=_d.length;var _14={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _14){this.own(_a.addKeyListener(this.domNode,{charOrCode:_6[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _15=_14[key];return function(_16){this._navigateByKey(_15,_16);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._setCurrent(this._cells[0].node);},focus:function(){_9.focus(this._currentFocus);},_onCellClick:function(evt){var _17=evt.target;while(_17.tagName!="TD"){if(!_17.parentNode||_17==this.gridNode){return;}_17=_17.parentNode;}var _18=this._getDye(_17).getValue();this._setCurrent(_17);_9.focus(_17);this._setValueAttr(_18,true);_5.stop(evt);},_setCurrent:function(_19){if("_currentFocus" in this){_2.set(this._currentFocus,"tabIndex","-1");}this._currentFocus=_19;if(_19){_2.set(_19,"tabIndex",this.tabIndex);}},_setValueAttr:function(_1a,_1b){if(this._selectedCell>=0){_3.remove(this._cells[this._selectedCell].node,this.cellClass+"Selected");}this._selectedCell=-1;if(_1a){for(var i=0;i<this._cells.length;i++){if(_1a==this._cells[i].dye.getValue()){this._selectedCell=i;_3.add(this._cells[i].node,this.cellClass+"Selected");break;}}}this._set("value",this._selectedCell>=0?_1a:null);if(_1b||_1b===undefined){this.onChange(_1a);}},onChange:function(){},_navigateByKey:function(_1c,_1d){if(_1d==-1){return;}var _1e=this._currentFocus.idx+_1c;if(_1e<this._cells.length&&_1e>-1){var _1f=this._cells[_1e].node;this._setCurrent(_1f);this.defer(_7.hitch(_9,"focus",_1f));}},_getDye:function(_20){return this._cells[_20.idx].dye;}});}); \ No newline at end of file
diff --git a/lib/dijit/_PaletteMixin.js.uncompressed.js b/lib/dijit/_PaletteMixin.js.uncompressed.js
new file mode 100644
index 000000000..3665f8f21
--- /dev/null
+++ b/lib/dijit/_PaletteMixin.js.uncompressed.js
@@ -0,0 +1,340 @@
+define("dijit/_PaletteMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-construct", // domConstruct.create domConstruct.place
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.getObject
+ "./_CssStateMixin",
+ "./focus",
+ "./typematic"
+], function(declare, domAttr, domClass, domConstruct, event, keys, lang, _CssStateMixin, focus, typematic){
+
+// module:
+// dijit/_PaletteMixin
+
+return declare("dijit._PaletteMixin", [_CssStateMixin], {
+ // summary:
+ // A keyboard accessible palette, for picking a color/emoticon/etc.
+ // description:
+ // A mixin for a grid showing various entities, so the user can pick a certain entity.
+
+ // defaultTimeout: Number
+ // Number of milliseconds before a held key or button becomes typematic
+ defaultTimeout: 500,
+
+ // 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,
+
+ // value: String
+ // Currently selected color/emoticon/etc.
+ value: "",
+
+ // _selectedCell: [private] Integer
+ // Index of the currently selected cell. Initially, none selected
+ _selectedCell: -1,
+
+/*=====
+ // _currentFocus: [private] DomNode
+ // The currently focused cell (if the palette itself has focus), or otherwise
+ // the cell to be focused when the palette itself gets focus.
+ // Different from value, which represents the selected (i.e. clicked) cell.
+ _currentFocus: null,
+=====*/
+
+/*=====
+ // _xDim: [protected] Integer
+ // This is the number of cells horizontally across.
+ _xDim: null,
+=====*/
+
+/*=====
+ // _yDim: [protected] Integer
+ // This is the number of cells vertically down.
+ _yDim: null,
+=====*/
+
+ // tabIndex: String
+ // Widget tab index.
+ tabIndex: "0",
+
+ // cellClass: [protected] String
+ // CSS class applied to each cell in the palette
+ cellClass: "dijitPaletteCell",
+
+ // dyeClass: [protected] Constructor
+ // Constructor for Object created for each cell of the palette.
+ // dyeClass should implements dijit.Dye interface
+ dyeClass: null,
+
+ // summary: String
+ // Localized summary for the palette table
+ summary: '',
+ _setSummaryAttr: "paletteTableNode",
+
+ _dyeFactory: function(value /*===== , row, col, title =====*/){
+ // summary:
+ // Return instance of dijit.Dye for specified cell of palette
+ // tags:
+ // extension
+
+ // Remove string support for 2.0
+ var dyeClassObj = typeof this.dyeClass == "string" ? lang.getObject(this.dyeClass) : this.dyeClass;
+ return new dyeClassObj(value);
+ },
+
+ _preparePalette: function(choices, titles) {
+ // summary:
+ // Subclass must call _preparePalette() from postCreate(), passing in the tooltip
+ // for each cell
+ // choices: String[][]
+ // id's for each cell of the palette, used to create Dye JS object for each cell
+ // titles: String[]
+ // Localized tooltip for each cell
+
+ this._cells = [];
+ var url = this._blankGif;
+
+ this.connect(this.gridNode, "ondijitclick", "_onCellClick");
+
+ for(var row=0; row < choices.length; row++){
+ var rowNode = domConstruct.create("tr", {tabIndex: "-1"}, this.gridNode);
+ for(var col=0; col < choices[row].length; col++){
+ var value = choices[row][col];
+ if(value){
+ var cellObject = this._dyeFactory(value, row, col, titles[value]);
+
+ var cellNode = domConstruct.create("td", {
+ "class": this.cellClass,
+ tabIndex: "-1",
+ title: titles[value],
+ role: "gridcell"
+ }, rowNode);
+
+ // prepare cell inner structure
+ cellObject.fillCell(cellNode, url);
+
+ cellNode.idx = this._cells.length;
+
+ // save cell info into _cells
+ this._cells.push({node:cellNode, dye:cellObject});
+ }
+ }
+ }
+ this._xDim = choices[0].length;
+ this._yDim = choices.length;
+
+ // Now set all events
+ // The palette itself is navigated to with the tab key on the keyboard
+ // Keyboard navigation within the Palette is with the arrow keys
+ // Spacebar selects the cell.
+ // For the up key the index is changed by negative the x dimension.
+
+ var keyIncrementMap = {
+ UP_ARROW: -this._xDim,
+ // The down key the index is increase by the x dimension.
+ DOWN_ARROW: this._xDim,
+ // Right and left move the index by 1.
+ RIGHT_ARROW: this.isLeftToRight() ? 1 : -1,
+ LEFT_ARROW: this.isLeftToRight() ? -1 : 1
+ };
+ for(var key in keyIncrementMap){
+ this.own(
+ typematic.addKeyListener(
+ this.domNode,
+ {charOrCode:keys[key], ctrlKey:false, altKey:false, shiftKey:false},
+ this,
+ function(){
+ var increment = keyIncrementMap[key];
+ return function(count){ this._navigateByKey(increment, count); };
+ }(),
+ this.timeoutChangeRate,
+ this.defaultTimeout
+ )
+ );
+ }
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Set initial navigable node.
+ this._setCurrent(this._cells[0].node);
+ },
+
+ focus: function(){
+ // summary:
+ // Focus this widget. Puts focus on the most recently focused cell.
+
+ // The cell already has tabIndex set, just need to set CSS and focus it
+ focus.focus(this._currentFocus);
+ },
+
+ _onCellClick: function(/*Event*/ evt){
+ // summary:
+ // Handler for click, enter key & space key. Selects the cell.
+ // evt:
+ // The event.
+ // tags:
+ // private
+
+ var target = evt.target;
+
+ // Find TD associated with click event. For ColorPalette user likely clicked IMG inside of TD
+ while(target.tagName != "TD"){
+ if(!target.parentNode || target == this.gridNode){ // probably can never happen, but just in case
+ return;
+ }
+ target = target.parentNode;
+ }
+
+ var value = this._getDye(target).getValue();
+
+ // First focus the clicked cell, and then send onChange() notification.
+ // onChange() (via _setValueAttr) must be after the focus call, because
+ // it may trigger a refocus to somewhere else (like the Editor content area), and that
+ // second focus should win.
+ this._setCurrent(target);
+ focus.focus(target);
+ this._setValueAttr(value, true);
+
+ event.stop(evt);
+ },
+
+ _setCurrent: function(/*DomNode*/ node){
+ // summary:
+ // Sets which node is the focused cell.
+ // description:
+ // At any point in time there's exactly one
+ // cell with tabIndex != -1. If focus is inside the palette then
+ // focus is on that cell.
+ //
+ // After calling this method, arrow key handlers and mouse click handlers
+ // should focus the cell in a setTimeout().
+ // tags:
+ // protected
+ if("_currentFocus" in this){
+ // Remove tabIndex on old cell
+ domAttr.set(this._currentFocus, "tabIndex", "-1");
+ }
+
+ // Set tabIndex of new cell
+ this._currentFocus = node;
+ if(node){
+ domAttr.set(node, "tabIndex", this.tabIndex);
+ }
+ },
+
+ _setValueAttr: function(value, priorityChange){
+ // summary:
+ // This selects a cell. It triggers the onChange event.
+ // value: String
+ // Value of the cell to select
+ // tags:
+ // protected
+ // priorityChange: Boolean?
+ // Optional parameter used to tell the select whether or not to fire
+ // onChange event.
+
+ // clear old selected cell
+ if(this._selectedCell >= 0){
+ domClass.remove(this._cells[this._selectedCell].node, this.cellClass + "Selected");
+ }
+ this._selectedCell = -1;
+
+ // search for cell matching specified value
+ if(value){
+ for(var i = 0; i < this._cells.length; i++){
+ if(value == this._cells[i].dye.getValue()){
+ this._selectedCell = i;
+ domClass.add(this._cells[i].node, this.cellClass + "Selected");
+ break;
+ }
+ }
+ }
+
+ // record new value, or null if no matching cell
+ this._set("value", this._selectedCell >= 0 ? value : null);
+
+ if(priorityChange || priorityChange === undefined){
+ this.onChange(value);
+ }
+ },
+
+ onChange: function(/*===== value =====*/){
+ // summary:
+ // Callback when a cell is selected.
+ // value: String
+ // Value corresponding to cell.
+ },
+
+ _navigateByKey: function(increment, typeCount){
+ // summary:
+ // This is the callback for typematic.
+ // It changes the focus and the highlighed cell.
+ // increment:
+ // How much the key is navigated.
+ // typeCount:
+ // How many times typematic has fired.
+ // tags:
+ // private
+
+ // typecount == -1 means the key is released.
+ if(typeCount == -1){ return; }
+
+ var newFocusIndex = this._currentFocus.idx + increment;
+ if(newFocusIndex < this._cells.length && newFocusIndex > -1){
+ var focusNode = this._cells[newFocusIndex].node;
+ this._setCurrent(focusNode);
+
+ // Actually focus the node, for the benefit of screen readers.
+ // Use defer because IE doesn't like changing focus inside of an event handler
+ this.defer(lang.hitch(focus, "focus", focusNode));
+ }
+ },
+
+ _getDye: function(/*DomNode*/ cell){
+ // summary:
+ // Get JS object for given cell DOMNode
+
+ return this._cells[cell.idx].dye;
+ }
+});
+
+/*=====
+declare("dijit.Dye",
+ null,
+ {
+ // summary:
+ // Interface for the JS Object associated with a palette cell (i.e. DOMNode)
+
+ constructor: function(alias, row, col){
+ // summary:
+ // Initialize according to value or alias like "white"
+ // alias: String
+ },
+
+ getValue: function(){
+ // summary:
+ // Return "value" of cell; meaning of "value" varies by subclass.
+ // description:
+ // For example color hex value, emoticon ascii value etc, entity hex value.
+ },
+
+ fillCell: function(cell, blankGif){
+ // summary:
+ // Add cell DOMNode inner structure
+ // cell: DomNode
+ // The surrounding cell
+ // blankGif: String
+ // URL for blank cell image
+ }
+ }
+);
+=====*/
+
+});
diff --git a/lib/dijit/_Templated.js.uncompressed.js b/lib/dijit/_Templated.js.uncompressed.js
new file mode 100644
index 000000000..c4c9a7ad2
--- /dev/null
+++ b/lib/dijit/_Templated.js.uncompressed.js
@@ -0,0 +1,64 @@
+define("dijit/_Templated", [
+ "./_WidgetBase",
+ "./_TemplatedMixin",
+ "./_WidgetsInTemplateMixin",
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.extend lang.isArray
+ "dojo/_base/kernel" // kernel.deprecated
+], function(_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, array, declare, lang, kernel){
+
+ // module:
+ // dijit/_Templated
+
+ // These arguments can be specified for widgets which are used in templates.
+ // Since any widget can be specified as sub widgets in template, mix it
+ // into the base widget class. (This is a hack, but it's effective.)
+ // Remove for 2.0. Also, hide from API doc parser.
+ lang.extend(_WidgetBase, /*===== {} || =====*/ {
+ waiRole: "",
+ waiState:""
+ });
+
+ return declare("dijit._Templated", [_TemplatedMixin, _WidgetsInTemplateMixin], {
+ // summary:
+ // Deprecated mixin for widgets that are instantiated from a template.
+ // Widgets should use _TemplatedMixin plus if necessary _WidgetsInTemplateMixin instead.
+
+ // widgetsInTemplate: [protected] Boolean
+ // Should we parse the template to find widgets that might be
+ // declared in markup inside it? False by default.
+ widgetsInTemplate: false,
+
+ constructor: function(){
+ kernel.deprecated(this.declaredClass + ": dijit._Templated deprecated, use dijit._TemplatedMixin and if necessary dijit._WidgetsInTemplateMixin", "", "2.0");
+ },
+
+ _attachTemplateNodes: function(rootNode, getAttrFunc){
+
+ this.inherited(arguments);
+
+ // Do deprecated waiRole and waiState
+ var nodes = lang.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*"));
+ var x = lang.isArray(rootNode) ? 0 : -1;
+ for(; x<nodes.length; x++){
+ var baseNode = (x == -1) ? rootNode : nodes[x];
+
+ // waiRole, waiState
+ var role = getAttrFunc(baseNode, "waiRole");
+ if(role){
+ baseNode.setAttribute("role", role);
+ }
+ var values = getAttrFunc(baseNode, "waiState");
+ if(values){
+ array.forEach(values.split(/\s*,\s*/), function(stateValue){
+ if(stateValue.indexOf('-') != -1){
+ var pair = stateValue.split('-');
+ baseNode.setAttribute("aria-"+pair[0], pair[1]);
+ }
+ });
+ }
+ }
+ }
+ });
+});
diff --git a/lib/dijit/_TemplatedMixin.js b/lib/dijit/_TemplatedMixin.js
index 683bb8f20..44282b6b0 100644
--- a/lib/dijit/_TemplatedMixin.js
+++ b/lib/dijit/_TemplatedMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_TemplatedMixin",["dojo/_base/lang","dojo/touch","./_WidgetBase","dojo/string","dojo/cache","dojo/_base/array","dojo/_base/declare","dojo/dom-construct","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){var _c=_7("dijit._TemplatedMixin",null,{templateString:null,templatePath:null,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];this._attachEvents=[];},_stringRepl:function(_d){var _e=this.declaredClass,_f=this;return _4.substitute(_d,this,function(_10,key){if(key.charAt(0)=="!"){_10=_1.getObject(key.substr(1),false,_f);}if(typeof _10=="undefined"){throw new Error(_e+" template:"+key);}if(_10==null){return "";}return key.charAt(0)=="!"?_10:_10.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){if(!this.templateString){this.templateString=_5(this.templatePath,{sanitize:true});}var _11=_c.getCachedTemplate(this.templateString,this._skipNodeCache);var _12;if(_1.isString(_11)){_12=_8.toDom(this._stringRepl(_11));if(_12.nodeType!=1){throw new Error("Invalid template: "+_11);}}else{_12=_11.cloneNode(true);}this.domNode=_12;this.inherited(arguments);this._attachTemplateNodes(_12,function(n,p){return n.getAttribute(p);});this._beforeFillContent();this._fillContent(this.srcNodeRef);},_beforeFillContent:function(){},_fillContent:function(_13){var _14=this.containerNode;if(_13&&_14){while(_13.hasChildNodes()){_14.appendChild(_13.firstChild);}}},_attachTemplateNodes:function(_15,_16){var _17=_1.isArray(_15)?_15:(_15.all||_15.getElementsByTagName("*"));var x=_1.isArray(_15)?0:-1;for(;x<_17.length;x++){var _18=(x==-1)?_15:_17[x];if(this.widgetsInTemplate&&(_16(_18,"dojoType")||_16(_18,"data-dojo-type"))){continue;}var _19=_16(_18,"dojoAttachPoint")||_16(_18,"data-dojo-attach-point");if(_19){var _1a,_1b=_19.split(/\s*,\s*/);while((_1a=_1b.shift())){if(_1.isArray(this[_1a])){this[_1a].push(_18);}else{this[_1a]=_18;}this._attachPoints.push(_1a);}}var _1c=_16(_18,"dojoAttachEvent")||_16(_18,"data-dojo-attach-event");if(_1c){var _1d,_1e=_1c.split(/\s*,\s*/);var _1f=_1.trim;while((_1d=_1e.shift())){if(_1d){var _20=null;if(_1d.indexOf(":")!=-1){var _21=_1d.split(":");_1d=_1f(_21[0]);_20=_1f(_21[1]);}else{_1d=_1f(_1d);}if(!_20){_20=_1d;}this._attachEvents.push(this.connect(_18,_2[_1d]||_1d,_20));}}}}},destroyRendering:function(){_6.forEach(this._attachPoints,function(_22){delete this[_22];},this);this._attachPoints=[];_6.forEach(this._attachEvents,this.disconnect,this);this._attachEvents=[];this.inherited(arguments);}});_c._templateCache={};_c.getCachedTemplate=function(_23,_24){var _25=_c._templateCache;var key=_23;var _26=_25[key];if(_26){try{if(!_26.ownerDocument||_26.ownerDocument==_b.doc){return _26;}}catch(e){}_8.destroy(_26);}_23=_4.trim(_23);if(_24||_23.match(/\$\{([^\}]+)\}/g)){return (_25[key]=_23);}else{var _27=_8.toDom(_23);if(_27.nodeType!=1){throw new Error("Invalid template: "+_23);}return (_25[key]=_27);}};if(_9("ie")){_a.addOnWindowUnload(function(){var _28=_c._templateCache;for(var key in _28){var _29=_28[key];if(typeof _29=="object"){_8.destroy(_29);}delete _28[key];}});}_1.extend(_3,{dojoAttachEvent:"",dojoAttachPoint:""});return _c;}); \ No newline at end of file
+define("dijit/_TemplatedMixin",["dojo/_base/lang","dojo/touch","./_WidgetBase","dojo/string","dojo/cache","dojo/_base/array","dojo/_base/declare","dojo/dom-construct","dojo/sniff","dojo/_base/unload"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){var _b=_7("dijit._TemplatedMixin",null,{templateString:null,templatePath:null,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];this._attachEvents=[];},_stringRepl:function(_c){var _d=this.declaredClass,_e=this;return _4.substitute(_c,this,function(_f,key){if(key.charAt(0)=="!"){_f=_1.getObject(key.substr(1),false,_e);}if(typeof _f=="undefined"){throw new Error(_d+" template:"+key);}if(_f==null){return "";}return key.charAt(0)=="!"?_f:_f.toString().replace(/"/g,"&quot;");},this);},buildRendering:function(){if(!this.templateString){this.templateString=_5(this.templatePath,{sanitize:true});}var _10=_b.getCachedTemplate(this.templateString,this._skipNodeCache,this.ownerDocument);var _11;if(_1.isString(_10)){_11=_8.toDom(this._stringRepl(_10),this.ownerDocument);if(_11.nodeType!=1){throw new Error("Invalid template: "+_10);}}else{_11=_10.cloneNode(true);}this.domNode=_11;this.inherited(arguments);this._attachTemplateNodes(_11,function(n,p){return n.getAttribute(p);});this._beforeFillContent();this._fillContent(this.srcNodeRef);},_beforeFillContent:function(){},_fillContent:function(_12){var _13=this.containerNode;if(_12&&_13){while(_12.hasChildNodes()){_13.appendChild(_12.firstChild);}}},_attachTemplateNodes:function(_14,_15){var _16=_1.isArray(_14)?_14:(_14.all||_14.getElementsByTagName("*"));var x=_1.isArray(_14)?0:-1;for(;x<0||_16[x];x++){var _17=(x==-1)?_14:_16[x];if(this.widgetsInTemplate&&(_15(_17,"dojoType")||_15(_17,"data-dojo-type"))){continue;}var _18=_15(_17,"dojoAttachPoint")||_15(_17,"data-dojo-attach-point");if(_18){var _19,_1a=_18.split(/\s*,\s*/);while((_19=_1a.shift())){if(_1.isArray(this[_19])){this[_19].push(_17);}else{this[_19]=_17;}this._attachPoints.push(_19);}}var _1b=_15(_17,"dojoAttachEvent")||_15(_17,"data-dojo-attach-event");if(_1b){var _1c,_1d=_1b.split(/\s*,\s*/);var _1e=_1.trim;while((_1c=_1d.shift())){if(_1c){var _1f=null;if(_1c.indexOf(":")!=-1){var _20=_1c.split(":");_1c=_1e(_20[0]);_1f=_1e(_20[1]);}else{_1c=_1e(_1c);}if(!_1f){_1f=_1c;}this._attachEvents.push(this.connect(_17,_2[_1c]||_1c,_1f));}}}}},destroyRendering:function(){_6.forEach(this._attachPoints,function(_21){delete this[_21];},this);this._attachPoints=[];_6.forEach(this._attachEvents,this.disconnect,this);this._attachEvents=[];this.inherited(arguments);}});_b._templateCache={};_b.getCachedTemplate=function(_22,_23,doc){var _24=_b._templateCache;var key=_22;var _25=_24[key];if(_25){try{if(!_25.ownerDocument||_25.ownerDocument==(doc||document)){return _25;}}catch(e){}_8.destroy(_25);}_22=_4.trim(_22);if(_23||_22.match(/\$\{([^\}]+)\}/g)){return (_24[key]=_22);}else{var _26=_8.toDom(_22,doc);if(_26.nodeType!=1){throw new Error("Invalid template: "+_22);}return (_24[key]=_26);}};if(_9("ie")){_a.addOnWindowUnload(function(){var _27=_b._templateCache;for(var key in _27){var _28=_27[key];if(typeof _28=="object"){_8.destroy(_28);}delete _27[key];}});}_1.extend(_3,{dojoAttachEvent:"",dojoAttachPoint:""});return _b;}); \ No newline at end of file
diff --git a/lib/dijit/_TemplatedMixin.js.uncompressed.js b/lib/dijit/_TemplatedMixin.js.uncompressed.js
new file mode 100644
index 000000000..7473b92b9
--- /dev/null
+++ b/lib/dijit/_TemplatedMixin.js.uncompressed.js
@@ -0,0 +1,309 @@
+define("dijit/_TemplatedMixin", [
+ "dojo/_base/lang", // lang.getObject
+ "dojo/touch",
+ "./_WidgetBase",
+ "dojo/string", // string.substitute string.trim
+ "dojo/cache", // dojo.cache
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.destroy, domConstruct.toDom
+ "dojo/sniff", // has("ie")
+ "dojo/_base/unload" // unload.addOnWindowUnload
+], function(lang, touch, _WidgetBase, string, cache, array, declare, domConstruct, has, unload) {
+
+ // module:
+ // dijit/_TemplatedMixin
+
+ var _TemplatedMixin = declare("dijit._TemplatedMixin", null, {
+ // summary:
+ // Mixin for widgets that are instantiated from a template
+
+ // templateString: [protected] String
+ // A string that represents the widget template.
+ // Use in conjunction with dojo.cache() to load from a file.
+ templateString: null,
+
+ // templatePath: [protected deprecated] String
+ // Path to template (HTML file) for this widget relative to dojo.baseUrl.
+ // Deprecated: use templateString with require([... "dojo/text!..."], ...) instead
+ templatePath: null,
+
+ // skipNodeCache: [protected] Boolean
+ // If using a cached widget template nodes poses issues for a
+ // particular widget class, it can set this property to ensure
+ // that its template is always re-built from a string
+ _skipNodeCache: false,
+
+ // _earlyTemplatedStartup: Boolean
+ // A fallback to preserve the 1.0 - 1.3 behavior of children in
+ // templates having their startup called before the parent widget
+ // fires postCreate. Defaults to 'false', causing child widgets to
+ // have their .startup() called immediately before a parent widget
+ // .startup(), but always after the parent .postCreate(). Set to
+ // 'true' to re-enable to previous, arguably broken, behavior.
+ _earlyTemplatedStartup: false,
+
+/*=====
+ // _attachPoints: [private] String[]
+ // List of widget attribute names associated with data-dojo-attach-point=... in the
+ // template, ex: ["containerNode", "labelNode"]
+ _attachPoints: [],
+
+ // _attachEvents: [private] Handle[]
+ // List of connections associated with data-dojo-attach-event=... in the
+ // template
+ _attachEvents: [],
+ =====*/
+
+ 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._attachPoints = [];
+ this._attachEvents = [];
+ },
+
+ _stringRepl: function(tmpl){
+ // summary:
+ // Does substitution of ${foo} type properties in template string
+ // tags:
+ // private
+ var className = this.declaredClass, _this = this;
+ // Cache contains a string because we need to do property replacement
+ // do the property replacement
+ return string.substitute(tmpl, this, function(value, key){
+ if(key.charAt(0) == '!'){ value = lang.getObject(key.substr(1), false, _this); }
+ if(typeof value == "undefined"){ throw new Error(className+" template:"+key); } // a debugging aide
+ if(value == null){ return ""; }
+
+ // Substitution keys beginning with ! will skip the transform step,
+ // in case a user wishes to insert unescaped markup, e.g. ${!foo}
+ return key.charAt(0) == "!" ? value :
+ // Safer substitution, see heading "Attribute values" in
+ // http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.3.2
+ value.toString().replace(/"/g,"&quot;"); //TODO: add &amp? use encodeXML method?
+ }, this);
+ },
+
+ buildRendering: function(){
+ // summary:
+ // Construct the UI for this widget from a template, setting this.domNode.
+ // tags:
+ // protected
+
+ if(!this.templateString){
+ this.templateString = cache(this.templatePath, {sanitize: true});
+ }
+
+ // Lookup cached version of template, and download to cache if it
+ // isn't there already. Returns either a DomNode or a string, depending on
+ // whether or not the template contains ${foo} replacement parameters.
+ var cached = _TemplatedMixin.getCachedTemplate(this.templateString, this._skipNodeCache, this.ownerDocument);
+
+ var node;
+ if(lang.isString(cached)){
+ node = domConstruct.toDom(this._stringRepl(cached), this.ownerDocument);
+ if(node.nodeType != 1){
+ // Flag common problems such as templates with multiple top level nodes (nodeType == 11)
+ throw new Error("Invalid template: " + cached);
+ }
+ }else{
+ // if it's a node, all we have to do is clone it
+ node = cached.cloneNode(true);
+ }
+
+ this.domNode = node;
+
+ // Call down to _Widget.buildRendering() to get base classes assigned
+ // TODO: change the baseClass assignment to _setBaseClassAttr
+ this.inherited(arguments);
+
+ // recurse through the node, looking for, and attaching to, our
+ // attachment points and events, which should be defined on the template node.
+ this._attachTemplateNodes(node, function(n,p){ return n.getAttribute(p); });
+
+ this._beforeFillContent(); // hook for _WidgetsInTemplateMixin
+
+ this._fillContent(this.srcNodeRef);
+ },
+
+ _beforeFillContent: function(){
+ },
+
+ _fillContent: function(/*DomNode*/ source){
+ // summary:
+ // Relocate source contents to templated container node.
+ // this.containerNode must be able to receive children, or exceptions will be thrown.
+ // tags:
+ // protected
+ var dest = this.containerNode;
+ if(source && dest){
+ while(source.hasChildNodes()){
+ dest.appendChild(source.firstChild);
+ }
+ }
+ },
+
+ _attachTemplateNodes: function(rootNode, getAttrFunc){
+ // summary:
+ // Iterate through the template and attach functions and nodes accordingly.
+ // Alternately, if rootNode is an array of widgets, then will process data-dojo-attach-point
+ // etc. for those widgets.
+ // description:
+ // Map widget properties and functions to the handlers specified in
+ // the dom node and it's descendants. This function iterates over all
+ // nodes and looks for these properties:
+ //
+ // - dojoAttachPoint/data-dojo-attach-point
+ // - dojoAttachEvent/data-dojo-attach-event
+ // rootNode: DomNode|Widget[]
+ // the node to search for properties. All children will be searched.
+ // getAttrFunc: Function
+ // a function which will be used to obtain property for a given
+ // DomNode/Widget
+ // tags:
+ // private
+
+ var nodes = lang.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*"));
+ var x = lang.isArray(rootNode) ? 0 : -1;
+ for(; x < 0 || nodes[x]; x++){ // don't access nodes.length on IE, see #14346
+ var baseNode = (x == -1) ? rootNode : nodes[x];
+ if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){
+ continue;
+ }
+ // Process data-dojo-attach-point
+ var attachPoint = getAttrFunc(baseNode, "dojoAttachPoint") || getAttrFunc(baseNode, "data-dojo-attach-point");
+ if(attachPoint){
+ var point, points = attachPoint.split(/\s*,\s*/);
+ while((point = points.shift())){
+ if(lang.isArray(this[point])){
+ this[point].push(baseNode);
+ }else{
+ this[point]=baseNode;
+ }
+ this._attachPoints.push(point);
+ }
+ }
+
+ // Process data-dojo-attach-event
+ var attachEvent = getAttrFunc(baseNode, "dojoAttachEvent") || getAttrFunc(baseNode, "data-dojo-attach-event");
+ if(attachEvent){
+ // NOTE: we want to support attributes that have the form
+ // "domEvent: nativeEvent; ..."
+ var event, events = attachEvent.split(/\s*,\s*/);
+ var trim = lang.trim;
+ while((event = events.shift())){
+ if(event){
+ var thisFunc = null;
+ if(event.indexOf(":") != -1){
+ // oh, if only JS had tuple assignment
+ var funcNameArr = event.split(":");
+ event = trim(funcNameArr[0]);
+ thisFunc = trim(funcNameArr[1]);
+ }else{
+ event = trim(event);
+ }
+ if(!thisFunc){
+ thisFunc = event;
+ }
+ // Map "press", "move" and "release" to keys.touch, keys.move, keys.release
+ this._attachEvents.push(this.connect(baseNode, touch[event] || event, thisFunc));
+ }
+ }
+ }
+ }
+ },
+
+ destroyRendering: function(){
+ // Delete all attach points to prevent IE6 memory leaks.
+ array.forEach(this._attachPoints, function(point){
+ delete this[point];
+ }, this);
+ this._attachPoints = [];
+
+ // And same for event handlers
+ array.forEach(this._attachEvents, this.disconnect, this);
+ this._attachEvents = [];
+
+ this.inherited(arguments);
+ }
+ });
+
+ // key is templateString; object is either string or DOM tree
+ _TemplatedMixin._templateCache = {};
+
+ _TemplatedMixin.getCachedTemplate = function(templateString, alwaysUseString, doc){
+ // summary:
+ // Static method to get a template based on the templatePath or
+ // templateString key
+ // templateString: String
+ // The template
+ // alwaysUseString: Boolean
+ // Don't cache the DOM tree for this template, even if it doesn't have any variables
+ // doc: Document?
+ // The target document. Defaults to document global if unspecified.
+ // returns: Mixed
+ // Either string (if there are ${} variables that need to be replaced) or just
+ // a DOM tree (if the node can be cloned directly)
+
+ // is it already cached?
+ var tmplts = _TemplatedMixin._templateCache;
+ var key = templateString;
+ var cached = tmplts[key];
+ if(cached){
+ try{
+ // if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the
+ // current document, then use the current cached value
+ if(!cached.ownerDocument || cached.ownerDocument == (doc || document)){
+ // string or node of the same document
+ return cached;
+ }
+ }catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded
+ domConstruct.destroy(cached);
+ }
+
+ templateString = string.trim(templateString);
+
+ if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){
+ // there are variables in the template so all we can do is cache the string
+ return (tmplts[key] = templateString); //String
+ }else{
+ // there are no variables in the template so we can cache the DOM tree
+ var node = domConstruct.toDom(templateString, doc);
+ if(node.nodeType != 1){
+ throw new Error("Invalid template: " + templateString);
+ }
+ return (tmplts[key] = node); //Node
+ }
+ };
+
+ if(has("ie")){
+ unload.addOnWindowUnload(function(){
+ var cache = _TemplatedMixin._templateCache;
+ for(var key in cache){
+ var value = cache[key];
+ if(typeof value == "object"){ // value is either a string or a DOM node template
+ domConstruct.destroy(value);
+ }
+ delete cache[key];
+ }
+ });
+ }
+
+ // These arguments can be specified for widgets which are used in templates.
+ // Since any widget can be specified as sub widgets in template, mix it
+ // into the base widget class. (This is a hack, but it's effective.).
+ // Remove for 2.0. Also, hide from API doc parser.
+ lang.extend(_WidgetBase, /*===== {} || =====*/ {
+ dojoAttachEvent: "",
+ dojoAttachPoint: ""
+ });
+
+ return _TemplatedMixin;
+});
diff --git a/lib/dijit/_TimePicker.js b/lib/dijit/_TimePicker.js
index 9a4cd100c..2264fcc5d 100644
--- a/lib/dijit/_TimePicker.js
+++ b/lib/dijit/_TimePicker.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/templates/TimePicker.html":"<div id=\"widget_${id}\" class=\"dijitMenu\"\n ><div data-dojo-attach-point=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&#160;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div></div\n ><div data-dojo-attach-point=\"timeMenu,focusNode\" data-dojo-attach-event=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n ><div data-dojo-attach-point=\"downArrow\" class=\"dijitButtonNode dijitDownArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&#160;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div></div\n></div>\n"}});define("dijit/_TimePicker",["dojo/_base/array","dojo/date","dojo/date/locale","dojo/date/stamp","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/_base/event","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/query","dijit/typematic","./_Widget","./_TemplatedMixin","./form/_FormValueWidget","dojo/text!./templates/TimePicker.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12){return _5("dijit._TimePicker",[_f,_10],{templateString:_12,baseClass:"dijitTimePicker",clickableIncrement:"T00:15:00",visibleIncrement:"T01:00:00",visibleRange:"T05:00:00",value:new Date(),_visibleIncrement:2,_clickableIncrement:1,_totalIncrements:10,constraints:{},serialize:_4.toISOString,setValue:function(_13){_9.deprecated("dijit._TimePicker:setValue() is deprecated. Use set('value', ...) instead.","","2.0");this.set("value",_13);},_setValueAttr:function(_14){this._set("value",_14);this._showText();},_setFilterStringAttr:function(val){this._set("filterString",val);this._showText();},isDisabledDate:function(){return false;},_getFilteredNodes:function(_15,_16,_17,_18){var _19=[],_1a=_18?_18.date:this._refDate,n,i=_15,max=this._maxIncrement+Math.abs(i),chk=_17?-1:1,dec=_17?1:0,inc=1-dec;do{i-=dec;n=this._createOption(i);if(n){if((_17&&n.date>_1a)||(!_17&&n.date<_1a)){break;}_19[_17?"unshift":"push"](n);_1a=n.date;}i+=inc;}while(_19.length<_16&&(i*chk)<max);return _19;},_showText:function(){var _1b=_4.fromISOString;this.timeMenu.innerHTML="";this._clickableIncrementDate=_1b(this.clickableIncrement);this._visibleIncrementDate=_1b(this.visibleIncrement);this._visibleRangeDate=_1b(this.visibleRange);var _1c=function(_1d){return _1d.getHours()*60*60+_1d.getMinutes()*60+_1d.getSeconds();},_1e=_1c(this._clickableIncrementDate),_1f=_1c(this._visibleIncrementDate),_20=_1c(this._visibleRangeDate),_21=(this.value||this.currentFocus).getTime();this._refDate=new Date(_21-_21%(_1e*1000));this._refDate.setFullYear(1970,0,1);this._clickableIncrement=1;this._totalIncrements=_20/_1e;this._visibleIncrement=_1f/_1e;this._maxIncrement=(60*60*24)/_1e;var _22=Math.min(this._totalIncrements,10),_23=this._getFilteredNodes(0,(_22>>1)+1,false),_24=[],_25=_22-_23.length,_26=this._getFilteredNodes(0,_25,true,_23[0]);if(_26.length<_25&&_23.length>0){_24=this._getFilteredNodes(_23.length,_25-_26.length,false,_23[_23.length-1]);}_1.forEach(_26.concat(_23,_24),function(n){this.timeMenu.appendChild(n);},this);},constructor:function(){this.constraints={};},postMixInProperties:function(){this.inherited(arguments);this._setConstraintsAttr(this.constraints);},_setConstraintsAttr:function(_27){_b.mixin(this,_27);if(!_27.locale){_27.locale=this.lang;}},postCreate:function(){this.connect(this.timeMenu,_c("ie")?"onmousewheel":"DOMMouseScroll","_mouseWheeled");this._connects.push(_e.addMouseListener(this.upArrow,this,"_onArrowUp",33,250));this._connects.push(_e.addMouseListener(this.downArrow,this,"_onArrowDown",33,250));this.inherited(arguments);},_buttonMouse:function(e){_6.toggle(e.currentTarget,e.currentTarget==this.upArrow?"dijitUpArrowHover":"dijitDownArrowHover",e.type=="mouseenter"||e.type=="mouseover");},_createOption:function(_28){var _29=new Date(this._refDate);var _2a=this._clickableIncrementDate;_29.setHours(_29.getHours()+_2a.getHours()*_28,_29.getMinutes()+_2a.getMinutes()*_28,_29.getSeconds()+_2a.getSeconds()*_28);if(this.constraints.selector=="time"){_29.setFullYear(1970,0,1);}var _2b=_3.format(_29,this.constraints);if(this.filterString&&_2b.toLowerCase().indexOf(this.filterString)!==0){return null;}var div=_7.create("div",{"class":this.baseClass+"Item"});div.date=_29;div.index=_28;_7.create("div",{"class":this.baseClass+"ItemInner",innerHTML:_2b},div);if(_28%this._visibleIncrement<1&&_28%this._visibleIncrement>-1){_6.add(div,this.baseClass+"Marker");}else{if(!(_28%this._clickableIncrement)){_6.add(div,this.baseClass+"Tick");}}if(this.isDisabledDate(_29)){_6.add(div,this.baseClass+"ItemDisabled");}if(this.value&&!_2.compare(this.value,_29,this.constraints.selector)){div.selected=true;_6.add(div,this.baseClass+"ItemSelected");if(_6.contains(div,this.baseClass+"Marker")){_6.add(div,this.baseClass+"MarkerSelected");}else{_6.add(div,this.baseClass+"TickSelected");}this._highlightOption(div,true);}return div;},_onOptionSelected:function(tgt){var _2c=tgt.target.date||tgt.target.parentNode.date;if(!_2c||this.isDisabledDate(_2c)){return;}this._highlighted_option=null;this.set("value",_2c);this.onChange(_2c);},onChange:function(){},_highlightOption:function(_2d,_2e){if(!_2d){return;}if(_2e){if(this._highlighted_option){this._highlightOption(this._highlighted_option,false);}this._highlighted_option=_2d;}else{if(this._highlighted_option!==_2d){return;}else{this._highlighted_option=null;}}_6.toggle(_2d,this.baseClass+"ItemHover",_2e);if(_6.contains(_2d,this.baseClass+"Marker")){_6.toggle(_2d,this.baseClass+"MarkerHover",_2e);}else{_6.toggle(_2d,this.baseClass+"TickHover",_2e);}},onmouseover:function(e){this._keyboardSelected=null;var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;if(!_6.contains(tgr,this.baseClass+"Item")){return;}this._highlightOption(tgr,true);},onmouseout:function(e){this._keyboardSelected=null;var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;this._highlightOption(tgr,false);},_mouseWheeled:function(e){this._keyboardSelected=null;_8.stop(e);var _2f=(_c("ie")?e.wheelDelta:-e.detail);this[(_2f>0?"_onArrowUp":"_onArrowDown")]();},_onArrowUp:function(_30){if(typeof _30=="number"&&_30==-1){return;}if(!this.timeMenu.childNodes.length){return;}var _31=this.timeMenu.childNodes[0].index;var _32=this._getFilteredNodes(_31,1,true,this.timeMenu.childNodes[0]);if(_32.length){this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length-1]);this.timeMenu.insertBefore(_32[0],this.timeMenu.childNodes[0]);}},_onArrowDown:function(_33){if(typeof _33=="number"&&_33==-1){return;}if(!this.timeMenu.childNodes.length){return;}var _34=this.timeMenu.childNodes[this.timeMenu.childNodes.length-1].index+1;var _35=this._getFilteredNodes(_34,1,false,this.timeMenu.childNodes[this.timeMenu.childNodes.length-1]);if(_35.length){this.timeMenu.removeChild(this.timeMenu.childNodes[0]);this.timeMenu.appendChild(_35[0]);}},handleKey:function(e){if(e.charOrCode==_a.DOWN_ARROW||e.charOrCode==_a.UP_ARROW){_8.stop(e);if(this._highlighted_option&&!this._highlighted_option.parentNode){this._highlighted_option=null;}var _36=this.timeMenu,tgt=this._highlighted_option||_d("."+this.baseClass+"ItemSelected",_36)[0];if(!tgt){tgt=_36.childNodes[0];}else{if(_36.childNodes.length){if(e.charOrCode==_a.DOWN_ARROW&&!tgt.nextSibling){this._onArrowDown();}else{if(e.charOrCode==_a.UP_ARROW&&!tgt.previousSibling){this._onArrowUp();}}if(e.charOrCode==_a.DOWN_ARROW){tgt=tgt.nextSibling;}else{tgt=tgt.previousSibling;}}}this._highlightOption(tgt,true);this._keyboardSelected=tgt;return false;}else{if(e.charOrCode==_a.ENTER||e.charOrCode===_a.TAB){if(!this._keyboardSelected&&e.charOrCode===_a.TAB){return true;}if(this._highlighted_option){this._onOptionSelected({target:this._highlighted_option});}return e.charOrCode===_a.TAB;}}return undefined;}});}); \ No newline at end of file
+require({cache:{"url:dijit/templates/TimePicker.html":"<div id=\"widget_${id}\" class=\"dijitMenu\"\n ><div data-dojo-attach-point=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&#160;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div></div\n ><div data-dojo-attach-point=\"timeMenu,focusNode\" data-dojo-attach-event=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n ><div data-dojo-attach-point=\"downArrow\" class=\"dijitButtonNode dijitDownArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&#160;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div></div\n></div>\n"}});define("dijit/_TimePicker",["dojo/_base/array","dojo/date","dojo/date/locale","dojo/date/stamp","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/_base/event","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/query","dojo/mouse","./typematic","./_Widget","./_TemplatedMixin","./form/_FormValueWidget","dojo/text!./templates/TimePicker.html"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13){var _14=_5("dijit._TimePicker",[_10,_11],{templateString:_13,baseClass:"dijitTimePicker",clickableIncrement:"T00:15:00",visibleIncrement:"T01:00:00",visibleRange:"T05:00:00",value:new Date(),_visibleIncrement:2,_clickableIncrement:1,_totalIncrements:10,constraints:{},serialize:_4.toISOString,setValue:function(_15){_9.deprecated("dijit._TimePicker:setValue() is deprecated. Use set('value', ...) instead.","","2.0");this.set("value",_15);},_setValueAttr:function(_16){this._set("value",_16);this._showText();},_setFilterStringAttr:function(val){this._set("filterString",val);this._showText();},isDisabledDate:function(){return false;},_getFilteredNodes:function(_17,_18,_19,_1a){var _1b=[],_1c=_1a?_1a.date:this._refDate,n,i=_17,max=this._maxIncrement+Math.abs(i),chk=_19?-1:1,dec=_19?1:0,inc=1-dec;do{i-=dec;n=this._createOption(i);if(n){if((_19&&n.date>_1c)||(!_19&&n.date<_1c)){break;}_1b[_19?"unshift":"push"](n);_1c=n.date;}i+=inc;}while(_1b.length<_18&&(i*chk)<max);return _1b;},_showText:function(){var _1d=_4.fromISOString;this.timeMenu.innerHTML="";this._clickableIncrementDate=_1d(this.clickableIncrement);this._visibleIncrementDate=_1d(this.visibleIncrement);this._visibleRangeDate=_1d(this.visibleRange);var _1e=function(_1f){return _1f.getHours()*60*60+_1f.getMinutes()*60+_1f.getSeconds();},_20=_1e(this._clickableIncrementDate),_21=_1e(this._visibleIncrementDate),_22=_1e(this._visibleRangeDate),_23=(this.value||this.currentFocus).getTime();this._refDate=new Date(_23-_23%(_20*1000));this._refDate.setFullYear(1970,0,1);this._clickableIncrement=1;this._totalIncrements=_22/_20;this._visibleIncrement=_21/_20;this._maxIncrement=(60*60*24)/_20;var _24=Math.min(this._totalIncrements,10),_25=this._getFilteredNodes(0,(_24>>1)+1,false),_26=[],_27=_24-_25.length,_28=this._getFilteredNodes(0,_27,true,_25[0]);if(_28.length<_27&&_25.length>0){_26=this._getFilteredNodes(_25[_25.length-1].idx+1,_27-_28.length,false,_25[_25.length-1]);}_1.forEach(_28.concat(_25,_26),function(n){this.timeMenu.appendChild(n);},this);if(!_28.length&&!_25.length&&!_26.length&&this.filterString){this.filterString="";this._showText();}},constructor:function(){this.constraints={};},postMixInProperties:function(){this.inherited(arguments);this._setConstraintsAttr(this.constraints);},_setConstraintsAttr:function(_29){_b.mixin(this,_29);if(!_29.locale){_29.locale=this.lang;}},postCreate:function(){this.connect(this.timeMenu,_e.wheel,"_mouseWheeled");this.own(_f.addMouseListener(this.upArrow,this,"_onArrowUp",33,250),_f.addMouseListener(this.downArrow,this,"_onArrowDown",33,250));this.inherited(arguments);},_buttonMouse:function(e){_6.toggle(e.currentTarget,e.currentTarget==this.upArrow?"dijitUpArrowHover":"dijitDownArrowHover",e.type=="mouseenter"||e.type=="mouseover");},_createOption:function(_2a){var _2b=new Date(this._refDate);var _2c=this._clickableIncrementDate;_2b.setTime(_2b.getTime()+_2c.getHours()*_2a*3600000+_2c.getMinutes()*_2a*60000+_2c.getSeconds()*_2a*1000);if(this.constraints.selector=="time"){_2b.setFullYear(1970,0,1);}var _2d=_3.format(_2b,this.constraints);if(this.filterString&&_2d.toLowerCase().indexOf(this.filterString)!==0){return null;}var div=this.ownerDocument.createElement("div");div.className=this.baseClass+"Item";div.date=_2b;div.idx=_2a;_7.create("div",{"class":this.baseClass+"ItemInner",innerHTML:_2d},div);if(_2a%this._visibleIncrement<1&&_2a%this._visibleIncrement>-1){_6.add(div,this.baseClass+"Marker");}else{if(!(_2a%this._clickableIncrement)){_6.add(div,this.baseClass+"Tick");}}if(this.isDisabledDate(_2b)){_6.add(div,this.baseClass+"ItemDisabled");}if(this.value&&!_2.compare(this.value,_2b,this.constraints.selector)){div.selected=true;_6.add(div,this.baseClass+"ItemSelected");if(_6.contains(div,this.baseClass+"Marker")){_6.add(div,this.baseClass+"MarkerSelected");}else{_6.add(div,this.baseClass+"TickSelected");}this._highlightOption(div,true);}return div;},_onOptionSelected:function(tgt){var _2e=tgt.target.date||tgt.target.parentNode.date;if(!_2e||this.isDisabledDate(_2e)){return;}this._highlighted_option=null;this.set("value",_2e);this.onChange(_2e);},onChange:function(){},_highlightOption:function(_2f,_30){if(!_2f){return;}if(_30){if(this._highlighted_option){this._highlightOption(this._highlighted_option,false);}this._highlighted_option=_2f;}else{if(this._highlighted_option!==_2f){return;}else{this._highlighted_option=null;}}_6.toggle(_2f,this.baseClass+"ItemHover",_30);if(_6.contains(_2f,this.baseClass+"Marker")){_6.toggle(_2f,this.baseClass+"MarkerHover",_30);}else{_6.toggle(_2f,this.baseClass+"TickHover",_30);}},onmouseover:function(e){this._keyboardSelected=null;var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;if(!_6.contains(tgr,this.baseClass+"Item")){return;}this._highlightOption(tgr,true);},onmouseout:function(e){this._keyboardSelected=null;var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;this._highlightOption(tgr,false);},_mouseWheeled:function(e){this._keyboardSelected=null;_8.stop(e);this[(e.wheelDelta>0?"_onArrowUp":"_onArrowDown")]();},_onArrowUp:function(_31){if(_31===-1){_6.remove(this.upArrow,"dijitUpArrowActive");return;}else{if(_31===0){_6.add(this.upArrow,"dijitUpArrowActive");}}if(!this.timeMenu.childNodes.length){return;}var _32=this.timeMenu.childNodes[0].idx;var _33=this._getFilteredNodes(_32,1,true,this.timeMenu.childNodes[0]);if(_33.length){this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length-1]);this.timeMenu.insertBefore(_33[0],this.timeMenu.childNodes[0]);}},_onArrowDown:function(_34){if(_34===-1){_6.remove(this.downArrow,"dijitDownArrowActive");return;}else{if(_34===0){_6.add(this.downArrow,"dijitDownArrowActive");}}if(!this.timeMenu.childNodes.length){return;}var _35=this.timeMenu.childNodes[this.timeMenu.childNodes.length-1].idx+1;var _36=this._getFilteredNodes(_35,1,false,this.timeMenu.childNodes[this.timeMenu.childNodes.length-1]);if(_36.length){this.timeMenu.removeChild(this.timeMenu.childNodes[0]);this.timeMenu.appendChild(_36[0]);}},handleKey:function(e){if(e.keyCode==_a.DOWN_ARROW||e.keyCode==_a.UP_ARROW){_8.stop(e);if(this._highlighted_option&&!this._highlighted_option.parentNode){this._highlighted_option=null;}var _37=this.timeMenu,tgt=this._highlighted_option||_d("."+this.baseClass+"ItemSelected",_37)[0];if(!tgt){tgt=_37.childNodes[0];}else{if(_37.childNodes.length){if(e.keyCode==_a.DOWN_ARROW&&!tgt.nextSibling){this._onArrowDown();}else{if(e.keyCode==_a.UP_ARROW&&!tgt.previousSibling){this._onArrowUp();}}if(e.keyCode==_a.DOWN_ARROW){tgt=tgt.nextSibling;}else{tgt=tgt.previousSibling;}}}this._highlightOption(tgt,true);this._keyboardSelected=tgt;return false;}else{if(e.keyCode==_a.ENTER||e.keyCode===_a.TAB){if(!this._keyboardSelected&&e.keyCode===_a.TAB){return true;}if(this._highlighted_option){this._onOptionSelected({target:this._highlighted_option});}return e.keyCode===_a.TAB;}}return undefined;}});return _14;}); \ No newline at end of file
diff --git a/lib/dijit/_TimePicker.js.uncompressed.js b/lib/dijit/_TimePicker.js.uncompressed.js
new file mode 100644
index 000000000..76f348664
--- /dev/null
+++ b/lib/dijit/_TimePicker.js.uncompressed.js
@@ -0,0 +1,525 @@
+require({cache:{
+'url:dijit/templates/TimePicker.html':"<div id=\"widget_${id}\" class=\"dijitMenu\"\n ><div data-dojo-attach-point=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&#160;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div></div\n ><div data-dojo-attach-point=\"timeMenu,focusNode\" data-dojo-attach-event=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n ><div data-dojo-attach-point=\"downArrow\" class=\"dijitButtonNode dijitDownArrowButton\" data-dojo-attach-event=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&#160;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div></div\n></div>\n"}});
+define("dijit/_TimePicker", [
+ "dojo/_base/array", // array.forEach
+ "dojo/date", // date.compare
+ "dojo/date/locale", // locale.format
+ "dojo/date/stamp", // stamp.fromISOString stamp.toISOString
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.contains domClass.toggle
+ "dojo/dom-construct", // domConstruct.create
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // deprecated
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.mixin
+ "dojo/sniff", // has(...)
+ "dojo/query", // query
+ "dojo/mouse", // mouse.wheel
+ "./typematic",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./form/_FormValueWidget",
+ "dojo/text!./templates/TimePicker.html"
+], function(array, ddate, locale, stamp, declare, domClass, domConstruct, event, kernel, keys, lang, has, query, mouse,
+ typematic, _Widget, _TemplatedMixin, _FormValueWidget, template){
+
+ // module:
+ // dijit/_TimePicker
+
+
+ var TimePicker = declare("dijit._TimePicker", [_Widget, _TemplatedMixin], {
+ // summary:
+ // A graphical time picker.
+ // This widget is used internally by other widgets and is not available
+ // as a standalone widget due to lack of accessibility support.
+
+ templateString: template,
+
+ // baseClass: [protected] String
+ // The root className to use for the various states of this widget
+ baseClass: "dijitTimePicker",
+
+ // clickableIncrement: String
+ // ISO-8601 string representing the amount by which
+ // every clickable element in the time picker increases.
+ // Set in local time, without a time zone.
+ // Example: `T00:15:00` creates 15 minute increments
+ // Must divide dijit/_TimePicker.visibleIncrement evenly
+ clickableIncrement: "T00:15:00",
+
+ // visibleIncrement: String
+ // ISO-8601 string representing the amount by which
+ // every element with a visible time in the time picker increases.
+ // Set in local time, without a time zone.
+ // Example: `T01:00:00` creates text in every 1 hour increment
+ visibleIncrement: "T01:00:00",
+
+ // visibleRange: String
+ // ISO-8601 string representing the range of this TimePicker.
+ // The TimePicker will only display times in this range.
+ // Example: `T05:00:00` displays 5 hours of options
+ visibleRange: "T05:00:00",
+
+ // value: String
+ // Date to display.
+ // Defaults to current time and date.
+ // Can be a Date object or an ISO-8601 string.
+ // If you specify the GMT time zone (`-01:00`),
+ // the time will be converted to the local time in the local time zone.
+ // Otherwise, the time is considered to be in the local time zone.
+ // If you specify the date and isDate is true, the date is used.
+ // Example: if your local time zone is `GMT -05:00`,
+ // `T10:00:00` becomes `T10:00:00-05:00` (considered to be local time),
+ // `T10:00:00-01:00` becomes `T06:00:00-05:00` (4 hour difference),
+ // `T10:00:00Z` becomes `T05:00:00-05:00` (5 hour difference between Zulu and local time)
+ // `yyyy-mm-ddThh:mm:ss` is the format to set the date and time
+ // Example: `2007-06-01T09:00:00`
+ value: new Date(),
+
+ _visibleIncrement:2,
+ _clickableIncrement:1,
+ _totalIncrements:10,
+
+ // constraints: TimePicker.__Constraints
+ // Specifies valid range of times (start time, end time)
+ constraints:{},
+
+/*=====
+ serialize: function(val, options){
+ // summary:
+ // User overridable function used to convert the attr('value') result to a String
+ // val: Date
+ // The current value
+ // options: Object?
+ // tags:
+ // protected
+ },
+=====*/
+ serialize: stamp.toISOString,
+
+/*=====
+ // filterString: string
+ // The string to filter by
+ filterString: "",
+=====*/
+
+ setValue: function(/*Date*/ value){
+ // summary:
+ // Deprecated. Used set('value') instead.
+ // tags:
+ // deprecated
+ kernel.deprecated("dijit._TimePicker:setValue() is deprecated. Use set('value', ...) instead.", "", "2.0");
+ this.set('value', value);
+ },
+
+ _setValueAttr: function(/*Date*/ date){
+ // summary:
+ // Hook so set('value', ...) works.
+ // description:
+ // Set the value of the TimePicker.
+ // Redraws the TimePicker around the new date.
+ // tags:
+ // protected
+ this._set("value", date);
+ this._showText();
+ },
+
+ _setFilterStringAttr: function(val){
+ // summary:
+ // Called by TimeTextBox to filter the values shown in my list
+ this._set("filterString", val);
+ this._showText();
+ },
+
+ isDisabledDate: function(/*===== dateObject, locale =====*/){
+ // summary:
+ // May be overridden to disable certain dates in the TimePicker e.g. `isDisabledDate=locale.isWeekend`
+ // dateObject: Date
+ // locale: String?
+ // type:
+ // extension
+ return false; // Boolean
+ },
+
+ _getFilteredNodes: function(/*number*/ start, /*number*/ maxNum, /*Boolean*/ before, /*DOMnode*/ lastNode){
+ // summary:
+ // Returns an array of nodes with the filter applied. At most maxNum nodes
+ // will be returned - but fewer may be returned as well. If the
+ // before parameter is set to true, then it will return the elements
+ // before the given index
+ // tags:
+ // private
+ var
+ nodes = [],
+ lastValue = lastNode ? lastNode.date : this._refDate,
+ n,
+ i = start,
+ max = this._maxIncrement + Math.abs(i),
+ chk = before ? -1 : 1,
+ dec = before ? 1 : 0,
+ inc = 1 - dec;
+ do{
+ i -= dec;
+ n = this._createOption(i);
+ if(n){
+ if((before && n.date > lastValue) || (!before && n.date < lastValue)){
+ break; // don't wrap
+ }
+ nodes[before ? "unshift" : "push"](n);
+ lastValue = n.date;
+ }
+ i += inc;
+ }while(nodes.length < maxNum && (i*chk) < max);
+ return nodes;
+ },
+
+ _showText: function(){
+ // summary:
+ // Displays the relevant choices in the drop down list
+ // tags:
+ // private
+ var fromIso = stamp.fromISOString;
+ this.timeMenu.innerHTML = "";
+ this._clickableIncrementDate=fromIso(this.clickableIncrement);
+ this._visibleIncrementDate=fromIso(this.visibleIncrement);
+ this._visibleRangeDate=fromIso(this.visibleRange);
+ // get the value of the increments and the range in seconds (since 00:00:00) to find out how many divs to create
+ var
+ sinceMidnight = function(/*Date*/ date){
+ return date.getHours() * 60 * 60 + date.getMinutes() * 60 + date.getSeconds();
+ },
+ clickableIncrementSeconds = sinceMidnight(this._clickableIncrementDate),
+ visibleIncrementSeconds = sinceMidnight(this._visibleIncrementDate),
+ visibleRangeSeconds = sinceMidnight(this._visibleRangeDate),
+ // round reference date to previous visible increment
+ time = (this.value || this.currentFocus).getTime();
+
+ this._refDate = new Date(time - time % (clickableIncrementSeconds*1000));
+ this._refDate.setFullYear(1970,0,1); // match parse defaults
+
+ // assume clickable increment is the smallest unit
+ this._clickableIncrement = 1;
+ // divide the visible range by the clickable increment to get the number of divs to create
+ // example: 10:00:00/00:15:00 -> display 40 divs
+ this._totalIncrements = visibleRangeSeconds / clickableIncrementSeconds;
+ // divide the visible increments by the clickable increments to get how often to display the time inline
+ // example: 01:00:00/00:15:00 -> display the time every 4 divs
+ this._visibleIncrement = visibleIncrementSeconds / clickableIncrementSeconds;
+ // divide the number of seconds in a day by the clickable increment in seconds to get the
+ // absolute max number of increments.
+ this._maxIncrement = (60 * 60 * 24) / clickableIncrementSeconds;
+
+ var
+ // Find the nodes we should display based on our filter.
+ // Limit to 10 nodes displayed as a half-hearted attempt to stop drop down from overlapping <input>.
+ count = Math.min(this._totalIncrements, 10),
+ after = this._getFilteredNodes(0, (count >> 1) + 1, false),
+ moreAfter = [],
+ estBeforeLength = count - after.length,
+ before = this._getFilteredNodes(0, estBeforeLength, true, after[0]);
+ if(before.length < estBeforeLength && after.length > 0){
+ moreAfter = this._getFilteredNodes(after[after.length-1].idx + 1, estBeforeLength - before.length, false, after[after.length-1]);
+ }
+ array.forEach(before.concat(after, moreAfter), function(n){ this.timeMenu.appendChild(n); }, this);
+ // never show empty due to a bad filter
+ if(!before.length && !after.length && !moreAfter.length && this.filterString){
+ this.filterString = '';
+ this._showText();
+ }
+ },
+
+ 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 = {};
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls
+ },
+
+ _setConstraintsAttr: function(/* Object */ constraints){
+ // brings in visibleRange, increments, etc.
+ lang.mixin(this, constraints);
+
+ // locale needs the lang in the constraints as locale
+ if(!constraints.locale){
+ constraints.locale = this.lang;
+ }
+ },
+
+ postCreate: function(){
+ // assign typematic mouse listeners to the arrow buttons
+ this.connect(this.timeMenu, mouse.wheel, "_mouseWheeled");
+ this.own(
+ typematic.addMouseListener(this.upArrow, this, "_onArrowUp", 33, 250),
+ typematic.addMouseListener(this.downArrow, this, "_onArrowDown", 33, 250)
+ );
+
+ this.inherited(arguments);
+ },
+
+ _buttonMouse: function(/*Event*/ e){
+ // summary:
+ // Handler for hover (and unhover) on up/down arrows
+ // tags:
+ // private
+
+ // in non-IE browser the "mouseenter" event will become "mouseover",
+ // but in IE it's still "mouseenter"
+ domClass.toggle(e.currentTarget, e.currentTarget == this.upArrow ? "dijitUpArrowHover" : "dijitDownArrowHover",
+ e.type == "mouseenter" || e.type == "mouseover");
+ },
+
+ _createOption: function(/*Number*/ index){
+ // summary:
+ // Creates a clickable time option
+ // tags:
+ // private
+ var date = new Date(this._refDate);
+ var incrementDate = this._clickableIncrementDate;
+ date.setTime(date.getTime()
+ + incrementDate.getHours() * index * 3600000
+ + incrementDate.getMinutes() * index * 60000
+ + incrementDate.getSeconds() * index * 1000);
+ if(this.constraints.selector == "time"){
+ date.setFullYear(1970,0,1); // make sure each time is for the same date
+ }
+ var dateString = locale.format(date, this.constraints);
+ if(this.filterString && dateString.toLowerCase().indexOf(this.filterString) !== 0){
+ // Doesn't match the filter - return null
+ return null;
+ }
+
+ var div = this.ownerDocument.createElement("div");
+ div.className = this.baseClass+"Item";
+ div.date = date;
+ div.idx = index;
+ domConstruct.create('div',{
+ "class": this.baseClass + "ItemInner",
+ innerHTML: dateString
+ }, div);
+
+ if(index%this._visibleIncrement<1 && index%this._visibleIncrement>-1){
+ domClass.add(div, this.baseClass+"Marker");
+ }else if(!(index%this._clickableIncrement)){
+ domClass.add(div, this.baseClass+"Tick");
+ }
+
+ if(this.isDisabledDate(date)){
+ // set disabled
+ domClass.add(div, this.baseClass+"ItemDisabled");
+ }
+ if(this.value && !ddate.compare(this.value, date, this.constraints.selector)){
+ div.selected = true;
+ domClass.add(div, this.baseClass+"ItemSelected");
+ if(domClass.contains(div, this.baseClass+"Marker")){
+ domClass.add(div, this.baseClass+"MarkerSelected");
+ }else{
+ domClass.add(div, this.baseClass+"TickSelected");
+ }
+
+ // Initially highlight the current value. User can change highlight by up/down arrow keys
+ // or mouse movement.
+ this._highlightOption(div, true);
+ }
+ return div;
+ },
+
+ _onOptionSelected: function(/*Object*/ tgt){
+ // summary:
+ // Called when user clicks an option in the drop down list
+ // tags:
+ // private
+ var tdate = tgt.target.date || tgt.target.parentNode.date;
+ if(!tdate || this.isDisabledDate(tdate)){ return; }
+ this._highlighted_option = null;
+ this.set('value', tdate);
+ this.onChange(tdate);
+ },
+
+ onChange: function(/*Date*/ /*===== time =====*/){
+ // summary:
+ // Notification that a time was selected. It may be the same as the previous value.
+ // tags:
+ // public
+ },
+
+ _highlightOption: function(/*node*/ node, /*Boolean*/ highlight){
+ // summary:
+ // Turns on/off highlight effect on a node based on mouse out/over event
+ // tags:
+ // private
+ if(!node){return;}
+ if(highlight){
+ if(this._highlighted_option){
+ this._highlightOption(this._highlighted_option, false);
+ }
+ this._highlighted_option = node;
+ }else if(this._highlighted_option !== node){
+ return;
+ }else{
+ this._highlighted_option = null;
+ }
+ domClass.toggle(node, this.baseClass+"ItemHover", highlight);
+ if(domClass.contains(node, this.baseClass+"Marker")){
+ domClass.toggle(node, this.baseClass+"MarkerHover", highlight);
+ }else{
+ domClass.toggle(node, this.baseClass+"TickHover", highlight);
+ }
+ },
+
+ onmouseover: function(/*Event*/ e){
+ // summary:
+ // Handler for onmouseover event
+ // tags:
+ // private
+ this._keyboardSelected = null;
+ var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode;
+ // if we aren't targeting an item, then we return
+ if(!domClass.contains(tgr, this.baseClass+"Item")){return;}
+ this._highlightOption(tgr, true);
+ },
+
+ onmouseout: function(/*Event*/ e){
+ // summary:
+ // Handler for onmouseout event
+ // tags:
+ // private
+ this._keyboardSelected = null;
+ var tgr = (e.target.parentNode === this.timeMenu) ? e.target : e.target.parentNode;
+ this._highlightOption(tgr, false);
+ },
+
+ _mouseWheeled: function(/*Event*/ e){
+ // summary:
+ // Handle the mouse wheel events
+ // tags:
+ // private
+ this._keyboardSelected = null;
+ event.stop(e);
+ // we're not _measuring_ the scroll amount, just direction
+ this[(e.wheelDelta>0 ? "_onArrowUp" : "_onArrowDown")](); // yes, we're making a new dom node every time you mousewheel, or click
+ },
+
+ _onArrowUp: function(count){
+ // summary:
+ // Handler for up arrow key.
+ // description:
+ // Removes the bottom time and add one to the top
+ // tags:
+ // private
+ if(count === -1){
+ domClass.remove(this.upArrow, "dijitUpArrowActive");
+ return;
+ }else if(count === 0){
+ domClass.add(this.upArrow, "dijitUpArrowActive");
+
+ } // typematic end
+ if(!this.timeMenu.childNodes.length){ return; }
+ var index = this.timeMenu.childNodes[0].idx;
+ var divs = this._getFilteredNodes(index, 1, true, this.timeMenu.childNodes[0]);
+ if(divs.length){
+ this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1]);
+ this.timeMenu.insertBefore(divs[0], this.timeMenu.childNodes[0]);
+ }
+ },
+
+ _onArrowDown: function(count){
+ // summary:
+ // Handler for up arrow key.
+ // description:
+ // Remove the top time and add one to the bottom
+ // tags:
+ // private
+ if(count === -1){
+ domClass.remove(this.downArrow, "dijitDownArrowActive");
+ return;
+ }else if(count === 0){
+ domClass.add(this.downArrow, "dijitDownArrowActive");
+ } // typematic end
+ if(!this.timeMenu.childNodes.length){ return; }
+ var index = this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1].idx + 1;
+ var divs = this._getFilteredNodes(index, 1, false, this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1]);
+ if(divs.length){
+ this.timeMenu.removeChild(this.timeMenu.childNodes[0]);
+ this.timeMenu.appendChild(divs[0]);
+ }
+ },
+
+ handleKey: function(/*Event*/ e){
+ // summary:
+ // Called from `dijit/form/_DateTimeTextBox` to pass a keypress event
+ // from the `dijit/form/TimeTextBox` to be handled in this widget
+ // tags:
+ // protected
+ if(e.keyCode == keys.DOWN_ARROW || e.keyCode == keys.UP_ARROW){
+ event.stop(e);
+ // Figure out which option to highlight now and then highlight it
+ if(this._highlighted_option && !this._highlighted_option.parentNode){
+ this._highlighted_option = null;
+ }
+ var timeMenu = this.timeMenu,
+ tgt = this._highlighted_option || query("." + this.baseClass + "ItemSelected", timeMenu)[0];
+ if(!tgt){
+ tgt = timeMenu.childNodes[0];
+ }else if(timeMenu.childNodes.length){
+ if(e.keyCode == keys.DOWN_ARROW && !tgt.nextSibling){
+ this._onArrowDown();
+ }else if(e.keyCode == keys.UP_ARROW && !tgt.previousSibling){
+ this._onArrowUp();
+ }
+ if(e.keyCode == keys.DOWN_ARROW){
+ tgt = tgt.nextSibling;
+ }else{
+ tgt = tgt.previousSibling;
+ }
+ }
+ this._highlightOption(tgt, true);
+ this._keyboardSelected = tgt;
+ return false;
+ }else if(e.keyCode == keys.ENTER || e.keyCode === keys.TAB){
+ // mouse hover followed by TAB is NO selection
+ if(!this._keyboardSelected && e.keyCode === keys.TAB){
+ return true; // true means don't call stopEvent()
+ }
+
+ // Accept the currently-highlighted option as the value
+ if(this._highlighted_option){
+ this._onOptionSelected({target: this._highlighted_option});
+ }
+
+ // Call stopEvent() for ENTER key so that form doesn't submit,
+ // but not for TAB, so that TAB does switch focus
+ return e.keyCode === keys.TAB;
+ }
+ return undefined;
+ }
+ });
+
+ /*=====
+ TimePicker.__Constraints = declare(locale.__FormatOptions, {
+ // clickableIncrement: String
+ // See `dijit/_TimePicker.clickableIncrement`
+ clickableIncrement: "T00:15:00",
+
+ // visibleIncrement: String
+ // See `dijit/_TimePicker.visibleIncrement`
+ visibleIncrement: "T01:00:00",
+
+ // visibleRange: String
+ // See `dijit/_TimePicker.visibleRange`
+ visibleRange: "T05:00:00"
+ });
+ =====*/
+
+ return TimePicker;
+});
diff --git a/lib/dijit/_Widget.js b/lib/dijit/_Widget.js
index be231b370..c15690dc7 100644
--- a/lib/dijit/_Widget.js
+++ b/lib/dijit/_Widget.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_Widget",["dojo/aspect","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/query","dojo/ready","./registry","./_WidgetBase","./_OnDijitClickMixin","./_FocusMixin","dojo/uacss","./hccss"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){function _d(){};function _e(_f){return function(obj,_10,_11,_12){if(obj&&typeof _10=="string"&&obj[_10]==_d){return obj.on(_10.substring(2).toLowerCase(),_6.hitch(_11,_12));}return _f.apply(_3,arguments);};};_1.around(_3,"connect",_e);if(_5.connect){_1.around(_5,"connect",_e);}var _13=_4("dijit._Widget",[_a,_b,_c],{onClick:_d,onDblClick:_d,onKeyDown:_d,onKeyPress:_d,onKeyUp:_d,onMouseDown:_d,onMouseMove:_d,onMouseOut:_d,onMouseOver:_d,onMouseLeave:_d,onMouseEnter:_d,onMouseUp:_d,constructor:function(_14){this._toConnect={};for(var _15 in _14){if(this[_15]===_d){this._toConnect[_15.replace(/^on/,"").toLowerCase()]=_14[_15];delete _14[_15];}}},postCreate:function(){this.inherited(arguments);for(var _16 in this._toConnect){this.on(_16,this._toConnect[_16]);}delete this._toConnect;},on:function(_17,_18){if(this[this._onMap(_17)]===_d){return _3.connect(this.domNode,_17.toLowerCase(),this,_18);}return this.inherited(arguments);},_setFocusedAttr:function(val){this._focused=val;this._set("focused",val);},setAttribute:function(_19,_1a){_5.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(_19,_1a);},attr:function(_1b,_1c){if(_2.isDebug){var _1d=arguments.callee._ach||(arguments.callee._ach={}),_1e=(arguments.callee.caller||"unknown caller").toString();if(!_1d[_1e]){_5.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_1e,"","2.0");_1d[_1e]=true;}}var _1f=arguments.length;if(_1f>=2||typeof _1b==="object"){return this.set.apply(this,arguments);}else{return this.get(_1b);}},getDescendants:function(){_5.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.","","2.0");return this.containerNode?_7("[widgetId]",this.containerNode).map(_9.byNode):[];},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){},onClose:function(){return true;}});if(!_5.isAsync){_8(0,function(){var _20=["dijit/_base"];require(_20);});}return _13;}); \ No newline at end of file
+define("dijit/_Widget",["dojo/aspect","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/has","dojo/_base/kernel","dojo/_base/lang","dojo/query","dojo/ready","./registry","./_WidgetBase","./_OnDijitClickMixin","./_FocusMixin","dojo/uacss","./hccss"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d){function _e(){};function _f(_10){return function(obj,_11,_12,_13){if(obj&&typeof _11=="string"&&obj[_11]==_e){return obj.on(_11.substring(2).toLowerCase(),_7.hitch(_12,_13));}return _10.apply(_3,arguments);};};_1.around(_3,"connect",_f);if(_6.connect){_1.around(_6,"connect",_f);}var _14=_4("dijit._Widget",[_b,_c,_d],{onClick:_e,onDblClick:_e,onKeyDown:_e,onKeyPress:_e,onKeyUp:_e,onMouseDown:_e,onMouseMove:_e,onMouseOut:_e,onMouseOver:_e,onMouseLeave:_e,onMouseEnter:_e,onMouseUp:_e,constructor:function(_15){this._toConnect={};for(var _16 in _15){if(this[_16]===_e){this._toConnect[_16.replace(/^on/,"").toLowerCase()]=_15[_16];delete _15[_16];}}},postCreate:function(){this.inherited(arguments);for(var _17 in this._toConnect){this.on(_17,this._toConnect[_17]);}delete this._toConnect;},on:function(_18,_19){if(this[this._onMap(_18)]===_e){return _3.connect(this.domNode,_18.toLowerCase(),this,_19);}return this.inherited(arguments);},_setFocusedAttr:function(val){this._focused=val;this._set("focused",val);},setAttribute:function(_1a,_1b){_6.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(_1a,_1b);},attr:function(_1c,_1d){if(_2.isDebug){var _1e=arguments.callee._ach||(arguments.callee._ach={}),_1f=(arguments.callee.caller||"unknown caller").toString();if(!_1e[_1f]){_6.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_1f,"","2.0");_1e[_1f]=true;}}var _20=arguments.length;if(_20>=2||typeof _1c==="object"){return this.set.apply(this,arguments);}else{return this.get(_1c);}},getDescendants:function(){_6.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.","","2.0");return this.containerNode?_8("[widgetId]",this.containerNode).map(_a.byNode):[];},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){},onClose:function(){return true;}});if(_5("dijit-legacy-requires")){_9(0,function(){var _21=["dijit/_base"];require(_21);});}return _14;}); \ No newline at end of file
diff --git a/lib/dijit/_Widget.js.uncompressed.js b/lib/dijit/_Widget.js.uncompressed.js
new file mode 100644
index 000000000..8a87b9f95
--- /dev/null
+++ b/lib/dijit/_Widget.js.uncompressed.js
@@ -0,0 +1,363 @@
+define("dijit/_Widget", [
+ "dojo/aspect", // aspect.around
+ "dojo/_base/config", // config.isDebug
+ "dojo/_base/connect", // connect.connect
+ "dojo/_base/declare", // declare
+ "dojo/has",
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.hitch
+ "dojo/query",
+ "dojo/ready",
+ "./registry", // registry.byNode
+ "./_WidgetBase",
+ "./_OnDijitClickMixin",
+ "./_FocusMixin",
+ "dojo/uacss", // browser sniffing (included for back-compat; subclasses may be using)
+ "./hccss" // high contrast mode sniffing (included to set CSS classes on <body>, module ret value unused)
+], function(aspect, config, connect, declare, has, kernel, lang, query, ready,
+ registry, _WidgetBase, _OnDijitClickMixin, _FocusMixin){
+
+
+// module:
+// dijit/_Widget
+
+
+function connectToDomNode(){
+ // summary:
+ // If user connects to a widget method === this function, then they will
+ // instead actually be connecting the equivalent event on this.domNode
+}
+
+// Trap dojo.connect() calls to connectToDomNode methods, and redirect to _Widget.on()
+function aroundAdvice(originalConnect){
+ return function(obj, event, scope, method){
+ if(obj && typeof event == "string" && obj[event] == connectToDomNode){
+ return obj.on(event.substring(2).toLowerCase(), lang.hitch(scope, method));
+ }
+ return originalConnect.apply(connect, arguments);
+ };
+}
+aspect.around(connect, "connect", aroundAdvice);
+if(kernel.connect){
+ aspect.around(kernel, "connect", aroundAdvice);
+}
+
+var _Widget = declare("dijit._Widget", [_WidgetBase, _OnDijitClickMixin, _FocusMixin], {
+ // summary:
+ // Old base class for widgets. New widgets should extend `dijit/_WidgetBase` instead
+ // description:
+ // Old Base class for Dijit widgets.
+ //
+ // Extends _WidgetBase, adding support for:
+ //
+ // - declaratively/programatically specifying widget initialization parameters like
+ // onMouseMove="foo" that call foo when this.domNode gets a mousemove event
+ // - ondijitclick:
+ // Support new data-dojo-attach-event="ondijitclick: ..." that is triggered by a mouse click or a SPACE/ENTER keypress
+ // - focus related functions:
+ // In particular, the onFocus()/onBlur() callbacks. Driven internally by
+ // dijit/_base/focus.js.
+ // - deprecated methods
+ // - onShow(), onHide(), onClose()
+ //
+ // Also, by loading code in dijit/_base, turns on:
+ //
+ // - browser sniffing (putting browser class like `dj_ie` on `<html>` node)
+ // - high contrast mode sniffing (add `dijit_a11y` class to `<body>` if machine is in high contrast mode)
+
+
+ ////////////////// DEFERRED CONNECTS ///////////////////
+
+ onClick: connectToDomNode,
+ /*=====
+ onClick: function(event){
+ // summary:
+ // Connect to this function to receive notifications of mouse click events.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onDblClick: connectToDomNode,
+ /*=====
+ onDblClick: function(event){
+ // summary:
+ // Connect to this function to receive notifications of mouse double click events.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onKeyDown: connectToDomNode,
+ /*=====
+ onKeyDown: function(event){
+ // summary:
+ // Connect to this function to receive notifications of keys being pressed down.
+ // event:
+ // key Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onKeyPress: connectToDomNode,
+ /*=====
+ onKeyPress: function(event){
+ // summary:
+ // Connect to this function to receive notifications of printable keys being typed.
+ // event:
+ // key Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onKeyUp: connectToDomNode,
+ /*=====
+ onKeyUp: function(event){
+ // summary:
+ // Connect to this function to receive notifications of keys being released.
+ // event:
+ // key Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseDown: connectToDomNode,
+ /*=====
+ onMouseDown: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse button is pressed down.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseMove: connectToDomNode,
+ /*=====
+ onMouseMove: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseOut: connectToDomNode,
+ /*=====
+ onMouseOut: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseOver: connectToDomNode,
+ /*=====
+ onMouseOver: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseLeave: connectToDomNode,
+ /*=====
+ onMouseLeave: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse moves off of this widget.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseEnter: connectToDomNode,
+ /*=====
+ onMouseEnter: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse moves onto this widget.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+ onMouseUp: connectToDomNode,
+ /*=====
+ onMouseUp: function(event){
+ // summary:
+ // Connect to this function to receive notifications of when the mouse button is released.
+ // event:
+ // mouse Event
+ // tags:
+ // callback
+ },
+ =====*/
+
+ 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:
+ //
+ // - use srcNodeRef.innerHTML as my contents
+ // - if this is a behavioral widget then apply behavior to that srcNodeRef
+ // - otherwise, replace srcNodeRef with my generated DOM tree
+
+ // extract parameters like onMouseMove that should connect directly to this.domNode
+ this._toConnect = {};
+ for(var name in params){
+ if(this[name] === connectToDomNode){
+ this._toConnect[name.replace(/^on/, "").toLowerCase()] = params[name];
+ delete params[name];
+ }
+ }
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // perform connection from this.domNode to user specified handlers (ex: onMouseMove)
+ for(var name in this._toConnect){
+ this.on(name, this._toConnect[name]);
+ }
+ delete this._toConnect;
+ },
+
+ on: function(/*String|Function*/ type, /*Function*/ func){
+ if(this[this._onMap(type)] === connectToDomNode){
+ // Use connect.connect() rather than on() to get handling for "onmouseenter" on non-IE,
+ // normalization of onkeypress/onkeydown to behave like firefox, etc.
+ // Also, need to specify context as "this" rather than the default context of the DOMNode
+ // Remove in 2.0.
+ return connect.connect(this.domNode, type.toLowerCase(), this, func);
+ }
+ return this.inherited(arguments);
+ },
+
+ _setFocusedAttr: function(val){
+ // Remove this method in 2.0 (or sooner), just here to set _focused == focused, for back compat
+ // (but since it's a private variable we aren't required to keep supporting it).
+ this._focused = val;
+ this._set("focused", val);
+ },
+
+ ////////////////// DEPRECATED METHODS ///////////////////
+
+ setAttribute: function(/*String*/ attr, /*anything*/ value){
+ // summary:
+ // Deprecated. Use set() instead.
+ // tags:
+ // deprecated
+ kernel.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.", "", "2.0");
+ this.set(attr, value);
+ },
+
+ attr: function(/*String|Object*/name, /*Object?*/value){
+ // summary:
+ // Set or get properties on a widget instance.
+ // name:
+ // The property to get or set. If an object is passed here and not
+ // a string, its keys are used as names of attributes to be set
+ // and the value of the object as values to set in the widget.
+ // value:
+ // Optional. If provided, attr() operates as a setter. If omitted,
+ // the current value of the named property is returned.
+ // description:
+ // This method is deprecated, use get() or set() directly.
+
+ // Print deprecation warning but only once per calling function
+ if(config.isDebug){
+ var alreadyCalledHash = arguments.callee._ach || (arguments.callee._ach = {}),
+ caller = (arguments.callee.caller || "unknown caller").toString();
+ if(!alreadyCalledHash[caller]){
+ kernel.deprecated(this.declaredClass + "::attr() is deprecated. Use get() or set() instead, called from " +
+ caller, "", "2.0");
+ alreadyCalledHash[caller] = true;
+ }
+ }
+
+ var args = arguments.length;
+ if(args >= 2 || typeof name === "object"){ // setter
+ return this.set.apply(this, arguments);
+ }else{ // getter
+ return this.get(name);
+ }
+ },
+
+ getDescendants: function(){
+ // summary:
+ // Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
+ // This method should generally be avoided as it returns widgets declared in templates, which are
+ // supposed to be internal/hidden, but it's left here for back-compat reasons.
+
+ kernel.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.", "", "2.0");
+ return this.containerNode ? query('[widgetId]', this.containerNode).map(registry.byNode) : []; // dijit/_WidgetBase[]
+ },
+
+ ////////////////// MISCELLANEOUS METHODS ///////////////////
+
+ _onShow: function(){
+ // summary:
+ // Internal method called when this widget is made visible.
+ // See `onShow` for details.
+ this.onShow();
+ },
+
+ onShow: function(){
+ // summary:
+ // Called when this widget becomes the selected pane in a
+ // `dijit/layout/TabContainer`, `dijit/layout/StackContainer`,
+ // `dijit/layout/AccordionContainer`, etc.
+ //
+ // Also called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+ // tags:
+ // callback
+ },
+
+ onHide: function(){
+ // summary:
+ // Called when another widget becomes the selected pane in a
+ // `dijit/layout/TabContainer`, `dijit/layout/StackContainer`,
+ // `dijit/layout/AccordionContainer`, etc.
+ //
+ // Also called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+ // tags:
+ // callback
+ },
+
+ onClose: function(){
+ // summary:
+ // Called when this widget is being displayed as a popup (ex: a Calendar popped
+ // up from a DateTextBox), and it is hidden.
+ // This is called from the dijit.popup code, and should not be called directly.
+ //
+ // Also used as a parameter for children of `dijit/layout/StackContainer` or subclasses.
+ // Callback if a user tries to close the child. Child will be closed if this function returns true.
+ // tags:
+ // extension
+
+ return true; // Boolean
+ }
+});
+
+// For back-compat, remove in 2.0.
+if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/_base"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+return _Widget;
+});
diff --git a/lib/dijit/_WidgetBase.js b/lib/dijit/_WidgetBase.js
index d96bf4fe0..c8a2e02e9 100644
--- a/lib/dijit/_WidgetBase.js
+++ b/lib/dijit/_WidgetBase.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_WidgetBase",["require","dojo/_base/array","dojo/aspect","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/ready","dojo/Stateful","dojo/topic","dojo/_base/window","./registry"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,on,_f,_10,_11,win,_12){if(!_d.isAsync){_f(0,function(){var _13=["dijit/_base/manager"];_1(_13);});}var _14={};function _15(obj){var ret={};for(var _16 in obj){ret[_16.toLowerCase()]=true;}return ret;};function _17(_18){return function(val){_8[val?"set":"remove"](this.domNode,_18,val);this._set(_18,val);};};return _6("dijit._WidgetBase",_10,{id:"",_setIdAttr:"domNode",lang:"",_setLangAttr:_17("lang"),dir:"",_setDirAttr:_17("dir"),textDir:"","class":"",_setClassAttr:{node:"domNode",type:"class"},style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{},_blankGif:_4.blankGif||_1.toUrl("dojo/resources/blank.gif"),postscript:function(_19,_1a){this.create(_19,_1a);},create:function(_1b,_1c){this.srcNodeRef=_7.byId(_1c);this._connects=[];this._supportingWidgets=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_1b){this.params=_1b;_e.mixin(this,_1b);}this.postMixInProperties();if(!this.id){this.id=_12.getUniqueId(this.declaredClass.replace(/\./g,"_"));}_12.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _1d=this.srcNodeRef;if(_1d&&_1d.parentNode&&this.domNode!==_1d){_1d.parentNode.replaceChild(this.domNode,_1d);}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}this._created=true;},_applyAttributes:function(){var _1e=this.constructor,_1f=_1e._setterAttrs;if(!_1f){_1f=(_1e._setterAttrs=[]);for(var _20 in this.attributeMap){_1f.push(_20);}var _21=_1e.prototype;for(var _22 in _21){if(_22 in this.attributeMap){continue;}var _23="_set"+_22.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();})+"Attr";if(_23 in _21){_1f.push(_22);}}}_2.forEach(_1f,function(_24){if(this.params&&_24 in this.params){}else{if(this[_24]){this.set(_24,this[_24]);}}},this);for(var _25 in this.params){this.set(_25,this[_25]);}},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||_a.create("div");}if(this.baseClass){var _26=this.baseClass.split(" ");if(!this.isLeftToRight()){_26=_26.concat(_2.map(_26,function(_27){return _27+"Rtl";}));}_9.add(this.domNode,_26);}},postCreate:function(){},startup:function(){if(this._started){return;}this._started=true;_2.forEach(this.getChildren(),function(obj){if(!obj._started&&!obj._destroyed&&_e.isFunction(obj.startup)){obj.startup();obj._started=true;}});},destroyRecursive:function(_28){this._beingDestroyed=true;this.destroyDescendants(_28);this.destroy(_28);},destroy:function(_29){this._beingDestroyed=true;this.uninitialize();var c;while((c=this._connects.pop())){c.remove();}var w;while((w=this._supportingWidgets.pop())){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}}this.destroyRendering(_29);_12.remove(this.id);this._destroyed=true;},destroyRendering:function(_2a){if(this.bgIframe){this.bgIframe.destroy(_2a);delete this.bgIframe;}if(this.domNode){if(_2a){_8.remove(this.domNode,"widgetId");}else{_a.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_2a){_a.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_2b){_2.forEach(this.getChildren(),function(_2c){if(_2c.destroyRecursive){_2c.destroyRecursive(_2b);}});},uninitialize:function(){return false;},_setStyleAttr:function(_2d){var _2e=this.domNode;if(_e.isObject(_2d)){_c.set(_2e,_2d);}else{if(_2e.style.cssText){_2e.style.cssText+="; "+_2d;}else{_2e.style.cssText=_2d;}}this._set("style",_2d);},_attrToDom:function(_2f,_30,_31){_31=arguments.length>=3?_31:this.attributeMap[_2f];_2.forEach(_e.isArray(_31)?_31:[_31],function(_32){var _33=this[_32.node||_32||"domNode"];var _34=_32.type||"attribute";switch(_34){case "attribute":if(_e.isFunction(_30)){_30=_e.hitch(this,_30);}var _35=_32.attribute?_32.attribute:(/^on[A-Z][a-zA-Z]*$/.test(_2f)?_2f.toLowerCase():_2f);_8.set(_33,_35,_30);break;case "innerText":_33.innerHTML="";_33.appendChild(win.doc.createTextNode(_30));break;case "innerHTML":_33.innerHTML=_30;break;case "class":_9.replace(_33,_30,this[_2f]);break;}},this);},get:function(_36){var _37=this._getAttrNames(_36);return this[_37.g]?this[_37.g]():this[_36];},set:function(_38,_39){if(typeof _38==="object"){for(var x in _38){this.set(x,_38[x]);}return this;}var _3a=this._getAttrNames(_38),_3b=this[_3a.s];if(_e.isFunction(_3b)){var _3c=_3b.apply(this,Array.prototype.slice.call(arguments,1));}else{var _3d=this.focusNode&&!_e.isFunction(this.focusNode)?"focusNode":"domNode",tag=this[_3d].tagName,_3e=_14[tag]||(_14[tag]=_15(this[_3d])),map=_38 in this.attributeMap?this.attributeMap[_38]:_3a.s in this?this[_3a.s]:((_3a.l in _3e&&typeof _39!="function")||/^aria-|^data-|^role$/.test(_38))?_3d:null;if(map!=null){this._attrToDom(_38,_39,map);}this._set(_38,_39);}return _3c||this;},_attrPairNames:{},_getAttrNames:function(_3f){var apn=this._attrPairNames;if(apn[_3f]){return apn[_3f];}var uc=_3f.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();});return (apn[_3f]={n:_3f+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr",l:uc.toLowerCase()});},_set:function(_40,_41){var _42=this[_40];this[_40]=_41;if(this._watchCallbacks&&this._created&&_41!==_42){this._watchCallbacks(_40,_42,_41);}},on:function(_43,_44){return _3.after(this,this._onMap(_43),_44,true);},_onMap:function(_45){var _46=this.constructor,map=_46._onMap;if(!map){map=(_46._onMap={});for(var _47 in _46.prototype){if(/^on/.test(_47)){map[_47.replace(/^on/,"").toLowerCase()]=_47;}}}return map[_45.toLowerCase()];},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getChildren:function(){return this.containerNode?_12.findWidgets(this.containerNode):[];},getParent:function(){return _12.getEnclosingWidget(this.domNode.parentNode);},connect:function(obj,_48,_49){var _4a=_5.connect(obj,_48,this,_49);this._connects.push(_4a);return _4a;},disconnect:function(_4b){var i=_2.indexOf(this._connects,_4b);if(i!=-1){_4b.remove();this._connects.splice(i,1);}},subscribe:function(t,_4c){var _4d=_11.subscribe(t,_e.hitch(this,_4c));this._connects.push(_4d);return _4d;},unsubscribe:function(_4e){this.disconnect(_4e);},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):_b.isBodyLtr();},isFocusable:function(){return this.focus&&(_c.get(this.domNode,"display")!="none");},placeAt:function(_4f,_50){if(_4f.declaredClass&&_4f.addChild){_4f.addChild(this,_50);}else{_a.place(this.domNode,_4f,_50);}return this;},getTextDir:function(_51,_52){return _52;},applyTextDir:function(){},defer:function(fcn,_53){var _54=setTimeout(_e.hitch(this,function(){_54=null;if(!this._destroyed){_e.hitch(this,fcn)();}}),_53||0);return {remove:function(){if(_54){clearTimeout(_54);_54=null;}return null;}};}});}); \ No newline at end of file
+define("dijit/_WidgetBase",["require","dojo/_base/array","dojo/aspect","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/has","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/ready","dojo/Stateful","dojo/topic","dojo/_base/window","./Destroyable","./registry"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,on,_10,_11,_12,win,_13,_14){_d.add("dijit-legacy-requires",!_e.isAsync);if(_d("dijit-legacy-requires")){_10(0,function(){var _15=["dijit/_base/manager"];_1(_15);});}var _16={};function _17(obj){var ret={};for(var _18 in obj){ret[_18.toLowerCase()]=true;}return ret;};function _19(_1a){return function(val){_8[val?"set":"remove"](this.domNode,_1a,val);this._set(_1a,val);};};return _6("dijit._WidgetBase",[_11,_13],{id:"",_setIdAttr:"domNode",lang:"",_setLangAttr:_19("lang"),dir:"",_setDirAttr:_19("dir"),textDir:"","class":"",_setClassAttr:{node:"domNode",type:"class"},style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,ownerDocument:null,_setOwnerDocumentAttr:function(val){this._set("ownerDocument",val);},attributeMap:{},_blankGif:_4.blankGif||_1.toUrl("dojo/resources/blank.gif"),postscript:function(_1b,_1c){this.create(_1b,_1c);},create:function(_1d,_1e){this.srcNodeRef=_7.byId(_1e);this._connects=[];this._supportingWidgets=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_1d){this.params=_1d;_f.mixin(this,_1d);}this.postMixInProperties();if(!this.id){this.id=_14.getUniqueId(this.declaredClass.replace(/\./g,"_"));if(this.params){delete this.params.id;}}this.ownerDocument=this.ownerDocument||(this.srcNodeRef?this.srcNodeRef.ownerDocument:win.doc);this.ownerDocumentBody=win.body(this.ownerDocument);_14.add(this);this.buildRendering();var _1f;if(this.domNode){this._applyAttributes();var _20=this.srcNodeRef;if(_20&&_20.parentNode&&this.domNode!==_20){_20.parentNode.replaceChild(this.domNode,_20);_1f=true;}this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(_1f){delete this.srcNodeRef;}this._created=true;},_applyAttributes:function(){var _21=this.constructor,_22=_21._setterAttrs;if(!_22){_22=(_21._setterAttrs=[]);for(var _23 in this.attributeMap){_22.push(_23);}var _24=_21.prototype;for(var _25 in _24){if(_25 in this.attributeMap){continue;}var _26="_set"+_25.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();})+"Attr";if(_26 in _24){_22.push(_25);}}}var _27={};for(var key in this.params||{}){_27[key]=this[key];}_2.forEach(_22,function(_28){if(_28 in _27){}else{if(this[_28]){this.set(_28,this[_28]);}}},this);for(key in _27){this.set(key,_27[key]);}},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||this.ownerDocument.createElement("div");}if(this.baseClass){var _29=this.baseClass.split(" ");if(!this.isLeftToRight()){_29=_29.concat(_2.map(_29,function(_2a){return _2a+"Rtl";}));}_9.add(this.domNode,_29);}},postCreate:function(){},startup:function(){if(this._started){return;}this._started=true;_2.forEach(this.getChildren(),function(obj){if(!obj._started&&!obj._destroyed&&_f.isFunction(obj.startup)){obj.startup();obj._started=true;}});},destroyRecursive:function(_2b){this._beingDestroyed=true;this.destroyDescendants(_2b);this.destroy(_2b);},destroy:function(_2c){this._beingDestroyed=true;this.uninitialize();function _2d(w){if(w.destroyRecursive){w.destroyRecursive(_2c);}else{if(w.destroy){w.destroy(_2c);}}};_2.forEach(this._connects,_f.hitch(this,"disconnect"));_2.forEach(this._supportingWidgets,_2d);if(this.domNode){_2.forEach(_14.findWidgets(this.domNode,this.containerNode),_2d);}this.destroyRendering(_2c);_14.remove(this.id);this._destroyed=true;},destroyRendering:function(_2e){if(this.bgIframe){this.bgIframe.destroy(_2e);delete this.bgIframe;}if(this.domNode){if(_2e){_8.remove(this.domNode,"widgetId");}else{_a.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_2e){_a.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_2f){_2.forEach(this.getChildren(),function(_30){if(_30.destroyRecursive){_30.destroyRecursive(_2f);}});},uninitialize:function(){return false;},_setStyleAttr:function(_31){var _32=this.domNode;if(_f.isObject(_31)){_c.set(_32,_31);}else{if(_32.style.cssText){_32.style.cssText+="; "+_31;}else{_32.style.cssText=_31;}}this._set("style",_31);},_attrToDom:function(_33,_34,_35){_35=arguments.length>=3?_35:this.attributeMap[_33];_2.forEach(_f.isArray(_35)?_35:[_35],function(_36){var _37=this[_36.node||_36||"domNode"];var _38=_36.type||"attribute";switch(_38){case "attribute":if(_f.isFunction(_34)){_34=_f.hitch(this,_34);}var _39=_36.attribute?_36.attribute:(/^on[A-Z][a-zA-Z]*$/.test(_33)?_33.toLowerCase():_33);if(_37.tagName){_8.set(_37,_39,_34);}else{_37.set(_39,_34);}break;case "innerText":_37.innerHTML="";_37.appendChild(this.ownerDocument.createTextNode(_34));break;case "innerHTML":_37.innerHTML=_34;break;case "class":_9.replace(_37,_34,this[_33]);break;}},this);},get:function(_3a){var _3b=this._getAttrNames(_3a);return this[_3b.g]?this[_3b.g]():this[_3a];},set:function(_3c,_3d){if(typeof _3c==="object"){for(var x in _3c){this.set(x,_3c[x]);}return this;}var _3e=this._getAttrNames(_3c),_3f=this[_3e.s];if(_f.isFunction(_3f)){var _40=_3f.apply(this,Array.prototype.slice.call(arguments,1));}else{var _41=this.focusNode&&!_f.isFunction(this.focusNode)?"focusNode":"domNode",tag=this[_41].tagName,_42=_16[tag]||(_16[tag]=_17(this[_41])),map=_3c in this.attributeMap?this.attributeMap[_3c]:_3e.s in this?this[_3e.s]:((_3e.l in _42&&typeof _3d!="function")||/^aria-|^data-|^role$/.test(_3c))?_41:null;if(map!=null){this._attrToDom(_3c,_3d,map);}this._set(_3c,_3d);}return _40||this;},_attrPairNames:{},_getAttrNames:function(_43){var apn=this._attrPairNames;if(apn[_43]){return apn[_43];}var uc=_43.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();});return (apn[_43]={n:_43+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr",l:uc.toLowerCase()});},_set:function(_44,_45){var _46=this[_44];this[_44]=_45;if(this._created&&_45!==_46){if(this._watchCallbacks){this._watchCallbacks(_44,_46,_45);}this.emit("attrmodified-"+_44,{detail:{prevValue:_46,newValue:_45}});}},emit:function(_47,_48,_49){_48=_48||{};if(_48.bubbles===undefined){_48.bubbles=true;}if(_48.cancelable===undefined){_48.cancelable=true;}if(!_48.detail){_48.detail={};}_48.detail.widget=this;var ret,_4a=this["on"+_47];if(_4a){ret=_4a.apply(this,_49?_49:[_48]);}if(this._started&&!this._beingDestroyed){on.emit(this.domNode,_47.toLowerCase(),_48);}return ret;},on:function(_4b,_4c){var _4d=this._onMap(_4b);if(_4d){return _3.after(this,_4d,_4c,true);}return this.own(on(this.domNode,_4b,_4c))[0];},_onMap:function(_4e){var _4f=this.constructor,map=_4f._onMap;if(!map){map=(_4f._onMap={});for(var _50 in _4f.prototype){if(/^on/.test(_50)){map[_50.replace(/^on/,"").toLowerCase()]=_50;}}}return map[typeof _4e=="string"&&_4e.toLowerCase()];},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getChildren:function(){return this.containerNode?_14.findWidgets(this.containerNode):[];},getParent:function(){return _14.getEnclosingWidget(this.domNode.parentNode);},connect:function(obj,_51,_52){return this.own(_5.connect(obj,_51,this,_52))[0];},disconnect:function(_53){_53.remove();},subscribe:function(t,_54){return this.own(_12.subscribe(t,_f.hitch(this,_54)))[0];},unsubscribe:function(_55){_55.remove();},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):_b.isBodyLtr(this.ownerDocument);},isFocusable:function(){return this.focus&&(_c.get(this.domNode,"display")!="none");},placeAt:function(_56,_57){var _58=!_56.tagName&&_14.byId(_56);if(_58&&_58.addChild&&(!_57||typeof _57==="number")){_58.addChild(this,_57);}else{var ref=_58?(_58.containerNode&&!/after|before|replace/.test(_57||"")?_58.containerNode:_58.domNode):_7.byId(_56,this.ownerDocument);_a.place(this.domNode,ref,_57);if(!this._started&&(this.getParent()||{})._started){this.startup();}}return this;},getTextDir:function(_59,_5a){return _5a;},applyTextDir:function(){},defer:function(fcn,_5b){var _5c=setTimeout(_f.hitch(this,function(){_5c=null;if(!this._destroyed){_f.hitch(this,fcn)();}}),_5b||0);return {remove:function(){if(_5c){clearTimeout(_5c);_5c=null;}return null;}};}});}); \ No newline at end of file
diff --git a/lib/dijit/_WidgetBase.js.uncompressed.js b/lib/dijit/_WidgetBase.js.uncompressed.js
new file mode 100644
index 000000000..fc39d26b7
--- /dev/null
+++ b/lib/dijit/_WidgetBase.js.uncompressed.js
@@ -0,0 +1,1137 @@
+define("dijit/_WidgetBase", [
+ "require", // require.toUrl
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/aspect",
+ "dojo/_base/config", // config.blankGif
+ "dojo/_base/connect", // connect.connect
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.byId
+ "dojo/dom-attr", // domAttr.set domAttr.remove
+ "dojo/dom-class", // domClass.add domClass.replace
+ "dojo/dom-construct", // domConstruct.destroy domConstruct.place
+ "dojo/dom-geometry", // isBodyLtr
+ "dojo/dom-style", // domStyle.set, domStyle.get
+ "dojo/has",
+ "dojo/_base/kernel",
+ "dojo/_base/lang", // mixin(), isArray(), etc.
+ "dojo/on",
+ "dojo/ready",
+ "dojo/Stateful", // Stateful
+ "dojo/topic",
+ "dojo/_base/window", // win.doc, win.body()
+ "./Destroyable",
+ "./registry" // registry.getUniqueId(), registry.findWidgets()
+], function(require, array, aspect, config, connect, declare,
+ dom, domAttr, domClass, domConstruct, domGeometry, domStyle, has, kernel,
+ lang, on, ready, Stateful, topic, win, Destroyable, registry){
+
+// module:
+// dijit/_WidgetBase
+
+// Flag to make dijit load modules the app didn't explicitly request, for backwards compatibility
+has.add("dijit-legacy-requires", !kernel.isAsync);
+
+// For back-compat, remove in 2.0.
+if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/_base/manager"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+// Nested hash listing attributes for each tag, all strings in lowercase.
+// ex: {"div": {"style": true, "tabindex" true}, "form": { ...
+var tagAttrs = {};
+function getAttrs(obj){
+ var ret = {};
+ for(var attr in obj){
+ ret[attr.toLowerCase()] = true;
+ }
+ return ret;
+}
+
+function nonEmptyAttrToDom(attr){
+ // summary:
+ // Returns a setter function that copies the attribute to this.domNode,
+ // or removes the attribute from this.domNode, depending on whether the
+ // value is defined or not.
+ return function(val){
+ domAttr[val ? "set" : "remove"](this.domNode, attr, val);
+ this._set(attr, val);
+ };
+}
+
+return declare("dijit._WidgetBase", [Stateful, Destroyable], {
+ // summary:
+ // Future base class for all Dijit widgets.
+ // description:
+ // Future base class for all Dijit widgets.
+ // _Widget extends this class adding support for various features needed by desktop.
+ //
+ // Provides stubs for widget lifecycle methods for subclasses to extend, like postMixInProperties(), buildRendering(),
+ // postCreate(), startup(), and destroy(), and also public API methods like set(), get(), and watch().
+ //
+ // Widgets can provide custom setters/getters for widget attributes, which are called automatically by set(name, value).
+ // For an attribute XXX, define methods _setXXXAttr() and/or _getXXXAttr().
+ //
+ // _setXXXAttr can also be a string/hash/array mapping from a widget attribute XXX to the widget's DOMNodes:
+ //
+ // - DOM node attribute
+ // | _setFocusAttr: {node: "focusNode", type: "attribute"}
+ // | _setFocusAttr: "focusNode" (shorthand)
+ // | _setFocusAttr: "" (shorthand, maps to this.domNode)
+ // Maps this.focus to this.focusNode.focus, or (last example) this.domNode.focus
+ //
+ // - DOM node innerHTML
+ // | _setTitleAttr: { node: "titleNode", type: "innerHTML" }
+ // Maps this.title to this.titleNode.innerHTML
+ //
+ // - DOM node innerText
+ // | _setTitleAttr: { node: "titleNode", type: "innerText" }
+ // Maps this.title to this.titleNode.innerText
+ //
+ // - DOM node CSS class
+ // | _setMyClassAttr: { node: "domNode", type: "class" }
+ // Maps this.myClass to this.domNode.className
+ //
+ // If the value of _setXXXAttr is an array, then each element in the array matches one of the
+ // formats of the above list.
+ //
+ // If the custom setter is null, no action is performed other than saving the new value
+ // in the widget (in this).
+ //
+ // If no custom setter is defined for an attribute, then it will be copied
+ // to this.focusNode (if the widget defines a focusNode), or this.domNode otherwise.
+ // That's only done though for attributes that match DOMNode attributes (title,
+ // alt, aria-labelledby, etc.)
+
+ // id: [const] String
+ // A unique, opaque ID string that can be assigned by users or by the
+ // system. If the developer passes an ID which is known not to be
+ // unique, the specified ID is ignored and the system-generated ID is
+ // used instead.
+ id: "",
+ _setIdAttr: "domNode", // to copy to this.domNode even for auto-generated id's
+
+ // lang: [const] String
+ // Rarely used. Overrides the default Dojo locale used to render this widget,
+ // as defined by the [HTML LANG](http://www.w3.org/TR/html401/struct/dirlang.html#adef-lang) attribute.
+ // Value must be among the list of locales specified during by the Dojo bootstrap,
+ // formatted according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt) (like en-us).
+ lang: "",
+ // set on domNode even when there's a focus node. but don't set lang="", since that's invalid.
+ _setLangAttr: nonEmptyAttrToDom("lang"),
+
+ // dir: [const] String
+ // Bi-directional support, as defined by the [HTML DIR](http://www.w3.org/TR/html401/struct/dirlang.html#adef-dir)
+ // attribute. Either left-to-right "ltr" or right-to-left "rtl". If undefined, widgets renders in page's
+ // default direction.
+ dir: "",
+ // set on domNode even when there's a focus node. but don't set dir="", since that's invalid.
+ _setDirAttr: nonEmptyAttrToDom("dir"), // to set on domNode even when there's a focus node
+
+ // textDir: String
+ // Bi-directional support, the main variable which is responsible for the direction of the text.
+ // The text direction can be different than the GUI direction by using this parameter in creation
+ // of a widget.
+ //
+ // Allowed values:
+ //
+ // 1. "ltr"
+ // 2. "rtl"
+ // 3. "auto" - contextual the direction of a text defined by first strong letter.
+ //
+ // By default is as the page direction.
+ textDir: "",
+
+ // class: String
+ // HTML class attribute
+ "class": "",
+ _setClassAttr: { node: "domNode", type: "class" },
+
+ // style: String||Object
+ // HTML style attributes as cssText string or name/value hash
+ style: "",
+
+ // title: String
+ // HTML title attribute.
+ //
+ // For form widgets this specifies a tooltip to display when hovering over
+ // the widget (just like the native HTML title attribute).
+ //
+ // For TitlePane or for when this widget is a child of a TabContainer, AccordionContainer,
+ // etc., it's used to specify the tab label, accordion pane title, etc.
+ title: "",
+
+ // tooltip: String
+ // When this widget's title attribute is used to for a tab label, accordion pane title, etc.,
+ // this specifies the tooltip to appear when the mouse is hovered over that text.
+ tooltip: "",
+
+ // baseClass: [protected] String
+ // Root CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate
+ // widget state.
+ baseClass: "",
+
+ // srcNodeRef: [readonly] DomNode
+ // pointer to original DOM node
+ srcNodeRef: null,
+
+ // domNode: [readonly] DomNode
+ // This is our visible representation of the widget! Other DOM
+ // Nodes may by assigned to other properties, usually through the
+ // template system's data-dojo-attach-point syntax, but the domNode
+ // property is the canonical "top level" node in widget UI.
+ domNode: null,
+
+ // containerNode: [readonly] DomNode
+ // Designates where children of the source DOM node will be placed.
+ // "Children" in this case refers to both DOM nodes and widgets.
+ // For example, for myWidget:
+ //
+ // | <div data-dojo-type=myWidget>
+ // | <b> here's a plain DOM node
+ // | <span data-dojo-type=subWidget>and a widget</span>
+ // | <i> and another plain DOM node </i>
+ // | </div>
+ //
+ // containerNode would point to:
+ //
+ // | <b> here's a plain DOM node
+ // | <span data-dojo-type=subWidget>and a widget</span>
+ // | <i> and another plain DOM node </i>
+ //
+ // In templated widgets, "containerNode" is set via a
+ // data-dojo-attach-point assignment.
+ //
+ // containerNode must be defined for any widget that accepts innerHTML
+ // (like ContentPane or BorderContainer or even Button), and conversely
+ // is null for widgets that don't, like TextBox.
+ containerNode: null,
+
+ // ownerDocument: [const] Document?
+ // The document this widget belongs to. If not specified to constructor, will default to
+ // srcNodeRef.ownerDocument, or if no sourceRef specified, then to dojo/_base/window::doc
+ ownerDocument: null,
+ _setOwnerDocumentAttr: function(val){
+ // this setter is merely to avoid automatically trying to set this.domNode.ownerDocument
+ this._set("ownerDocument", val);
+ },
+
+/*=====
+ // _started: [readonly] Boolean
+ // startup() has completed.
+ _started: false,
+=====*/
+
+ // attributeMap: [protected] Object
+ // Deprecated. Instead of attributeMap, widget should have a _setXXXAttr attribute
+ // for each XXX attribute to be mapped to the DOM.
+ //
+ // attributeMap sets up a "binding" between attributes (aka properties)
+ // of the widget and the widget's DOM.
+ // Changes to widget attributes listed in attributeMap will be
+ // reflected into the DOM.
+ //
+ // For example, calling set('title', 'hello')
+ // on a TitlePane will automatically cause the TitlePane's DOM to update
+ // with the new title.
+ //
+ // attributeMap is a hash where the key is an attribute of the widget,
+ // and the value reflects a binding to a:
+ //
+ // - DOM node attribute
+ // | focus: {node: "focusNode", type: "attribute"}
+ // Maps this.focus to this.focusNode.focus
+ //
+ // - DOM node innerHTML
+ // | title: { node: "titleNode", type: "innerHTML" }
+ // Maps this.title to this.titleNode.innerHTML
+ //
+ // - DOM node innerText
+ // | title: { node: "titleNode", type: "innerText" }
+ // Maps this.title to this.titleNode.innerText
+ //
+ // - DOM node CSS class
+ // | myClass: { node: "domNode", type: "class" }
+ // Maps this.myClass to this.domNode.className
+ //
+ // If the value is an array, then each element in the array matches one of the
+ // formats of the above list.
+ //
+ // There are also some shorthands for backwards compatibility:
+ //
+ // - string --> { node: string, type: "attribute" }, for example:
+ //
+ // | "focusNode" ---> { node: "focusNode", type: "attribute" }
+ //
+ // - "" --> { node: "domNode", type: "attribute" }
+ attributeMap: {},
+
+ // _blankGif: [protected] String
+ // Path to a blank 1x1 image.
+ // Used by `<img>` nodes in templates that really get their image via CSS background-image.
+ _blankGif: config.blankGif || require.toUrl("dojo/resources/blank.gif"),
+
+ //////////// 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:
+ //
+ // - use srcNodeRef.innerHTML as my contents
+ // - if this is a behavioral widget then apply behavior to that srcNodeRef
+ // - otherwise, replace srcNodeRef with my generated DOM tree
+ },
+ =====*/
+
+ postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+ // summary:
+ // Kicks off widget instantiation. See create() for details.
+ // tags:
+ // private
+ this.create(params, srcNodeRef);
+ },
+
+ create: function(params, srcNodeRef){
+ // summary:
+ // Kick off the life-cycle of a widget
+ // description:
+ // Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate,
+ // etc.), some of which of you'll want to override. See http://dojotoolkit.org/reference-guide/dijit/_WidgetBase.html
+ // for a discussion of the widget creation lifecycle.
+ //
+ // Of course, adventurous developers could override create entirely, but this should
+ // only be done as a last resort.
+ // 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:
+ //
+ // - use srcNodeRef.innerHTML as my contents
+ // - if this is a behavioral widget then apply behavior to that srcNodeRef
+ // - otherwise, replace srcNodeRef with my generated DOM tree
+ // tags:
+ // private
+
+ // store pointer to original DOM tree
+ this.srcNodeRef = dom.byId(srcNodeRef);
+
+ // No longer used, remove for 2.0.
+ this._connects = [];
+ this._supportingWidgets = [];
+
+ // this is here for back-compat, remove in 2.0 (but check NodeList-instantiate.html test)
+ if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; }
+
+ // mix in our passed parameters
+ if(params){
+ this.params = params;
+ lang.mixin(this, params);
+ }
+ this.postMixInProperties();
+
+ // Generate an id for the widget if one wasn't specified, or it was specified as id: undefined.
+ // Do this before buildRendering() because it might expect the id to be there.
+ if(!this.id){
+ this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+ if(this.params){
+ // if params contains {id: undefined}, prevent _applyAttributes() from processing it
+ delete this.params.id;
+ }
+ }
+
+ // The document and <body> node this widget is associated with
+ this.ownerDocument = this.ownerDocument || (this.srcNodeRef ? this.srcNodeRef.ownerDocument : win.doc);
+ this.ownerDocumentBody = win.body(this.ownerDocument);
+
+ registry.add(this);
+
+ this.buildRendering();
+
+ var deleteSrcNodeRef;
+
+ if(this.domNode){
+ // Copy attributes listed in attributeMap into the [newly created] DOM for the widget.
+ // Also calls custom setters for all attributes with custom setters.
+ this._applyAttributes();
+
+ // If srcNodeRef was specified, then swap out original srcNode for this widget's DOM tree.
+ // For 2.0, move this after postCreate(). postCreate() shouldn't depend on the
+ // widget being attached to the DOM since it isn't when a widget is created programmatically like
+ // new MyWidget({}). See #11635.
+ var source = this.srcNodeRef;
+ if(source && source.parentNode && this.domNode !== source){
+ source.parentNode.replaceChild(this.domNode, source);
+ deleteSrcNodeRef = true;
+ }
+
+ // Note: for 2.0 may want to rename widgetId to dojo._scopeName + "_widgetId",
+ // assuming that dojo._scopeName even exists in 2.0
+ this.domNode.setAttribute("widgetId", this.id);
+ }
+ this.postCreate();
+
+ // If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.
+ // I think for back-compatibility it isn't deleting srcNodeRef until after postCreate() has run.
+ if(deleteSrcNodeRef){
+ delete this.srcNodeRef;
+ }
+
+ this._created = true;
+ },
+
+ _applyAttributes: function(){
+ // summary:
+ // Step during widget creation to copy widget attributes to the
+ // DOM according to attributeMap and _setXXXAttr objects, and also to call
+ // custom _setXXXAttr() methods.
+ //
+ // Skips over blank/false attribute values, unless they were explicitly specified
+ // as parameters to the widget, since those are the default anyway,
+ // and setting tabIndex="" is different than not setting tabIndex at all.
+ //
+ // For backwards-compatibility reasons attributeMap overrides _setXXXAttr when
+ // _setXXXAttr is a hash/string/array, but _setXXXAttr as a functions override attributeMap.
+ // tags:
+ // private
+
+ // Get list of attributes where this.set(name, value) will do something beyond
+ // setting this[name] = value. Specifically, attributes that have:
+ // - associated _setXXXAttr() method/hash/string/array
+ // - entries in attributeMap (remove this for 2.0);
+ var ctor = this.constructor,
+ list = ctor._setterAttrs;
+ if(!list){
+ list = (ctor._setterAttrs = []);
+ for(var attr in this.attributeMap){
+ list.push(attr);
+ }
+
+ var proto = ctor.prototype;
+ for(var fxName in proto){
+ if(fxName in this.attributeMap){ continue; }
+ var setterName = "_set" + fxName.replace(/^[a-z]|-[a-zA-Z]/g, function(c){ return c.charAt(c.length-1).toUpperCase(); }) + "Attr";
+ if(setterName in proto){
+ list.push(fxName);
+ }
+ }
+ }
+
+ // Call this.set() for each property that was either specified as parameter to constructor,
+ // or is in the list found above. For correlated properties like value and displayedValue, the one
+ // specified as a parameter should take precedence.
+ // Particularly important for new DateTextBox({displayedValue: ...}) since DateTextBox's default value is
+ // NaN and thus is not ignored like a default value of "".
+
+ // Step 1: Save the current values of the widget properties that were specified as parameters to the constructor.
+ // Generally this.foo == this.params.foo, except if postMixInProperties() changed the value of this.foo.
+ var params = {};
+ for(var key in this.params || {}){
+ params[key] = this[key];
+ }
+
+ // Step 2: Call set() for each property that wasn't passed as a parameter to the constructor
+ array.forEach(list, function(attr){
+ if(attr in params){
+ // skip this one, do it below
+ }else if(this[attr]){
+ this.set(attr, this[attr]);
+ }
+ }, this);
+
+ // Step 3: Call set() for each property that was specified as parameter to constructor.
+ // Use params hash created above to ignore side effects from step #2 above.
+ for(key in params){
+ this.set(key, params[key]);
+ }
+ },
+
+ postMixInProperties: function(){
+ // summary:
+ // Called after the parameters to the widget have been read-in,
+ // but before the widget template is instantiated. Especially
+ // useful to set properties that are referenced in the widget
+ // template.
+ // tags:
+ // protected
+ },
+
+ buildRendering: function(){
+ // summary:
+ // Construct the UI for this widget, setting this.domNode.
+ // Most widgets will mixin `dijit._TemplatedMixin`, which implements this method.
+ // tags:
+ // protected
+
+ if(!this.domNode){
+ // Create root node if it wasn't created by _Templated
+ this.domNode = this.srcNodeRef || this.ownerDocument.createElement("div");
+ }
+
+ // baseClass is a single class name or occasionally a space-separated list of names.
+ // Add those classes to the DOMNode. If RTL mode then also add with Rtl suffix.
+ // TODO: make baseClass custom setter
+ if(this.baseClass){
+ var classes = this.baseClass.split(" ");
+ if(!this.isLeftToRight()){
+ classes = classes.concat( array.map(classes, function(name){ return name+"Rtl"; }));
+ }
+ domClass.add(this.domNode, classes);
+ }
+ },
+
+ postCreate: function(){
+ // summary:
+ // Processing after the DOM fragment is created
+ // description:
+ // Called after the DOM fragment has been created, but not necessarily
+ // added to the document. Do not include any operations which rely on
+ // node dimensions or placement.
+ // tags:
+ // protected
+ },
+
+ startup: function(){
+ // summary:
+ // Processing after the DOM fragment is added to the document
+ // description:
+ // Called after a widget and its children have been created and added to the page,
+ // and all related widgets have finished their create() cycle, up through postCreate().
+ // This is useful for composite widgets that need to control or layout sub-widgets.
+ // Many layout widgets can use this as a wiring phase.
+ if(this._started){ return; }
+ this._started = true;
+ array.forEach(this.getChildren(), function(obj){
+ if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){
+ obj.startup();
+ obj._started = true;
+ }
+ });
+ },
+
+ //////////// DESTROY FUNCTIONS ////////////////////////////////
+
+ destroyRecursive: function(/*Boolean?*/ preserveDom){
+ // summary:
+ // Destroy this widget and its descendants
+ // description:
+ // This is the generic "destructor" function that all widget users
+ // should call to cleanly discard with a widget. Once a widget is
+ // destroyed, it is removed from the manager object.
+ // preserveDom:
+ // If true, this method will leave the original DOM structure
+ // alone of descendant Widgets. Note: This will NOT work with
+ // dijit._Templated widgets.
+
+ this._beingDestroyed = true;
+ this.destroyDescendants(preserveDom);
+ this.destroy(preserveDom);
+ },
+
+ destroy: function(/*Boolean*/ preserveDom){
+ // summary:
+ // Destroy this widget, but not its descendants.
+ // This method will, however, destroy internal widgets such as those used within a template.
+ // preserveDom: Boolean
+ // If true, this method will leave the original DOM structure alone.
+ // Note: This will not yet work with _Templated widgets
+
+ this._beingDestroyed = true;
+ this.uninitialize();
+
+ function destroy(w){
+ if(w.destroyRecursive){
+ w.destroyRecursive(preserveDom);
+ }else if(w.destroy){
+ w.destroy(preserveDom);
+ }
+ }
+
+ // Back-compat, remove for 2.0
+ array.forEach(this._connects, lang.hitch(this, "disconnect"));
+ array.forEach(this._supportingWidgets, destroy);
+
+ // Destroy supporting widgets, but not child widgets under this.containerNode (for 2.0, destroy child widgets
+ // here too). if() statement is to guard against exception if destroy() called multiple times (see #15815).
+ if(this.domNode){
+ array.forEach(registry.findWidgets(this.domNode, this.containerNode), destroy);
+ }
+
+ this.destroyRendering(preserveDom);
+ registry.remove(this.id);
+ this._destroyed = true;
+ },
+
+ destroyRendering: function(/*Boolean?*/ preserveDom){
+ // summary:
+ // Destroys the DOM nodes associated with this widget
+ // preserveDom:
+ // If true, this method will leave the original DOM structure alone
+ // during tear-down. Note: this will not work with _Templated
+ // widgets yet.
+ // tags:
+ // protected
+
+ if(this.bgIframe){
+ this.bgIframe.destroy(preserveDom);
+ delete this.bgIframe;
+ }
+
+ if(this.domNode){
+ if(preserveDom){
+ domAttr.remove(this.domNode, "widgetId");
+ }else{
+ domConstruct.destroy(this.domNode);
+ }
+ delete this.domNode;
+ }
+
+ if(this.srcNodeRef){
+ if(!preserveDom){
+ domConstruct.destroy(this.srcNodeRef);
+ }
+ delete this.srcNodeRef;
+ }
+ },
+
+ destroyDescendants: function(/*Boolean?*/ preserveDom){
+ // summary:
+ // Recursively destroy the children of this widget and their
+ // descendants.
+ // preserveDom:
+ // If true, the preserveDom attribute is passed to all descendant
+ // widget's .destroy() method. Not for use with _Templated
+ // widgets.
+
+ // get all direct descendants and destroy them recursively
+ array.forEach(this.getChildren(), function(widget){
+ if(widget.destroyRecursive){
+ widget.destroyRecursive(preserveDom);
+ }
+ });
+ },
+
+ uninitialize: function(){
+ // summary:
+ // Deprecated. Override destroy() instead to implement custom widget tear-down
+ // behavior.
+ // tags:
+ // protected
+ return false;
+ },
+
+ ////////////////// GET/SET, CUSTOM SETTERS, ETC. ///////////////////
+
+ _setStyleAttr: function(/*String||Object*/ value){
+ // summary:
+ // Sets the style attribute of the widget according to value,
+ // which is either a hash like {height: "5px", width: "3px"}
+ // or a plain string
+ // description:
+ // Determines which node to set the style on based on style setting
+ // in attributeMap.
+ // tags:
+ // protected
+
+ var mapNode = this.domNode;
+
+ // Note: technically we should revert any style setting made in a previous call
+ // to his method, but that's difficult to keep track of.
+
+ if(lang.isObject(value)){
+ domStyle.set(mapNode, value);
+ }else{
+ if(mapNode.style.cssText){
+ mapNode.style.cssText += "; " + value;
+ }else{
+ mapNode.style.cssText = value;
+ }
+ }
+
+ this._set("style", value);
+ },
+
+ _attrToDom: function(/*String*/ attr, /*String*/ value, /*Object?*/ commands){
+ // summary:
+ // Reflect a widget attribute (title, tabIndex, duration etc.) to
+ // the widget DOM, as specified by commands parameter.
+ // If commands isn't specified then it's looked up from attributeMap.
+ // Note some attributes like "type"
+ // cannot be processed this way as they are not mutable.
+ // attr:
+ // Name of member variable (ex: "focusNode" maps to this.focusNode) pointing
+ // to DOMNode inside the widget, or alternately pointing to a subwidget
+ // tags:
+ // private
+
+ commands = arguments.length >= 3 ? commands : this.attributeMap[attr];
+
+ array.forEach(lang.isArray(commands) ? commands : [commands], function(command){
+
+ // Get target node and what we are doing to that node
+ var mapNode = this[command.node || command || "domNode"]; // DOM node
+ var type = command.type || "attribute"; // class, innerHTML, innerText, or attribute
+
+ switch(type){
+ case "attribute":
+ if(lang.isFunction(value)){ // functions execute in the context of the widget
+ value = lang.hitch(this, value);
+ }
+
+ // Get the name of the DOM node attribute; usually it's the same
+ // as the name of the attribute in the widget (attr), but can be overridden.
+ // Also maps handler names to lowercase, like onSubmit --> onsubmit
+ var attrName = command.attribute ? command.attribute :
+ (/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr);
+
+ if(mapNode.tagName){
+ // Normal case, mapping to a DOMNode. Note that modern browsers will have a mapNode.set()
+ // method, but for consistency we still call domAttr
+ domAttr.set(mapNode, attrName, value);
+ }else{
+ // mapping to a sub-widget
+ mapNode.set(attrName, value);
+ }
+ break;
+ case "innerText":
+ mapNode.innerHTML = "";
+ mapNode.appendChild(this.ownerDocument.createTextNode(value));
+ break;
+ case "innerHTML":
+ mapNode.innerHTML = value;
+ break;
+ case "class":
+ domClass.replace(mapNode, value, this[attr]);
+ break;
+ }
+ }, this);
+ },
+
+ get: function(name){
+ // summary:
+ // Get a property from a widget.
+ // name:
+ // The property to get.
+ // description:
+ // Get a named property from a widget. The property may
+ // potentially be retrieved via a getter method. If no getter is defined, this
+ // just retrieves the object's property.
+ //
+ // For example, if the widget has properties `foo` and `bar`
+ // and a method named `_getFooAttr()`, calling:
+ // `myWidget.get("foo")` would be equivalent to calling
+ // `widget._getFooAttr()` and `myWidget.get("bar")`
+ // would be equivalent to the expression
+ // `widget.bar2`
+ var names = this._getAttrNames(name);
+ return this[names.g] ? this[names.g]() : this[name];
+ },
+
+ set: function(name, value){
+ // summary:
+ // Set a property on a widget
+ // name:
+ // The property to set.
+ // value:
+ // The value to set in the property.
+ // description:
+ // Sets named properties on a widget which may potentially be handled by a
+ // setter in the widget.
+ //
+ // For example, if the widget has properties `foo` and `bar`
+ // and a method named `_setFooAttr()`, calling
+ // `myWidget.set("foo", "Howdy!")` would be equivalent to calling
+ // `widget._setFooAttr("Howdy!")` and `myWidget.set("bar", 3)`
+ // would be equivalent to the statement `widget.bar = 3;`
+ //
+ // set() may also be called with a hash of name/value pairs, ex:
+ //
+ // | myWidget.set({
+ // | foo: "Howdy",
+ // | bar: 3
+ // | });
+ //
+ // This is equivalent to calling `set(foo, "Howdy")` and `set(bar, 3)`
+
+ if(typeof name === "object"){
+ for(var x in name){
+ this.set(x, name[x]);
+ }
+ return this;
+ }
+ var names = this._getAttrNames(name),
+ setter = this[names.s];
+ if(lang.isFunction(setter)){
+ // use the explicit setter
+ var result = setter.apply(this, Array.prototype.slice.call(arguments, 1));
+ }else{
+ // Mapping from widget attribute to DOMNode/subwidget attribute/value/etc.
+ // Map according to:
+ // 1. attributeMap setting, if one exists (TODO: attributeMap deprecated, remove in 2.0)
+ // 2. _setFooAttr: {...} type attribute in the widget (if one exists)
+ // 3. apply to focusNode or domNode if standard attribute name, excluding funcs like onClick.
+ // Checks if an attribute is a "standard attribute" by whether the DOMNode JS object has a similar
+ // attribute name (ex: accept-charset attribute matches jsObject.acceptCharset).
+ // Note also that Tree.focusNode() is a function not a DOMNode, so test for that.
+ var defaultNode = this.focusNode && !lang.isFunction(this.focusNode) ? "focusNode" : "domNode",
+ tag = this[defaultNode].tagName,
+ attrsForTag = tagAttrs[tag] || (tagAttrs[tag] = getAttrs(this[defaultNode])),
+ map = name in this.attributeMap ? this.attributeMap[name] :
+ names.s in this ? this[names.s] :
+ ((names.l in attrsForTag && typeof value != "function") ||
+ /^aria-|^data-|^role$/.test(name)) ? defaultNode : null;
+ if(map != null){
+ this._attrToDom(name, value, map);
+ }
+ this._set(name, value);
+ }
+ return result || this;
+ },
+
+ _attrPairNames: {}, // shared between all widgets
+ _getAttrNames: function(name){
+ // summary:
+ // Helper function for get() and set().
+ // Caches attribute name values so we don't do the string ops every time.
+ // tags:
+ // private
+
+ var apn = this._attrPairNames;
+ if(apn[name]){ return apn[name]; }
+ var uc = name.replace(/^[a-z]|-[a-zA-Z]/g, function(c){ return c.charAt(c.length-1).toUpperCase(); });
+ return (apn[name] = {
+ n: name+"Node",
+ s: "_set"+uc+"Attr", // converts dashes to camel case, ex: accept-charset --> _setAcceptCharsetAttr
+ g: "_get"+uc+"Attr",
+ l: uc.toLowerCase() // lowercase name w/out dashes, ex: acceptcharset
+ });
+ },
+
+ _set: function(/*String*/ name, /*anything*/ value){
+ // summary:
+ // Helper function to set new value for specified attribute, and call handlers
+ // registered with watch() if the value has changed.
+ var oldValue = this[name];
+ this[name] = value;
+ if(this._created && value !== oldValue){
+ if(this._watchCallbacks){
+ this._watchCallbacks(name, oldValue, value);
+ }
+ this.emit("attrmodified-" + name, {
+ detail: {
+ prevValue: oldValue,
+ newValue: value
+ }
+ });
+ }
+ },
+
+ emit: function(/*String*/ type, /*Object?*/ eventObj, /*Array?*/ callbackArgs){
+ // summary:
+ // Used by widgets to signal that a synthetic event occurred, ex:
+ // | myWidget.emit("attrmodified-selectedChildWidget", {}).
+ //
+ // Emits an event on this.domNode named type.toLowerCase(), based on eventObj.
+ // Also calls onType() method, if present, and returns value from that method.
+ // By default passes eventObj to callback, but will pass callbackArgs instead, if specified.
+ // Modifies eventObj by adding missing parameters (bubbles, cancelable, widget).
+ // tags:
+ // protected
+
+ // Specify fallback values for bubbles, cancelable in case they are not set in eventObj.
+ // Also set pointer to widget, although since we can't add a pointer to the widget for native events
+ // (see #14729), maybe we shouldn't do it here?
+ eventObj = eventObj || {};
+ if(eventObj.bubbles === undefined){ eventObj.bubbles = true; }
+ if(eventObj.cancelable === undefined){ eventObj.cancelable = true; }
+ if(!eventObj.detail){ eventObj.detail = {}; }
+ eventObj.detail.widget = this;
+
+ var ret, callback = this["on"+type];
+ if(callback){
+ ret = callback.apply(this, callbackArgs ? callbackArgs : [eventObj]);
+ }
+
+ // Emit event, but avoid spurious emit()'s as parent sets properties on child during startup/destroy
+ if(this._started && !this._beingDestroyed){
+ on.emit(this.domNode, type.toLowerCase(), eventObj);
+ }
+
+ return ret;
+ },
+
+ on: function(/*String|Function*/ type, /*Function*/ func){
+ // summary:
+ // Call specified function when event occurs, ex: myWidget.on("click", function(){ ... }).
+ // type:
+ // Name of event (ex: "click") or extension event like touch.press.
+ // description:
+ // Call specified function when event `type` occurs, ex: `myWidget.on("click", function(){ ... })`.
+ // Note that the function is not run in any particular scope, so if (for example) you want it to run in the
+ // widget's scope you must do `myWidget.on("click", lang.hitch(myWidget, func))`.
+
+ // For backwards compatibility, if there's an onType() method in the widget then connect to that.
+ // Remove in 2.0.
+ var widgetMethod = this._onMap(type);
+ if(widgetMethod){
+ return aspect.after(this, widgetMethod, func, true);
+ }
+
+ // Otherwise, just listen for the event on this.domNode.
+ return this.own(on(this.domNode, type, func))[0];
+ },
+
+ _onMap: function(/*String|Function*/ type){
+ // summary:
+ // Maps on() type parameter (ex: "mousemove") to method name (ex: "onMouseMove").
+ // If type is a synthetic event like touch.press then returns undefined.
+ var ctor = this.constructor, map = ctor._onMap;
+ if(!map){
+ map = (ctor._onMap = {});
+ for(var attr in ctor.prototype){
+ if(/^on/.test(attr)){
+ map[attr.replace(/^on/, "").toLowerCase()] = attr;
+ }
+ }
+ }
+ return map[typeof type == "string" && type.toLowerCase()]; // String
+ },
+
+ toString: function(){
+ // summary:
+ // Returns a string that represents the widget
+ // description:
+ // When a widget is cast to a string, this method will be used to generate the
+ // output. Currently, it does not implement any sort of reversible
+ // serialization.
+ return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
+ },
+
+ getChildren: function(){
+ // summary:
+ // Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
+ // Does not return nested widgets, nor widgets that are part of this widget's template.
+ return this.containerNode ? registry.findWidgets(this.containerNode) : []; // dijit/_WidgetBase[]
+ },
+
+ getParent: function(){
+ // summary:
+ // Returns the parent widget of this widget
+ return registry.getEnclosingWidget(this.domNode.parentNode);
+ },
+
+ connect: function(
+ /*Object|null*/ obj,
+ /*String|Function*/ event,
+ /*String|Function*/ method){
+ // summary:
+ // Deprecated, will be removed in 2.0, use this.own(on(...)) or this.own(aspect.after(...)) instead.
+ //
+ // Connects specified obj/event to specified method of this object
+ // and registers for disconnect() on widget destroy.
+ //
+ // Provide widget-specific analog to dojo.connect, except with the
+ // implicit use of this widget as the target object.
+ // Events connected with `this.connect` are disconnected upon
+ // destruction.
+ // returns:
+ // A handle that can be passed to `disconnect` in order to disconnect before
+ // the widget is destroyed.
+ // example:
+ // | var btn = new Button();
+ // | // when foo.bar() is called, call the listener we're going to
+ // | // provide in the scope of btn
+ // | btn.connect(foo, "bar", function(){
+ // | console.debug(this.toString());
+ // | });
+ // tags:
+ // protected
+
+ return this.own(connect.connect(obj, event, this, method))[0]; // handle
+ },
+
+ disconnect: function(handle){
+ // summary:
+ // Deprecated, will be removed in 2.0, use handle.remove() instead.
+ //
+ // Disconnects handle created by `connect`.
+ // tags:
+ // protected
+
+ handle.remove();
+ },
+
+ subscribe: function(t, method){
+ // summary:
+ // Deprecated, will be removed in 2.0, use this.own(topic.subscribe()) instead.
+ //
+ // Subscribes to the specified topic and calls the specified method
+ // of this object and registers for unsubscribe() on widget destroy.
+ //
+ // Provide widget-specific analog to dojo.subscribe, except with the
+ // implicit use of this widget as the target object.
+ // t: String
+ // The topic
+ // method: Function
+ // The callback
+ // example:
+ // | var btn = new Button();
+ // | // when /my/topic is published, this button changes its label to
+ // | // be the parameter of the topic.
+ // | btn.subscribe("/my/topic", function(v){
+ // | this.set("label", v);
+ // | });
+ // tags:
+ // protected
+ return this.own(topic.subscribe(t, lang.hitch(this, method)))[0]; // handle
+ },
+
+ unsubscribe: function(/*Object*/ handle){
+ // summary:
+ // Deprecated, will be removed in 2.0, use handle.remove() instead.
+ //
+ // Unsubscribes handle created by this.subscribe.
+ // Also removes handle from this widget's list of subscriptions
+ // tags:
+ // protected
+
+ handle.remove();
+ },
+
+ isLeftToRight: function(){
+ // summary:
+ // Return this widget's explicit or implicit orientation (true for LTR, false for RTL)
+ // tags:
+ // protected
+ return this.dir ? (this.dir == "ltr") : domGeometry.isBodyLtr(this.ownerDocument); //Boolean
+ },
+
+ isFocusable: function(){
+ // summary:
+ // Return true if this widget can currently be focused
+ // and false if not
+ return this.focus && (domStyle.get(this.domNode, "display") != "none");
+ },
+
+ placeAt: function(/* String|DomNode|_Widget */ reference, /* String|Int? */ position){
+ // summary:
+ // Place this widget somewhere in the DOM based
+ // on standard domConstruct.place() conventions.
+ // description:
+ // A convenience function provided in all _Widgets, providing a simple
+ // shorthand mechanism to put an existing (or newly created) Widget
+ // somewhere in the dom, and allow chaining.
+ // reference:
+ // Widget, DOMNode, or id of widget or DOMNode
+ // position:
+ // If reference is a widget (or id of widget), and that widget has an ".addChild" method,
+ // it will be called passing this widget instance into that method, supplying the optional
+ // position index passed. In this case position (if specified) should be an integer.
+ //
+ // If reference is a DOMNode (or id matching a DOMNode but not a widget),
+ // the position argument can be a numeric index or a string
+ // "first", "last", "before", or "after", same as dojo/dom-construct::place().
+ // returns: dijit/_WidgetBase
+ // Provides a useful return of the newly created dijit._Widget instance so you
+ // can "chain" this function by instantiating, placing, then saving the return value
+ // to a variable.
+ // example:
+ // | // create a Button with no srcNodeRef, and place it in the body:
+ // | var button = new Button({ label:"click" }).placeAt(win.body());
+ // | // now, 'button' is still the widget reference to the newly created button
+ // | button.on("click", function(e){ console.log('click'); }));
+ // example:
+ // | // create a button out of a node with id="src" and append it to id="wrapper":
+ // | var button = new Button({},"src").placeAt("wrapper");
+ // example:
+ // | // place a new button as the first element of some div
+ // | var button = new Button({ label:"click" }).placeAt("wrapper","first");
+ // example:
+ // | // create a contentpane and add it to a TabContainer
+ // | var tc = dijit.byId("myTabs");
+ // | new ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc)
+
+ var refWidget = !reference.tagName && registry.byId(reference);
+ if(refWidget && refWidget.addChild && (!position || typeof position === "number")){
+ // Adding this to refWidget and can use refWidget.addChild() to handle everything.
+ refWidget.addChild(this, position);
+ }else{
+ // "reference" is a plain DOMNode, or we can't use refWidget.addChild(). Use domConstruct.place() and
+ // target refWidget.containerNode for nested placement (position==number, "first", "last", "only"), and
+ // refWidget.domNode otherwise ("after"/"before"/"replace"). (But not supported officially, see #14946.)
+ var ref = refWidget ?
+ (refWidget.containerNode && !/after|before|replace/.test(position||"") ?
+ refWidget.containerNode : refWidget.domNode) : dom.byId(reference, this.ownerDocument);
+ domConstruct.place(this.domNode, ref, position);
+
+ // Start this iff it has a parent widget that's already started.
+ if(!this._started && (this.getParent() || {})._started){
+ this.startup();
+ }
+ }
+ return this;
+ },
+
+ getTextDir: function(/*String*/ text,/*String*/ originalDir){
+ // summary:
+ // Return direction of the text.
+ // The function overridden in the _BidiSupport module,
+ // its main purpose is to calculate the direction of the
+ // text, if was defined by the programmer through textDir.
+ // tags:
+ // protected.
+ return originalDir;
+ },
+
+ 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: DOMNode
+ // text: String
+ // tags:
+ // protected.
+ },
+
+ defer: function(fcn, delay){
+ // summary:
+ // Wrapper to setTimeout to avoid deferred functions executing
+ // after the originating widget has been destroyed.
+ // Returns an object handle with a remove method (that returns null) (replaces clearTimeout).
+ // fcn: function reference
+ // delay: Optional number (defaults to 0)
+ // tags:
+ // protected.
+ var timer = setTimeout(lang.hitch(this,
+ function(){
+ timer = null;
+ if(!this._destroyed){
+ lang.hitch(this, fcn)();
+ }
+ }),
+ delay || 0
+ );
+ return {
+ remove: function(){
+ if(timer){
+ clearTimeout(timer);
+ timer = null;
+ }
+ return null; // so this works well: handle = handle.remove();
+ }
+ };
+ }
+});
+
+});
diff --git a/lib/dijit/_WidgetsInTemplateMixin.js b/lib/dijit/_WidgetsInTemplateMixin.js
index bea9c9ffe..f1c7df76b 100644
--- a/lib/dijit/_WidgetsInTemplateMixin.js
+++ b/lib/dijit/_WidgetsInTemplateMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_WidgetsInTemplateMixin",["dojo/_base/array","dojo/_base/declare","dojo/parser","dijit/registry"],function(_1,_2,_3,_4){return _2("dijit._WidgetsInTemplateMixin",null,{_earlyTemplatedStartup:false,widgetsInTemplate:true,_beforeFillContent:function(){if(this.widgetsInTemplate){var _5=this.domNode;var cw=(this._startupWidgets=_3.parse(_5,{noStart:!this._earlyTemplatedStartup,template:true,inherited:{dir:this.dir,lang:this.lang,textDir:this.textDir},propsThis:this,scope:"dojo"}));this._supportingWidgets=_4.findWidgets(_5);this._attachTemplateNodes(cw,function(n,p){return n[p];});}},startup:function(){_1.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/_WidgetsInTemplateMixin",["dojo/_base/array","dojo/_base/declare","dojo/parser"],function(_1,_2,_3){return _2("dijit._WidgetsInTemplateMixin",null,{_earlyTemplatedStartup:false,widgetsInTemplate:true,_beforeFillContent:function(){if(this.widgetsInTemplate){var _4=this.domNode;var cw=(this._startupWidgets=_3.parse(_4,{noStart:!this._earlyTemplatedStartup,template:true,inherited:{dir:this.dir,lang:this.lang,textDir:this.textDir},propsThis:this,scope:"dojo"}));if(!cw.isFulfilled()){throw new Error(this.declaredClass+": parser returned unfilled promise (probably waiting for module auto-load), "+"unsupported by _WidgetsInTemplateMixin. Must pre-load all supporting widgets before instantiation.");}this._attachTemplateNodes(cw,function(n,p){return n[p];});}},startup:function(){_1.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js b/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js
new file mode 100644
index 000000000..9108931d5
--- /dev/null
+++ b/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js
@@ -0,0 +1,65 @@
+define("dijit/_WidgetsInTemplateMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/parser" // parser.parse
+], function(array, declare, parser){
+
+ // module:
+ // dijit/_WidgetsInTemplateMixin
+
+ return declare("dijit._WidgetsInTemplateMixin", null, {
+ // summary:
+ // Mixin to supplement _TemplatedMixin when template contains widgets
+
+ // _earlyTemplatedStartup: Boolean
+ // A fallback to preserve the 1.0 - 1.3 behavior of children in
+ // templates having their startup called before the parent widget
+ // fires postCreate. Defaults to 'false', causing child widgets to
+ // have their .startup() called immediately before a parent widget
+ // .startup(), but always after the parent .postCreate(). Set to
+ // 'true' to re-enable to previous, arguably broken, behavior.
+ _earlyTemplatedStartup: false,
+
+ // widgetsInTemplate: [protected] Boolean
+ // Should we parse the template to find widgets that might be
+ // declared in markup inside it? (Remove for 2.0 and assume true)
+ widgetsInTemplate: true,
+
+ _beforeFillContent: function(){
+ if(this.widgetsInTemplate){
+ // Before copying over content, instantiate widgets in template
+ var node = this.domNode;
+
+ var cw = (this._startupWidgets = parser.parse(node, {
+ noStart: !this._earlyTemplatedStartup,
+ template: true,
+ inherited: {dir: this.dir, lang: this.lang, textDir: this.textDir},
+ propsThis: this, // so data-dojo-props of widgets in the template can reference "this" to refer to me
+ scope: "dojo" // even in multi-version mode templates use dojoType/data-dojo-type
+ }));
+
+ if(!cw.isFulfilled()){
+ throw new Error(this.declaredClass + ": parser returned unfilled promise (probably waiting for module auto-load), " +
+ "unsupported by _WidgetsInTemplateMixin. Must pre-load all supporting widgets before instantiation.");
+ }
+
+ // _WidgetBase::destroy() will destroy any supporting widgets under this.domNode.
+ // If we wanted to, we could call this.own() on anything in this._startupWidgets that was moved outside
+ // of this.domNode (like Dialog, which is moved to <body>).
+
+ this._attachTemplateNodes(cw, function(n,p){
+ return n[p];
+ });
+ }
+ },
+
+ startup: function(){
+ array.forEach(this._startupWidgets, function(w){
+ if(w && !w._started && w.startup){
+ w.startup();
+ }
+ });
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/_base.js b/lib/dijit/_base.js
index f85f7809e..196356294 100644
--- a/lib/dijit/_base.js
+++ b/lib/dijit/_base.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base",[".","./a11y","./WidgetSet","./_base/focus","./_base/manager","./_base/place","./_base/popup","./_base/scroll","./_base/sniff","./_base/typematic","./_base/wai","./_base/window"],function(_1){return _1._base;}); \ No newline at end of file
+define("dijit/_base",["./main","./a11y","./WidgetSet","./_base/focus","./_base/manager","./_base/place","./_base/popup","./_base/scroll","./_base/sniff","./_base/typematic","./_base/wai","./_base/window"],function(_1){return _1._base;}); \ No newline at end of file
diff --git a/lib/dijit/_base.js.uncompressed.js b/lib/dijit/_base.js.uncompressed.js
new file mode 100644
index 000000000..77ead5ffb
--- /dev/null
+++ b/lib/dijit/_base.js.uncompressed.js
@@ -0,0 +1,27 @@
+define("dijit/_base", [
+ "./main",
+ "./a11y", // used to be in dijit/_base/manager
+ "./WidgetSet", // used to be in dijit/_base/manager
+ "./_base/focus",
+ "./_base/manager",
+ "./_base/place",
+ "./_base/popup",
+ "./_base/scroll",
+ "./_base/sniff",
+ "./_base/typematic",
+ "./_base/wai",
+ "./_base/window"
+], function(dijit){
+
+ // module:
+ // dijit/_base
+
+ /*=====
+ return {
+ // summary:
+ // Includes all the modules in dijit/_base
+ };
+ =====*/
+
+ return dijit._base;
+});
diff --git a/lib/dijit/_base/focus.js b/lib/dijit/_base/focus.js
index 840329992..0f8a7f92d 100644
--- a/lib/dijit/_base/focus.js
+++ b/lib/dijit/_base/focus.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/focus",["dojo/_base/array","dojo/dom","dojo/_base/lang","dojo/topic","dojo/_base/window","../focus",".."],function(_1,_2,_3,_4,_5,_6,_7){_3.mixin(_7,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return _7.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,_8=_5.doc.selection,cf=_6.curNode;if(_5.global.getSelection){_8=_5.global.getSelection();if(_8){if(_8.isCollapsed){tg=cf?cf.tagName:"";if(tg){tg=tg.toLowerCase();if(tg=="textarea"||(tg=="input"&&(!cf.type||cf.type.toLowerCase()=="text"))){_8={start:cf.selectionStart,end:cf.selectionEnd,node:cf,pRange:true};return {isCollapsed:(_8.end<=_8.start),mark:_8};}}bm={isCollapsed:true};if(_8.rangeCount){bm.mark=_8.getRangeAt(0).cloneRange();}}else{rg=_8.getRangeAt(0);bm={isCollapsed:false,mark:rg.cloneRange()};}}}else{if(_8){tg=cf?cf.tagName:"";tg=tg.toLowerCase();if(cf&&tg&&(tg=="button"||tg=="textarea"||tg=="input")){if(_8.type&&_8.type.toLowerCase()=="none"){return {isCollapsed:true,mark:null};}else{rg=_8.createRange();return {isCollapsed:rg.text&&rg.text.length?false:true,mark:{range:rg,pRange:true}};}}bm={};try{rg=_8.createRange();bm.isCollapsed=!(_8.type=="Text"?rg.htmlText.length:rg.length);}catch(e){bm.isCollapsed=true;return bm;}if(_8.type.toUpperCase()=="CONTROL"){if(rg.length){bm.mark=[];var i=0,_9=rg.length;while(i<_9){bm.mark.push(rg.item(i++));}}else{bm.isCollapsed=true;bm.mark=null;}}else{bm.mark=rg.getBookmark();}}else{console.warn("No idea how to store the current selection for this browser!");}}return bm;},moveToBookmark:function(_a){var _b=_5.doc,_c=_a.mark;if(_c){if(_5.global.getSelection){var _d=_5.global.getSelection();if(_d&&_d.removeAllRanges){if(_c.pRange){var n=_c.node;n.selectionStart=_c.start;n.selectionEnd=_c.end;}else{_d.removeAllRanges();_d.addRange(_c);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_b.selection&&_c){var rg;if(_c.pRange){rg=_c.range;}else{if(_3.isArray(_c)){rg=_b.body.createControlRange();_1.forEach(_c,function(n){rg.addElement(n);});}else{rg=_b.body.createTextRange();rg.moveToBookmark(_c);}}rg.select();}}}},getFocus:function(_e,_f){var _10=!_6.curNode||(_e&&_2.isDescendant(_6.curNode,_e.domNode))?_7._prevFocus:_6.curNode;return {node:_10,bookmark:_10&&(_10==_6.curNode)&&_5.withGlobal(_f||_5.global,_7.getBookmark),openedForWindow:_f};},_activeStack:[],registerIframe:function(_11){return _6.registerIframe(_11);},unregisterIframe:function(_12){_12&&_12.remove();},registerWin:function(_13,_14){return _6.registerWin(_13,_14);},unregisterWin:function(_15){_15&&_15.remove();}});_6.focus=function(_16){if(!_16){return;}var _17="node" in _16?_16.node:_16,_18=_16.bookmark,_19=_16.openedForWindow,_1a=_18?_18.isCollapsed:false;if(_17){var _1b=(_17.tagName.toLowerCase()=="iframe")?_17.contentWindow:_17;if(_1b&&_1b.focus){try{_1b.focus();}catch(e){}}_6._onFocusNode(_17);}if(_18&&_5.withGlobal(_19||_5.global,_7.isCollapsed)&&!_1a){if(_19){_19.focus();}try{_5.withGlobal(_19||_5.global,_7.moveToBookmark,null,[_18]);}catch(e2){}}};_6.watch("curNode",function(_1c,_1d,_1e){_7._curFocus=_1e;_7._prevFocus=_1d;if(_1e){_4.publish("focusNode",_1e);}});_6.watch("activeStack",function(_1f,_20,_21){_7._activeStack=_21;});_6.on("widget-blur",function(_22,by){_4.publish("widgetBlur",_22,by);});_6.on("widget-focus",function(_23,by){_4.publish("widgetFocus",_23,by);});return _7;}); \ No newline at end of file
+define("dijit/_base/focus",["dojo/_base/array","dojo/dom","dojo/_base/lang","dojo/topic","dojo/_base/window","../focus","../main"],function(_1,_2,_3,_4,_5,_6,_7){var _8={_curFocus:null,_prevFocus:null,isCollapsed:function(){return _7.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,_9=_5.doc.selection,cf=_6.curNode;if(_5.global.getSelection){_9=_5.global.getSelection();if(_9){if(_9.isCollapsed){tg=cf?cf.tagName:"";if(tg){tg=tg.toLowerCase();if(tg=="textarea"||(tg=="input"&&(!cf.type||cf.type.toLowerCase()=="text"))){_9={start:cf.selectionStart,end:cf.selectionEnd,node:cf,pRange:true};return {isCollapsed:(_9.end<=_9.start),mark:_9};}}bm={isCollapsed:true};if(_9.rangeCount){bm.mark=_9.getRangeAt(0).cloneRange();}}else{rg=_9.getRangeAt(0);bm={isCollapsed:false,mark:rg.cloneRange()};}}}else{if(_9){tg=cf?cf.tagName:"";tg=tg.toLowerCase();if(cf&&tg&&(tg=="button"||tg=="textarea"||tg=="input")){if(_9.type&&_9.type.toLowerCase()=="none"){return {isCollapsed:true,mark:null};}else{rg=_9.createRange();return {isCollapsed:rg.text&&rg.text.length?false:true,mark:{range:rg,pRange:true}};}}bm={};try{rg=_9.createRange();bm.isCollapsed=!(_9.type=="Text"?rg.htmlText.length:rg.length);}catch(e){bm.isCollapsed=true;return bm;}if(_9.type.toUpperCase()=="CONTROL"){if(rg.length){bm.mark=[];var i=0,_a=rg.length;while(i<_a){bm.mark.push(rg.item(i++));}}else{bm.isCollapsed=true;bm.mark=null;}}else{bm.mark=rg.getBookmark();}}else{console.warn("No idea how to store the current selection for this browser!");}}return bm;},moveToBookmark:function(_b){var _c=_5.doc,_d=_b.mark;if(_d){if(_5.global.getSelection){var _e=_5.global.getSelection();if(_e&&_e.removeAllRanges){if(_d.pRange){var n=_d.node;n.selectionStart=_d.start;n.selectionEnd=_d.end;}else{_e.removeAllRanges();_e.addRange(_d);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_c.selection&&_d){var rg;if(_d.pRange){rg=_d.range;}else{if(_3.isArray(_d)){rg=_c.body.createControlRange();_1.forEach(_d,function(n){rg.addElement(n);});}else{rg=_c.body.createTextRange();rg.moveToBookmark(_d);}}rg.select();}}}},getFocus:function(_f,_10){var _11=!_6.curNode||(_f&&_2.isDescendant(_6.curNode,_f.domNode))?_7._prevFocus:_6.curNode;return {node:_11,bookmark:_11&&(_11==_6.curNode)&&_5.withGlobal(_10||_5.global,_7.getBookmark),openedForWindow:_10};},_activeStack:[],registerIframe:function(_12){return _6.registerIframe(_12);},unregisterIframe:function(_13){_13&&_13.remove();},registerWin:function(_14,_15){return _6.registerWin(_14,_15);},unregisterWin:function(_16){_16&&_16.remove();}};_6.focus=function(_17){if(!_17){return;}var _18="node" in _17?_17.node:_17,_19=_17.bookmark,_1a=_17.openedForWindow,_1b=_19?_19.isCollapsed:false;if(_18){var _1c=(_18.tagName.toLowerCase()=="iframe")?_18.contentWindow:_18;if(_1c&&_1c.focus){try{_1c.focus();}catch(e){}}_6._onFocusNode(_18);}if(_19&&_5.withGlobal(_1a||_5.global,_7.isCollapsed)&&!_1b){if(_1a){_1a.focus();}try{_5.withGlobal(_1a||_5.global,_7.moveToBookmark,null,[_19]);}catch(e2){}}};_6.watch("curNode",function(_1d,_1e,_1f){_7._curFocus=_1f;_7._prevFocus=_1e;if(_1f){_4.publish("focusNode",_1f);}});_6.watch("activeStack",function(_20,_21,_22){_7._activeStack=_22;});_6.on("widget-blur",function(_23,by){_4.publish("widgetBlur",_23,by);});_6.on("widget-focus",function(_24,by){_4.publish("widgetFocus",_24,by);});_3.mixin(_7,_8);return _7;}); \ No newline at end of file
diff --git a/lib/dijit/_base/focus.js.uncompressed.js b/lib/dijit/_base/focus.js.uncompressed.js
new file mode 100644
index 000000000..5d1e94ea6
--- /dev/null
+++ b/lib/dijit/_base/focus.js.uncompressed.js
@@ -0,0 +1,323 @@
+define("dijit/_base/focus", [
+ "dojo/_base/array", // array.forEach
+ "dojo/dom", // dom.isDescendant
+ "dojo/_base/lang", // lang.isArray
+ "dojo/topic", // publish
+ "dojo/_base/window", // win.doc win.doc.selection win.global win.global.getSelection win.withGlobal
+ "../focus",
+ "../main" // for exporting symbols to dijit
+], function(array, dom, lang, topic, win, focus, dijit){
+
+ // module:
+ // dijit/_base/focus
+
+ var exports = {
+ // summary:
+ // Deprecated module to monitor currently focused node and stack of currently focused widgets.
+ // New code should access dijit/focus directly.
+
+ // _curFocus: DomNode
+ // Currently focused item on screen
+ _curFocus: null,
+
+ // _prevFocus: DomNode
+ // Previously focused item on screen
+ _prevFocus: null,
+
+ isCollapsed: function(){
+ // summary:
+ // Returns true if there is no text selected
+ return dijit.getBookmark().isCollapsed;
+ },
+
+ getBookmark: function(){
+ // summary:
+ // Retrieves a bookmark that can be used with moveToBookmark to return to the same range
+ var bm, rg, tg, sel = win.doc.selection, cf = focus.curNode;
+
+ if(win.global.getSelection){
+ //W3C Range API for selections.
+ sel = win.global.getSelection();
+ if(sel){
+ if(sel.isCollapsed){
+ tg = cf? cf.tagName : "";
+ if(tg){
+ //Create a fake rangelike item to restore selections.
+ tg = tg.toLowerCase();
+ if(tg == "textarea" ||
+ (tg == "input" && (!cf.type || cf.type.toLowerCase() == "text"))){
+ sel = {
+ start: cf.selectionStart,
+ end: cf.selectionEnd,
+ node: cf,
+ pRange: true
+ };
+ return {isCollapsed: (sel.end <= sel.start), mark: sel}; //Object.
+ }
+ }
+ bm = {isCollapsed:true};
+ if(sel.rangeCount){
+ bm.mark = sel.getRangeAt(0).cloneRange();
+ }
+ }else{
+ rg = sel.getRangeAt(0);
+ bm = {isCollapsed: false, mark: rg.cloneRange()};
+ }
+ }
+ }else if(sel){
+ // If the current focus was a input of some sort and no selection, don't bother saving
+ // a native bookmark. This is because it causes issues with dialog/page selection restore.
+ // So, we need to create psuedo bookmarks to work with.
+ tg = cf ? cf.tagName : "";
+ tg = tg.toLowerCase();
+ if(cf && tg && (tg == "button" || tg == "textarea" || tg == "input")){
+ if(sel.type && sel.type.toLowerCase() == "none"){
+ return {
+ isCollapsed: true,
+ mark: null
+ }
+ }else{
+ rg = sel.createRange();
+ return {
+ isCollapsed: rg.text && rg.text.length?false:true,
+ mark: {
+ range: rg,
+ pRange: true
+ }
+ };
+ }
+ }
+ bm = {};
+
+ //'IE' way for selections.
+ try{
+ // createRange() throws exception when dojo in iframe
+ //and nothing selected, see #9632
+ rg = sel.createRange();
+ bm.isCollapsed = !(sel.type == 'Text' ? rg.htmlText.length : rg.length);
+ }catch(e){
+ bm.isCollapsed = true;
+ return bm;
+ }
+ if(sel.type.toUpperCase() == 'CONTROL'){
+ if(rg.length){
+ bm.mark=[];
+ var i=0,len=rg.length;
+ while(i<len){
+ bm.mark.push(rg.item(i++));
+ }
+ }else{
+ bm.isCollapsed = true;
+ bm.mark = null;
+ }
+ }else{
+ bm.mark = rg.getBookmark();
+ }
+ }else{
+ console.warn("No idea how to store the current selection for this browser!");
+ }
+ return bm; // Object
+ },
+
+ moveToBookmark: function(/*Object*/ bookmark){
+ // summary:
+ // Moves current selection to a bookmark
+ // bookmark:
+ // This should be a returned object from dijit.getBookmark()
+
+ var _doc = win.doc,
+ mark = bookmark.mark;
+ if(mark){
+ if(win.global.getSelection){
+ //W3C Rangi API (FF, WebKit, Opera, etc)
+ var sel = win.global.getSelection();
+ if(sel && sel.removeAllRanges){
+ if(mark.pRange){
+ var n = mark.node;
+ n.selectionStart = mark.start;
+ n.selectionEnd = mark.end;
+ }else{
+ sel.removeAllRanges();
+ sel.addRange(mark);
+ }
+ }else{
+ console.warn("No idea how to restore selection for this browser!");
+ }
+ }else if(_doc.selection && mark){
+ //'IE' way.
+ var rg;
+ if(mark.pRange){
+ rg = mark.range;
+ }else if(lang.isArray(mark)){
+ rg = _doc.body.createControlRange();
+ //rg.addElement does not have call/apply method, so can not call it directly
+ //rg is not available in "range.addElement(item)", so can't use that either
+ array.forEach(mark, function(n){
+ rg.addElement(n);
+ });
+ }else{
+ rg = _doc.body.createTextRange();
+ rg.moveToBookmark(mark);
+ }
+ rg.select();
+ }
+ }
+ },
+
+ getFocus: function(/*Widget?*/ menu, /*Window?*/ openedForWindow){
+ // summary:
+ // Called as getFocus(), this returns an Object showing the current focus
+ // and selected text.
+ //
+ // Called as getFocus(widget), where widget is a (widget representing) a button
+ // that was just pressed, it returns where focus was before that button
+ // was pressed. (Pressing the button may have either shifted focus to the button,
+ // or removed focus altogether.) In this case the selected text is not returned,
+ // since it can't be accurately determined.
+ //
+ // menu: dijit/_WidgetBase|{domNode: DomNode} structure
+ // The button that was just pressed. If focus has disappeared or moved
+ // to this button, returns the previous focus. In this case the bookmark
+ // information is already lost, and null is returned.
+ //
+ // openedForWindow:
+ // iframe in which menu was opened
+ //
+ // returns:
+ // A handle to restore focus/selection, to be passed to `dijit.focus`
+ var node = !focus.curNode || (menu && dom.isDescendant(focus.curNode, menu.domNode)) ? dijit._prevFocus : focus.curNode;
+ return {
+ node: node,
+ bookmark: node && (node == focus.curNode) && win.withGlobal(openedForWindow || win.global, dijit.getBookmark),
+ openedForWindow: openedForWindow
+ }; // Object
+ },
+
+ // _activeStack: dijit/_WidgetBase[]
+ // List of currently active widgets (focused widget and it's ancestors)
+ _activeStack: [],
+
+ registerIframe: function(/*DomNode*/ iframe){
+ // summary:
+ // Registers listeners on the specified iframe so that any click
+ // or focus event on that iframe (or anything in it) is reported
+ // as a focus/click event on the `<iframe>` itself.
+ // description:
+ // Currently only used by editor.
+ // returns:
+ // Handle to pass to unregisterIframe()
+ return focus.registerIframe(iframe);
+ },
+
+ unregisterIframe: function(/*Object*/ handle){
+ // summary:
+ // Unregisters listeners on the specified iframe created by registerIframe.
+ // After calling be sure to delete or null out the handle itself.
+ // handle:
+ // Handle returned by registerIframe()
+
+ handle && handle.remove();
+ },
+
+ registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){
+ // summary:
+ // Registers listeners on the specified window (either the main
+ // window or an iframe's window) to detect when the user has clicked somewhere
+ // or focused somewhere.
+ // description:
+ // Users should call registerIframe() instead of this method.
+ // targetWindow:
+ // If specified this is the window associated with the iframe,
+ // i.e. iframe.contentWindow.
+ // effectiveNode:
+ // If specified, report any focus events inside targetWindow as
+ // an event on effectiveNode, rather than on evt.target.
+ // returns:
+ // Handle to pass to unregisterWin()
+
+ return focus.registerWin(targetWindow, effectiveNode);
+ },
+
+ unregisterWin: function(/*Handle*/ handle){
+ // summary:
+ // Unregisters listeners on the specified window (either the main
+ // window or an iframe's window) according to handle returned from registerWin().
+ // After calling be sure to delete or null out the handle itself.
+
+ handle && handle.remove();
+ }
+ };
+
+ // Override focus singleton's focus function so that dijit.focus()
+ // has backwards compatible behavior of restoring selection (although
+ // probably no one is using that).
+ focus.focus = function(/*Object|DomNode */ handle){
+ // summary:
+ // Sets the focused node and the selection according to argument.
+ // To set focus to an iframe's content, pass in the iframe itself.
+ // handle:
+ // object returned by get(), or a DomNode
+
+ if(!handle){ return; }
+
+ var node = "node" in handle ? handle.node : handle, // because handle is either DomNode or a composite object
+ bookmark = handle.bookmark,
+ openedForWindow = handle.openedForWindow,
+ collapsed = bookmark ? bookmark.isCollapsed : false;
+
+ // Set the focus
+ // Note that for iframe's we need to use the <iframe> to follow the parentNode chain,
+ // but we need to set focus to iframe.contentWindow
+ if(node){
+ var focusNode = (node.tagName.toLowerCase() == "iframe") ? node.contentWindow : node;
+ if(focusNode && focusNode.focus){
+ try{
+ // Gecko throws sometimes if setting focus is impossible,
+ // node not displayed or something like that
+ focusNode.focus();
+ }catch(e){/*quiet*/}
+ }
+ focus._onFocusNode(node);
+ }
+
+ // set the selection
+ // do not need to restore if current selection is not empty
+ // (use keyboard to select a menu item) or if previous selection was collapsed
+ // as it may cause focus shift (Esp in IE).
+ if(bookmark && win.withGlobal(openedForWindow || win.global, dijit.isCollapsed) && !collapsed){
+ if(openedForWindow){
+ openedForWindow.focus();
+ }
+ try{
+ win.withGlobal(openedForWindow || win.global, dijit.moveToBookmark, null, [bookmark]);
+ }catch(e2){
+ /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+ }
+ }
+ };
+
+ // For back compatibility, monitor changes to focused node and active widget stack,
+ // publishing events and copying changes from focus manager variables into dijit (top level) variables
+ focus.watch("curNode", function(name, oldVal, newVal){
+ dijit._curFocus = newVal;
+ dijit._prevFocus = oldVal;
+ if(newVal){
+ topic.publish("focusNode", newVal); // publish
+ }
+ });
+ focus.watch("activeStack", function(name, oldVal, newVal){
+ dijit._activeStack = newVal;
+ });
+
+ focus.on("widget-blur", function(widget, by){
+ topic.publish("widgetBlur", widget, by); // publish
+ });
+ focus.on("widget-focus", function(widget, by){
+ topic.publish("widgetFocus", widget, by); // publish
+ });
+
+ lang.mixin(dijit, exports);
+
+ /*===== return exports; =====*/
+ return dijit; // for back compat :-(
+});
diff --git a/lib/dijit/_base/manager.js b/lib/dijit/_base/manager.js
index db80c9890..473d1fb8a 100644
--- a/lib/dijit/_base/manager.js
+++ b/lib/dijit/_base/manager.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/manager",["dojo/_base/array","dojo/_base/config","../registry",".."],function(_1,_2,_3,_4){_1.forEach(["byId","getUniqueId","findWidgets","_destroyAll","byNode","getEnclosingWidget"],function(_5){_4[_5]=_3[_5];});_4.defaultDuration=_2["defaultDuration"]||200;return _4;}); \ No newline at end of file
+define("dijit/_base/manager",["dojo/_base/array","dojo/_base/config","dojo/_base/lang","../registry","../main"],function(_1,_2,_3,_4,_5){var _6={};_1.forEach(["byId","getUniqueId","findWidgets","_destroyAll","byNode","getEnclosingWidget"],function(_7){_6[_7]=_4[_7];});_3.mixin(_6,{defaultDuration:_2["defaultDuration"]||200});_3.mixin(_5,_6);return _5;}); \ No newline at end of file
diff --git a/lib/dijit/_base/manager.js.uncompressed.js b/lib/dijit/_base/manager.js.uncompressed.js
new file mode 100644
index 000000000..b4e2729ae
--- /dev/null
+++ b/lib/dijit/_base/manager.js.uncompressed.js
@@ -0,0 +1,35 @@
+define("dijit/_base/manager", [
+ "dojo/_base/array",
+ "dojo/_base/config", // defaultDuration
+ "dojo/_base/lang",
+ "../registry",
+ "../main" // for setting exports to dijit namespace
+], function(array, config, lang, registry, dijit){
+
+ // module:
+ // dijit/_base/manager
+
+ var exports = {
+ // summary:
+ // Deprecated. Shim to methods on registry, plus a few other declarations.
+ // New code should access dijit/registry directly when possible.
+ };
+
+ array.forEach(["byId", "getUniqueId", "findWidgets", "_destroyAll", "byNode", "getEnclosingWidget"], function(name){
+ exports[name] = registry[name];
+ });
+
+ lang.mixin(exports, {
+ // defaultDuration: Integer
+ // The default fx.animation speed (in ms) to use for all Dijit
+ // transitional fx.animations, unless otherwise specified
+ // on a per-instance basis. Defaults to 200, overrided by
+ // `djConfig.defaultDuration`
+ defaultDuration: config["defaultDuration"] || 200
+ });
+
+ lang.mixin(dijit, exports);
+
+ /*===== return exports; =====*/
+ return dijit; // for back compat :-(
+});
diff --git a/lib/dijit/_base/place.js b/lib/dijit/_base/place.js
index 8bdd09f80..52c166ad2 100644
--- a/lib/dijit/_base/place.js
+++ b/lib/dijit/_base/place.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/place",["dojo/_base/array","dojo/_base/lang","dojo/window","../place",".."],function(_1,_2,_3,_4,_5){_5.getViewport=function(){return _3.getBox();};_5.placeOnScreen=_4.at;_5.placeOnScreenAroundElement=function(_6,_7,_8,_9){var _a;if(_2.isArray(_8)){_a=_8;}else{_a=[];for(var _b in _8){_a.push({aroundCorner:_b,corner:_8[_b]});}}return _4.around(_6,_7,_a,true,_9);};_5.placeOnScreenAroundNode=_5.placeOnScreenAroundElement;_5.placeOnScreenAroundRectangle=_5.placeOnScreenAroundElement;_5.getPopupAroundAlignment=function(_c,_d){var _e={};_1.forEach(_c,function(_f){var ltr=_d;switch(_f){case "after":_e[_d?"BR":"BL"]=_d?"BL":"BR";break;case "before":_e[_d?"BL":"BR"]=_d?"BR":"BL";break;case "below-alt":ltr=!ltr;case "below":_e[ltr?"BL":"BR"]=ltr?"TL":"TR";_e[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above-alt":ltr=!ltr;case "above":default:_e[ltr?"TL":"TR"]=ltr?"BL":"BR";_e[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});return _e;};return _5;}); \ No newline at end of file
+define("dijit/_base/place",["dojo/_base/array","dojo/_base/lang","dojo/window","../place","../main"],function(_1,_2,_3,_4,_5){var _6={};_6.getViewport=function(){return _3.getBox();};_6.placeOnScreen=_4.at;_6.placeOnScreenAroundElement=function(_7,_8,_9,_a){var _b;if(_2.isArray(_9)){_b=_9;}else{_b=[];for(var _c in _9){_b.push({aroundCorner:_c,corner:_9[_c]});}}return _4.around(_7,_8,_b,true,_a);};_6.placeOnScreenAroundNode=_6.placeOnScreenAroundElement;_6.placeOnScreenAroundRectangle=_6.placeOnScreenAroundElement;_6.getPopupAroundAlignment=function(_d,_e){var _f={};_1.forEach(_d,function(pos){var ltr=_e;switch(pos){case "after":_f[_e?"BR":"BL"]=_e?"BL":"BR";break;case "before":_f[_e?"BL":"BR"]=_e?"BR":"BL";break;case "below-alt":ltr=!ltr;case "below":_f[ltr?"BL":"BR"]=ltr?"TL":"TR";_f[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above-alt":ltr=!ltr;case "above":default:_f[ltr?"TL":"TR"]=ltr?"BL":"BR";_f[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});return _f;};_2.mixin(_5,_6);return _5;}); \ No newline at end of file
diff --git a/lib/dijit/_base/place.js.uncompressed.js b/lib/dijit/_base/place.js.uncompressed.js
new file mode 100644
index 000000000..c71cabcd3
--- /dev/null
+++ b/lib/dijit/_base/place.js.uncompressed.js
@@ -0,0 +1,131 @@
+define("dijit/_base/place", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/lang", // lang.isArray, lang.mixin
+ "dojo/window", // windowUtils.getBox
+ "../place",
+ "../main" // export to dijit namespace
+], function(array, lang, windowUtils, place, dijit){
+
+ // module:
+ // dijit/_base/place
+
+
+ var exports = {
+ // summary:
+ // Deprecated back compatibility module, new code should use dijit/place directly instead of using this module.
+ };
+
+ exports.getViewport = function(){
+ // summary:
+ // Deprecated method to return the dimensions and scroll position of the viewable area of a browser window.
+ // New code should use windowUtils.getBox()
+
+ return windowUtils.getBox();
+ };
+
+ exports.placeOnScreen = place.at;
+
+ exports.placeOnScreenAroundElement = function(node, aroundNode, aroundCorners, layoutNode){
+ // summary:
+ // Like dijit.placeOnScreenAroundNode(), except it accepts an arbitrary object
+ // for the "around" argument and finds a proper processor to place a node.
+ // Deprecated, new code should use dijit/place.around() instead.
+
+ // Convert old style {"BL": "TL", "BR": "TR"} type argument
+ // to style needed by dijit.place code:
+ // [
+ // {aroundCorner: "BL", corner: "TL" },
+ // {aroundCorner: "BR", corner: "TR" }
+ // ]
+ var positions;
+ if(lang.isArray(aroundCorners)){
+ positions = aroundCorners;
+ }else{
+ positions = [];
+ for(var key in aroundCorners){
+ positions.push({aroundCorner: key, corner: aroundCorners[key]});
+ }
+ }
+
+ return place.around(node, aroundNode, positions, true, layoutNode);
+ };
+
+ exports.placeOnScreenAroundNode = exports.placeOnScreenAroundElement;
+ /*=====
+ exports.placeOnScreenAroundNode = function(node, aroundNode, aroundCorners, layoutNode){
+ // summary:
+ // Position node adjacent or kitty-corner to aroundNode
+ // such that it's fully visible in viewport.
+ // Deprecated, new code should use dijit/place.around() instead.
+ };
+ =====*/
+
+ exports.placeOnScreenAroundRectangle = exports.placeOnScreenAroundElement;
+ /*=====
+ exports.placeOnScreenAroundRectangle = function(node, aroundRect, aroundCorners, layoutNode){
+ // summary:
+ // Like dijit.placeOnScreenAroundNode(), except that the "around"
+ // parameter is an arbitrary rectangle on the screen (x, y, width, height)
+ // instead of a dom node.
+ // Deprecated, new code should use dijit/place.around() instead.
+ };
+ =====*/
+
+ exports.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+ // summary:
+ // Deprecated method, unneeded when using dijit/place directly.
+ // Transforms the passed array of preferred positions into a format suitable for
+ // passing as the aroundCorners argument to dijit/place.placeOnScreenAroundElement.
+ // position: String[]
+ // This variable controls the position of the drop down.
+ // It's an array of strings with the following values:
+ //
+ // - before: places drop down to the left of the target node/widget, or to the right in
+ // the case of RTL scripts like Hebrew and Arabic
+ // - after: places drop down to the right of the target node/widget, or to the left in
+ // the case of RTL scripts like Hebrew and Arabic
+ // - above: drop down goes above target node
+ // - below: drop down goes below target node
+ //
+ // The list is positions is tried, in order, until a position is found where the drop down fits
+ // within the viewport.
+ // leftToRight: Boolean
+ // Whether the popup will be displaying in leftToRight mode.
+
+ var align = {};
+ array.forEach(position, function(pos){
+ var ltr = leftToRight;
+ switch(pos){
+ case "after":
+ align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+ break;
+ case "before":
+ align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+ break;
+ case "below-alt":
+ ltr = !ltr;
+ // fall through
+ case "below":
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ align[ltr ? "BL" : "BR"] = ltr ? "TL" : "TR";
+ align[ltr ? "BR" : "BL"] = ltr ? "TR" : "TL";
+ break;
+ case "above-alt":
+ ltr = !ltr;
+ // fall through
+ case "above":
+ default:
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ align[ltr ? "TL" : "TR"] = ltr ? "BL" : "BR";
+ align[ltr ? "TR" : "TL"] = ltr ? "BR" : "BL";
+ break;
+ }
+ });
+ return align;
+ };
+
+ lang.mixin(dijit, exports);
+
+ /*===== return exports; =====*/
+ return dijit; // for back compat :-(
+});
diff --git a/lib/dijit/_base/popup.js b/lib/dijit/_base/popup.js
index 2a38c810e..5e6939ddf 100644
--- a/lib/dijit/_base/popup.js
+++ b/lib/dijit/_base/popup.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/popup",["dojo/dom-class","../popup","../BackgroundIframe"],function(_1,_2){var _3=_2._createWrapper;_2._createWrapper=function(_4){if(!_4.declaredClass){_4={_popupWrapper:(_4.parentNode&&_1.contains(_4.parentNode,"dijitPopup"))?_4.parentNode:null,domNode:_4,destroy:function(){}};}return _3.call(this,_4);};var _5=_2.open;_2.open=function(_6){if(_6.orient&&typeof _6.orient!="string"&&!("length" in _6.orient)){var _7=[];for(var _8 in _6.orient){_7.push({aroundCorner:_8,corner:_6.orient[_8]});}_6.orient=_7;}return _5.call(this,_6);};return _2;}); \ No newline at end of file
+define("dijit/_base/popup",["dojo/dom-class","dojo/_base/window","../popup","../BackgroundIframe"],function(_1,_2,_3){var _4=_3._createWrapper;_3._createWrapper=function(_5){if(!_5.declaredClass){_5={_popupWrapper:(_5.parentNode&&_1.contains(_5.parentNode,"dijitPopup"))?_5.parentNode:null,domNode:_5,destroy:function(){},ownerDocument:_5.ownerDocument,ownerDocumentBody:_2.body(_5.ownerDocument)};}return _4.call(this,_5);};var _6=_3.open;_3.open=function(_7){if(_7.orient&&typeof _7.orient!="string"&&!("length" in _7.orient)){var _8=[];for(var _9 in _7.orient){_8.push({aroundCorner:_9,corner:_7.orient[_9]});}_7.orient=_8;}return _6.call(this,_7);};return _3;}); \ No newline at end of file
diff --git a/lib/dijit/_base/popup.js.uncompressed.js b/lib/dijit/_base/popup.js.uncompressed.js
new file mode 100644
index 000000000..cc582e66e
--- /dev/null
+++ b/lib/dijit/_base/popup.js.uncompressed.js
@@ -0,0 +1,58 @@
+define("dijit/_base/popup", [
+ "dojo/dom-class", // domClass.contains
+ "dojo/_base/window",
+ "../popup",
+ "../BackgroundIframe" // just loading for back-compat, in case client code is referencing it
+], function(domClass, win, popup){
+
+// module:
+// dijit/_base/popup
+
+/*=====
+return {
+ // summary:
+ // Deprecated. Old module for popups, new code should use dijit/popup directly.
+};
+=====*/
+
+
+// Hack support for old API passing in node instead of a widget (to various methods)
+var origCreateWrapper = popup._createWrapper;
+popup._createWrapper = function(widget){
+ if(!widget.declaredClass){
+ // make fake widget to pass to new API
+ widget = {
+ _popupWrapper: (widget.parentNode && domClass.contains(widget.parentNode, "dijitPopup")) ?
+ widget.parentNode : null,
+ domNode: widget,
+ destroy: function(){},
+ ownerDocument: widget.ownerDocument,
+ ownerDocumentBody: win.body(widget.ownerDocument)
+ };
+ }
+ return origCreateWrapper.call(this, widget);
+};
+
+// Support old format of orient parameter
+var origOpen = popup.open;
+popup.open = function(/*__OpenArgs*/ args){
+ // Convert old hash structure (ex: {"BL": "TL", ...}) of orient to format compatible w/new popup.open() API.
+ // Don't do conversion for:
+ // - null parameter (that means to use the default positioning)
+ // - "R" or "L" strings used to indicate positioning for context menus (when there is no around node)
+ // - new format, ex: ["below", "above"]
+ // - return value from deprecated dijit.getPopupAroundAlignment() method,
+ // ex: ["below", "above"]
+ if(args.orient && typeof args.orient != "string" && !("length" in args.orient)){
+ var ary = [];
+ for(var key in args.orient){
+ ary.push({aroundCorner: key, corner: args.orient[key]});
+ }
+ args.orient = ary;
+ }
+
+ return origOpen.call(this, args);
+};
+
+return popup;
+});
diff --git a/lib/dijit/_base/scroll.js b/lib/dijit/_base/scroll.js
index dd7027147..e5763e1ec 100644
--- a/lib/dijit/_base/scroll.js
+++ b/lib/dijit/_base/scroll.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/scroll",["dojo/window",".."],function(_1,_2){_2.scrollIntoView=function(_3,_4){_1.scrollIntoView(_3,_4);};}); \ No newline at end of file
+define("dijit/_base/scroll",["dojo/window","../main"],function(_1,_2){_2.scrollIntoView=function(_3,_4){_1.scrollIntoView(_3,_4);};}); \ No newline at end of file
diff --git a/lib/dijit/_base/scroll.js.uncompressed.js b/lib/dijit/_base/scroll.js.uncompressed.js
new file mode 100644
index 000000000..41f8962e4
--- /dev/null
+++ b/lib/dijit/_base/scroll.js.uncompressed.js
@@ -0,0 +1,22 @@
+define("dijit/_base/scroll", [
+ "dojo/window", // windowUtils.scrollIntoView
+ "../main" // export symbol to dijit
+], function(windowUtils, dijit){
+ // module:
+ // dijit/_base/scroll
+
+ /*=====
+ return {
+ // summary:
+ // Back compatibility module, new code should use windowUtils directly instead of using this module.
+ };
+ =====*/
+
+ dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
+ // summary:
+ // Scroll the passed node into view, if it is not already.
+ // Deprecated, use `windowUtils.scrollIntoView` instead.
+
+ windowUtils.scrollIntoView(node, pos);
+ };
+});
diff --git a/lib/dijit/_base/sniff.js.uncompressed.js b/lib/dijit/_base/sniff.js.uncompressed.js
new file mode 100644
index 000000000..ada374aa5
--- /dev/null
+++ b/lib/dijit/_base/sniff.js.uncompressed.js
@@ -0,0 +1,12 @@
+define("dijit/_base/sniff", [ "dojo/uacss" ], function(){
+
+ // module:
+ // dijit/_base/sniff
+
+ /*=====
+ return {
+ // summary:
+ // Deprecated, back compatibility module, new code should require dojo/uacss directly instead of this module.
+ };
+ =====*/
+});
diff --git a/lib/dijit/_base/typematic.js.uncompressed.js b/lib/dijit/_base/typematic.js.uncompressed.js
new file mode 100644
index 000000000..71132a6ca
--- /dev/null
+++ b/lib/dijit/_base/typematic.js.uncompressed.js
@@ -0,0 +1,10 @@
+define("dijit/_base/typematic", ["../typematic"], function(){
+
+ /*=====
+ return {
+ // summary:
+ // Deprecated, for back-compat, just loads top level module
+ };
+ =====*/
+
+});
diff --git a/lib/dijit/_base/wai.js b/lib/dijit/_base/wai.js
index d16ca3575..5bcb62514 100644
--- a/lib/dijit/_base/wai.js
+++ b/lib/dijit/_base/wai.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/wai",["dojo/dom-attr","dojo/_base/lang","..","../hccss"],function(_1,_2,_3){_2.mixin(_3,{hasWaiRole:function(_4,_5){var _6=this.getWaiRole(_4);return _5?(_6.indexOf(_5)>-1):(_6.length>0);},getWaiRole:function(_7){return _2.trim((_1.get(_7,"role")||"").replace("wairole:",""));},setWaiRole:function(_8,_9){_1.set(_8,"role",_9);},removeWaiRole:function(_a,_b){var _c=_1.get(_a,"role");if(!_c){return;}if(_b){var t=_2.trim((" "+_c+" ").replace(" "+_b+" "," "));_1.set(_a,"role",t);}else{_a.removeAttribute("role");}},hasWaiState:function(_d,_e){return _d.hasAttribute?_d.hasAttribute("aria-"+_e):!!_d.getAttribute("aria-"+_e);},getWaiState:function(_f,_10){return _f.getAttribute("aria-"+_10)||"";},setWaiState:function(_11,_12,_13){_11.setAttribute("aria-"+_12,_13);},removeWaiState:function(_14,_15){_14.removeAttribute("aria-"+_15);}});return _3;}); \ No newline at end of file
+define("dijit/_base/wai",["dojo/dom-attr","dojo/_base/lang","../main","../hccss"],function(_1,_2,_3){var _4={hasWaiRole:function(_5,_6){var _7=this.getWaiRole(_5);return _6?(_7.indexOf(_6)>-1):(_7.length>0);},getWaiRole:function(_8){return _2.trim((_1.get(_8,"role")||"").replace("wairole:",""));},setWaiRole:function(_9,_a){_1.set(_9,"role",_a);},removeWaiRole:function(_b,_c){var _d=_1.get(_b,"role");if(!_d){return;}if(_c){var t=_2.trim((" "+_d+" ").replace(" "+_c+" "," "));_1.set(_b,"role",t);}else{_b.removeAttribute("role");}},hasWaiState:function(_e,_f){return _e.hasAttribute?_e.hasAttribute("aria-"+_f):!!_e.getAttribute("aria-"+_f);},getWaiState:function(_10,_11){return _10.getAttribute("aria-"+_11)||"";},setWaiState:function(_12,_13,_14){_12.setAttribute("aria-"+_13,_14);},removeWaiState:function(_15,_16){_15.removeAttribute("aria-"+_16);}};_2.mixin(_3,_4);return _3;}); \ No newline at end of file
diff --git a/lib/dijit/_base/wai.js.uncompressed.js b/lib/dijit/_base/wai.js.uncompressed.js
new file mode 100644
index 000000000..b71b21698
--- /dev/null
+++ b/lib/dijit/_base/wai.js.uncompressed.js
@@ -0,0 +1,109 @@
+define("dijit/_base/wai", [
+ "dojo/dom-attr", // domAttr.attr
+ "dojo/_base/lang", // lang.mixin
+ "../main", // export symbols to dijit
+ "../hccss" // not using this module directly, but loading it sets CSS flag on <html>
+], function(domAttr, lang, dijit){
+
+ // module:
+ // dijit/_base/wai
+
+ var exports = {
+ // summary:
+ // Deprecated methods for setting/getting wai roles and states.
+ // New code should call setAttribute()/getAttribute() directly.
+ //
+ // Also loads hccss to apply dj_a11y class to root node if machine is in high-contrast mode.
+
+ hasWaiRole: function(/*Element*/ elem, /*String?*/ role){
+ // summary:
+ // Determines if an element has a particular role.
+ // returns:
+ // True if elem has the specific role attribute and false if not.
+ // For backwards compatibility if role parameter not provided,
+ // returns true if has a role
+ var waiRole = this.getWaiRole(elem);
+ return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0);
+ },
+
+ getWaiRole: function(/*Element*/ elem){
+ // summary:
+ // Gets the role for an element (which should be a wai role).
+ // returns:
+ // The role of elem or an empty string if elem
+ // does not have a role.
+ return lang.trim((domAttr.get(elem, "role") || "").replace("wairole:",""));
+ },
+
+ setWaiRole: function(/*Element*/ elem, /*String*/ role){
+ // summary:
+ // Sets the role on an element.
+ // description:
+ // Replace existing role attribute with new role.
+
+ domAttr.set(elem, "role", role);
+ },
+
+ removeWaiRole: function(/*Element*/ elem, /*String*/ role){
+ // summary:
+ // Removes the specified role from an element.
+ // Removes role attribute if no specific role provided (for backwards compat.)
+
+ var roleValue = domAttr.get(elem, "role");
+ if(!roleValue){ return; }
+ if(role){
+ var t = lang.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
+ domAttr.set(elem, "role", t);
+ }else{
+ elem.removeAttribute("role");
+ }
+ },
+
+ hasWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary:
+ // Determines if an element has a given state.
+ // description:
+ // Checks for an attribute called "aria-"+state.
+ // returns:
+ // true if elem has a value for the given state and
+ // false if it does not.
+
+ return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
+ },
+
+ getWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary:
+ // Gets the value of a state on an element.
+ // description:
+ // Checks for an attribute called "aria-"+state.
+ // returns:
+ // The value of the requested state on elem
+ // or an empty string if elem has no value for state.
+
+ return elem.getAttribute("aria-"+state) || "";
+ },
+
+ setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){
+ // summary:
+ // Sets a state on an element.
+ // description:
+ // Sets an attribute called "aria-"+state.
+
+ elem.setAttribute("aria-"+state, value);
+ },
+
+ removeWaiState: function(/*Element*/ elem, /*String*/ state){
+ // summary:
+ // Removes a state from an element.
+ // description:
+ // Sets an attribute called "aria-"+state.
+
+ elem.removeAttribute("aria-"+state);
+ }
+ };
+
+ lang.mixin(dijit, exports);
+
+ /*===== return exports; =====*/
+ return dijit; // for back compat :-(
+});
diff --git a/lib/dijit/_base/window.js b/lib/dijit/_base/window.js
index 4b79d780d..9b405a62f 100644
--- a/lib/dijit/_base/window.js
+++ b/lib/dijit/_base/window.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_base/window",["dojo/window",".."],function(_1,_2){_2.getDocumentWindow=function(_3){return _1.get(_3);};}); \ No newline at end of file
+define("dijit/_base/window",["dojo/window","../main"],function(_1,_2){_2.getDocumentWindow=function(_3){return _1.get(_3);};}); \ No newline at end of file
diff --git a/lib/dijit/_base/window.js.uncompressed.js b/lib/dijit/_base/window.js.uncompressed.js
new file mode 100644
index 000000000..1b4c187ef
--- /dev/null
+++ b/lib/dijit/_base/window.js.uncompressed.js
@@ -0,0 +1,18 @@
+define("dijit/_base/window", [
+ "dojo/window", // windowUtils.get
+ "../main" // export symbol to dijit
+], function(windowUtils, dijit){
+ // module:
+ // dijit/_base/window
+
+ /*=====
+ return {
+ // summary:
+ // Back compatibility module, new code should use windowUtils directly instead of using this module.
+ };
+ =====*/
+
+ dijit.getDocumentWindow = function(doc){
+ return windowUtils.get(doc);
+ };
+});
diff --git a/lib/dijit/_editor/RichText.js b/lib/dijit/_editor/RichText.js
index afa4a944d..7bd30103d 100644
--- a/lib/dijit/_editor/RichText.js
+++ b/lib/dijit/_editor/RichText.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/RichText",["dojo/_base/array","dojo/_base/config","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/query","dojo/ready","dojo/_base/sniff","dojo/topic","dojo/_base/unload","dojo/_base/url","dojo/_base/window","../_Widget","../_CssStateMixin","./selection","./range","./html","../focus",".."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,on,_f,_10,has,_11,_12,_13,win,_14,_15,_16,_17,_18,_19,_1a){var _1b=_3("dijit._editor.RichText",[_14,_15],{constructor:function(_1c){this.contentPreFilters=[];this.contentPostFilters=[];this.contentDomPreFilters=[];this.contentDomPostFilters=[];this.editingAreaStyleSheets=[];this.events=[].concat(this.events);this._keyHandlers={};if(_1c&&_e.isString(_1c.value)){this.value=_1c.value;}this.onLoadDeferred=new _4();},baseClass:"dijitEditor",inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",_NAME_CONTENT_SEP:"@@**%%:%%**@@",onLoadDeferred:null,isTabIndent:false,disableSpellCheck:false,postCreate:function(){if("textarea"===this.domNode.tagName.toLowerCase()){console.warn("RichText should not be used with the TEXTAREA tag. See dijit._editor.RichText docs.");}this.contentPreFilters=[_e.hitch(this,"_preFixUrlAttributes")].concat(this.contentPreFilters);if(has("mozilla")){this.contentPreFilters=[this._normalizeFontStyle].concat(this.contentPreFilters);this.contentPostFilters=[this._removeMozBogus].concat(this.contentPostFilters);}if(has("webkit")){this.contentPreFilters=[this._removeWebkitBogus].concat(this.contentPreFilters);this.contentPostFilters=[this._removeWebkitBogus].concat(this.contentPostFilters);}if(has("ie")){this.contentPostFilters=[this._normalizeFontStyle].concat(this.contentPostFilters);this.contentDomPostFilters=[_e.hitch(this,this._stripBreakerNodes)].concat(this.contentDomPostFilters);}this.inherited(arguments);_11.publish(_1a._scopeName+"._editor.RichText::init",this);this.open();this.setupDefaultShortcuts();},setupDefaultShortcuts:function(){var _1d=_e.hitch(this,function(cmd,arg){return function(){return !this.execCommand(cmd,arg);};});var _1e={b:_1d("bold"),i:_1d("italic"),u:_1d("underline"),a:_1d("selectall"),s:function(){this.save(true);},m:function(){this.isTabIndent=!this.isTabIndent;},"1":_1d("formatblock","h1"),"2":_1d("formatblock","h2"),"3":_1d("formatblock","h3"),"4":_1d("formatblock","h4"),"\\":_1d("insertunorderedlist")};if(!has("ie")){_1e.Z=_1d("redo");}var key;for(key in _1e){this.addKeyHandler(key,true,false,_1e[key]);}},events:["onKeyPress","onKeyDown","onKeyUp"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){if(_1b._editorCommandsLocalized){this._local2NativeFormatNames=_1b._local2NativeFormatNames;this._native2LocalFormatNames=_1b._native2LocalFormatNames;return;}_1b._editorCommandsLocalized=true;_1b._local2NativeFormatNames={};_1b._native2LocalFormatNames={};this._local2NativeFormatNames=_1b._local2NativeFormatNames;this._native2LocalFormatNames=_1b._native2LocalFormatNames;var _1f=["div","p","pre","h1","h2","h3","h4","h5","h6","ol","ul","address"];var _20="",_21,i=0;while((_21=_1f[i++])){if(_21.charAt(1)!=="l"){_20+="<"+_21+"><span>content</span></"+_21+"><br/>";}else{_20+="<"+_21+"><li>content</li></"+_21+"><br/>";}}var _22={position:"absolute",top:"0px",zIndex:10,opacity:0.01};var div=_8.create("div",{style:_22,innerHTML:_20});win.body().appendChild(div);var _23=_e.hitch(this,function(){var _24=div.firstChild;while(_24){try{_16.selectElement(_24.firstChild);var _25=_24.tagName.toLowerCase();this._local2NativeFormatNames[_25]=document.queryCommandValue("formatblock");this._native2LocalFormatNames[this._local2NativeFormatNames[_25]]=_25;_24=_24.nextSibling.nextSibling;}catch(e){}}div.parentNode.removeChild(div);div.innerHTML="";});setTimeout(_23,0);},open:function(_26){if(!this.onLoadDeferred||this.onLoadDeferred.fired>=0){this.onLoadDeferred=new _4();}if(!this.isClosed){this.close();}_11.publish(_1a._scopeName+"._editor.RichText::open",this);if(arguments.length===1&&_26.nodeName){this.domNode=_26;}var dn=this.domNode;var _27;if(_e.isString(this.value)){_27=this.value;delete this.value;dn.innerHTML="";}else{if(dn.nodeName&&dn.nodeName.toLowerCase()=="textarea"){var ta=(this.textarea=dn);this.name=ta.name;_27=ta.value;dn=this.domNode=win.doc.createElement("div");dn.setAttribute("widgetId",this.id);ta.removeAttribute("widgetId");dn.cssText=ta.cssText;dn.className+=" "+ta.className;_8.place(dn,ta,"before");var _28=_e.hitch(this,function(){_a.set(ta,{display:"block",position:"absolute",top:"-1000px"});if(has("ie")){var s=ta.style;this.__overflow=s.overflow;s.overflow="hidden";}});if(has("ie")){setTimeout(_28,10);}else{_28();}if(ta.form){var _29=ta.value;this.reset=function(){var _2a=this.getValue();if(_2a!==_29){this.replaceValue(_29);}};on(ta.form,"submit",_e.hitch(this,function(){_6.set(ta,"disabled",this.disabled);ta.value=this.getValue();}));}}else{_27=_18.getChildrenHtml(dn);dn.innerHTML="";}}this.value=_27;if(dn.nodeName&&dn.nodeName==="LI"){dn.innerHTML=" <br>";}this.header=dn.ownerDocument.createElement("div");dn.appendChild(this.header);this.editingArea=dn.ownerDocument.createElement("div");dn.appendChild(this.editingArea);this.footer=dn.ownerDocument.createElement("div");dn.appendChild(this.footer);if(!this.name){this.name=this.id+"_AUTOGEN";}if(this.name!==""&&(!_2["useXDomain"]||_2["allowXdRichTextSave"])){var _2b=_5.byId(_1a._scopeName+"._editor.RichText.value");if(_2b&&_2b.value!==""){var _2c=_2b.value.split(this._SEPARATOR),i=0,dat;while((dat=_2c[i++])){var _2d=dat.split(this._NAME_CONTENT_SEP);if(_2d[0]===this.name){_27=_2d[1];_2c=_2c.splice(i,1);_2b.value=_2c.join(this._SEPARATOR);break;}}}if(!_1b._globalSaveHandler){_1b._globalSaveHandler={};_12.addOnUnload(function(){var id;for(id in _1b._globalSaveHandler){var f=_1b._globalSaveHandler[id];if(_e.isFunction(f)){f();}}});}_1b._globalSaveHandler[this.id]=_e.hitch(this,"_saveContent");}this.isClosed=false;var ifr=(this.editorObject=this.iframe=win.doc.createElement("iframe"));ifr.id=this.id+"_iframe";this._iframeSrc=this._getIframeDocTxt();ifr.style.border="none";ifr.style.width="100%";if(this._layoutMode){ifr.style.height="100%";}else{if(has("ie")>=7){if(this.height){ifr.style.height=this.height;}if(this.minHeight){ifr.style.minHeight=this.minHeight;}}else{ifr.style.height=this.height?this.height:this.minHeight;}}ifr.frameBorder=0;ifr._loadFunc=_e.hitch(this,function(w){this.window=w;this.document=this.window.document;if(has("ie")){this._localizeEditorCommands();}this.onLoad(_27);});var _2e="parent."+_1a._scopeName+".byId(\""+this.id+"\")._iframeSrc";var s="javascript:(function(){try{return "+_2e+"}catch(e){document.open();document.domain=\""+document.domain+"\";document.write("+_2e+");document.close();}})()";ifr.setAttribute("src",s);this.editingArea.appendChild(ifr);if(has("safari")<=4){var src=ifr.getAttribute("src");if(!src||src.indexOf("javascript")===-1){setTimeout(function(){ifr.setAttribute("src",s);},0);}}if(dn.nodeName==="LI"){dn.lastChild.style.marginTop="-1.2em";}_7.add(this.domNode,this.baseClass);},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_getIframeDocTxt:function(){var _2f=_a.getComputedStyle(this.domNode);var _30="";var _31=true;if(has("ie")||has("webkit")||(!this.height&&!has("mozilla"))){_30="<div id='dijitEditorBody'></div>";_31=false;}else{if(has("mozilla")){this._cursorToStart=true;_30="&#160;";}}var _32=[_2f.fontWeight,_2f.fontSize,_2f.fontFamily].join(" ");var _33=_2f.lineHeight;if(_33.indexOf("px")>=0){_33=parseFloat(_33)/parseFloat(_2f.fontSize);}else{if(_33.indexOf("em")>=0){_33=parseFloat(_33);}else{_33="normal";}}var _34="";var _35=this;this.style.replace(/(^|;)\s*(line-|font-?)[^;]+/ig,function(_36){_36=_36.replace(/^;/ig,"")+";";var s=_36.split(":")[0];if(s){s=_e.trim(s);s=s.toLowerCase();var i;var sC="";for(i=0;i<s.length;i++){var c=s.charAt(i);switch(c){case "-":i++;c=s.charAt(i).toUpperCase();default:sC+=c;}}_a.set(_35.domNode,sC,"");}_34+=_36+";";});var _37=_f("label[for=\""+this.id+"\"]");return [this.isLeftToRight()?"<html>\n<head>\n":"<html dir='rtl'>\n<head>\n",(has("mozilla")&&_37.length?"<title>"+_37[0].innerHTML+"</title>\n":""),"<meta http-equiv='Content-Type' content='text/html'>\n","<style>\n","\tbody,html {\n","\t\tbackground:transparent;\n","\t\tpadding: 1px 0 0 0;\n","\t\tmargin: -1px 0 0 0;\n",((has("webkit"))?"\t\twidth: 100%;\n":""),((has("webkit"))?"\t\theight: 100%;\n":""),"\t}\n","\tbody{\n","\t\ttop:0px;\n","\t\tleft:0px;\n","\t\tright:0px;\n","\t\tfont:",_32,";\n",((this.height||has("opera"))?"":"\t\tposition: fixed;\n"),"\t\tmin-height:",this.minHeight,";\n","\t\tline-height:",_33,";\n","\t}\n","\tp{ margin: 1em 0; }\n",(!_31&&!this.height?"\tbody,html {overflow-y: hidden;}\n":""),"\t#dijitEditorBody{overflow-x: auto; overflow-y:"+(this.height?"auto;":"hidden;")+" outline: 0px;}\n","\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n",(!has("ie")?"\tli{ min-height:1.2em; }\n":""),"</style>\n",this._applyEditingAreaStyleSheets(),"\n","</head>\n<body ",(_31?"id='dijitEditorBody' ":""),"onload='frameElement._loadFunc(window,document)' style='"+_34+"'>",_30,"</body>\n</html>"].join("");},_applyEditingAreaStyleSheets:function(){var _38=[];if(this.styleSheets){_38=this.styleSheets.split(";");this.styleSheets="";}_38=_38.concat(this.editingAreaStyleSheets);this.editingAreaStyleSheets=[];var _39="",i=0,url;while((url=_38[i++])){var _3a=(new _13(win.global.location,url)).toString();this.editingAreaStyleSheets.push(_3a);_39+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_3a+"\"/>";}return _39;},addStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)==="."||(url.charAt(0)!=="/"&&!uri.host)){url=(new _13(win.global.location,url)).toString();}if(_1.indexOf(this.editingAreaStyleSheets,url)>-1){return;}this.editingAreaStyleSheets.push(url);this.onLoadDeferred.addCallback(_e.hitch(this,function(){if(this.document.createStyleSheet){this.document.createStyleSheet(url);}else{var _3b=this.document.getElementsByTagName("head")[0];var _3c=this.document.createElement("link");_3c.rel="stylesheet";_3c.type="text/css";_3c.href=url;_3b.appendChild(_3c);}}));},removeStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)==="."||(url.charAt(0)!=="/"&&!uri.host)){url=(new _13(win.global.location,url)).toString();}var _3d=_1.indexOf(this.editingAreaStyleSheets,url);if(_3d===-1){return;}delete this.editingAreaStyleSheets[_3d];win.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_3e){_3e=!!_3e;this._set("disabled",_3e);if(!this.isLoaded){return;}if(has("ie")||has("webkit")||has("opera")){var _3f=has("ie")&&(this.isLoaded||!this.focusOnLoad);if(_3f){this.editNode.unselectable="on";}this.editNode.contentEditable=!_3e;if(_3f){var _40=this;setTimeout(function(){if(_40.editNode){_40.editNode.unselectable="off";}},0);}}else{try{this.document.designMode=(_3e?"off":"on");}catch(e){return;}if(!_3e&&this._mozSettingProps){var ps=this._mozSettingProps;var n;for(n in ps){if(ps.hasOwnProperty(n)){try{this.document.execCommand(n,false,ps[n]);}catch(e2){}}}}}this._disabledOK=true;},onLoad:function(_41){if(!this.window.__registeredWindow){this.window.__registeredWindow=true;this._iframeRegHandle=_19.registerIframe(this.iframe);}if(!has("ie")&&!has("webkit")&&(this.height||has("mozilla"))){this.editNode=this.document.body;}else{this.editNode=this.document.body.firstChild;var _42=this;if(has("ie")){this.tabStop=_8.create("div",{tabIndex:-1},this.editingArea);this.iframe.onfocus=function(){_42.editNode.setActive();};}}this.focusNode=this.editNode;var _43=this.events.concat(this.captureEvents);var ap=this.iframe?this.document:this.editNode;_1.forEach(_43,function(_44){this.connect(ap,_44.toLowerCase(),_44);},this);this.connect(ap,"onmouseup","onClick");if(has("ie")){this.connect(this.document,"onmousedown","_onIEMouseDown");this.editNode.style.zoom=1;}else{this.connect(this.document,"onmousedown",function(){delete this._cursorToStart;});}if(has("webkit")){this._webkitListener=this.connect(this.document,"onmouseup","onDisplayChanged");this.connect(this.document,"onmousedown",function(e){var t=e.target;if(t&&(t===this.document.body||t===this.document)){setTimeout(_e.hitch(this,"placeCursorAtEnd"),0);}});}if(has("ie")){try{this.document.execCommand("RespectVisibilityInDesign",true,null);}catch(e){}}this.isLoaded=true;this.set("disabled",this.disabled);var _45=_e.hitch(this,function(){this.setValue(_41);if(this.onLoadDeferred){this.onLoadDeferred.callback(true);}this.onDisplayChanged();if(this.focusOnLoad){_10(_e.hitch(this,function(){setTimeout(_e.hitch(this,"focus"),this.updateInterval);}));}this.value=this.getValue(true);});if(this.setValueDeferred){this.setValueDeferred.addCallback(_45);}else{_45();}},onKeyDown:function(e){if(e.keyCode===_d.TAB&&this.isTabIndent){_b.stop(e);if(this.queryCommandEnabled((e.shiftKey?"outdent":"indent"))){this.execCommand((e.shiftKey?"outdent":"indent"));}}if(has("ie")){if(e.keyCode==_d.TAB&&!this.isTabIndent){if(e.shiftKey&&!e.ctrlKey&&!e.altKey){this.iframe.focus();}else{if(!e.shiftKey&&!e.ctrlKey&&!e.altKey){this.tabStop.focus();}}}else{if(e.keyCode===_d.BACKSPACE&&this.document.selection.type==="Control"){_b.stop(e);this.execCommand("delete");}else{if((65<=e.keyCode&&e.keyCode<=90)||(e.keyCode>=37&&e.keyCode<=40)){e.charCode=e.keyCode;this.onKeyPress(e);}}}}if(has("ff")){if(e.keyCode===_d.PAGE_UP||e.keyCode===_d.PAGE_DOWN){if(this.editNode.clientHeight>=this.editNode.scrollHeight){e.preventDefault();}}}return true;},onKeyUp:function(){},setDisabled:function(_46){_c.deprecated("dijit.Editor::setDisabled is deprecated","use dijit.Editor::attr(\"disabled\",boolean) instead",2);this.set("disabled",_46);},_setValueAttr:function(_47){this.setValue(_47);},_setDisableSpellCheckAttr:function(_48){if(this.document){_6.set(this.document.body,"spellcheck",!_48);}else{this.onLoadDeferred.addCallback(_e.hitch(this,function(){_6.set(this.document.body,"spellcheck",!_48);}));}this._set("disableSpellCheck",_48);},onKeyPress:function(e){var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode,_49=this._keyHandlers[c],_4a=arguments;if(_49&&!e.altKey){_1.some(_49,function(h){if(!(h.shift^e.shiftKey)&&!(h.ctrl^(e.ctrlKey||e.metaKey))){if(!h.handler.apply(this,_4a)){e.preventDefault();}return true;}},this);}if(!this._onKeyHitch){this._onKeyHitch=_e.hitch(this,"onKeyPressed");}setTimeout(this._onKeyHitch,1);return true;},addKeyHandler:function(key,_4b,_4c,_4d){if(!_e.isArray(this._keyHandlers[key])){this._keyHandlers[key]=[];}this._keyHandlers[key].push({shift:_4c||false,ctrl:_4b||false,handler:_4d});},onKeyPressed:function(){this.onDisplayChanged();},onClick:function(e){this.onDisplayChanged(e);},_onIEMouseDown:function(){if(!this.focused&&!this.disabled){this.focus();}},_onBlur:function(e){this.inherited(arguments);var _4e=this.getValue(true);if(_4e!==this.value){this.onChange(_4e);}this._set("value",_4e);},_onFocus:function(e){if(!this.disabled){if(!this._disabledOK){this.set("disabled",false);}this.inherited(arguments);}},blur:function(){if(!has("ie")&&this.window.document.documentElement&&this.window.document.documentElement.focus){this.window.document.documentElement.focus();}else{if(win.doc.body.focus){win.doc.body.focus();}}},focus:function(){if(!this.isLoaded){this.focusOnLoad=true;return;}if(this._cursorToStart){delete this._cursorToStart;if(this.editNode.childNodes){this.placeCursorAtStart();return;}}if(!has("ie")){_19.focus(this.iframe);}else{if(this.editNode&&this.editNode.focus){this.iframe.fireEvent("onfocus",document.createEventObject());}}},updateInterval:200,_updateTimer:null,onDisplayChanged:function(){if(this._updateTimer){clearTimeout(this._updateTimer);}if(!this._updateHandler){this._updateHandler=_e.hitch(this,"onNormalizedDisplayChanged");}this._updateTimer=setTimeout(this._updateHandler,this.updateInterval);},onNormalizedDisplayChanged:function(){delete this._updateTimer;},onChange:function(){},_normalizeCommand:function(cmd,_4f){var _50=cmd.toLowerCase();if(_50==="formatblock"){if(has("safari")&&_4f===undefined){_50="heading";}}else{if(_50==="hilitecolor"&&!has("mozilla")){_50="backcolor";}}return _50;},_qcaCache:{},queryCommandAvailable:function(_51){var ca=this._qcaCache[_51];if(ca!==undefined){return ca;}return (this._qcaCache[_51]=this._queryCommandAvailable(_51));},_queryCommandAvailable:function(_52){var ie=1;var _53=1<<1;var _54=1<<2;var _55=1<<3;function _56(_57){return {ie:Boolean(_57&ie),mozilla:Boolean(_57&_53),webkit:Boolean(_57&_54),opera:Boolean(_57&_55)};};var _58=null;switch(_52.toLowerCase()){case "bold":case "italic":case "underline":case "subscript":case "superscript":case "fontname":case "fontsize":case "forecolor":case "hilitecolor":case "justifycenter":case "justifyfull":case "justifyleft":case "justifyright":case "delete":case "selectall":case "toggledir":_58=_56(_53|ie|_54|_55);break;case "createlink":case "unlink":case "removeformat":case "inserthorizontalrule":case "insertimage":case "insertorderedlist":case "insertunorderedlist":case "indent":case "outdent":case "formatblock":case "inserthtml":case "undo":case "redo":case "strikethrough":case "tabindent":_58=_56(_53|ie|_55|_54);break;case "blockdirltr":case "blockdirrtl":case "dirltr":case "dirrtl":case "inlinedirltr":case "inlinedirrtl":_58=_56(ie);break;case "cut":case "copy":case "paste":_58=_56(ie|_53|_54);break;case "inserttable":_58=_56(_53|ie);break;case "insertcell":case "insertcol":case "insertrow":case "deletecells":case "deletecols":case "deleterows":case "mergecells":case "splitcell":_58=_56(ie|_53);break;default:return false;}return (has("ie")&&_58.ie)||(has("mozilla")&&_58.mozilla)||(has("webkit")&&_58.webkit)||(has("opera")&&_58.opera);},execCommand:function(_59,_5a){var _5b;this.focus();_59=this._normalizeCommand(_59,_5a);if(_5a!==undefined){if(_59==="heading"){throw new Error("unimplemented");}else{if((_59==="formatblock")&&has("ie")){_5a="<"+_5a+">";}}}var _5c="_"+_59+"Impl";if(this[_5c]){_5b=this[_5c](_5a);}else{_5a=arguments.length>1?_5a:null;if(_5a||_59!=="createlink"){_5b=this.document.execCommand(_59,false,_5a);}}this.onDisplayChanged();return _5b;},queryCommandEnabled:function(_5d){if(this.disabled||!this._disabledOK){return false;}_5d=this._normalizeCommand(_5d);var _5e="_"+_5d+"EnabledImpl";if(this[_5e]){return this[_5e](_5d);}else{return this._browserQueryCommandEnabled(_5d);}},queryCommandState:function(_5f){if(this.disabled||!this._disabledOK){return false;}_5f=this._normalizeCommand(_5f);try{return this.document.queryCommandState(_5f);}catch(e){return false;}},queryCommandValue:function(_60){if(this.disabled||!this._disabledOK){return false;}var r;_60=this._normalizeCommand(_60);if(has("ie")&&_60==="formatblock"){r=this._native2LocalFormatNames[this.document.queryCommandValue(_60)];}else{if(has("mozilla")&&_60==="hilitecolor"){var _61;try{_61=this.document.queryCommandValue("styleWithCSS");}catch(e){_61=false;}this.document.execCommand("styleWithCSS",false,true);r=this.document.queryCommandValue(_60);this.document.execCommand("styleWithCSS",false,_61);}else{r=this.document.queryCommandValue(_60);}}return r;},_sCall:function(_62,_63){return win.withGlobal(this.window,_62,_16,_63);},placeCursorAtStart:function(){this.focus();var _64=false;if(has("mozilla")){var _65=this.editNode.firstChild;while(_65){if(_65.nodeType===3){if(_65.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_64=true;this._sCall("selectElement",[_65]);break;}}else{if(_65.nodeType===1){_64=true;var tg=_65.tagName?_65.tagName.toLowerCase():"";if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){this._sCall("selectElement",[_65]);}else{this._sCall("selectElementChildren",[_65]);}break;}}_65=_65.nextSibling;}}else{_64=true;this._sCall("selectElementChildren",[this.editNode]);}if(_64){this._sCall("collapse",[true]);}},placeCursorAtEnd:function(){this.focus();var _66=false;if(has("mozilla")){var _67=this.editNode.lastChild;while(_67){if(_67.nodeType===3){if(_67.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_66=true;this._sCall("selectElement",[_67]);break;}}else{if(_67.nodeType===1){_66=true;if(_67.lastChild){this._sCall("selectElement",[_67.lastChild]);}else{this._sCall("selectElement",[_67]);}break;}}_67=_67.previousSibling;}}else{_66=true;this._sCall("selectElementChildren",[this.editNode]);}if(_66){this._sCall("collapse",[false]);}},getValue:function(_68){if(this.textarea){if(this.isClosed||!this.isLoaded){return this.textarea.value;}}return this._postFilterContent(null,_68);},_getValueAttr:function(){return this.getValue(true);},setValue:function(_69){if(!this.isLoaded){this.onLoadDeferred.addCallback(_e.hitch(this,function(){this.setValue(_69);}));return;}this._cursorToStart=true;if(this.textarea&&(this.isClosed||!this.isLoaded)){this.textarea.value=_69;}else{_69=this._preFilterContent(_69);var _6a=this.isClosed?this.domNode:this.editNode;if(_69&&has("mozilla")&&_69.toLowerCase()==="<p></p>"){_69="<p>&#160;</p>";}if(!_69&&has("webkit")){_69="&#160;";}_6a.innerHTML=_69;this._preDomFilterContent(_6a);}this.onDisplayChanged();this._set("value",this.getValue(true));},replaceValue:function(_6b){if(this.isClosed){this.setValue(_6b);}else{if(this.window&&this.window.getSelection&&!has("mozilla")){this.setValue(_6b);}else{if(this.window&&this.window.getSelection){_6b=this._preFilterContent(_6b);this.execCommand("selectall");if(!_6b){this._cursorToStart=true;_6b="&#160;";}this.execCommand("inserthtml",_6b);this._preDomFilterContent(this.editNode);}else{if(this.document&&this.document.selection){this.setValue(_6b);}}}}this._set("value",this.getValue(true));},_preFilterContent:function(_6c){var ec=_6c;_1.forEach(this.contentPreFilters,function(ef){if(ef){ec=ef(ec);}});return ec;},_preDomFilterContent:function(dom){dom=dom||this.editNode;_1.forEach(this.contentDomPreFilters,function(ef){if(ef&&_e.isFunction(ef)){ef(dom);}},this);},_postFilterContent:function(dom,_6d){var ec;if(!_e.isString(dom)){dom=dom||this.editNode;if(this.contentDomPostFilters.length){if(_6d){dom=_e.clone(dom);}_1.forEach(this.contentDomPostFilters,function(ef){dom=ef(dom);});}ec=_18.getChildrenHtml(dom);}else{ec=dom;}if(!_e.trim(ec.replace(/^\xA0\xA0*/,"").replace(/\xA0\xA0*$/,"")).length){ec="";}_1.forEach(this.contentPostFilters,function(ef){ec=ef(ec);});return ec;},_saveContent:function(){var _6e=_5.byId(_1a._scopeName+"._editor.RichText.value");if(_6e){if(_6e.value){_6e.value+=this._SEPARATOR;}_6e.value+=this.name+this._NAME_CONTENT_SEP+this.getValue(true);}},escapeXml:function(str,_6f){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_6f){str=str.replace(/'/gm,"&#39;");}return str;},getNodeHtml:function(_70){_c.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit/_editor/html::getNodeHtml instead",2);return _18.getNodeHtml(_70);},getNodeChildrenHtml:function(dom){_c.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit/_editor/html::getChildrenHtml instead",2);return _18.getChildrenHtml(dom);},close:function(_71){if(this.isClosed){return;}if(!arguments.length){_71=true;}if(_71){this._set("value",this.getValue(true));}if(this.interval){clearInterval(this.interval);}if(this._webkitListener){this.disconnect(this._webkitListener);delete this._webkitListener;}if(has("ie")){this.iframe.onfocus=null;}this.iframe._loadFunc=null;if(this._iframeRegHandle){this._iframeRegHandle.remove();delete this._iframeRegHandle;}if(this.textarea){var s=this.textarea.style;s.position="";s.left=s.top="";if(has("ie")){s.overflow=this.__overflow;this.__overflow=null;}this.textarea.value=this.value;_8.destroy(this.domNode);this.domNode=this.textarea;}else{this.domNode.innerHTML=this.value;}delete this.iframe;_7.remove(this.domNode,this.baseClass);this.isClosed=true;this.isLoaded=false;delete this.editNode;delete this.focusNode;if(this.window&&this.window._frameElement){this.window._frameElement=null;}this.window=null;this.document=null;this.editingArea=null;this.editorObject=null;},destroy:function(){if(!this.isClosed){this.close(false);}if(this._updateTimer){clearTimeout(this._updateTimer);}this.inherited(arguments);if(_1b._globalSaveHandler){delete _1b._globalSaveHandler[this.id];}},_removeMozBogus:function(_72){return _72.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"").replace(/_moz_resizing="(true|false)"/gi,"");},_removeWebkitBogus:function(_73){_73=_73.replace(/\sclass="webkit-block-placeholder"/gi,"");_73=_73.replace(/\sclass="apple-style-span"/gi,"");_73=_73.replace(/<meta charset=\"utf-8\" \/>/gi,"");return _73;},_normalizeFontStyle:function(_74){return _74.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");},_preFixUrlAttributes:function(_75){return _75.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");},_browserQueryCommandEnabled:function(_76){if(!_76){return false;}var _77=has("ie")?this.document.selection.createRange():this.document;try{return _77.queryCommandEnabled(_76);}catch(e){return false;}},_createlinkEnabledImpl:function(){var _78=true;if(has("opera")){var sel=this.window.getSelection();if(sel.isCollapsed){_78=true;}else{_78=this.document.queryCommandEnabled("createlink");}}else{_78=this._browserQueryCommandEnabled("createlink");}return _78;},_unlinkEnabledImpl:function(){var _79=true;if(has("mozilla")||has("webkit")){_79=this._sCall("hasAncestorElement",["a"]);}else{_79=this._browserQueryCommandEnabled("unlink");}return _79;},_inserttableEnabledImpl:function(){var _7a=true;if(has("mozilla")||has("webkit")){_7a=true;}else{_7a=this._browserQueryCommandEnabled("inserttable");}return _7a;},_cutEnabledImpl:function(){var _7b=true;if(has("webkit")){var sel=this.window.getSelection();if(sel){sel=sel.toString();}_7b=!!sel;}else{_7b=this._browserQueryCommandEnabled("cut");}return _7b;},_copyEnabledImpl:function(){var _7c=true;if(has("webkit")){var sel=this.window.getSelection();if(sel){sel=sel.toString();}_7c=!!sel;}else{_7c=this._browserQueryCommandEnabled("copy");}return _7c;},_pasteEnabledImpl:function(){var _7d=true;if(has("webkit")){return true;}else{_7d=this._browserQueryCommandEnabled("paste");}return _7d;},_inserthorizontalruleImpl:function(_7e){if(has("ie")){return this._inserthtmlImpl("<hr>");}return this.document.execCommand("inserthorizontalrule",false,_7e);},_unlinkImpl:function(_7f){if((this.queryCommandEnabled("unlink"))&&(has("mozilla")||has("webkit"))){var a=this._sCall("getAncestorElement",["a"]);this._sCall("selectElement",[a]);return this.document.execCommand("unlink",false,null);}return this.document.execCommand("unlink",false,_7f);},_hilitecolorImpl:function(_80){var _81;var _82=this._handleTextColorOrProperties("hilitecolor",_80);if(!_82){if(has("mozilla")){this.document.execCommand("styleWithCSS",false,true);_81=this.document.execCommand("hilitecolor",false,_80);this.document.execCommand("styleWithCSS",false,false);}else{_81=this.document.execCommand("hilitecolor",false,_80);}}return _81;},_backcolorImpl:function(_83){if(has("ie")){_83=_83?_83:null;}var _84=this._handleTextColorOrProperties("backcolor",_83);if(!_84){_84=this.document.execCommand("backcolor",false,_83);}return _84;},_forecolorImpl:function(_85){if(has("ie")){_85=_85?_85:null;}var _86=false;_86=this._handleTextColorOrProperties("forecolor",_85);if(!_86){_86=this.document.execCommand("forecolor",false,_85);}return _86;},_inserthtmlImpl:function(_87){_87=this._preFilterContent(_87);var rv=true;if(has("ie")){var _88=this.document.selection.createRange();if(this.document.selection.type.toUpperCase()==="CONTROL"){var n=_88.item(0);while(_88.length){_88.remove(_88.item(0));}n.outerHTML=_87;}else{_88.pasteHTML(_87);}_88.select();}else{if(has("mozilla")&&!_87.length){this._sCall("remove");}else{rv=this.document.execCommand("inserthtml",false,_87);}}return rv;},_boldImpl:function(_89){var _8a=false;if(has("ie")){this._adaptIESelection();_8a=this._adaptIEFormatAreaAndExec("bold");}if(!_8a){_8a=this.document.execCommand("bold",false,_89);}return _8a;},_italicImpl:function(_8b){var _8c=false;if(has("ie")){this._adaptIESelection();_8c=this._adaptIEFormatAreaAndExec("italic");}if(!_8c){_8c=this.document.execCommand("italic",false,_8b);}return _8c;},_underlineImpl:function(_8d){var _8e=false;if(has("ie")){this._adaptIESelection();_8e=this._adaptIEFormatAreaAndExec("underline");}if(!_8e){_8e=this.document.execCommand("underline",false,_8d);}return _8e;},_strikethroughImpl:function(_8f){var _90=false;if(has("ie")){this._adaptIESelection();_90=this._adaptIEFormatAreaAndExec("strikethrough");}if(!_90){_90=this.document.execCommand("strikethrough",false,_8f);}return _90;},_superscriptImpl:function(_91){var _92=false;if(has("ie")){this._adaptIESelection();_92=this._adaptIEFormatAreaAndExec("superscript");}if(!_92){_92=this.document.execCommand("superscript",false,_91);}return _92;},_subscriptImpl:function(_93){var _94=false;if(has("ie")){this._adaptIESelection();_94=this._adaptIEFormatAreaAndExec("subscript");}if(!_94){_94=this.document.execCommand("subscript",false,_93);}return _94;},_fontnameImpl:function(_95){var _96;if(has("ie")){_96=this._handleTextColorOrProperties("fontname",_95);}if(!_96){_96=this.document.execCommand("fontname",false,_95);}return _96;},_fontsizeImpl:function(_97){var _98;if(has("ie")){_98=this._handleTextColorOrProperties("fontsize",_97);}if(!_98){_98=this.document.execCommand("fontsize",false,_97);}return _98;},_insertorderedlistImpl:function(_99){var _9a=false;if(has("ie")){_9a=this._adaptIEList("insertorderedlist",_99);}if(!_9a){_9a=this.document.execCommand("insertorderedlist",false,_99);}return _9a;},_insertunorderedlistImpl:function(_9b){var _9c=false;if(has("ie")){_9c=this._adaptIEList("insertunorderedlist",_9b);}if(!_9c){_9c=this.document.execCommand("insertunorderedlist",false,_9b);}return _9c;},getHeaderHeight:function(){return this._getNodeChildrenHeight(this.header);},getFooterHeight:function(){return this._getNodeChildrenHeight(this.footer);},_getNodeChildrenHeight:function(_9d){var h=0;if(_9d&&_9d.childNodes){var i;for(i=0;i<_9d.childNodes.length;i++){var _9e=_9.position(_9d.childNodes[i]);h+=_9e.h;}}return h;},_isNodeEmpty:function(_9f,_a0){if(_9f.nodeType===1){if(_9f.childNodes.length>0){return this._isNodeEmpty(_9f.childNodes[0],_a0);}return true;}else{if(_9f.nodeType===3){return (_9f.nodeValue.substring(_a0)==="");}}return false;},_removeStartingRangeFromRange:function(_a1,_a2){if(_a1.nextSibling){_a2.setStart(_a1.nextSibling,0);}else{var _a3=_a1.parentNode;while(_a3&&_a3.nextSibling==null){_a3=_a3.parentNode;}if(_a3){_a2.setStart(_a3.nextSibling,0);}}return _a2;},_adaptIESelection:function(){var _a4=_17.getSelection(this.window);if(_a4&&_a4.rangeCount&&!_a4.isCollapsed){var _a5=_a4.getRangeAt(0);var _a6=_a5.startContainer;var _a7=_a5.startOffset;while(_a6.nodeType===3&&_a7>=_a6.length&&_a6.nextSibling){_a7=_a7-_a6.length;_a6=_a6.nextSibling;}var _a8=null;while(this._isNodeEmpty(_a6,_a7)&&_a6!==_a8){_a8=_a6;_a5=this._removeStartingRangeFromRange(_a6,_a5);_a6=_a5.startContainer;_a7=0;}_a4.removeAllRanges();_a4.addRange(_a5);}},_adaptIEFormatAreaAndExec:function(_a9){var _aa=_17.getSelection(this.window);var doc=this.document;var rs,ret,_ab,txt,_ac,_ad,_ae,_af;if(_a9&&_aa&&_aa.isCollapsed){var _b0=this.queryCommandValue(_a9);if(_b0){var _b1=this._tagNamesForCommand(_a9);_ab=_aa.getRangeAt(0);var fs=_ab.startContainer;if(fs.nodeType===3){var _b2=_ab.endOffset;if(fs.length<_b2){ret=this._adjustNodeAndOffset(rs,_b2);fs=ret.node;_b2=ret.offset;}}var _b3;while(fs&&fs!==this.editNode){var _b4=fs.tagName?fs.tagName.toLowerCase():"";if(_1.indexOf(_b1,_b4)>-1){_b3=fs;break;}fs=fs.parentNode;}if(_b3){rs=_ab.startContainer;var _b5=doc.createElement(_b3.tagName);_8.place(_b5,_b3,"after");if(rs&&rs.nodeType===3){var _b6,_b7;var _b8=_ab.endOffset;if(rs.length<_b8){ret=this._adjustNodeAndOffset(rs,_b8);rs=ret.node;_b8=ret.offset;}txt=rs.nodeValue;_ac=doc.createTextNode(txt.substring(0,_b8));var _b9=txt.substring(_b8,txt.length);if(_b9){_ad=doc.createTextNode(_b9);}_8.place(_ac,rs,"before");if(_ad){_ae=doc.createElement("span");_ae.className="ieFormatBreakerSpan";_8.place(_ae,rs,"after");_8.place(_ad,_ae,"after");_ad=_ae;}_8.destroy(rs);var _ba=_ac.parentNode;var _bb=[];var _bc;while(_ba!==_b3){var tg=_ba.tagName;_bc={tagName:tg};_bb.push(_bc);var _bd=doc.createElement(tg);if(_ba.style){if(_bd.style){if(_ba.style.cssText){_bd.style.cssText=_ba.style.cssText;_bc.cssText=_ba.style.cssText;}}}if(_ba.tagName==="FONT"){if(_ba.color){_bd.color=_ba.color;_bc.color=_ba.color;}if(_ba.face){_bd.face=_ba.face;_bc.face=_ba.face;}if(_ba.size){_bd.size=_ba.size;_bc.size=_ba.size;}}if(_ba.className){_bd.className=_ba.className;_bc.className=_ba.className;}if(_ad){_b6=_ad;while(_b6){_b7=_b6.nextSibling;_bd.appendChild(_b6);_b6=_b7;}}if(_bd.tagName==_ba.tagName){_ae=doc.createElement("span");_ae.className="ieFormatBreakerSpan";_8.place(_ae,_ba,"after");_8.place(_bd,_ae,"after");}else{_8.place(_bd,_ba,"after");}_ac=_ba;_ad=_bd;_ba=_ba.parentNode;}if(_ad){_b6=_ad;if(_b6.nodeType===1||(_b6.nodeType===3&&_b6.nodeValue)){_b5.innerHTML="";}while(_b6){_b7=_b6.nextSibling;_b5.appendChild(_b6);_b6=_b7;}}if(_bb.length){_bc=_bb.pop();var _be=doc.createElement(_bc.tagName);if(_bc.cssText&&_be.style){_be.style.cssText=_bc.cssText;}if(_bc.className){_be.className=_bc.className;}if(_bc.tagName==="FONT"){if(_bc.color){_be.color=_bc.color;}if(_bc.face){_be.face=_bc.face;}if(_bc.size){_be.size=_bc.size;}}_8.place(_be,_b5,"before");while(_bb.length){_bc=_bb.pop();var _bf=doc.createElement(_bc.tagName);if(_bc.cssText&&_bf.style){_bf.style.cssText=_bc.cssText;}if(_bc.className){_bf.className=_bc.className;}if(_bc.tagName==="FONT"){if(_bc.color){_bf.color=_bc.color;}if(_bc.face){_bf.face=_bc.face;}if(_bc.size){_bf.size=_bc.size;}}_be.appendChild(_bf);_be=_bf;}_af=doc.createTextNode(".");_ae.appendChild(_af);_be.appendChild(_af);win.withGlobal(this.window,_e.hitch(this,function(){var _c0=_17.create();_c0.setStart(_af,0);_c0.setEnd(_af,_af.length);_aa.removeAllRanges();_aa.addRange(_c0);_16.collapse(false);_af.parentNode.innerHTML="";}));}else{_ae=doc.createElement("span");_ae.className="ieFormatBreakerSpan";_af=doc.createTextNode(".");_ae.appendChild(_af);_8.place(_ae,_b5,"before");win.withGlobal(this.window,_e.hitch(this,function(){var _c1=_17.create();_c1.setStart(_af,0);_c1.setEnd(_af,_af.length);_aa.removeAllRanges();_aa.addRange(_c1);_16.collapse(false);_af.parentNode.innerHTML="";}));}if(!_b5.firstChild){_8.destroy(_b5);}return true;}}return false;}else{_ab=_aa.getRangeAt(0);rs=_ab.startContainer;if(rs&&rs.nodeType===3){win.withGlobal(this.window,_e.hitch(this,function(){var _c2=_ab.startOffset;if(rs.length<_c2){ret=this._adjustNodeAndOffset(rs,_c2);rs=ret.node;_c2=ret.offset;}txt=rs.nodeValue;_ac=doc.createTextNode(txt.substring(0,_c2));var _c3=txt.substring(_c2);if(_c3!==""){_ad=doc.createTextNode(txt.substring(_c2));}_ae=doc.createElement("span");_af=doc.createTextNode(".");_ae.appendChild(_af);if(_ac.length){_8.place(_ac,rs,"after");}else{_ac=rs;}_8.place(_ae,_ac,"after");if(_ad){_8.place(_ad,_ae,"after");}_8.destroy(rs);var _c4=_17.create();_c4.setStart(_af,0);_c4.setEnd(_af,_af.length);_aa.removeAllRanges();_aa.addRange(_c4);doc.execCommand(_a9);_8.place(_ae.firstChild,_ae,"before");_8.destroy(_ae);_c4.setStart(_af,0);_c4.setEnd(_af,_af.length);_aa.removeAllRanges();_aa.addRange(_c4);_16.collapse(false);_af.parentNode.innerHTML="";}));return true;}}}else{return false;}},_adaptIEList:function(_c5){var _c6=_17.getSelection(this.window);if(_c6.isCollapsed){if(_c6.rangeCount&&!this.queryCommandValue(_c5)){var _c7=_c6.getRangeAt(0);var sc=_c7.startContainer;if(sc&&sc.nodeType==3){if(!_c7.startOffset){win.withGlobal(this.window,_e.hitch(this,function(){var _c8="ul";if(_c5==="insertorderedlist"){_c8="ol";}var _c9=_8.create(_c8);var li=_8.create("li",null,_c9);_8.place(_c9,sc,"before");li.appendChild(sc);_8.create("br",null,_c9,"after");var _ca=_17.create();_ca.setStart(sc,0);_ca.setEnd(sc,sc.length);_c6.removeAllRanges();_c6.addRange(_ca);_16.collapse(true);}));return true;}}}}return false;},_handleTextColorOrProperties:function(_cb,_cc){var _cd=_17.getSelection(this.window);var doc=this.document;var rs,ret,_ce,txt,_cf,_d0,_d1,_d2;_cc=_cc||null;if(_cb&&_cd&&_cd.isCollapsed){if(_cd.rangeCount){_ce=_cd.getRangeAt(0);rs=_ce.startContainer;if(rs&&rs.nodeType===3){win.withGlobal(this.window,_e.hitch(this,function(){var _d3=_ce.startOffset;if(rs.length<_d3){ret=this._adjustNodeAndOffset(rs,_d3);rs=ret.node;_d3=ret.offset;}txt=rs.nodeValue;_cf=doc.createTextNode(txt.substring(0,_d3));var _d4=txt.substring(_d3);if(_d4!==""){_d0=doc.createTextNode(txt.substring(_d3));}_d1=_8.create("span");_d2=doc.createTextNode(".");_d1.appendChild(_d2);var _d5=_8.create("span");_d1.appendChild(_d5);if(_cf.length){_8.place(_cf,rs,"after");}else{_cf=rs;}_8.place(_d1,_cf,"after");if(_d0){_8.place(_d0,_d1,"after");}_8.destroy(rs);var _d6=_17.create();_d6.setStart(_d2,0);_d6.setEnd(_d2,_d2.length);_cd.removeAllRanges();_cd.addRange(_d6);if(has("webkit")){var _d7="color";if(_cb==="hilitecolor"||_cb==="backcolor"){_d7="backgroundColor";}_a.set(_d1,_d7,_cc);_16.remove();_8.destroy(_d5);_d1.innerHTML="&#160;";_16.selectElement(_d1);this.focus();}else{this.execCommand(_cb,_cc);_8.place(_d1.firstChild,_d1,"before");_8.destroy(_d1);_d6.setStart(_d2,0);_d6.setEnd(_d2,_d2.length);_cd.removeAllRanges();_cd.addRange(_d6);_16.collapse(false);_d2.parentNode.removeChild(_d2);}}));return true;}}}return false;},_adjustNodeAndOffset:function(_d8,_d9){while(_d8.length<_d9&&_d8.nextSibling&&_d8.nextSibling.nodeType===3){_d9=_d9-_d8.length;_d8=_d8.nextSibling;}return {"node":_d8,"offset":_d9};},_tagNamesForCommand:function(_da){if(_da==="bold"){return ["b","strong"];}else{if(_da==="italic"){return ["i","em"];}else{if(_da==="strikethrough"){return ["s","strike"];}else{if(_da==="superscript"){return ["sup"];}else{if(_da==="subscript"){return ["sub"];}else{if(_da==="underline"){return ["u"];}}}}}}return [];},_stripBreakerNodes:function(_db){win.withGlobal(this.window,_e.hitch(this,function(){var _dc=_f(".ieFormatBreakerSpan",_db);var i;for(i=0;i<_dc.length;i++){var b=_dc[i];while(b.firstChild){_8.place(b.firstChild,b,"before");}_8.destroy(b);}}));return _db;}});return _1b;}); \ No newline at end of file
+define("dijit/_editor/RichText",["dojo/_base/array","dojo/_base/config","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/query","dojo/ready","dojo/sniff","dojo/topic","dojo/_base/unload","dojo/_base/url","dojo/_base/window","../_Widget","../_CssStateMixin","./selection","./range","./html","../focus","../main"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,on,_f,_10,has,_11,_12,_13,win,_14,_15,_16,_17,_18,_19,_1a){var _1b=_3("dijit._editor.RichText",[_14,_15],{constructor:function(_1c){this.contentPreFilters=[];this.contentPostFilters=[];this.contentDomPreFilters=[];this.contentDomPostFilters=[];this.editingAreaStyleSheets=[];this.events=[].concat(this.events);this._keyHandlers={};if(_1c&&_e.isString(_1c.value)){this.value=_1c.value;}this.onLoadDeferred=new _4();},baseClass:"dijitEditor",inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",_NAME_CONTENT_SEP:"@@**%%:%%**@@",onLoadDeferred:null,isTabIndent:false,disableSpellCheck:false,postCreate:function(){if("textarea"===this.domNode.tagName.toLowerCase()){console.warn("RichText should not be used with the TEXTAREA tag. See dijit._editor.RichText docs.");}this.contentPreFilters=[_e.hitch(this,"_preFixUrlAttributes")].concat(this.contentPreFilters);if(has("mozilla")){this.contentPreFilters=[this._normalizeFontStyle].concat(this.contentPreFilters);this.contentPostFilters=[this._removeMozBogus].concat(this.contentPostFilters);}if(has("webkit")){this.contentPreFilters=[this._removeWebkitBogus].concat(this.contentPreFilters);this.contentPostFilters=[this._removeWebkitBogus].concat(this.contentPostFilters);}if(has("ie")){this.contentPostFilters=[this._normalizeFontStyle].concat(this.contentPostFilters);this.contentDomPostFilters=[_e.hitch(this,this._stripBreakerNodes)].concat(this.contentDomPostFilters);}this.inherited(arguments);_11.publish(_1a._scopeName+"._editor.RichText::init",this);this.open();this.setupDefaultShortcuts();},setupDefaultShortcuts:function(){var _1d=_e.hitch(this,function(cmd,arg){return function(){return !this.execCommand(cmd,arg);};});var _1e={b:_1d("bold"),i:_1d("italic"),u:_1d("underline"),a:_1d("selectall"),s:function(){this.save(true);},m:function(){this.isTabIndent=!this.isTabIndent;},"1":_1d("formatblock","h1"),"2":_1d("formatblock","h2"),"3":_1d("formatblock","h3"),"4":_1d("formatblock","h4"),"\\":_1d("insertunorderedlist")};if(!has("ie")){_1e.Z=_1d("redo");}var key;for(key in _1e){this.addKeyHandler(key,true,false,_1e[key]);}},events:["onKeyPress","onKeyDown","onKeyUp"],captureEvents:[],_editorCommandsLocalized:false,_localizeEditorCommands:function(){if(_1b._editorCommandsLocalized){this._local2NativeFormatNames=_1b._local2NativeFormatNames;this._native2LocalFormatNames=_1b._native2LocalFormatNames;return;}_1b._editorCommandsLocalized=true;_1b._local2NativeFormatNames={};_1b._native2LocalFormatNames={};this._local2NativeFormatNames=_1b._local2NativeFormatNames;this._native2LocalFormatNames=_1b._native2LocalFormatNames;var _1f=["div","p","pre","h1","h2","h3","h4","h5","h6","ol","ul","address"];var _20="",_21,i=0;while((_21=_1f[i++])){if(_21.charAt(1)!=="l"){_20+="<"+_21+"><span>content</span></"+_21+"><br/>";}else{_20+="<"+_21+"><li>content</li></"+_21+"><br/>";}}var _22={position:"absolute",top:"0px",zIndex:10,opacity:0.01};var div=_8.create("div",{style:_22,innerHTML:_20});this.ownerDocumentBody.appendChild(div);var _23=_e.hitch(this,function(){var _24=div.firstChild;while(_24){try{this._sCall("selectElement",[_24.firstChild]);var _25=_24.tagName.toLowerCase();this._local2NativeFormatNames[_25]=document.queryCommandValue("formatblock");this._native2LocalFormatNames[this._local2NativeFormatNames[_25]]=_25;_24=_24.nextSibling.nextSibling;}catch(e){}}_8.destroy(div);});this.defer(_23);},open:function(_26){if(!this.onLoadDeferred||this.onLoadDeferred.fired>=0){this.onLoadDeferred=new _4();}if(!this.isClosed){this.close();}_11.publish(_1a._scopeName+"._editor.RichText::open",this);if(arguments.length===1&&_26.nodeName){this.domNode=_26;}var dn=this.domNode;var _27;if(_e.isString(this.value)){_27=this.value;delete this.value;dn.innerHTML="";}else{if(dn.nodeName&&dn.nodeName.toLowerCase()=="textarea"){var ta=(this.textarea=dn);this.name=ta.name;_27=ta.value;dn=this.domNode=this.ownerDocument.createElement("div");dn.setAttribute("widgetId",this.id);ta.removeAttribute("widgetId");dn.cssText=ta.cssText;dn.className+=" "+ta.className;_8.place(dn,ta,"before");var _28=_e.hitch(this,function(){_a.set(ta,{display:"block",position:"absolute",top:"-1000px"});if(has("ie")){var s=ta.style;this.__overflow=s.overflow;s.overflow="hidden";}});if(has("ie")){this.defer(_28,10);}else{_28();}if(ta.form){var _29=ta.value;this.reset=function(){var _2a=this.getValue();if(_2a!==_29){this.replaceValue(_29);}};on(ta.form,"submit",_e.hitch(this,function(){_6.set(ta,"disabled",this.disabled);ta.value=this.getValue();}));}}else{_27=_18.getChildrenHtml(dn);dn.innerHTML="";}}this.value=_27;if(dn.nodeName&&dn.nodeName==="LI"){dn.innerHTML=" <br>";}this.header=dn.ownerDocument.createElement("div");dn.appendChild(this.header);this.editingArea=dn.ownerDocument.createElement("div");dn.appendChild(this.editingArea);this.footer=dn.ownerDocument.createElement("div");dn.appendChild(this.footer);if(!this.name){this.name=this.id+"_AUTOGEN";}if(this.name!==""&&(!_2["useXDomain"]||_2["allowXdRichTextSave"])){var _2b=_5.byId(_1a._scopeName+"._editor.RichText.value");if(_2b&&_2b.value!==""){var _2c=_2b.value.split(this._SEPARATOR),i=0,dat;while((dat=_2c[i++])){var _2d=dat.split(this._NAME_CONTENT_SEP);if(_2d[0]===this.name){_27=_2d[1];_2c=_2c.splice(i,1);_2b.value=_2c.join(this._SEPARATOR);break;}}}if(!_1b._globalSaveHandler){_1b._globalSaveHandler={};_12.addOnUnload(function(){var id;for(id in _1b._globalSaveHandler){var f=_1b._globalSaveHandler[id];if(_e.isFunction(f)){f();}}});}_1b._globalSaveHandler[this.id]=_e.hitch(this,"_saveContent");}this.isClosed=false;var ifr=(this.editorObject=this.iframe=this.ownerDocument.createElement("iframe"));ifr.id=this.id+"_iframe";ifr.style.border="none";ifr.style.width="100%";if(this._layoutMode){ifr.style.height="100%";}else{if(has("ie")>=7){if(this.height){ifr.style.height=this.height;}if(this.minHeight){ifr.style.minHeight=this.minHeight;}}else{ifr.style.height=this.height?this.height:this.minHeight;}}ifr.frameBorder=0;ifr._loadFunc=_e.hitch(this,function(w){this.window=w;this.document=this.window.document;if(has("ie")){this._localizeEditorCommands();}this.onLoad(_27);});var src=this._getIframeDocTxt(),s="javascript: '"+src.replace(/\\/g,"\\\\").replace(/'/g,"\\'")+"'";ifr.setAttribute("src",s);this.editingArea.appendChild(ifr);if(has("safari")<=4){src=ifr.getAttribute("src");if(!src||src.indexOf("javascript")===-1){this.defer(function(){ifr.setAttribute("src",s);});}}if(dn.nodeName==="LI"){dn.lastChild.style.marginTop="-1.2em";}_7.add(this.domNode,this.baseClass);},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_getIframeDocTxt:function(){var _2e=_a.getComputedStyle(this.domNode);var _2f="";var _30=true;if(has("ie")||has("webkit")||(!this.height&&!has("mozilla"))){_2f="<div id='dijitEditorBody'></div>";_30=false;}else{if(has("mozilla")){this._cursorToStart=true;_2f="&#160;";}}var _31=[_2e.fontWeight,_2e.fontSize,_2e.fontFamily].join(" ");var _32=_2e.lineHeight;if(_32.indexOf("px")>=0){_32=parseFloat(_32)/parseFloat(_2e.fontSize);}else{if(_32.indexOf("em")>=0){_32=parseFloat(_32);}else{_32="normal";}}var _33="";var _34=this;this.style.replace(/(^|;)\s*(line-|font-?)[^;]+/ig,function(_35){_35=_35.replace(/^;/ig,"")+";";var s=_35.split(":")[0];if(s){s=_e.trim(s);s=s.toLowerCase();var i;var sC="";for(i=0;i<s.length;i++){var c=s.charAt(i);switch(c){case "-":i++;c=s.charAt(i).toUpperCase();default:sC+=c;}}_a.set(_34.domNode,sC,"");}_33+=_35+";";});var _36=_f("label[for=\""+this.id+"\"]");return [this.isLeftToRight()?"<html>\n<head>\n":"<html dir='rtl'>\n<head>\n",(has("mozilla")&&_36.length?"<title>"+_36[0].innerHTML+"</title>\n":""),"<meta http-equiv='Content-Type' content='text/html'>\n","<style>\n","\tbody,html {\n","\t\tbackground:transparent;\n","\t\tpadding: 1px 0 0 0;\n","\t\tmargin: -1px 0 0 0;\n",((has("webkit"))?"\t\twidth: 100%;\n":""),((has("webkit"))?"\t\theight: 100%;\n":""),"\t}\n","\tbody{\n","\t\ttop:0px;\n","\t\tleft:0px;\n","\t\tright:0px;\n","\t\tfont:",_31,";\n",((this.height||has("opera"))?"":"\t\tposition: fixed;\n"),"\t\tmin-height:",this.minHeight,";\n","\t\tline-height:",_32,";\n","\t}\n","\tp{ margin: 1em 0; }\n",(!_30&&!this.height?"\tbody,html {overflow-y: hidden;}\n":""),"\t#dijitEditorBody{overflow-x: auto; overflow-y:"+(this.height?"auto;":"hidden;")+" outline: 0px;}\n","\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n",(!has("ie")?"\tli{ min-height:1.2em; }\n":""),"</style>\n",this._applyEditingAreaStyleSheets(),"\n","</head>\n<body ",(_30?"id='dijitEditorBody' ":""),"onload='frameElement && frameElement._loadFunc(window,document)' ","style='"+_33+"'>",_2f,"</body>\n</html>"].join("");},_applyEditingAreaStyleSheets:function(){var _37=[];if(this.styleSheets){_37=this.styleSheets.split(";");this.styleSheets="";}_37=_37.concat(this.editingAreaStyleSheets);this.editingAreaStyleSheets=[];var _38="",i=0,url;while((url=_37[i++])){var _39=(new _13(win.global.location,url)).toString();this.editingAreaStyleSheets.push(_39);_38+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_39+"\"/>";}return _38;},addStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)==="."||(url.charAt(0)!=="/"&&!uri.host)){url=(new _13(win.global.location,url)).toString();}if(_1.indexOf(this.editingAreaStyleSheets,url)>-1){return;}this.editingAreaStyleSheets.push(url);this.onLoadDeferred.then(_e.hitch(this,function(){if(this.document.createStyleSheet){this.document.createStyleSheet(url);}else{var _3a=this.document.getElementsByTagName("head")[0];var _3b=this.document.createElement("link");_3b.rel="stylesheet";_3b.type="text/css";_3b.href=url;_3a.appendChild(_3b);}}));},removeStyleSheet:function(uri){var url=uri.toString();if(url.charAt(0)==="."||(url.charAt(0)!=="/"&&!uri.host)){url=(new _13(win.global.location,url)).toString();}var _3c=_1.indexOf(this.editingAreaStyleSheets,url);if(_3c===-1){return;}delete this.editingAreaStyleSheets[_3c];_f("link:[href=\""+url+"\"]",this.window.document).orphan();},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_3d){_3d=!!_3d;this._set("disabled",_3d);if(!this.isLoaded){return;}if(has("ie")||has("webkit")||has("opera")){var _3e=has("ie")&&(this.isLoaded||!this.focusOnLoad);if(_3e){this.editNode.unselectable="on";}this.editNode.contentEditable=!_3d;if(_3e){this.defer(function(){if(this.editNode){this.editNode.unselectable="off";}});}}else{try{this.document.designMode=(_3d?"off":"on");}catch(e){return;}if(!_3d&&this._mozSettingProps){var ps=this._mozSettingProps;var n;for(n in ps){if(ps.hasOwnProperty(n)){try{this.document.execCommand(n,false,ps[n]);}catch(e2){}}}}}this._disabledOK=true;},onLoad:function(_3f){if(!this.window.__registeredWindow){this.window.__registeredWindow=true;this._iframeRegHandle=_19.registerIframe(this.iframe);}if(!has("ie")&&!has("webkit")&&(this.height||has("mozilla"))){this.editNode=this.document.body;}else{this.editNode=this.document.body.firstChild;var _40=this;if(has("ie")){this.tabStop=_8.create("div",{tabIndex:-1},this.editingArea);this.iframe.onfocus=function(){_40.editNode.setActive();};}}this.focusNode=this.editNode;var _41=this.events.concat(this.captureEvents);var ap=this.iframe?this.document:this.editNode;_1.forEach(_41,function(_42){this.connect(ap,_42.toLowerCase(),_42);},this);this.connect(ap,"onmouseup","onClick");if(has("ie")){this.connect(this.document,"onmousedown","_onIEMouseDown");this.editNode.style.zoom=1;}else{this.connect(this.document,"onmousedown",function(){delete this._cursorToStart;});}if(has("webkit")){this._webkitListener=this.connect(this.document,"onmouseup","onDisplayChanged");this.connect(this.document,"onmousedown",function(e){var t=e.target;if(t&&(t===this.document.body||t===this.document)){this.defer("placeCursorAtEnd");}});}if(has("ie")){try{this.document.execCommand("RespectVisibilityInDesign",true,null);}catch(e){}}this.isLoaded=true;this.set("disabled",this.disabled);var _43=_e.hitch(this,function(){this.setValue(_3f);if(this.onLoadDeferred){this.onLoadDeferred.resolve(true);}this.onDisplayChanged();if(this.focusOnLoad){_10(_e.hitch(this,"defer","focus",this.updateInterval));}this.value=this.getValue(true);});if(this.setValueDeferred){this.setValueDeferred.then(_43);}else{_43();}},onKeyDown:function(e){if(e.keyCode===_d.TAB&&this.isTabIndent){_b.stop(e);if(this.queryCommandEnabled((e.shiftKey?"outdent":"indent"))){this.execCommand((e.shiftKey?"outdent":"indent"));}}if(has("ie")){if(e.keyCode==_d.TAB&&!this.isTabIndent){if(e.shiftKey&&!e.ctrlKey&&!e.altKey){this.iframe.focus();}else{if(!e.shiftKey&&!e.ctrlKey&&!e.altKey){this.tabStop.focus();}}}else{if(e.keyCode===_d.BACKSPACE&&this.document.selection.type==="Control"){_b.stop(e);this.execCommand("delete");}else{if((65<=e.keyCode&&e.keyCode<=90)||(e.keyCode>=37&&e.keyCode<=40)){e.charCode=e.keyCode;this.onKeyPress(e);}}}}if(has("ff")){if(e.keyCode===_d.PAGE_UP||e.keyCode===_d.PAGE_DOWN){if(this.editNode.clientHeight>=this.editNode.scrollHeight){e.preventDefault();}}}return true;},onKeyUp:function(){},setDisabled:function(_44){_c.deprecated("dijit.Editor::setDisabled is deprecated","use dijit.Editor::attr(\"disabled\",boolean) instead",2);this.set("disabled",_44);},_setValueAttr:function(_45){this.setValue(_45);},_setDisableSpellCheckAttr:function(_46){if(this.document){_6.set(this.document.body,"spellcheck",!_46);}else{this.onLoadDeferred.then(_e.hitch(this,function(){_6.set(this.document.body,"spellcheck",!_46);}));}this._set("disableSpellCheck",_46);},onKeyPress:function(e){var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode,_47=this._keyHandlers[c],_48=arguments;if(_47&&!e.altKey){_1.some(_47,function(h){if(!(h.shift^e.shiftKey)&&!(h.ctrl^(e.ctrlKey||e.metaKey))){if(!h.handler.apply(this,_48)){e.preventDefault();}return true;}},this);}if(!this._onKeyHitch){this._onKeyHitch=_e.hitch(this,"onKeyPressed");}this.defer("_onKeyHitch",1);return true;},addKeyHandler:function(key,_49,_4a,_4b){if(!_e.isArray(this._keyHandlers[key])){this._keyHandlers[key]=[];}this._keyHandlers[key].push({shift:_4a||false,ctrl:_49||false,handler:_4b});},onKeyPressed:function(){this.onDisplayChanged();},onClick:function(e){this.onDisplayChanged(e);},_onIEMouseDown:function(){if(!this.focused&&!this.disabled){this.focus();}},_onBlur:function(e){this.inherited(arguments);var _4c=this.getValue(true);if(_4c!==this.value){this.onChange(_4c);}this._set("value",_4c);},_onFocus:function(e){if(!this.disabled){if(!this._disabledOK){this.set("disabled",false);}this.inherited(arguments);}},blur:function(){if(!has("ie")&&this.window.document.documentElement&&this.window.document.documentElement.focus){this.window.document.documentElement.focus();}else{if(this.ownerDocumentBody.focus){this.ownerDocumentBody.focus();}}},focus:function(){if(!this.isLoaded){this.focusOnLoad=true;return;}if(this._cursorToStart){delete this._cursorToStart;if(this.editNode.childNodes){this.placeCursorAtStart();return;}}if(!has("ie")){_19.focus(this.iframe);}else{if(this.editNode&&this.editNode.focus){this.iframe.fireEvent("onfocus",document.createEventObject());}}},updateInterval:200,_updateTimer:null,onDisplayChanged:function(){if(this._updateTimer){this._updateTimer.remove();}this._updateTimer=this.defer("onNormalizedDisplayChanged",this.updateInterval);},onNormalizedDisplayChanged:function(){delete this._updateTimer;},onChange:function(){},_normalizeCommand:function(cmd,_4d){var _4e=cmd.toLowerCase();if(_4e==="formatblock"){if(has("safari")&&_4d===undefined){_4e="heading";}}else{if(_4e==="hilitecolor"&&!has("mozilla")){_4e="backcolor";}}return _4e;},_qcaCache:{},queryCommandAvailable:function(_4f){var ca=this._qcaCache[_4f];if(ca!==undefined){return ca;}return (this._qcaCache[_4f]=this._queryCommandAvailable(_4f));},_queryCommandAvailable:function(_50){var ie=1;var _51=1<<1;var _52=1<<2;var _53=1<<3;function _54(_55){return {ie:Boolean(_55&ie),mozilla:Boolean(_55&_51),webkit:Boolean(_55&_52),opera:Boolean(_55&_53)};};var _56=null;switch(_50.toLowerCase()){case "bold":case "italic":case "underline":case "subscript":case "superscript":case "fontname":case "fontsize":case "forecolor":case "hilitecolor":case "justifycenter":case "justifyfull":case "justifyleft":case "justifyright":case "delete":case "selectall":case "toggledir":_56=_54(_51|ie|_52|_53);break;case "createlink":case "unlink":case "removeformat":case "inserthorizontalrule":case "insertimage":case "insertorderedlist":case "insertunorderedlist":case "indent":case "outdent":case "formatblock":case "inserthtml":case "undo":case "redo":case "strikethrough":case "tabindent":_56=_54(_51|ie|_53|_52);break;case "blockdirltr":case "blockdirrtl":case "dirltr":case "dirrtl":case "inlinedirltr":case "inlinedirrtl":_56=_54(ie);break;case "cut":case "copy":case "paste":_56=_54(ie|_51|_52|_53);break;case "inserttable":_56=_54(_51|ie);break;case "insertcell":case "insertcol":case "insertrow":case "deletecells":case "deletecols":case "deleterows":case "mergecells":case "splitcell":_56=_54(ie|_51);break;default:return false;}return (has("ie")&&_56.ie)||(has("mozilla")&&_56.mozilla)||(has("webkit")&&_56.webkit)||(has("opera")&&_56.opera);},execCommand:function(_57,_58){var _59;this.focus();_57=this._normalizeCommand(_57,_58);if(_58!==undefined){if(_57==="heading"){throw new Error("unimplemented");}else{if((_57==="formatblock")&&has("ie")){_58="<"+_58+">";}}}var _5a="_"+_57+"Impl";if(this[_5a]){_59=this[_5a](_58);}else{_58=arguments.length>1?_58:null;if(_58||_57!=="createlink"){_59=this.document.execCommand(_57,false,_58);}}this.onDisplayChanged();return _59;},queryCommandEnabled:function(_5b){if(this.disabled||!this._disabledOK){return false;}_5b=this._normalizeCommand(_5b);var _5c="_"+_5b+"EnabledImpl";if(this[_5c]){return this[_5c](_5b);}else{return this._browserQueryCommandEnabled(_5b);}},queryCommandState:function(_5d){if(this.disabled||!this._disabledOK){return false;}_5d=this._normalizeCommand(_5d);try{return this.document.queryCommandState(_5d);}catch(e){return false;}},queryCommandValue:function(_5e){if(this.disabled||!this._disabledOK){return false;}var r;_5e=this._normalizeCommand(_5e);if(has("ie")&&_5e==="formatblock"){r=this._native2LocalFormatNames[this.document.queryCommandValue(_5e)];}else{if(has("mozilla")&&_5e==="hilitecolor"){var _5f;try{_5f=this.document.queryCommandValue("styleWithCSS");}catch(e){_5f=false;}this.document.execCommand("styleWithCSS",false,true);r=this.document.queryCommandValue(_5e);this.document.execCommand("styleWithCSS",false,_5f);}else{r=this.document.queryCommandValue(_5e);}}return r;},_sCall:function(_60,_61){return win.withGlobal(this.window,_60,_16,_61);},placeCursorAtStart:function(){this.focus();var _62=false;if(has("mozilla")){var _63=this.editNode.firstChild;while(_63){if(_63.nodeType===3){if(_63.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_62=true;this._sCall("selectElement",[_63]);break;}}else{if(_63.nodeType===1){_62=true;var tg=_63.tagName?_63.tagName.toLowerCase():"";if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){this._sCall("selectElement",[_63]);}else{this._sCall("selectElementChildren",[_63]);}break;}}_63=_63.nextSibling;}}else{_62=true;this._sCall("selectElementChildren",[this.editNode]);}if(_62){this._sCall("collapse",[true]);}},placeCursorAtEnd:function(){this.focus();var _64=false;if(has("mozilla")){var _65=this.editNode.lastChild;while(_65){if(_65.nodeType===3){if(_65.nodeValue.replace(/^\s+|\s+$/g,"").length>0){_64=true;this._sCall("selectElement",[_65]);break;}}else{if(_65.nodeType===1){_64=true;this._sCall("selectElement",[_65.lastChild||_65]);break;}}_65=_65.previousSibling;}}else{_64=true;this._sCall("selectElementChildren",[this.editNode]);}if(_64){this._sCall("collapse",[false]);}},getValue:function(_66){if(this.textarea){if(this.isClosed||!this.isLoaded){return this.textarea.value;}}return this._postFilterContent(null,_66);},_getValueAttr:function(){return this.getValue(true);},setValue:function(_67){if(!this.isLoaded){this.onLoadDeferred.then(_e.hitch(this,function(){this.setValue(_67);}));return;}this._cursorToStart=true;if(this.textarea&&(this.isClosed||!this.isLoaded)){this.textarea.value=_67;}else{_67=this._preFilterContent(_67);var _68=this.isClosed?this.domNode:this.editNode;if(_67&&has("mozilla")&&_67.toLowerCase()==="<p></p>"){_67="<p>&#160;</p>";}if(!_67&&has("webkit")){_67="&#160;";}_68.innerHTML=_67;this._preDomFilterContent(_68);}this.onDisplayChanged();this._set("value",this.getValue(true));},replaceValue:function(_69){if(this.isClosed){this.setValue(_69);}else{if(this.window&&this.window.getSelection&&!has("mozilla")){this.setValue(_69);}else{if(this.window&&this.window.getSelection){_69=this._preFilterContent(_69);this.execCommand("selectall");if(!_69){this._cursorToStart=true;_69="&#160;";}this.execCommand("inserthtml",_69);this._preDomFilterContent(this.editNode);}else{if(this.document&&this.document.selection){this.setValue(_69);}}}}this._set("value",this.getValue(true));},_preFilterContent:function(_6a){var ec=_6a;_1.forEach(this.contentPreFilters,function(ef){if(ef){ec=ef(ec);}});return ec;},_preDomFilterContent:function(dom){dom=dom||this.editNode;_1.forEach(this.contentDomPreFilters,function(ef){if(ef&&_e.isFunction(ef)){ef(dom);}},this);},_postFilterContent:function(dom,_6b){var ec;if(!_e.isString(dom)){dom=dom||this.editNode;if(this.contentDomPostFilters.length){if(_6b){dom=_e.clone(dom);}_1.forEach(this.contentDomPostFilters,function(ef){dom=ef(dom);});}ec=_18.getChildrenHtml(dom);}else{ec=dom;}if(!_e.trim(ec.replace(/^\xA0\xA0*/,"").replace(/\xA0\xA0*$/,"")).length){ec="";}_1.forEach(this.contentPostFilters,function(ef){ec=ef(ec);});return ec;},_saveContent:function(){var _6c=_5.byId(_1a._scopeName+"._editor.RichText.value");if(_6c){if(_6c.value){_6c.value+=this._SEPARATOR;}_6c.value+=this.name+this._NAME_CONTENT_SEP+this.getValue(true);}},escapeXml:function(str,_6d){str=str.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_6d){str=str.replace(/'/gm,"&#39;");}return str;},getNodeHtml:function(_6e){_c.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit/_editor/html::getNodeHtml instead",2);return _18.getNodeHtml(_6e);},getNodeChildrenHtml:function(dom){_c.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit/_editor/html::getChildrenHtml instead",2);return _18.getChildrenHtml(dom);},close:function(_6f){if(this.isClosed){return;}if(!arguments.length){_6f=true;}if(_6f){this._set("value",this.getValue(true));}if(this.interval){clearInterval(this.interval);}if(this._webkitListener){this.disconnect(this._webkitListener);delete this._webkitListener;}if(has("ie")){this.iframe.onfocus=null;}this.iframe._loadFunc=null;if(this._iframeRegHandle){this._iframeRegHandle.remove();delete this._iframeRegHandle;}if(this.textarea){var s=this.textarea.style;s.position="";s.left=s.top="";if(has("ie")){s.overflow=this.__overflow;this.__overflow=null;}this.textarea.value=this.value;_8.destroy(this.domNode);this.domNode=this.textarea;}else{this.domNode.innerHTML=this.value;}delete this.iframe;_7.remove(this.domNode,this.baseClass);this.isClosed=true;this.isLoaded=false;delete this.editNode;delete this.focusNode;if(this.window&&this.window._frameElement){this.window._frameElement=null;}this.window=null;this.document=null;this.editingArea=null;this.editorObject=null;},destroy:function(){if(!this.isClosed){this.close(false);}if(this._updateTimer){this._updateTimer.remove();}this.inherited(arguments);if(_1b._globalSaveHandler){delete _1b._globalSaveHandler[this.id];}},_removeMozBogus:function(_70){return _70.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"").replace(/_moz_resizing="(true|false)"/gi,"");},_removeWebkitBogus:function(_71){_71=_71.replace(/\sclass="webkit-block-placeholder"/gi,"");_71=_71.replace(/\sclass="apple-style-span"/gi,"");_71=_71.replace(/<meta charset=\"utf-8\" \/>/gi,"");return _71;},_normalizeFontStyle:function(_72){return _72.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");},_preFixUrlAttributes:function(_73){return _73.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");},_browserQueryCommandEnabled:function(_74){if(!_74){return false;}var _75=has("ie")?this.document.selection.createRange():this.document;try{return _75.queryCommandEnabled(_74);}catch(e){return false;}},_createlinkEnabledImpl:function(){var _76=true;if(has("opera")){var sel=this.window.getSelection();if(sel.isCollapsed){_76=true;}else{_76=this.document.queryCommandEnabled("createlink");}}else{_76=this._browserQueryCommandEnabled("createlink");}return _76;},_unlinkEnabledImpl:function(){var _77=true;if(has("mozilla")||has("webkit")){_77=this._sCall("hasAncestorElement",["a"]);}else{_77=this._browserQueryCommandEnabled("unlink");}return _77;},_inserttableEnabledImpl:function(){var _78=true;if(has("mozilla")||has("webkit")){_78=true;}else{_78=this._browserQueryCommandEnabled("inserttable");}return _78;},_cutEnabledImpl:function(){var _79=true;if(has("webkit")){var sel=this.window.getSelection();if(sel){sel=sel.toString();}_79=!!sel;}else{_79=this._browserQueryCommandEnabled("cut");}return _79;},_copyEnabledImpl:function(){var _7a=true;if(has("webkit")){var sel=this.window.getSelection();if(sel){sel=sel.toString();}_7a=!!sel;}else{_7a=this._browserQueryCommandEnabled("copy");}return _7a;},_pasteEnabledImpl:function(){var _7b=true;if(has("webkit")){return true;}else{_7b=this._browserQueryCommandEnabled("paste");}return _7b;},_inserthorizontalruleImpl:function(_7c){if(has("ie")){return this._inserthtmlImpl("<hr>");}return this.document.execCommand("inserthorizontalrule",false,_7c);},_unlinkImpl:function(_7d){if((this.queryCommandEnabled("unlink"))&&(has("mozilla")||has("webkit"))){var a=this._sCall("getAncestorElement",["a"]);this._sCall("selectElement",[a]);return this.document.execCommand("unlink",false,null);}return this.document.execCommand("unlink",false,_7d);},_hilitecolorImpl:function(_7e){var _7f;var _80=this._handleTextColorOrProperties("hilitecolor",_7e);if(!_80){if(has("mozilla")){this.document.execCommand("styleWithCSS",false,true);_7f=this.document.execCommand("hilitecolor",false,_7e);this.document.execCommand("styleWithCSS",false,false);}else{_7f=this.document.execCommand("hilitecolor",false,_7e);}}return _7f;},_backcolorImpl:function(_81){if(has("ie")){_81=_81?_81:null;}var _82=this._handleTextColorOrProperties("backcolor",_81);if(!_82){_82=this.document.execCommand("backcolor",false,_81);}return _82;},_forecolorImpl:function(_83){if(has("ie")){_83=_83?_83:null;}var _84=false;_84=this._handleTextColorOrProperties("forecolor",_83);if(!_84){_84=this.document.execCommand("forecolor",false,_83);}return _84;},_inserthtmlImpl:function(_85){_85=this._preFilterContent(_85);var rv=true;if(has("ie")){var _86=this.document.selection.createRange();if(this.document.selection.type.toUpperCase()==="CONTROL"){var n=_86.item(0);while(_86.length){_86.remove(_86.item(0));}n.outerHTML=_85;}else{_86.pasteHTML(_85);}_86.select();}else{if(has("mozilla")&&!_85.length){this._sCall("remove");}else{rv=this.document.execCommand("inserthtml",false,_85);}}return rv;},_boldImpl:function(_87){var _88=false;if(has("ie")){this._adaptIESelection();_88=this._adaptIEFormatAreaAndExec("bold");}if(!_88){_88=this.document.execCommand("bold",false,_87);}return _88;},_italicImpl:function(_89){var _8a=false;if(has("ie")){this._adaptIESelection();_8a=this._adaptIEFormatAreaAndExec("italic");}if(!_8a){_8a=this.document.execCommand("italic",false,_89);}return _8a;},_underlineImpl:function(_8b){var _8c=false;if(has("ie")){this._adaptIESelection();_8c=this._adaptIEFormatAreaAndExec("underline");}if(!_8c){_8c=this.document.execCommand("underline",false,_8b);}return _8c;},_strikethroughImpl:function(_8d){var _8e=false;if(has("ie")){this._adaptIESelection();_8e=this._adaptIEFormatAreaAndExec("strikethrough");}if(!_8e){_8e=this.document.execCommand("strikethrough",false,_8d);}return _8e;},_superscriptImpl:function(_8f){var _90=false;if(has("ie")){this._adaptIESelection();_90=this._adaptIEFormatAreaAndExec("superscript");}if(!_90){_90=this.document.execCommand("superscript",false,_8f);}return _90;},_subscriptImpl:function(_91){var _92=false;if(has("ie")){this._adaptIESelection();_92=this._adaptIEFormatAreaAndExec("subscript");}if(!_92){_92=this.document.execCommand("subscript",false,_91);}return _92;},_fontnameImpl:function(_93){var _94;if(has("ie")){_94=this._handleTextColorOrProperties("fontname",_93);}if(!_94){_94=this.document.execCommand("fontname",false,_93);}return _94;},_fontsizeImpl:function(_95){var _96;if(has("ie")){_96=this._handleTextColorOrProperties("fontsize",_95);}if(!_96){_96=this.document.execCommand("fontsize",false,_95);}return _96;},_insertorderedlistImpl:function(_97){var _98=false;if(has("ie")){_98=this._adaptIEList("insertorderedlist",_97);}if(!_98){_98=this.document.execCommand("insertorderedlist",false,_97);}return _98;},_insertunorderedlistImpl:function(_99){var _9a=false;if(has("ie")){_9a=this._adaptIEList("insertunorderedlist",_99);}if(!_9a){_9a=this.document.execCommand("insertunorderedlist",false,_99);}return _9a;},getHeaderHeight:function(){return this._getNodeChildrenHeight(this.header);},getFooterHeight:function(){return this._getNodeChildrenHeight(this.footer);},_getNodeChildrenHeight:function(_9b){var h=0;if(_9b&&_9b.childNodes){var i;for(i=0;i<_9b.childNodes.length;i++){var _9c=_9.position(_9b.childNodes[i]);h+=_9c.h;}}return h;},_isNodeEmpty:function(_9d,_9e){if(_9d.nodeType===1){if(_9d.childNodes.length>0){return this._isNodeEmpty(_9d.childNodes[0],_9e);}return true;}else{if(_9d.nodeType===3){return (_9d.nodeValue.substring(_9e)==="");}}return false;},_removeStartingRangeFromRange:function(_9f,_a0){if(_9f.nextSibling){_a0.setStart(_9f.nextSibling,0);}else{var _a1=_9f.parentNode;while(_a1&&_a1.nextSibling==null){_a1=_a1.parentNode;}if(_a1){_a0.setStart(_a1.nextSibling,0);}}return _a0;},_adaptIESelection:function(){var _a2=_17.getSelection(this.window);if(_a2&&_a2.rangeCount&&!_a2.isCollapsed){var _a3=_a2.getRangeAt(0);var _a4=_a3.startContainer;var _a5=_a3.startOffset;while(_a4.nodeType===3&&_a5>=_a4.length&&_a4.nextSibling){_a5=_a5-_a4.length;_a4=_a4.nextSibling;}var _a6=null;while(this._isNodeEmpty(_a4,_a5)&&_a4!==_a6){_a6=_a4;_a3=this._removeStartingRangeFromRange(_a4,_a3);_a4=_a3.startContainer;_a5=0;}_a2.removeAllRanges();_a2.addRange(_a3);}},_adaptIEFormatAreaAndExec:function(_a7){var _a8=_17.getSelection(this.window);var doc=this.document;var rs,ret,_a9,txt,_aa,_ab,_ac,_ad;if(_a7&&_a8&&_a8.isCollapsed){var _ae=this.queryCommandValue(_a7);if(_ae){var _af=this._tagNamesForCommand(_a7);_a9=_a8.getRangeAt(0);var fs=_a9.startContainer;if(fs.nodeType===3){var _b0=_a9.endOffset;if(fs.length<_b0){ret=this._adjustNodeAndOffset(rs,_b0);fs=ret.node;_b0=ret.offset;}}var _b1;while(fs&&fs!==this.editNode){var _b2=fs.tagName?fs.tagName.toLowerCase():"";if(_1.indexOf(_af,_b2)>-1){_b1=fs;break;}fs=fs.parentNode;}if(_b1){rs=_a9.startContainer;var _b3=doc.createElement(_b1.tagName);_8.place(_b3,_b1,"after");if(rs&&rs.nodeType===3){var _b4,_b5;var _b6=_a9.endOffset;if(rs.length<_b6){ret=this._adjustNodeAndOffset(rs,_b6);rs=ret.node;_b6=ret.offset;}txt=rs.nodeValue;_aa=doc.createTextNode(txt.substring(0,_b6));var _b7=txt.substring(_b6,txt.length);if(_b7){_ab=doc.createTextNode(_b7);}_8.place(_aa,rs,"before");if(_ab){_ac=doc.createElement("span");_ac.className="ieFormatBreakerSpan";_8.place(_ac,rs,"after");_8.place(_ab,_ac,"after");_ab=_ac;}_8.destroy(rs);var _b8=_aa.parentNode;var _b9=[];var _ba;while(_b8!==_b1){var tg=_b8.tagName;_ba={tagName:tg};_b9.push(_ba);var _bb=doc.createElement(tg);if(_b8.style){if(_bb.style){if(_b8.style.cssText){_bb.style.cssText=_b8.style.cssText;_ba.cssText=_b8.style.cssText;}}}if(_b8.tagName==="FONT"){if(_b8.color){_bb.color=_b8.color;_ba.color=_b8.color;}if(_b8.face){_bb.face=_b8.face;_ba.face=_b8.face;}if(_b8.size){_bb.size=_b8.size;_ba.size=_b8.size;}}if(_b8.className){_bb.className=_b8.className;_ba.className=_b8.className;}if(_ab){_b4=_ab;while(_b4){_b5=_b4.nextSibling;_bb.appendChild(_b4);_b4=_b5;}}if(_bb.tagName==_b8.tagName){_ac=doc.createElement("span");_ac.className="ieFormatBreakerSpan";_8.place(_ac,_b8,"after");_8.place(_bb,_ac,"after");}else{_8.place(_bb,_b8,"after");}_aa=_b8;_ab=_bb;_b8=_b8.parentNode;}if(_ab){_b4=_ab;if(_b4.nodeType===1||(_b4.nodeType===3&&_b4.nodeValue)){_b3.innerHTML="";}while(_b4){_b5=_b4.nextSibling;_b3.appendChild(_b4);_b4=_b5;}}var _bc;if(_b9.length){_ba=_b9.pop();var _bd=doc.createElement(_ba.tagName);if(_ba.cssText&&_bd.style){_bd.style.cssText=_ba.cssText;}if(_ba.className){_bd.className=_ba.className;}if(_ba.tagName==="FONT"){if(_ba.color){_bd.color=_ba.color;}if(_ba.face){_bd.face=_ba.face;}if(_ba.size){_bd.size=_ba.size;}}_8.place(_bd,_b3,"before");while(_b9.length){_ba=_b9.pop();var _be=doc.createElement(_ba.tagName);if(_ba.cssText&&_be.style){_be.style.cssText=_ba.cssText;}if(_ba.className){_be.className=_ba.className;}if(_ba.tagName==="FONT"){if(_ba.color){_be.color=_ba.color;}if(_ba.face){_be.face=_ba.face;}if(_ba.size){_be.size=_ba.size;}}_bd.appendChild(_be);_bd=_be;}_ad=doc.createTextNode(".");_ac.appendChild(_ad);_bd.appendChild(_ad);_bc=_17.create(this.window);_bc.setStart(_ad,0);_bc.setEnd(_ad,_ad.length);_a8.removeAllRanges();_a8.addRange(_bc);this._sCall("collapse",[false]);_ad.parentNode.innerHTML="";}else{_ac=doc.createElement("span");_ac.className="ieFormatBreakerSpan";_ad=doc.createTextNode(".");_ac.appendChild(_ad);_8.place(_ac,_b3,"before");_bc=_17.create(this.window);_bc.setStart(_ad,0);_bc.setEnd(_ad,_ad.length);_a8.removeAllRanges();_a8.addRange(_bc);this._sCall("collapse",[false]);_ad.parentNode.innerHTML="";}if(!_b3.firstChild){_8.destroy(_b3);}return true;}}return false;}else{_a9=_a8.getRangeAt(0);rs=_a9.startContainer;if(rs&&rs.nodeType===3){var _b0=_a9.startOffset;if(rs.length<_b0){ret=this._adjustNodeAndOffset(rs,_b0);rs=ret.node;_b0=ret.offset;}txt=rs.nodeValue;_aa=doc.createTextNode(txt.substring(0,_b0));var _b7=txt.substring(_b0);if(_b7!==""){_ab=doc.createTextNode(txt.substring(_b0));}_ac=doc.createElement("span");_ad=doc.createTextNode(".");_ac.appendChild(_ad);if(_aa.length){_8.place(_aa,rs,"after");}else{_aa=rs;}_8.place(_ac,_aa,"after");if(_ab){_8.place(_ab,_ac,"after");}_8.destroy(rs);var _bc=_17.create(this.window);_bc.setStart(_ad,0);_bc.setEnd(_ad,_ad.length);_a8.removeAllRanges();_a8.addRange(_bc);doc.execCommand(_a7);_8.place(_ac.firstChild,_ac,"before");_8.destroy(_ac);_bc.setStart(_ad,0);_bc.setEnd(_ad,_ad.length);_a8.removeAllRanges();_a8.addRange(_bc);this._sCall("collapse",[false]);_ad.parentNode.innerHTML="";return true;}}}else{return false;}},_adaptIEList:function(_bf){var _c0=_17.getSelection(this.window);if(_c0.isCollapsed){if(_c0.rangeCount&&!this.queryCommandValue(_bf)){var _c1=_c0.getRangeAt(0);var sc=_c1.startContainer;if(sc&&sc.nodeType==3){if(!_c1.startOffset){var _c2="ul";if(_bf==="insertorderedlist"){_c2="ol";}var _c3=this.document.createElement(_c2);var li=_8.create("li",null,_c3);_8.place(_c3,sc,"before");li.appendChild(sc);_8.create("br",null,_c3,"after");var _c4=_17.create(this.window);_c4.setStart(sc,0);_c4.setEnd(sc,sc.length);_c0.removeAllRanges();_c0.addRange(_c4);this._sCall("collapse",[true]);return true;}}}}return false;},_handleTextColorOrProperties:function(_c5,_c6){var _c7=_17.getSelection(this.window);var doc=this.document;var rs,ret,_c8,txt,_c9,_ca,_cb,_cc;_c6=_c6||null;if(_c5&&_c7&&_c7.isCollapsed){if(_c7.rangeCount){_c8=_c7.getRangeAt(0);rs=_c8.startContainer;if(rs&&rs.nodeType===3){var _cd=_c8.startOffset;if(rs.length<_cd){ret=this._adjustNodeAndOffset(rs,_cd);rs=ret.node;_cd=ret.offset;}txt=rs.nodeValue;_c9=doc.createTextNode(txt.substring(0,_cd));var _ce=txt.substring(_cd);if(_ce!==""){_ca=doc.createTextNode(txt.substring(_cd));}_cb=doc.createElement("span");_cc=doc.createTextNode(".");_cb.appendChild(_cc);var _cf=doc.createElement("span");_cb.appendChild(_cf);if(_c9.length){_8.place(_c9,rs,"after");}else{_c9=rs;}_8.place(_cb,_c9,"after");if(_ca){_8.place(_ca,_cb,"after");}_8.destroy(rs);var _d0=_17.create(this.window);_d0.setStart(_cc,0);_d0.setEnd(_cc,_cc.length);_c7.removeAllRanges();_c7.addRange(_d0);if(has("webkit")){var _d1="color";if(_c5==="hilitecolor"||_c5==="backcolor"){_d1="backgroundColor";}_a.set(_cb,_d1,_c6);this._sCall("remove",[]);_8.destroy(_cf);_cb.innerHTML="&#160;";this._sCall("selectElement",[_cb]);this.focus();}else{this.execCommand(_c5,_c6);_8.place(_cb.firstChild,_cb,"before");_8.destroy(_cb);_d0.setStart(_cc,0);_d0.setEnd(_cc,_cc.length);_c7.removeAllRanges();_c7.addRange(_d0);this._sCall("collapse",[false]);_cc.parentNode.removeChild(_cc);}return true;}}}return false;},_adjustNodeAndOffset:function(_d2,_d3){while(_d2.length<_d3&&_d2.nextSibling&&_d2.nextSibling.nodeType===3){_d3=_d3-_d2.length;_d2=_d2.nextSibling;}return {"node":_d2,"offset":_d3};},_tagNamesForCommand:function(_d4){if(_d4==="bold"){return ["b","strong"];}else{if(_d4==="italic"){return ["i","em"];}else{if(_d4==="strikethrough"){return ["s","strike"];}else{if(_d4==="superscript"){return ["sup"];}else{if(_d4==="subscript"){return ["sub"];}else{if(_d4==="underline"){return ["u"];}}}}}}return [];},_stripBreakerNodes:function(_d5){if(!this.isLoaded){return;}_f(".ieFormatBreakerSpan",_d5).forEach(function(b){while(b.firstChild){_8.place(b.firstChild,b,"before");}_8.destroy(b);});return _d5;}});return _1b;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/RichText.js.uncompressed.js b/lib/dijit/_editor/RichText.js.uncompressed.js
new file mode 100644
index 000000000..5fd3e0962
--- /dev/null
+++ b/lib/dijit/_editor/RichText.js.uncompressed.js
@@ -0,0 +1,2874 @@
+define("dijit/_editor/RichText", [
+ "dojo/_base/array", // array.forEach array.indexOf array.some
+ "dojo/_base/config", // config
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred
+ "dojo/dom", // dom.byId
+ "dojo/dom-attr", // domAttr.set or get
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-construct", // domConstruct.create domConstruct.destroy domConstruct.place
+ "dojo/dom-geometry", // domGeometry.position
+ "dojo/dom-style", // domStyle.getComputedStyle domStyle.set
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/keys", // keys.BACKSPACE keys.TAB
+ "dojo/_base/lang", // lang.clone lang.hitch lang.isArray lang.isFunction lang.isString lang.trim
+ "dojo/on", // on()
+ "dojo/query", // query
+ "dojo/ready", // ready
+ "dojo/sniff", // has("ie") has("mozilla") has("opera") has("safari") has("webkit")
+ "dojo/topic", // topic.publish() (publish)
+ "dojo/_base/unload", // unload
+ "dojo/_base/url", // url
+ "dojo/_base/window", // win.global
+ "../_Widget",
+ "../_CssStateMixin",
+ "./selection",
+ "./range",
+ "./html",
+ "../focus",
+ "../main" // dijit._scopeName
+], function(array, config, declare, Deferred, dom, domAttr, domClass, domConstruct, domGeometry, domStyle,
+ event, kernel, keys, lang, on, query, ready, has, topic, unload, _Url, win,
+ _Widget, _CssStateMixin, selectionapi, rangeapi, htmlapi, focus, dijit){
+
+// module:
+// dijit/_editor/RichText
+// summary:
+// dijit/_editor/RichText is the core of dijit/Editor, which provides basic
+// WYSIWYG editing features.
+
+// if you want to allow for rich text saving with back/forward actions, you must add a text area to your page with
+// the id==dijit._scopeName + "._editor.RichText.value" (typically "dijit/_editor/RichText.value). For example,
+// something like this will work:
+//
+// <textarea id="dijit._editor.RichText.value" style="display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;"></textarea>
+//
+
+var RichText = declare("dijit._editor.RichText", [_Widget, _CssStateMixin], {
+ // summary:
+ // dijit/_editor/RichText is the core of dijit.Editor, which provides basic
+ // WYSIWYG editing features.
+ //
+ // description:
+ // dijit/_editor/RichText is the core of dijit.Editor, which provides basic
+ // WYSIWYG editing features. It also encapsulates the differences
+ // of different js engines for various browsers. Do not use this widget
+ // with an HTML &lt;TEXTAREA&gt; tag, since the browser unescapes XML escape characters,
+ // like &lt;. This can have unexpected behavior and lead to security issues
+ // such as scripting attacks.
+ //
+ // tags:
+ // private
+
+ constructor: function(params /*===== , srcNodeRef =====*/){
+ // summary:
+ // Create the widget.
+ // params: Object|null
+ // Initial settings for any of the widget attributes, except readonly attributes.
+ // srcNodeRef: DOMNode
+ // The widget replaces the specified DOMNode.
+
+ // contentPreFilters: Function(String)[]
+ // Pre content filter function register array.
+ // these filters will be executed before the actual
+ // editing area gets the html content.
+ this.contentPreFilters = [];
+
+ // contentPostFilters: Function(String)[]
+ // post content filter function register array.
+ // These will be used on the resulting html
+ // from contentDomPostFilters. The resulting
+ // content is the final html (returned by getValue()).
+ this.contentPostFilters = [];
+
+ // contentDomPreFilters: Function(DomNode)[]
+ // Pre content dom filter function register array.
+ // These filters are applied after the result from
+ // contentPreFilters are set to the editing area.
+ this.contentDomPreFilters = [];
+
+ // contentDomPostFilters: Function(DomNode)[]
+ // Post content dom filter function register array.
+ // These filters are executed on the editing area dom.
+ // The result from these will be passed to contentPostFilters.
+ this.contentDomPostFilters = [];
+
+ // editingAreaStyleSheets: dojo._URL[]
+ // array to store all the stylesheets applied to the editing area
+ this.editingAreaStyleSheets = [];
+
+ // Make a copy of this.events before we start writing into it, otherwise we
+ // will modify the prototype which leads to bad things on pages w/multiple editors
+ this.events = [].concat(this.events);
+
+ this._keyHandlers = {};
+
+ if(params && lang.isString(params.value)){
+ this.value = params.value;
+ }
+
+ this.onLoadDeferred = new Deferred();
+ },
+
+ baseClass: "dijitEditor",
+
+ // inheritWidth: Boolean
+ // whether to inherit the parent's width or simply use 100%
+ inheritWidth: false,
+
+ // focusOnLoad: [deprecated] Boolean
+ // Focus into this widget when the page is loaded
+ focusOnLoad: false,
+
+ // name: String?
+ // Specifies the name of a (hidden) `<textarea>` node on the page that's used to save
+ // the editor content on page leave. Used to restore editor contents after navigating
+ // to a new page and then hitting the back button.
+ name: "",
+
+ // styleSheets: [const] String
+ // semicolon (";") separated list of css files for the editing area
+ styleSheets: "",
+
+ // height: String
+ // Set height to fix the editor at a specific height, with scrolling.
+ // By default, this is 300px. If you want to have the editor always
+ // resizes to accommodate the content, use AlwaysShowToolbar plugin
+ // and set height="". If this editor is used within a layout widget,
+ // set height="100%".
+ height: "300px",
+
+ // minHeight: String
+ // The minimum height that the editor should have.
+ minHeight: "1em",
+
+ // isClosed: [private] Boolean
+ isClosed: true,
+
+ // isLoaded: [private] Boolean
+ isLoaded: false,
+
+ // _SEPARATOR: [private] String
+ // Used to concat contents from multiple editors into a single string,
+ // so they can be saved into a single `<textarea>` node. See "name" attribute.
+ _SEPARATOR: "@@**%%__RICHTEXTBOUNDRY__%%**@@",
+
+ // _NAME_CONTENT_SEP: [private] String
+ // USed to separate name from content. Just a colon isn't safe.
+ _NAME_CONTENT_SEP: "@@**%%:%%**@@",
+
+ // onLoadDeferred: [readonly] dojo.Deferred
+ // Deferred which is fired when the editor finishes loading.
+ // Call myEditor.onLoadDeferred.then(callback) it to be informed
+ // when the rich-text area initialization is finalized.
+ onLoadDeferred: null,
+
+ // isTabIndent: Boolean
+ // Make tab key and shift-tab indent and outdent rather than navigating.
+ // Caution: sing this makes web pages inaccessible to users unable to use a mouse.
+ isTabIndent: false,
+
+ // disableSpellCheck: [const] Boolean
+ // When true, disables the browser's native spell checking, if supported.
+ // Works only in Firefox.
+ disableSpellCheck: false,
+
+ postCreate: function(){
+ if("textarea" === this.domNode.tagName.toLowerCase()){
+ console.warn("RichText should not be used with the TEXTAREA tag. See dijit._editor.RichText docs.");
+ }
+
+ // Push in the builtin filters now, making them the first executed, but not over-riding anything
+ // users passed in. See: #6062
+ this.contentPreFilters = [lang.hitch(this, "_preFixUrlAttributes")].concat(this.contentPreFilters);
+ if(has("mozilla")){
+ this.contentPreFilters = [this._normalizeFontStyle].concat(this.contentPreFilters);
+ this.contentPostFilters = [this._removeMozBogus].concat(this.contentPostFilters);
+ }
+ if(has("webkit")){
+ // Try to clean up WebKit bogus artifacts. The inserted classes
+ // made by WebKit sometimes messes things up.
+ this.contentPreFilters = [this._removeWebkitBogus].concat(this.contentPreFilters);
+ this.contentPostFilters = [this._removeWebkitBogus].concat(this.contentPostFilters);
+ }
+ if(has("ie")){
+ // IE generates <strong> and <em> but we want to normalize to <b> and <i>
+ this.contentPostFilters = [this._normalizeFontStyle].concat(this.contentPostFilters);
+ this.contentDomPostFilters = [lang.hitch(this, this._stripBreakerNodes)].concat(this.contentDomPostFilters);
+ }
+ this.inherited(arguments);
+
+ topic.publish(dijit._scopeName + "._editor.RichText::init", this);
+ this.open();
+ this.setupDefaultShortcuts();
+ },
+
+ setupDefaultShortcuts: function(){
+ // summary:
+ // Add some default key handlers
+ // description:
+ // Overwrite this to setup your own handlers. The default
+ // implementation does not use Editor commands, but directly
+ // executes the builtin commands within the underlying browser
+ // support.
+ // tags:
+ // protected
+ var exec = lang.hitch(this, function(cmd, arg){
+ return function(){
+ return !this.execCommand(cmd,arg);
+ };
+ });
+
+ var ctrlKeyHandlers = {
+ b: exec("bold"),
+ i: exec("italic"),
+ u: exec("underline"),
+ a: exec("selectall"),
+ s: function(){ this.save(true); },
+ m: function(){ this.isTabIndent = !this.isTabIndent; },
+
+ "1": exec("formatblock", "h1"),
+ "2": exec("formatblock", "h2"),
+ "3": exec("formatblock", "h3"),
+ "4": exec("formatblock", "h4"),
+
+ "\\": exec("insertunorderedlist")
+ };
+
+ if(!has("ie")){
+ ctrlKeyHandlers.Z = exec("redo"); //FIXME: undo?
+ }
+
+ var key;
+ for(key in ctrlKeyHandlers){
+ this.addKeyHandler(key, true, false, ctrlKeyHandlers[key]);
+ }
+ },
+
+ // events: [private] String[]
+ // events which should be connected to the underlying editing area
+ events: ["onKeyPress", "onKeyDown", "onKeyUp"], // onClick handled specially
+
+ // captureEvents: [deprecated] String[]
+ // Events which should be connected to the underlying editing
+ // area, events in this array will be addListener with
+ // capture=true.
+ // TODO: looking at the code I don't see any distinction between events and captureEvents,
+ // so get rid of this for 2.0 if not sooner
+ captureEvents: [],
+
+ _editorCommandsLocalized: false,
+ _localizeEditorCommands: function(){
+ // summary:
+ // When IE is running in a non-English locale, the API actually changes,
+ // so that we have to say (for example) danraku instead of p (for paragraph).
+ // Handle that here.
+ // tags:
+ // private
+ if(RichText._editorCommandsLocalized){
+ // Use the already generate cache of mappings.
+ this._local2NativeFormatNames = RichText._local2NativeFormatNames;
+ this._native2LocalFormatNames = RichText._native2LocalFormatNames;
+ return;
+ }
+ RichText._editorCommandsLocalized = true;
+ RichText._local2NativeFormatNames = {};
+ RichText._native2LocalFormatNames = {};
+ this._local2NativeFormatNames = RichText._local2NativeFormatNames;
+ this._native2LocalFormatNames = RichText._native2LocalFormatNames;
+ //in IE, names for blockformat is locale dependent, so we cache the values here
+
+ //put p after div, so if IE returns Normal, we show it as paragraph
+ //We can distinguish p and div if IE returns Normal, however, in order to detect that,
+ //we have to call this.document.selection.createRange().parentElement() or such, which
+ //could slow things down. Leave it as it is for now
+ var formats = ['div', 'p', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ol', 'ul', 'address'];
+ var localhtml = "", format, i=0;
+ while((format=formats[i++])){
+ //append a <br> after each element to separate the elements more reliably
+ if(format.charAt(1) !== 'l'){
+ localhtml += "<"+format+"><span>content</span></"+format+"><br/>";
+ }else{
+ localhtml += "<"+format+"><li>content</li></"+format+"><br/>";
+ }
+ }
+ // queryCommandValue returns empty if we hide editNode, so move it out of screen temporary
+ // Also, IE9 does weird stuff unless we do it inside the editor iframe.
+ var style = { position: "absolute", top: "0px", zIndex: 10, opacity: 0.01 };
+ var div = domConstruct.create('div', {style: style, innerHTML: localhtml});
+ this.ownerDocumentBody.appendChild(div);
+
+ // IE9 has a timing issue with doing this right after setting
+ // the inner HTML, so put a delay in.
+ var inject = lang.hitch(this, function(){
+ var node = div.firstChild;
+ while(node){
+ try{
+ this._sCall("selectElement", [node.firstChild]);
+ var nativename = node.tagName.toLowerCase();
+ this._local2NativeFormatNames[nativename] = document.queryCommandValue("formatblock");
+ this._native2LocalFormatNames[this._local2NativeFormatNames[nativename]] = nativename;
+ node = node.nextSibling.nextSibling;
+ //console.log("Mapped: ", nativename, " to: ", this._local2NativeFormatNames[nativename]);
+ }catch(e){ /*Sqelch the occasional IE9 error */ }
+ }
+ domConstruct.destroy(div);
+ });
+ this.defer(inject);
+ },
+
+ open: function(/*DomNode?*/ element){
+ // summary:
+ // Transforms the node referenced in this.domNode into a rich text editing
+ // node.
+ // description:
+ // Sets up the editing area asynchronously. This will result in
+ // the creation and replacement with an iframe.
+ // tags:
+ // private
+
+ if(!this.onLoadDeferred || this.onLoadDeferred.fired >= 0){
+ this.onLoadDeferred = new Deferred();
+ }
+
+ if(!this.isClosed){ this.close(); }
+ topic.publish(dijit._scopeName + "._editor.RichText::open", this);
+
+ if(arguments.length === 1 && element.nodeName){ // else unchanged
+ this.domNode = element;
+ }
+
+ var dn = this.domNode;
+
+ // "html" will hold the innerHTML of the srcNodeRef and will be used to
+ // initialize the editor.
+ var html;
+
+ if(lang.isString(this.value)){
+ // Allow setting the editor content programmatically instead of
+ // relying on the initial content being contained within the target
+ // domNode.
+ html = this.value;
+ delete this.value;
+ dn.innerHTML = "";
+ }else if(dn.nodeName && dn.nodeName.toLowerCase() == "textarea"){
+ // if we were created from a textarea, then we need to create a
+ // new editing harness node.
+ var ta = (this.textarea = dn);
+ this.name = ta.name;
+ html = ta.value;
+ dn = this.domNode = this.ownerDocument.createElement("div");
+ dn.setAttribute('widgetId', this.id);
+ ta.removeAttribute('widgetId');
+ dn.cssText = ta.cssText;
+ dn.className += " " + ta.className;
+ domConstruct.place(dn, ta, "before");
+ var tmpFunc = lang.hitch(this, function(){
+ //some browsers refuse to submit display=none textarea, so
+ //move the textarea off screen instead
+ domStyle.set(ta, {
+ display: "block",
+ position: "absolute",
+ top: "-1000px"
+ });
+
+ if(has("ie")){ //nasty IE bug: abnormal formatting if overflow is not hidden
+ var s = ta.style;
+ this.__overflow = s.overflow;
+ s.overflow = "hidden";
+ }
+ });
+ if(has("ie")){
+ this.defer(tmpFunc, 10);
+ }else{
+ tmpFunc();
+ }
+
+ if(ta.form){
+ var resetValue = ta.value;
+ this.reset = function(){
+ var current = this.getValue();
+ if(current !== resetValue){
+ this.replaceValue(resetValue);
+ }
+ };
+ on(ta.form, "submit", lang.hitch(this, function(){
+ // Copy value to the <textarea> so it gets submitted along with form.
+ // FIXME: should we be calling close() here instead?
+ domAttr.set(ta, 'disabled', this.disabled); // don't submit the value if disabled
+ ta.value = this.getValue();
+ }));
+ }
+ }else{
+ html = htmlapi.getChildrenHtml(dn);
+ dn.innerHTML = "";
+ }
+
+ this.value = html;
+
+ // If we're a list item we have to put in a blank line to force the
+ // bullet to nicely align at the top of text
+ if(dn.nodeName && dn.nodeName === "LI"){
+ dn.innerHTML = " <br>";
+ }
+
+ // Construct the editor div structure.
+ this.header = dn.ownerDocument.createElement("div");
+ dn.appendChild(this.header);
+ this.editingArea = dn.ownerDocument.createElement("div");
+ dn.appendChild(this.editingArea);
+ this.footer = dn.ownerDocument.createElement("div");
+ dn.appendChild(this.footer);
+
+ if(!this.name){
+ this.name = this.id + "_AUTOGEN";
+ }
+
+ // User has pressed back/forward button so we lost the text in the editor, but it's saved
+ // in a hidden <textarea> (which contains the data for all the editors on this page),
+ // so get editor value from there
+ if(this.name !== "" && (!config["useXDomain"] || config["allowXdRichTextSave"])){
+ var saveTextarea = dom.byId(dijit._scopeName + "._editor.RichText.value");
+ if(saveTextarea && saveTextarea.value !== ""){
+ var datas = saveTextarea.value.split(this._SEPARATOR), i=0, dat;
+ while((dat=datas[i++])){
+ var data = dat.split(this._NAME_CONTENT_SEP);
+ if(data[0] === this.name){
+ html = data[1];
+ datas = datas.splice(i, 1);
+ saveTextarea.value = datas.join(this._SEPARATOR);
+ break;
+ }
+ }
+ }
+
+ if(!RichText._globalSaveHandler){
+ RichText._globalSaveHandler = {};
+ unload.addOnUnload(function(){
+ var id;
+ for(id in RichText._globalSaveHandler){
+ var f = RichText._globalSaveHandler[id];
+ if(lang.isFunction(f)){
+ f();
+ }
+ }
+ });
+ }
+ RichText._globalSaveHandler[this.id] = lang.hitch(this, "_saveContent");
+ }
+
+ this.isClosed = false;
+
+ var ifr = (this.editorObject = this.iframe = this.ownerDocument.createElement('iframe'));
+ ifr.id = this.id+"_iframe";
+ ifr.style.border = "none";
+ ifr.style.width = "100%";
+ if(this._layoutMode){
+ // iframe should be 100% height, thus getting it's height from surrounding
+ // <div> (which has the correct height set by Editor)
+ ifr.style.height = "100%";
+ }else{
+ if(has("ie") >= 7){
+ if(this.height){
+ ifr.style.height = this.height;
+ }
+ if(this.minHeight){
+ ifr.style.minHeight = this.minHeight;
+ }
+ }else{
+ ifr.style.height = this.height ? this.height : this.minHeight;
+ }
+ }
+ ifr.frameBorder = 0;
+ ifr._loadFunc = lang.hitch( this, function(w){
+ this.window = w;
+ this.document = this.window.document;
+
+ if(has("ie")){
+ this._localizeEditorCommands();
+ }
+
+ // Do final setup and set initial contents of editor
+ this.onLoad(html);
+ });
+
+ // Set the iframe's initial (blank) content.
+ var src = this._getIframeDocTxt(),
+ s = "javascript: '" + src.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + "'";
+ ifr.setAttribute('src', s);
+ this.editingArea.appendChild(ifr);
+
+ if(has("safari") <= 4){
+ src = ifr.getAttribute("src");
+ if(!src || src.indexOf("javascript") === -1){
+ // Safari 4 and earlier sometimes act oddly
+ // So we have to set it again.
+ this.defer(function(){ ifr.setAttribute('src', s); });
+ }
+ }
+
+ // TODO: this is a guess at the default line-height, kinda works
+ if(dn.nodeName === "LI"){
+ dn.lastChild.style.marginTop = "-1.2em";
+ }
+
+ domClass.add(this.domNode, this.baseClass);
+ },
+
+ //static cache variables shared among all instance of this class
+ _local2NativeFormatNames: {},
+ _native2LocalFormatNames: {},
+
+ _getIframeDocTxt: function(){
+ // summary:
+ // Generates the boilerplate text of the document inside the iframe (ie, `<html><head>...</head><body/></html>`).
+ // Editor content (if not blank) should be added afterwards.
+ // tags:
+ // private
+ var _cs = domStyle.getComputedStyle(this.domNode);
+
+ // The contents inside of <body>. The real contents are set later via a call to setValue().
+ var html = "";
+ var setBodyId = true;
+ if(has("ie") || has("webkit") || (!this.height && !has("mozilla"))){
+ // In auto-expand mode, need a wrapper div for AlwaysShowToolbar plugin to correctly
+ // expand/contract the editor as the content changes.
+ html = "<div id='dijitEditorBody'></div>";
+ setBodyId = false;
+ }else if(has("mozilla")){
+ // workaround bug where can't select then delete text (until user types something
+ // into the editor)... and/or issue where typing doesn't erase selected text
+ this._cursorToStart = true;
+ html = "&#160;"; // &nbsp;
+ }
+
+ var font = [ _cs.fontWeight, _cs.fontSize, _cs.fontFamily ].join(" ");
+
+ // line height is tricky - applying a units value will mess things up.
+ // if we can't get a non-units value, bail out.
+ var lineHeight = _cs.lineHeight;
+ if(lineHeight.indexOf("px") >= 0){
+ lineHeight = parseFloat(lineHeight)/parseFloat(_cs.fontSize);
+ // console.debug(lineHeight);
+ }else if(lineHeight.indexOf("em")>=0){
+ lineHeight = parseFloat(lineHeight);
+ }else{
+ // If we can't get a non-units value, just default
+ // it to the CSS spec default of 'normal'. Seems to
+ // work better, esp on IE, than '1.0'
+ lineHeight = "normal";
+ }
+ var userStyle = "";
+ var self = this;
+ this.style.replace(/(^|;)\s*(line-|font-?)[^;]+/ig, function(match){
+ match = match.replace(/^;/ig,"") + ';';
+ var s = match.split(":")[0];
+ if(s){
+ s = lang.trim(s);
+ s = s.toLowerCase();
+ var i;
+ var sC = "";
+ for(i = 0; i < s.length; i++){
+ var c = s.charAt(i);
+ switch(c){
+ case "-":
+ i++;
+ c = s.charAt(i).toUpperCase();
+ default:
+ sC += c;
+ }
+ }
+ domStyle.set(self.domNode, sC, "");
+ }
+ userStyle += match + ';';
+ });
+
+
+ // need to find any associated label element and update iframe document title
+ var label=query('label[for="'+this.id+'"]');
+
+ return [
+ this.isLeftToRight() ? "<html>\n<head>\n" : "<html dir='rtl'>\n<head>\n",
+ (has("mozilla") && label.length ? "<title>" + label[0].innerHTML + "</title>\n" : ""),
+ "<meta http-equiv='Content-Type' content='text/html'>\n",
+ "<style>\n",
+ "\tbody,html {\n",
+ "\t\tbackground:transparent;\n",
+ "\t\tpadding: 1px 0 0 0;\n",
+ "\t\tmargin: -1px 0 0 0;\n", // remove extraneous vertical scrollbar on safari and firefox
+
+ // Set the html/body sizing. Webkit always needs this, other browsers
+ // only set it when height is defined (not auto-expanding), otherwise
+ // scrollers do not appear.
+ ((has("webkit"))?"\t\twidth: 100%;\n":""),
+ ((has("webkit"))?"\t\theight: 100%;\n":""),
+ "\t}\n",
+
+ // TODO: left positioning will cause contents to disappear out of view
+ // if it gets too wide for the visible area
+ "\tbody{\n",
+ "\t\ttop:0px;\n",
+ "\t\tleft:0px;\n",
+ "\t\tright:0px;\n",
+ "\t\tfont:", font, ";\n",
+ ((this.height||has("opera")) ? "" : "\t\tposition: fixed;\n"),
+ // FIXME: IE 6 won't understand min-height?
+ "\t\tmin-height:", this.minHeight, ";\n",
+ "\t\tline-height:", lineHeight,";\n",
+ "\t}\n",
+ "\tp{ margin: 1em 0; }\n",
+
+ // Determine how scrollers should be applied. In autoexpand mode (height = "") no scrollers on y at all.
+ // But in fixed height mode we want both x/y scrollers. Also, if it's using wrapping div and in auto-expand
+ // (Mainly IE) we need to kill the y scroller on body and html.
+ (!setBodyId && !this.height ? "\tbody,html {overflow-y: hidden;}\n" : ""),
+ "\t#dijitEditorBody{overflow-x: auto; overflow-y:" + (this.height ? "auto;" : "hidden;") + " outline: 0px;}\n",
+ "\tli > ul:-moz-first-node, li > ol:-moz-first-node{ padding-top: 1.2em; }\n",
+ // Can't set min-height in IE9, it puts layout on li, which puts move/resize handles.
+ (!has("ie") ? "\tli{ min-height:1.2em; }\n" : ""),
+ "</style>\n",
+ this._applyEditingAreaStyleSheets(),"\n",
+ "</head>\n<body ",
+ (setBodyId?"id='dijitEditorBody' ":""),
+
+ // Onload handler fills in real editor content.
+ // On IE9, sometimes onload is called twice, and the first time frameElement is null (test_FullScreen.html)
+ "onload='frameElement && frameElement._loadFunc(window,document)' ",
+ "style='"+userStyle+"'>", html, "</body>\n</html>"
+ ].join(""); // String
+ },
+
+ _applyEditingAreaStyleSheets: function(){
+ // summary:
+ // apply the specified css files in styleSheets
+ // tags:
+ // private
+ var files = [];
+ if(this.styleSheets){
+ files = this.styleSheets.split(';');
+ this.styleSheets = '';
+ }
+
+ //empty this.editingAreaStyleSheets here, as it will be filled in addStyleSheet
+ files = files.concat(this.editingAreaStyleSheets);
+ this.editingAreaStyleSheets = [];
+
+ var text='', i=0, url;
+ while((url=files[i++])){
+ var abstring = (new _Url(win.global.location, url)).toString();
+ this.editingAreaStyleSheets.push(abstring);
+ text += '<link rel="stylesheet" type="text/css" href="'+abstring+'"/>';
+ }
+ return text;
+ },
+
+ addStyleSheet: function(/*dojo/_base/url*/ uri){
+ // summary:
+ // add an external stylesheet for the editing area
+ // uri:
+ // Url of the external css file
+ var url=uri.toString();
+
+ //if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe
+ if(url.charAt(0) === '.' || (url.charAt(0) !== '/' && !uri.host)){
+ url = (new _Url(win.global.location, url)).toString();
+ }
+
+ if(array.indexOf(this.editingAreaStyleSheets, url) > -1){
+// console.debug("dijit/_editor/RichText.addStyleSheet(): Style sheet "+url+" is already applied");
+ return;
+ }
+
+ this.editingAreaStyleSheets.push(url);
+ this.onLoadDeferred.then(lang.hitch(this, function(){
+ if(this.document.createStyleSheet){ //IE
+ this.document.createStyleSheet(url);
+ }else{ //other browser
+ var head = this.document.getElementsByTagName("head")[0];
+ var stylesheet = this.document.createElement("link");
+ stylesheet.rel="stylesheet";
+ stylesheet.type="text/css";
+ stylesheet.href=url;
+ head.appendChild(stylesheet);
+ }
+ }));
+ },
+
+ removeStyleSheet: function(/*dojo/_base/url*/ uri){
+ // summary:
+ // remove an external stylesheet for the editing area
+ var url=uri.toString();
+ //if uri is relative, then convert it to absolute so that it can be resolved correctly in iframe
+ if(url.charAt(0) === '.' || (url.charAt(0) !== '/' && !uri.host)){
+ url = (new _Url(win.global.location, url)).toString();
+ }
+ var index = array.indexOf(this.editingAreaStyleSheets, url);
+ if(index === -1){
+// console.debug("dijit/_editor/RichText.removeStyleSheet(): Style sheet "+url+" has not been applied");
+ return;
+ }
+ delete this.editingAreaStyleSheets[index];
+ query('link:[href="'+url+'"]', this.window.document).orphan();
+ },
+
+ // disabled: Boolean
+ // The editor is disabled; the text cannot be changed.
+ disabled: false,
+
+ _mozSettingProps: {'styleWithCSS':false},
+ _setDisabledAttr: function(/*Boolean*/ value){
+ value = !!value;
+ this._set("disabled", value);
+ if(!this.isLoaded){ return; } // this method requires init to be complete
+ if(has("ie") || has("webkit") || has("opera")){
+ var preventIEfocus = has("ie") && (this.isLoaded || !this.focusOnLoad);
+ if(preventIEfocus){ this.editNode.unselectable = "on"; }
+ this.editNode.contentEditable = !value;
+ if(preventIEfocus){
+ this.defer(function(){
+ if(this.editNode){ // guard in case widget destroyed before timeout
+ this.editNode.unselectable = "off";
+ }
+ });
+ }
+ }else{ //moz
+ try{
+ this.document.designMode=(value?'off':'on');
+ }catch(e){ return; } // ! _disabledOK
+ if(!value && this._mozSettingProps){
+ var ps = this._mozSettingProps;
+ var n;
+ for(n in ps){
+ if(ps.hasOwnProperty(n)){
+ try{
+ this.document.execCommand(n,false,ps[n]);
+ }catch(e2){}
+ }
+ }
+ }
+// this.document.execCommand('contentReadOnly', false, value);
+// if(value){
+// this.blur(); //to remove the blinking caret
+// }
+ }
+ this._disabledOK = true;
+ },
+
+/* Event handlers
+ *****************/
+
+ onLoad: function(/*String*/ html){
+ // summary:
+ // Handler after the iframe finishes loading.
+ // html: String
+ // Editor contents should be set to this value
+ // tags:
+ // protected
+
+ // TODO: rename this to _onLoad, make empty public onLoad() method, deprecate/make protected onLoadDeferred handler?
+
+ if(!this.window.__registeredWindow){
+ this.window.__registeredWindow = true;
+ this._iframeRegHandle = focus.registerIframe(this.iframe);
+ }
+ if(!has("ie") && !has("webkit") && (this.height || has("mozilla"))){
+ this.editNode=this.document.body;
+ }else{
+ // there's a wrapper div around the content, see _getIframeDocTxt().
+ this.editNode=this.document.body.firstChild;
+ var _this = this;
+ if(has("ie")){ // #4996 IE wants to focus the BODY tag
+ this.tabStop = domConstruct.create('div', { tabIndex: -1 }, this.editingArea);
+ this.iframe.onfocus = function(){ _this.editNode.setActive(); };
+ }
+ }
+ this.focusNode = this.editNode; // for InlineEditBox
+
+
+ var events = this.events.concat(this.captureEvents);
+ var ap = this.iframe ? this.document : this.editNode;
+ array.forEach(events, function(item){
+ this.connect(ap, item.toLowerCase(), item);
+ }, this);
+
+ this.connect(ap, "onmouseup", "onClick"); // mouseup in the margin does not generate an onclick event
+
+ if(has("ie")){ // IE contentEditable
+ this.connect(this.document, "onmousedown", "_onIEMouseDown"); // #4996 fix focus
+
+ // give the node Layout on IE
+ // TODO: this may no longer be needed, since we've reverted IE to using an iframe,
+ // not contentEditable. Removing it would also probably remove the need for creating
+ // the extra <div> in _getIframeDocTxt()
+ this.editNode.style.zoom = 1.0;
+ }else{
+ this.connect(this.document, "onmousedown", function(){
+ // Clear the moveToStart focus, as mouse
+ // down will set cursor point. Required to properly
+ // work with selection/position driven plugins and clicks in
+ // the window. refs: #10678
+ delete this._cursorToStart;
+ });
+ }
+
+ if(has("webkit")){
+ //WebKit sometimes doesn't fire right on selections, so the toolbar
+ //doesn't update right. Therefore, help it out a bit with an additional
+ //listener. A mouse up will typically indicate a display change, so fire this
+ //and get the toolbar to adapt. Reference: #9532
+ this._webkitListener = this.connect(this.document, "onmouseup", "onDisplayChanged");
+ this.connect(this.document, "onmousedown", function(e){
+ var t = e.target;
+ if(t && (t === this.document.body || t === this.document)){
+ // Since WebKit uses the inner DIV, we need to check and set position.
+ // See: #12024 as to why the change was made.
+ this.defer("placeCursorAtEnd");
+ }
+ });
+ }
+
+ if(has("ie")){
+ // Try to make sure 'hidden' elements aren't visible in edit mode (like browsers other than IE
+ // do). See #9103
+ try{
+ this.document.execCommand('RespectVisibilityInDesign', true, null);
+ }catch(e){/* squelch */}
+ }
+
+ this.isLoaded = true;
+
+ this.set('disabled', this.disabled); // initialize content to editable (or not)
+
+ // Note that setValue() call will only work after isLoaded is set to true (above)
+
+ // Set up a function to allow delaying the setValue until a callback is fired
+ // This ensures extensions like dijit.Editor have a way to hold the value set
+ // until plugins load (and do things like register filters).
+ var setContent = lang.hitch(this, function(){
+ this.setValue(html);
+ if(this.onLoadDeferred){
+ this.onLoadDeferred.resolve(true);
+ }
+ this.onDisplayChanged();
+ if(this.focusOnLoad){
+ // after the document loads, then set focus after updateInterval expires so that
+ // onNormalizedDisplayChanged has run to avoid input caret issues
+ ready(lang.hitch(this, "defer", "focus", this.updateInterval));
+ }
+ // Save off the initial content now
+ this.value = this.getValue(true);
+ });
+ if(this.setValueDeferred){
+ this.setValueDeferred.then(setContent);
+ }else{
+ setContent();
+ }
+ },
+
+ onKeyDown: function(/* Event */ e){
+ // summary:
+ // Handler for onkeydown event
+ // tags:
+ // protected
+
+ // we need this event at the moment to get the events from control keys
+ // such as the backspace. It might be possible to add this to Dojo, so that
+ // keyPress events can be emulated by the keyDown and keyUp detection.
+
+ if(e.keyCode === keys.TAB && this.isTabIndent ){
+ event.stop(e); //prevent tab from moving focus out of editor
+
+ // FIXME: this is a poor-man's indent/outdent. It would be
+ // better if it added 4 "&nbsp;" chars in an undoable way.
+ // Unfortunately pasteHTML does not prove to be undoable
+ if(this.queryCommandEnabled((e.shiftKey ? "outdent" : "indent"))){
+ this.execCommand((e.shiftKey ? "outdent" : "indent"));
+ }
+ }
+ if(has("ie")){
+ if(e.keyCode == keys.TAB && !this.isTabIndent){
+ if(e.shiftKey && !e.ctrlKey && !e.altKey){
+ // focus the BODY so the browser will tab away from it instead
+ this.iframe.focus();
+ }else if(!e.shiftKey && !e.ctrlKey && !e.altKey){
+ // focus the BODY so the browser will tab away from it instead
+ this.tabStop.focus();
+ }
+ }else if(e.keyCode === keys.BACKSPACE && this.document.selection.type === "Control"){
+ // IE has a bug where if a non-text object is selected in the editor,
+ // hitting backspace would act as if the browser's back button was
+ // clicked instead of deleting the object. see #1069
+ event.stop(e);
+ this.execCommand("delete");
+ }else if((65 <= e.keyCode && e.keyCode <= 90) ||
+ (e.keyCode>=37 && e.keyCode<=40) // FIXME: get this from connect() instead!
+ ){ //arrow keys
+ e.charCode = e.keyCode;
+ this.onKeyPress(e);
+ }
+ }
+ if(has("ff")){
+ if(e.keyCode === keys.PAGE_UP || e.keyCode === keys.PAGE_DOWN ){
+ if(this.editNode.clientHeight >= this.editNode.scrollHeight){
+ // Stop the event to prevent firefox from trapping the cursor when there is no scroll bar.
+ e.preventDefault();
+ }
+ }
+ }
+ return true;
+ },
+
+ onKeyUp: function(/*===== e =====*/){
+ // summary:
+ // Handler for onkeyup event
+ // tags:
+ // callback
+ },
+
+ setDisabled: function(/*Boolean*/ disabled){
+ // summary:
+ // Deprecated, use set('disabled', ...) instead.
+ // tags:
+ // deprecated
+ kernel.deprecated('dijit.Editor::setDisabled is deprecated','use dijit.Editor::attr("disabled",boolean) instead', 2.0);
+ this.set('disabled',disabled);
+ },
+ _setValueAttr: function(/*String*/ value){
+ // summary:
+ // Registers that attr("value", foo) should call setValue(foo)
+ this.setValue(value);
+ },
+ _setDisableSpellCheckAttr: function(/*Boolean*/ disabled){
+ if(this.document){
+ domAttr.set(this.document.body, "spellcheck", !disabled);
+ }else{
+ // try again after the editor is finished loading
+ this.onLoadDeferred.then(lang.hitch(this, function(){
+ domAttr.set(this.document.body, "spellcheck", !disabled);
+ }));
+ }
+ this._set("disableSpellCheck", disabled);
+ },
+
+ onKeyPress: function(e){
+ // summary:
+ // Handle the various key events
+ // tags:
+ // protected
+
+ var c = (e.keyChar && e.keyChar.toLowerCase()) || e.keyCode,
+ handlers = this._keyHandlers[c],
+ args = arguments;
+
+ if(handlers && !e.altKey){
+ array.some(handlers, function(h){
+ // treat meta- same as ctrl-, for benefit of mac users
+ if(!(h.shift ^ e.shiftKey) && !(h.ctrl ^ (e.ctrlKey||e.metaKey))){
+ if(!h.handler.apply(this, args)){
+ e.preventDefault();
+ }
+ return true;
+ }
+ }, this);
+ }
+
+ // function call after the character has been inserted
+ if(!this._onKeyHitch){
+ this._onKeyHitch = lang.hitch(this, "onKeyPressed");
+ }
+ this.defer("_onKeyHitch", 1);
+ return true;
+ },
+
+ addKeyHandler: function(/*String*/ key, /*Boolean*/ ctrl, /*Boolean*/ shift, /*Function*/ handler){
+ // summary:
+ // Add a handler for a keyboard shortcut
+ // description:
+ // The key argument should be in lowercase if it is a letter character
+ // tags:
+ // protected
+ if(!lang.isArray(this._keyHandlers[key])){
+ this._keyHandlers[key] = [];
+ }
+ //TODO: would be nice to make this a hash instead of an array for quick lookups
+ this._keyHandlers[key].push({
+ shift: shift || false,
+ ctrl: ctrl || false,
+ handler: handler
+ });
+ },
+
+ onKeyPressed: function(){
+ // summary:
+ // Handler for after the user has pressed a key, and the display has been updated.
+ // (Runs on a timer so that it runs after the display is updated)
+ // tags:
+ // private
+ this.onDisplayChanged(/*e*/); // can't pass in e
+ },
+
+ onClick: function(/*Event*/ e){
+ // summary:
+ // Handler for when the user clicks.
+ // tags:
+ // private
+
+ // console.info('onClick',this._tryDesignModeOn);
+ this.onDisplayChanged(e);
+ },
+
+ _onIEMouseDown: function(){
+ // summary:
+ // IE only to prevent 2 clicks to focus
+ // tags:
+ // protected
+
+ if(!this.focused && !this.disabled){
+ this.focus();
+ }
+ },
+
+ _onBlur: function(e){
+ // summary:
+ // Called from focus manager when focus has moved away from this editor
+ // tags:
+ // protected
+
+ // console.info('_onBlur')
+
+ this.inherited(arguments);
+
+ var newValue = this.getValue(true);
+ if(newValue !== this.value){
+ this.onChange(newValue);
+ }
+ this._set("value", newValue);
+ },
+
+ _onFocus: function(/*Event*/ e){
+ // summary:
+ // Called from focus manager when focus has moved into this editor
+ // tags:
+ // protected
+
+ // console.info('_onFocus')
+ if(!this.disabled){
+ if(!this._disabledOK){
+ this.set('disabled', false);
+ }
+ this.inherited(arguments);
+ }
+ },
+
+ // TODO: remove in 2.0
+ blur: function(){
+ // summary:
+ // Remove focus from this instance.
+ // tags:
+ // deprecated
+ if(!has("ie") && this.window.document.documentElement && this.window.document.documentElement.focus){
+ this.window.document.documentElement.focus();
+ }else if(this.ownerDocumentBody.focus){
+ this.ownerDocumentBody.focus();
+ }
+ },
+
+ focus: function(){
+ // summary:
+ // Move focus to this editor
+ if(!this.isLoaded){
+ this.focusOnLoad = true;
+ return;
+ }
+ if(this._cursorToStart){
+ delete this._cursorToStart;
+ if(this.editNode.childNodes){
+ this.placeCursorAtStart(); // this calls focus() so return
+ return;
+ }
+ }
+ if(!has("ie")){
+ focus.focus(this.iframe);
+ }else if(this.editNode && this.editNode.focus){
+ // editNode may be hidden in display:none div, lets just punt in this case
+ //this.editNode.focus(); -> causes IE to scroll always (strict and quirks mode) to the top the Iframe
+ // if we fire the event manually and let the browser handle the focusing, the latest
+ // cursor position is focused like in FF
+ this.iframe.fireEvent('onfocus', document.createEventObject()); // createEventObject only in IE
+ // }else{
+ // TODO: should we throw here?
+ // console.debug("Have no idea how to focus into the editor!");
+ }
+ },
+
+ // _lastUpdate: 0,
+ updateInterval: 200,
+ _updateTimer: null,
+ onDisplayChanged: function(/*Event*/ /*===== e =====*/){
+ // summary:
+ // This event will be fired every time the display context
+ // changes and the result needs to be reflected in the UI.
+ // description:
+ // If you don't want to have update too often,
+ // onNormalizedDisplayChanged should be used instead
+ // tags:
+ // private
+
+ // var _t=new Date();
+ if(this._updateTimer){
+ this._updateTimer.remove();
+ }
+ this._updateTimer = this.defer("onNormalizedDisplayChanged", this.updateInterval);
+
+ // Technically this should trigger a call to watch("value", ...) registered handlers,
+ // but getValue() is too slow to call on every keystroke so we don't.
+ },
+ onNormalizedDisplayChanged: function(){
+ // summary:
+ // This event is fired every updateInterval ms or more
+ // description:
+ // If something needs to happen immediately after a
+ // user change, please use onDisplayChanged instead.
+ // tags:
+ // private
+ delete this._updateTimer;
+ },
+ onChange: function(/*===== newContent =====*/){
+ // summary:
+ // This is fired if and only if the editor loses focus and
+ // the content is changed.
+ },
+ _normalizeCommand: function(/*String*/ cmd, /*Anything?*/argument){
+ // summary:
+ // Used as the advice function to map our
+ // normalized set of commands to those supported by the target
+ // browser.
+ // tags:
+ // private
+
+ var command = cmd.toLowerCase();
+ if(command === "formatblock"){
+ if(has("safari") && argument === undefined){ command = "heading"; }
+ }else if(command === "hilitecolor" && !has("mozilla")){
+ command = "backcolor";
+ }
+
+ return command;
+ },
+
+ _qcaCache: {},
+ queryCommandAvailable: function(/*String*/ command){
+ // summary:
+ // Tests whether a command is supported by the host. Clients
+ // SHOULD check whether a command is supported before attempting
+ // to use it, behaviour for unsupported commands is undefined.
+ // command:
+ // The command to test for
+ // tags:
+ // private
+
+ // memoizing version. See _queryCommandAvailable for computing version
+ var ca = this._qcaCache[command];
+ if(ca !== undefined){ return ca; }
+ return (this._qcaCache[command] = this._queryCommandAvailable(command));
+ },
+
+ _queryCommandAvailable: function(/*String*/ command){
+ // summary:
+ // See queryCommandAvailable().
+ // tags:
+ // private
+
+ var ie = 1;
+ var mozilla = 1 << 1;
+ var webkit = 1 << 2;
+ var opera = 1 << 3;
+
+ function isSupportedBy(browsers){
+ return {
+ ie: Boolean(browsers & ie),
+ mozilla: Boolean(browsers & mozilla),
+ webkit: Boolean(browsers & webkit),
+ opera: Boolean(browsers & opera)
+ };
+ }
+
+ var supportedBy = null;
+
+ switch(command.toLowerCase()){
+ case "bold": case "italic": case "underline":
+ case "subscript": case "superscript":
+ case "fontname": case "fontsize":
+ case "forecolor": case "hilitecolor":
+ case "justifycenter": case "justifyfull": case "justifyleft":
+ case "justifyright": case "delete": case "selectall": case "toggledir":
+ supportedBy = isSupportedBy(mozilla | ie | webkit | opera);
+ break;
+
+ case "createlink": case "unlink": case "removeformat":
+ case "inserthorizontalrule": case "insertimage":
+ case "insertorderedlist": case "insertunorderedlist":
+ case "indent": case "outdent": case "formatblock":
+ case "inserthtml": case "undo": case "redo": case "strikethrough": case "tabindent":
+ supportedBy = isSupportedBy(mozilla | ie | opera | webkit);
+ break;
+
+ case "blockdirltr": case "blockdirrtl":
+ case "dirltr": case "dirrtl":
+ case "inlinedirltr": case "inlinedirrtl":
+ supportedBy = isSupportedBy(ie);
+ break;
+ case "cut": case "copy": case "paste":
+ supportedBy = isSupportedBy( ie | mozilla | webkit | opera);
+ break;
+
+ case "inserttable":
+ supportedBy = isSupportedBy(mozilla | ie);
+ break;
+
+ case "insertcell": case "insertcol": case "insertrow":
+ case "deletecells": case "deletecols": case "deleterows":
+ case "mergecells": case "splitcell":
+ supportedBy = isSupportedBy(ie | mozilla);
+ break;
+
+ default: return false;
+ }
+
+ return (has("ie") && supportedBy.ie) ||
+ (has("mozilla") && supportedBy.mozilla) ||
+ (has("webkit") && supportedBy.webkit) ||
+ (has("opera") && supportedBy.opera); // Boolean return true if the command is supported, false otherwise
+ },
+
+ execCommand: function(/*String*/ command, argument){
+ // summary:
+ // Executes a command in the Rich Text area
+ // command:
+ // The command to execute
+ // argument:
+ // An optional argument to the command
+ // tags:
+ // protected
+ var returnValue;
+
+ //focus() is required for IE to work
+ //In addition, focus() makes sure after the execution of
+ //the command, the editor receives the focus as expected
+ this.focus();
+
+ command = this._normalizeCommand(command, argument);
+
+ if(argument !== undefined){
+ if(command === "heading"){
+ throw new Error("unimplemented");
+ }else if((command === "formatblock") && has("ie")){
+ argument = '<'+argument+'>';
+ }
+ }
+
+ //Check to see if we have any over-rides for commands, they will be functions on this
+ //widget of the form _commandImpl. If we don't, fall through to the basic native
+ //exec command of the browser.
+ var implFunc = "_" + command + "Impl";
+ if(this[implFunc]){
+ returnValue = this[implFunc](argument);
+ }else{
+ argument = arguments.length > 1 ? argument : null;
+ if(argument || command !== "createlink"){
+ returnValue = this.document.execCommand(command, false, argument);
+ }
+ }
+
+ this.onDisplayChanged();
+ return returnValue;
+ },
+
+ queryCommandEnabled: function(/*String*/ command){
+ // summary:
+ // Check whether a command is enabled or not.
+ // command:
+ // The command to execute
+ // tags:
+ // protected
+ if(this.disabled || !this._disabledOK){ return false; }
+
+ command = this._normalizeCommand(command);
+
+ //Check to see if we have any over-rides for commands, they will be functions on this
+ //widget of the form _commandEnabledImpl. If we don't, fall through to the basic native
+ //command of the browser.
+ var implFunc = "_" + command + "EnabledImpl";
+
+ if(this[implFunc]){
+ return this[implFunc](command);
+ }else{
+ return this._browserQueryCommandEnabled(command);
+ }
+ },
+
+ queryCommandState: function(command){
+ // summary:
+ // Check the state of a given command and returns true or false.
+ // tags:
+ // protected
+
+ if(this.disabled || !this._disabledOK){ return false; }
+ command = this._normalizeCommand(command);
+ try{
+ return this.document.queryCommandState(command);
+ }catch(e){
+ //Squelch, occurs if editor is hidden on FF 3 (and maybe others.)
+ return false;
+ }
+ },
+
+ queryCommandValue: function(command){
+ // summary:
+ // Check the value of a given command. This matters most for
+ // custom selections and complex values like font value setting.
+ // tags:
+ // protected
+
+ if(this.disabled || !this._disabledOK){ return false; }
+ var r;
+ command = this._normalizeCommand(command);
+ if(has("ie") && command === "formatblock"){
+ r = this._native2LocalFormatNames[this.document.queryCommandValue(command)];
+ }else if(has("mozilla") && command === "hilitecolor"){
+ var oldValue;
+ try{
+ oldValue = this.document.queryCommandValue("styleWithCSS");
+ }catch(e){
+ oldValue = false;
+ }
+ this.document.execCommand("styleWithCSS", false, true);
+ r = this.document.queryCommandValue(command);
+ this.document.execCommand("styleWithCSS", false, oldValue);
+ }else{
+ r = this.document.queryCommandValue(command);
+ }
+ return r;
+ },
+
+ // Misc.
+
+ _sCall: function(name, args){
+ // summary:
+ // Run the named method of dijit/_editor/selection over the
+ // current editor instance's window, with the passed args.
+ // tags:
+ // private
+ return win.withGlobal(this.window, name, selectionapi, args);
+ },
+
+ // FIXME: this is a TON of code duplication. Why?
+
+ placeCursorAtStart: function(){
+ // summary:
+ // Place the cursor at the start of the editing area.
+ // tags:
+ // private
+
+ this.focus();
+
+ //see comments in placeCursorAtEnd
+ var isvalid=false;
+ if(has("mozilla")){
+ // TODO: Is this branch even necessary?
+ var first=this.editNode.firstChild;
+ while(first){
+ if(first.nodeType === 3){
+ if(first.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+ isvalid=true;
+ this._sCall("selectElement", [ first ]);
+ break;
+ }
+ }else if(first.nodeType === 1){
+ isvalid=true;
+ var tg = first.tagName ? first.tagName.toLowerCase() : "";
+ // Collapse before childless tags.
+ if(/br|input|img|base|meta|area|basefont|hr|link/.test(tg)){
+ this._sCall("selectElement", [ first ]);
+ }else{
+ // Collapse inside tags with children.
+ this._sCall("selectElementChildren", [ first ]);
+ }
+ break;
+ }
+ first = first.nextSibling;
+ }
+ }else{
+ isvalid=true;
+ this._sCall("selectElementChildren", [ this.editNode ]);
+ }
+ if(isvalid){
+ this._sCall("collapse", [ true ]);
+ }
+ },
+
+ placeCursorAtEnd: function(){
+ // summary:
+ // Place the cursor at the end of the editing area.
+ // tags:
+ // private
+
+ this.focus();
+
+ //In mozilla, if last child is not a text node, we have to use
+ // selectElementChildren on this.editNode.lastChild otherwise the
+ // cursor would be placed at the end of the closing tag of
+ //this.editNode.lastChild
+ var isvalid=false;
+ if(has("mozilla")){
+ var last=this.editNode.lastChild;
+ while(last){
+ if(last.nodeType === 3){
+ if(last.nodeValue.replace(/^\s+|\s+$/g, "").length>0){
+ isvalid=true;
+ this._sCall("selectElement", [ last ]);
+ break;
+ }
+ }else if(last.nodeType === 1){
+ isvalid=true;
+ this._sCall("selectElement", [ last.lastChild || last]);
+ break;
+ }
+ last = last.previousSibling;
+ }
+ }else{
+ isvalid=true;
+ this._sCall("selectElementChildren", [ this.editNode ]);
+ }
+ if(isvalid){
+ this._sCall("collapse", [ false ]);
+ }
+ },
+
+ getValue: function(/*Boolean?*/ nonDestructive){
+ // summary:
+ // Return the current content of the editing area (post filters
+ // are applied). Users should call get('value') instead.
+ // nonDestructive:
+ // defaults to false. Should the post-filtering be run over a copy
+ // of the live DOM? Most users should pass "true" here unless they
+ // *really* know that none of the installed filters are going to
+ // mess up the editing session.
+ // tags:
+ // private
+ if(this.textarea){
+ if(this.isClosed || !this.isLoaded){
+ return this.textarea.value;
+ }
+ }
+
+ return this._postFilterContent(null, nonDestructive);
+ },
+ _getValueAttr: function(){
+ // summary:
+ // Hook to make attr("value") work
+ return this.getValue(true);
+ },
+
+ setValue: function(/*String*/ html){
+ // summary:
+ // This function sets the content. No undo history is preserved.
+ // Users should use set('value', ...) instead.
+ // tags:
+ // deprecated
+
+ // TODO: remove this and getValue() for 2.0, and move code to _setValueAttr()
+
+ if(!this.isLoaded){
+ // try again after the editor is finished loading
+ this.onLoadDeferred.then(lang.hitch(this, function(){
+ this.setValue(html);
+ }));
+ return;
+ }
+ this._cursorToStart = true;
+ if(this.textarea && (this.isClosed || !this.isLoaded)){
+ this.textarea.value=html;
+ }else{
+ html = this._preFilterContent(html);
+ var node = this.isClosed ? this.domNode : this.editNode;
+ if(html && has("mozilla") && html.toLowerCase() === "<p></p>"){
+ html = "<p>&#160;</p>"; // &nbsp;
+ }
+
+ // Use &nbsp; to avoid webkit problems where editor is disabled until the user clicks it
+ if(!html && has("webkit")){
+ html = "&#160;"; // &nbsp;
+ }
+ node.innerHTML = html;
+ this._preDomFilterContent(node);
+ }
+
+ this.onDisplayChanged();
+ this._set("value", this.getValue(true));
+ },
+
+ replaceValue: function(/*String*/ html){
+ // summary:
+ // This function set the content while trying to maintain the undo stack
+ // (now only works fine with Moz, this is identical to setValue in all
+ // other browsers)
+ // tags:
+ // protected
+
+ if(this.isClosed){
+ this.setValue(html);
+ }else if(this.window && this.window.getSelection && !has("mozilla")){ // Safari
+ // look ma! it's a totally f'd browser!
+ this.setValue(html);
+ }else if(this.window && this.window.getSelection){ // Moz
+ html = this._preFilterContent(html);
+ this.execCommand("selectall");
+ if(!html){
+ this._cursorToStart = true;
+ html = "&#160;"; // &nbsp;
+ }
+ this.execCommand("inserthtml", html);
+ this._preDomFilterContent(this.editNode);
+ }else if(this.document && this.document.selection){//IE
+ //In IE, when the first element is not a text node, say
+ //an <a> tag, when replacing the content of the editing
+ //area, the <a> tag will be around all the content
+ //so for now, use setValue for IE too
+ this.setValue(html);
+ }
+
+ this._set("value", this.getValue(true));
+ },
+
+ _preFilterContent: function(/*String*/ html){
+ // summary:
+ // Filter the input before setting the content of the editing
+ // area. DOM pre-filtering may happen after this
+ // string-based filtering takes place but as of 1.2, this is not
+ // guaranteed for operations such as the inserthtml command.
+ // tags:
+ // private
+
+ var ec = html;
+ array.forEach(this.contentPreFilters, function(ef){ if(ef){ ec = ef(ec); } });
+ return ec;
+ },
+ _preDomFilterContent: function(/*DomNode*/ dom){
+ // summary:
+ // filter the input's live DOM. All filter operations should be
+ // considered to be "live" and operating on the DOM that the user
+ // will be interacting with in their editing session.
+ // tags:
+ // private
+ dom = dom || this.editNode;
+ array.forEach(this.contentDomPreFilters, function(ef){
+ if(ef && lang.isFunction(ef)){
+ ef(dom);
+ }
+ }, this);
+ },
+
+ _postFilterContent: function(
+ /*DomNode|DomNode[]|String?*/ dom,
+ /*Boolean?*/ nonDestructive){
+ // summary:
+ // filter the output after getting the content of the editing area
+ //
+ // description:
+ // post-filtering allows plug-ins and users to specify any number
+ // of transforms over the editor's content, enabling many common
+ // use-cases such as transforming absolute to relative URLs (and
+ // vice-versa), ensuring conformance with a particular DTD, etc.
+ // The filters are registered in the contentDomPostFilters and
+ // contentPostFilters arrays. Each item in the
+ // contentDomPostFilters array is a function which takes a DOM
+ // Node or array of nodes as its only argument and returns the
+ // same. It is then passed down the chain for further filtering.
+ // The contentPostFilters array behaves the same way, except each
+ // member operates on strings. Together, the DOM and string-based
+ // filtering allow the full range of post-processing that should
+ // be necessaray to enable even the most agressive of post-editing
+ // conversions to take place.
+ //
+ // If nonDestructive is set to "true", the nodes are cloned before
+ // filtering proceeds to avoid potentially destructive transforms
+ // to the content which may still needed to be edited further.
+ // Once DOM filtering has taken place, the serialized version of
+ // the DOM which is passed is run through each of the
+ // contentPostFilters functions.
+ //
+ // dom:
+ // a node, set of nodes, which to filter using each of the current
+ // members of the contentDomPostFilters and contentPostFilters arrays.
+ //
+ // nonDestructive:
+ // defaults to "false". If true, ensures that filtering happens on
+ // a clone of the passed-in content and not the actual node
+ // itself.
+ //
+ // tags:
+ // private
+
+ var ec;
+ if(!lang.isString(dom)){
+ dom = dom || this.editNode;
+ if(this.contentDomPostFilters.length){
+ if(nonDestructive){
+ dom = lang.clone(dom);
+ }
+ array.forEach(this.contentDomPostFilters, function(ef){
+ dom = ef(dom);
+ });
+ }
+ ec = htmlapi.getChildrenHtml(dom);
+ }else{
+ ec = dom;
+ }
+
+ if(!lang.trim(ec.replace(/^\xA0\xA0*/, '').replace(/\xA0\xA0*$/, '')).length){
+ ec = "";
+ }
+
+ // if(has("ie")){
+ // //removing appended <P>&nbsp;</P> for IE
+ // ec = ec.replace(/(?:<p>&nbsp;</p>[\n\r]*)+$/i,"");
+ // }
+ array.forEach(this.contentPostFilters, function(ef){
+ ec = ef(ec);
+ });
+
+ return ec;
+ },
+
+ _saveContent: function(){
+ // summary:
+ // Saves the content in an onunload event if the editor has not been closed
+ // tags:
+ // private
+
+ var saveTextarea = dom.byId(dijit._scopeName + "._editor.RichText.value");
+ if(saveTextarea){
+ if(saveTextarea.value){
+ saveTextarea.value += this._SEPARATOR;
+ }
+ saveTextarea.value += this.name + this._NAME_CONTENT_SEP + this.getValue(true);
+ }
+ },
+
+
+ escapeXml: function(/*String*/ str, /*Boolean*/ noSingleQuotes){
+ // summary:
+ // Adds escape sequences for special characters in XML.
+ // Optionally skips escapes for single quotes
+ // tags:
+ // private
+
+ str = str.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;");
+ if(!noSingleQuotes){
+ str = str.replace(/'/gm, "&#39;");
+ }
+ return str; // string
+ },
+
+ getNodeHtml: function(/* DomNode */ node){
+ // summary:
+ // Deprecated. Use dijit/_editor/html::_getNodeHtml() instead.
+ // tags:
+ // deprecated
+ kernel.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit/_editor/html::getNodeHtml instead', 2);
+ return htmlapi.getNodeHtml(node); // String
+ },
+
+ getNodeChildrenHtml: function(/* DomNode */ dom){
+ // summary:
+ // Deprecated. Use dijit/_editor/html::getChildrenHtml() instead.
+ // tags:
+ // deprecated
+ kernel.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit/_editor/html::getChildrenHtml instead', 2);
+ return htmlapi.getChildrenHtml(dom);
+ },
+
+ close: function(/*Boolean?*/ save){
+ // summary:
+ // Kills the editor and optionally writes back the modified contents to the
+ // element from which it originated.
+ // save:
+ // Whether or not to save the changes. If false, the changes are discarded.
+ // tags:
+ // private
+
+ if(this.isClosed){ return; }
+
+ if(!arguments.length){ save = true; }
+ if(save){
+ this._set("value", this.getValue(true));
+ }
+
+ // line height is squashed for iframes
+ // FIXME: why was this here? if(this.iframe){ this.domNode.style.lineHeight = null; }
+
+ if(this.interval){ clearInterval(this.interval); }
+
+ if(this._webkitListener){
+ //Cleaup of WebKit fix: #9532
+ this.disconnect(this._webkitListener);
+ delete this._webkitListener;
+ }
+
+ // Guard against memory leaks on IE (see #9268)
+ if(has("ie")){
+ this.iframe.onfocus = null;
+ }
+ this.iframe._loadFunc = null;
+
+ if(this._iframeRegHandle){
+ this._iframeRegHandle.remove();
+ delete this._iframeRegHandle;
+ }
+
+ if(this.textarea){
+ var s = this.textarea.style;
+ s.position = "";
+ s.left = s.top = "";
+ if(has("ie")){
+ s.overflow = this.__overflow;
+ this.__overflow = null;
+ }
+ this.textarea.value = this.value;
+ domConstruct.destroy(this.domNode);
+ this.domNode = this.textarea;
+ }else{
+ // Note that this destroys the iframe
+ this.domNode.innerHTML = this.value;
+ }
+ delete this.iframe;
+
+ domClass.remove(this.domNode, this.baseClass);
+ this.isClosed = true;
+ this.isLoaded = false;
+
+ delete this.editNode;
+ delete this.focusNode;
+
+ if(this.window && this.window._frameElement){
+ this.window._frameElement = null;
+ }
+
+ this.window = null;
+ this.document = null;
+ this.editingArea = null;
+ this.editorObject = null;
+ },
+
+ destroy: function(){
+ if(!this.isClosed){ this.close(false); }
+ if(this._updateTimer){
+ this._updateTimer.remove();
+ }
+ this.inherited(arguments);
+ if(RichText._globalSaveHandler){
+ delete RichText._globalSaveHandler[this.id];
+ }
+ },
+
+ _removeMozBogus: function(/* String */ html){
+ // summary:
+ // Post filter to remove unwanted HTML attributes generated by mozilla
+ // tags:
+ // private
+ return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, '').replace(/_moz_resizing="(true|false)"/gi,''); // String
+ },
+ _removeWebkitBogus: function(/* String */ html){
+ // summary:
+ // Post filter to remove unwanted HTML attributes generated by webkit
+ // tags:
+ // private
+ html = html.replace(/\sclass="webkit-block-placeholder"/gi, '');
+ html = html.replace(/\sclass="apple-style-span"/gi, '');
+ // For some reason copy/paste sometime adds extra meta tags for charset on
+ // webkit (chrome) on mac.They need to be removed. See: #12007"
+ html = html.replace(/<meta charset=\"utf-8\" \/>/gi, '');
+ return html; // String
+ },
+ _normalizeFontStyle: function(/* String */ html){
+ // summary:
+ // Convert 'strong' and 'em' to 'b' and 'i'.
+ // description:
+ // Moz can not handle strong/em tags correctly, so to help
+ // mozilla and also to normalize output, convert them to 'b' and 'i'.
+ //
+ // Note the IE generates 'strong' and 'em' rather than 'b' and 'i'
+ // tags:
+ // private
+ return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2')
+ .replace(/<(\/)?em([ \>])/gi, '<$1i$2' ); // String
+ },
+
+ _preFixUrlAttributes: function(/* String */ html){
+ // summary:
+ // Pre-filter to do fixing to href attributes on `<a>` and `<img>` tags
+ // tags:
+ // private
+ return html.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,
+ '$1$4$2$3$5$2 _djrealurl=$2$3$5$2')
+ .replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,
+ '$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String
+ },
+
+ /*****************************************************************************
+ The following functions implement HTML manipulation commands for various
+ browser/contentEditable implementations. The goal of them is to enforce
+ standard behaviors of them.
+ ******************************************************************************/
+
+ /*** queryCommandEnabled implementations ***/
+
+ _browserQueryCommandEnabled: function(command){
+ // summary:
+ // Implementation to call to the native queryCommandEnabled of the browser.
+ // command:
+ // The command to check.
+ // tags:
+ // protected
+ if(!command) { return false; }
+ var elem = has("ie") ? this.document.selection.createRange() : this.document;
+ try{
+ return elem.queryCommandEnabled(command);
+ }catch(e){
+ return false;
+ }
+ },
+
+ _createlinkEnabledImpl: function(/*===== argument =====*/){
+ // summary:
+ // This function implements the test for if the create link
+ // command should be enabled or not.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var enabled = true;
+ if(has("opera")){
+ var sel = this.window.getSelection();
+ if(sel.isCollapsed){
+ enabled = true;
+ }else{
+ enabled = this.document.queryCommandEnabled("createlink");
+ }
+ }else{
+ enabled = this._browserQueryCommandEnabled("createlink");
+ }
+ return enabled;
+ },
+
+ _unlinkEnabledImpl: function(/*===== argument =====*/){
+ // summary:
+ // This function implements the test for if the unlink
+ // command should be enabled or not.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var enabled = true;
+ if(has("mozilla") || has("webkit")){
+ enabled = this._sCall("hasAncestorElement", ["a"]);
+ }else{
+ enabled = this._browserQueryCommandEnabled("unlink");
+ }
+ return enabled;
+ },
+
+ _inserttableEnabledImpl: function(/*===== argument =====*/){
+ // summary:
+ // This function implements the test for if the inserttable
+ // command should be enabled or not.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var enabled = true;
+ if(has("mozilla") || has("webkit")){
+ enabled = true;
+ }else{
+ enabled = this._browserQueryCommandEnabled("inserttable");
+ }
+ return enabled;
+ },
+
+ _cutEnabledImpl: function(/*===== argument =====*/){
+ // summary:
+ // This function implements the test for if the cut
+ // command should be enabled or not.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var enabled = true;
+ if(has("webkit")){
+ // WebKit deems clipboard activity as a security threat and natively would return false
+ var sel = this.window.getSelection();
+ if(sel){ sel = sel.toString(); }
+ enabled = !!sel;
+ }else{
+ enabled = this._browserQueryCommandEnabled("cut");
+ }
+ return enabled;
+ },
+
+ _copyEnabledImpl: function(/*===== argument =====*/){
+ // summary:
+ // This function implements the test for if the copy
+ // command should be enabled or not.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var enabled = true;
+ if(has("webkit")){
+ // WebKit deems clipboard activity as a security threat and natively would return false
+ var sel = this.window.getSelection();
+ if(sel){ sel = sel.toString(); }
+ enabled = !!sel;
+ }else{
+ enabled = this._browserQueryCommandEnabled("copy");
+ }
+ return enabled;
+ },
+
+ _pasteEnabledImpl: function(/*===== argument =====*/){
+ // summary:c
+ // This function implements the test for if the paste
+ // command should be enabled or not.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var enabled = true;
+ if(has("webkit")){
+ return true;
+ }else{
+ enabled = this._browserQueryCommandEnabled("paste");
+ }
+ return enabled;
+ },
+
+ /*** execCommand implementations ***/
+
+ _inserthorizontalruleImpl: function(argument){
+ // summary:
+ // This function implements the insertion of HTML 'HR' tags.
+ // into a point on the page. IE doesn't to it right, so
+ // we have to use an alternate form
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ if(has("ie")){
+ return this._inserthtmlImpl("<hr>");
+ }
+ return this.document.execCommand("inserthorizontalrule", false, argument);
+ },
+
+ _unlinkImpl: function(argument){
+ // summary:
+ // This function implements the unlink of an 'a' tag.
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ if((this.queryCommandEnabled("unlink")) && (has("mozilla") || has("webkit"))){
+ var a = this._sCall("getAncestorElement", [ "a" ]);
+ this._sCall("selectElement", [ a ]);
+ return this.document.execCommand("unlink", false, null);
+ }
+ return this.document.execCommand("unlink", false, argument);
+ },
+
+ _hilitecolorImpl: function(argument){
+ // summary:
+ // This function implements the hilitecolor command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var returnValue;
+ var isApplied = this._handleTextColorOrProperties("hilitecolor", argument);
+ if(!isApplied){
+ if(has("mozilla")){
+ // mozilla doesn't support hilitecolor properly when useCSS is
+ // set to false (bugzilla #279330)
+ this.document.execCommand("styleWithCSS", false, true);
+ console.log("Executing color command.");
+ returnValue = this.document.execCommand("hilitecolor", false, argument);
+ this.document.execCommand("styleWithCSS", false, false);
+ }else{
+ returnValue = this.document.execCommand("hilitecolor", false, argument);
+ }
+ }
+ return returnValue;
+ },
+
+ _backcolorImpl: function(argument){
+ // summary:
+ // This function implements the backcolor command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ if(has("ie")){
+ // Tested under IE 6 XP2, no problem here, comment out
+ // IE weirdly collapses ranges when we exec these commands, so prevent it
+ // var tr = this.document.selection.createRange();
+ argument = argument ? argument : null;
+ }
+ var isApplied = this._handleTextColorOrProperties("backcolor", argument);
+ if(!isApplied){
+ isApplied = this.document.execCommand("backcolor", false, argument);
+ }
+ return isApplied;
+ },
+
+ _forecolorImpl: function(argument){
+ // summary:
+ // This function implements the forecolor command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ if(has("ie")){
+ // Tested under IE 6 XP2, no problem here, comment out
+ // IE weirdly collapses ranges when we exec these commands, so prevent it
+ // var tr = this.document.selection.createRange();
+ argument = argument? argument : null;
+ }
+ var isApplied = false;
+ isApplied = this._handleTextColorOrProperties("forecolor", argument);
+ if(!isApplied){
+ isApplied = this.document.execCommand("forecolor", false, argument);
+ }
+ return isApplied;
+ },
+
+ _inserthtmlImpl: function(argument){
+ // summary:
+ // This function implements the insertion of HTML content into
+ // a point on the page.
+ // argument:
+ // The content to insert, if any.
+ // tags:
+ // protected
+ argument = this._preFilterContent(argument);
+ var rv = true;
+ if(has("ie")){
+ var insertRange = this.document.selection.createRange();
+ if(this.document.selection.type.toUpperCase() === 'CONTROL'){
+ var n=insertRange.item(0);
+ while(insertRange.length){
+ insertRange.remove(insertRange.item(0));
+ }
+ n.outerHTML=argument;
+ }else{
+ insertRange.pasteHTML(argument);
+ }
+ insertRange.select();
+ //insertRange.collapse(true);
+ }else if(has("mozilla") && !argument.length){
+ //mozilla can not inserthtml an empty html to delete current selection
+ //so we delete the selection instead in this case
+ this._sCall("remove"); // FIXME
+ }else{
+ rv = this.document.execCommand("inserthtml", false, argument);
+ }
+ return rv;
+ },
+
+ _boldImpl: function(argument){
+ // summary:
+ // This function implements an over-ride of the bold command.
+ // argument:
+ // Not used, operates by selection.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ this._adaptIESelection();
+ applied = this._adaptIEFormatAreaAndExec("bold");
+ }
+ if(!applied){
+ applied = this.document.execCommand("bold", false, argument);
+ }
+ return applied;
+ },
+
+ _italicImpl: function(argument){
+ // summary:
+ // This function implements an over-ride of the italic command.
+ // argument:
+ // Not used, operates by selection.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ this._adaptIESelection();
+ applied = this._adaptIEFormatAreaAndExec("italic");
+ }
+ if(!applied){
+ applied = this.document.execCommand("italic", false, argument);
+ }
+ return applied;
+ },
+
+ _underlineImpl: function(argument){
+ // summary:
+ // This function implements an over-ride of the underline command.
+ // argument:
+ // Not used, operates by selection.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ this._adaptIESelection();
+ applied = this._adaptIEFormatAreaAndExec("underline");
+ }
+ if(!applied){
+ applied = this.document.execCommand("underline", false, argument);
+ }
+ return applied;
+ },
+
+ _strikethroughImpl: function(argument){
+ // summary:
+ // This function implements an over-ride of the strikethrough command.
+ // argument:
+ // Not used, operates by selection.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ this._adaptIESelection();
+ applied = this._adaptIEFormatAreaAndExec("strikethrough");
+ }
+ if(!applied){
+ applied = this.document.execCommand("strikethrough", false, argument);
+ }
+ return applied;
+ },
+
+ _superscriptImpl: function(argument){
+ // summary:
+ // This function implements an over-ride of the superscript command.
+ // argument:
+ // Not used, operates by selection.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ this._adaptIESelection();
+ applied = this._adaptIEFormatAreaAndExec("superscript");
+ }
+ if(!applied){
+ applied = this.document.execCommand("superscript", false, argument);
+ }
+ return applied;
+ },
+
+ _subscriptImpl: function(argument){
+ // summary:
+ // This function implements an over-ride of the superscript command.
+ // argument:
+ // Not used, operates by selection.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ this._adaptIESelection();
+ applied = this._adaptIEFormatAreaAndExec("subscript");
+
+ }
+ if(!applied){
+ applied = this.document.execCommand("subscript", false, argument);
+ }
+ return applied;
+ },
+
+ _fontnameImpl: function(argument){
+ // summary:
+ // This function implements the fontname command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var isApplied;
+ if(has("ie")){
+ isApplied = this._handleTextColorOrProperties("fontname", argument);
+ }
+ if(!isApplied){
+ isApplied = this.document.execCommand("fontname", false, argument);
+ }
+ return isApplied;
+ },
+
+ _fontsizeImpl: function(argument){
+ // summary:
+ // This function implements the fontsize command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var isApplied;
+ if(has("ie")){
+ isApplied = this._handleTextColorOrProperties("fontsize", argument);
+ }
+ if(!isApplied){
+ isApplied = this.document.execCommand("fontsize", false, argument);
+ }
+ return isApplied;
+ },
+
+ _insertorderedlistImpl: function(argument){
+ // summary:
+ // This function implements the insertorderedlist command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ applied = this._adaptIEList("insertorderedlist", argument);
+ }
+ if(!applied){
+ applied = this.document.execCommand("insertorderedlist", false, argument);
+ }
+ return applied;
+ },
+
+ _insertunorderedlistImpl: function(argument){
+ // summary:
+ // This function implements the insertunorderedlist command
+ // argument:
+ // arguments to the exec command, if any.
+ // tags:
+ // protected
+ var applied = false;
+ if(has("ie")){
+ applied = this._adaptIEList("insertunorderedlist", argument);
+ }
+ if(!applied){
+ applied = this.document.execCommand("insertunorderedlist", false, argument);
+ }
+ return applied;
+ },
+
+ getHeaderHeight: function(){
+ // summary:
+ // A function for obtaining the height of the header node
+ return this._getNodeChildrenHeight(this.header); // Number
+ },
+
+ getFooterHeight: function(){
+ // summary:
+ // A function for obtaining the height of the footer node
+ return this._getNodeChildrenHeight(this.footer); // Number
+ },
+
+ _getNodeChildrenHeight: function(node){
+ // summary:
+ // An internal function for computing the cumulative height of all child nodes of 'node'
+ // node:
+ // The node to process the children of;
+ var h = 0;
+ if(node && node.childNodes){
+ // IE didn't compute it right when position was obtained on the node directly is some cases,
+ // so we have to walk over all the children manually.
+ var i;
+ for(i = 0; i < node.childNodes.length; i++){
+ var size = domGeometry.position(node.childNodes[i]);
+ h += size.h;
+ }
+ }
+ return h; // Number
+ },
+
+ _isNodeEmpty: function(node, startOffset){
+ // summary:
+ // Function to test if a node is devoid of real content.
+ // node:
+ // The node to check.
+ // tags:
+ // private.
+ if(node.nodeType === 1/*element*/){
+ if(node.childNodes.length > 0){
+ return this._isNodeEmpty(node.childNodes[0], startOffset);
+ }
+ return true;
+ }else if(node.nodeType === 3/*text*/){
+ return (node.nodeValue.substring(startOffset) === "");
+ }
+ return false;
+ },
+
+ _removeStartingRangeFromRange: function(node, range){
+ // summary:
+ // Function to adjust selection range by removing the current
+ // start node.
+ // node:
+ // The node to remove from the starting range.
+ // range:
+ // The range to adapt.
+ // tags:
+ // private
+ if(node.nextSibling){
+ range.setStart(node.nextSibling,0);
+ }else{
+ var parent = node.parentNode;
+ while(parent && parent.nextSibling == null){
+ //move up the tree until we find a parent that has another node, that node will be the next node
+ parent = parent.parentNode;
+ }
+ if(parent){
+ range.setStart(parent.nextSibling,0);
+ }
+ }
+ return range;
+ },
+
+ _adaptIESelection: function(){
+ // summary:
+ // Function to adapt the IE range by removing leading 'newlines'
+ // Needed to fix issue with bold/italics/underline not working if
+ // range included leading 'newlines'.
+ // In IE, if a user starts a selection at the very end of a line,
+ // then the native browser commands will fail to execute correctly.
+ // To work around the issue, we can remove all empty nodes from
+ // the start of the range selection.
+ var selection = rangeapi.getSelection(this.window);
+ if(selection && selection.rangeCount && !selection.isCollapsed){
+ var range = selection.getRangeAt(0);
+ var firstNode = range.startContainer;
+ var startOffset = range.startOffset;
+
+ while(firstNode.nodeType === 3/*text*/ && startOffset >= firstNode.length && firstNode.nextSibling){
+ //traverse the text nodes until we get to the one that is actually highlighted
+ startOffset = startOffset - firstNode.length;
+ firstNode = firstNode.nextSibling;
+ }
+
+ //Remove the starting ranges until the range does not start with an empty node.
+ var lastNode=null;
+ while(this._isNodeEmpty(firstNode, startOffset) && firstNode !== lastNode){
+ lastNode =firstNode; //this will break the loop in case we can't find the next sibling
+ range = this._removeStartingRangeFromRange(firstNode, range); //move the start container to the next node in the range
+ firstNode = range.startContainer;
+ startOffset = 0; //start at the beginning of the new starting range
+ }
+ selection.removeAllRanges();// this will work as long as users cannot select multiple ranges. I have not been able to do that in the editor.
+ selection.addRange(range);
+ }
+ },
+
+ _adaptIEFormatAreaAndExec: function(command){
+ // summary:
+ // Function to handle IE's quirkiness regarding how it handles
+ // format commands on a word. This involves a lit of node splitting
+ // and format cloning.
+ // command:
+ // The format command, needed to check if the desired
+ // command is true or not.
+ var selection = rangeapi.getSelection(this.window);
+ var doc = this.document;
+ var rs, ret, range, txt, startNode, endNode, breaker, sNode;
+ if(command && selection && selection.isCollapsed){
+ var isApplied = this.queryCommandValue(command);
+ if(isApplied){
+
+ // We have to split backwards until we hit the format
+ var nNames = this._tagNamesForCommand(command);
+ range = selection.getRangeAt(0);
+ var fs = range.startContainer;
+ if(fs.nodeType === 3){
+ var offset = range.endOffset;
+ if(fs.length < offset){
+ //We are not looking from the right node, try to locate the correct one
+ ret = this._adjustNodeAndOffset(rs, offset);
+ fs = ret.node;
+ offset = ret.offset;
+ }
+ }
+ var topNode;
+ while(fs && fs !== this.editNode){
+ // We have to walk back and see if this is still a format or not.
+ // Hm, how do I do this?
+ var tName = fs.tagName? fs.tagName.toLowerCase() : "";
+ if(array.indexOf(nNames, tName) > -1){
+ topNode = fs;
+ break;
+ }
+ fs = fs.parentNode;
+ }
+
+ // Okay, we have a stopping place, time to split things apart.
+ if(topNode){
+ // Okay, we know how far we have to split backwards, so we have to split now.
+ rs = range.startContainer;
+ var newblock = doc.createElement(topNode.tagName);
+ domConstruct.place(newblock, topNode, "after");
+ if(rs && rs.nodeType === 3){
+ // Text node, we have to split it.
+ var nodeToMove, tNode;
+ var endOffset = range.endOffset;
+ if(rs.length < endOffset){
+ //We are not splitting the right node, try to locate the correct one
+ ret = this._adjustNodeAndOffset(rs, endOffset);
+ rs = ret.node;
+ endOffset = ret.offset;
+ }
+
+ txt = rs.nodeValue;
+ startNode = doc.createTextNode(txt.substring(0, endOffset));
+ var endText = txt.substring(endOffset, txt.length);
+ if(endText){
+ endNode = doc.createTextNode(endText);
+ }
+ // Place the split, then remove original nodes.
+ domConstruct.place(startNode, rs, "before");
+ if(endNode){
+ breaker = doc.createElement("span");
+ breaker.className = "ieFormatBreakerSpan";
+ domConstruct.place(breaker, rs, "after");
+ domConstruct.place(endNode, breaker, "after");
+ endNode = breaker;
+ }
+ domConstruct.destroy(rs);
+
+ // Okay, we split the text. Now we need to see if we're
+ // parented to the block element we're splitting and if
+ // not, we have to split all the way up. Ugh.
+ var parentC = startNode.parentNode;
+ var tagList = [];
+ var tagData;
+ while(parentC !== topNode){
+ var tg = parentC.tagName;
+ tagData = {tagName: tg};
+ tagList.push(tagData);
+
+ var newTg = doc.createElement(tg);
+ // Clone over any 'style' data.
+ if(parentC.style){
+ if(newTg.style){
+ if(parentC.style.cssText){
+ newTg.style.cssText = parentC.style.cssText;
+ tagData.cssText = parentC.style.cssText;
+ }
+ }
+ }
+ // If font also need to clone over any font data.
+ if(parentC.tagName === "FONT"){
+ if(parentC.color){
+ newTg.color = parentC.color;
+ tagData.color = parentC.color;
+ }
+ if(parentC.face){
+ newTg.face = parentC.face;
+ tagData.face = parentC.face;
+ }
+ if(parentC.size){ // this check was necessary on IE
+ newTg.size = parentC.size;
+ tagData.size = parentC.size;
+ }
+ }
+ if(parentC.className){
+ newTg.className = parentC.className;
+ tagData.className = parentC.className;
+ }
+
+ // Now move end node and every sibling
+ // after it over into the new tag.
+ if(endNode){
+ nodeToMove = endNode;
+ while(nodeToMove){
+ tNode = nodeToMove.nextSibling;
+ newTg.appendChild(nodeToMove);
+ nodeToMove = tNode;
+ }
+ }
+ if(newTg.tagName == parentC.tagName){
+ breaker = doc.createElement("span");
+ breaker.className = "ieFormatBreakerSpan";
+ domConstruct.place(breaker, parentC, "after");
+ domConstruct.place(newTg, breaker, "after");
+ }else{
+ domConstruct.place(newTg, parentC, "after");
+ }
+ startNode = parentC;
+ endNode = newTg;
+ parentC = parentC.parentNode;
+ }
+
+ // Lastly, move the split out all the split tags
+ // to the new block as they should now be split properly.
+ if(endNode){
+ nodeToMove = endNode;
+ if(nodeToMove.nodeType === 1 || (nodeToMove.nodeType === 3 && nodeToMove.nodeValue)){
+ // Non-blank text and non-text nodes need to clear out that blank space
+ // before moving the contents.
+ newblock.innerHTML = "";
+ }
+ while(nodeToMove){
+ tNode = nodeToMove.nextSibling;
+ newblock.appendChild(nodeToMove);
+ nodeToMove = tNode;
+ }
+ }
+
+ // We had intermediate tags, we have to now recreate them inbetween the split
+ // and restore what styles, classnames, etc, we can.
+ var newrange;
+ if(tagList.length){
+ tagData = tagList.pop();
+ var newContTag = doc.createElement(tagData.tagName);
+ if(tagData.cssText && newContTag.style){
+ newContTag.style.cssText = tagData.cssText;
+ }
+ if(tagData.className){
+ newContTag.className = tagData.className;
+ }
+ if(tagData.tagName === "FONT"){
+ if(tagData.color){
+ newContTag.color = tagData.color;
+ }
+ if(tagData.face){
+ newContTag.face = tagData.face;
+ }
+ if(tagData.size){
+ newContTag.size = tagData.size;
+ }
+ }
+ domConstruct.place(newContTag, newblock, "before");
+ while(tagList.length){
+ tagData = tagList.pop();
+ var newTgNode = doc.createElement(tagData.tagName);
+ if(tagData.cssText && newTgNode.style){
+ newTgNode.style.cssText = tagData.cssText;
+ }
+ if(tagData.className){
+ newTgNode.className = tagData.className;
+ }
+ if(tagData.tagName === "FONT"){
+ if(tagData.color){
+ newTgNode.color = tagData.color;
+ }
+ if(tagData.face){
+ newTgNode.face = tagData.face;
+ }
+ if(tagData.size){
+ newTgNode.size = tagData.size;
+ }
+ }
+ newContTag.appendChild(newTgNode);
+ newContTag = newTgNode;
+ }
+
+ // Okay, everything is theoretically split apart and removed from the content
+ // so insert the dummy text to select, select it, then
+ // clear to position cursor.
+ sNode = doc.createTextNode(".");
+ breaker.appendChild(sNode);
+ newContTag.appendChild(sNode);
+ newrange = rangeapi.create(this.window);
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ this._sCall("collapse", [false]);
+ sNode.parentNode.innerHTML = "";
+ }else{
+ // No extra tags, so we have to insert a breaker point and rely
+ // on filters to remove it later.
+ breaker = doc.createElement("span");
+ breaker.className="ieFormatBreakerSpan";
+ sNode = doc.createTextNode(".");
+ breaker.appendChild(sNode);
+ domConstruct.place(breaker, newblock, "before");
+ newrange = rangeapi.create(this.window);
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ this._sCall("collapse", [false]);
+ sNode.parentNode.innerHTML = "";
+ }
+ if(!newblock.firstChild){
+ // Empty, we don't need it. Split was at end or similar
+ // So, remove it.
+ domConstruct.destroy(newblock);
+ }
+ return true;
+ }
+ }
+ return false;
+ }else{
+ range = selection.getRangeAt(0);
+ rs = range.startContainer;
+ if(rs && rs.nodeType === 3){
+ // Text node, we have to split it.
+ var offset = range.startOffset;
+ if(rs.length < offset){
+ //We are not splitting the right node, try to locate the correct one
+ ret = this._adjustNodeAndOffset(rs, offset);
+ rs = ret.node;
+ offset = ret.offset;
+ }
+ txt = rs.nodeValue;
+ startNode = doc.createTextNode(txt.substring(0, offset));
+ var endText = txt.substring(offset);
+ if(endText !== ""){
+ endNode = doc.createTextNode(txt.substring(offset));
+ }
+ // Create a space, we'll select and bold it, so
+ // the whole word doesn't get bolded
+ breaker = doc.createElement("span");
+ sNode = doc.createTextNode(".");
+ breaker.appendChild(sNode);
+ if(startNode.length){
+ domConstruct.place(startNode, rs, "after");
+ }else{
+ startNode = rs;
+ }
+ domConstruct.place(breaker, startNode, "after");
+ if(endNode){
+ domConstruct.place(endNode, breaker, "after");
+ }
+ domConstruct.destroy(rs);
+ var newrange = rangeapi.create(this.window);
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ doc.execCommand(command);
+ domConstruct.place(breaker.firstChild, breaker, "before");
+ domConstruct.destroy(breaker);
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ this._sCall("collapse", [false]);
+ sNode.parentNode.innerHTML = "";
+ return true;
+ }
+ }
+ }else{
+ return false;
+ }
+ },
+
+ _adaptIEList: function(command /*===== , argument =====*/){
+ // summary:
+ // This function handles normalizing the IE list behavior as
+ // much as possible.
+ // command:
+ // The list command to execute.
+ // argument:
+ // Any additional argument.
+ // tags:
+ // private
+ var selection = rangeapi.getSelection(this.window);
+ if(selection.isCollapsed){
+ // In the case of no selection, lets commonize the behavior and
+ // make sure that it indents if needed.
+ if(selection.rangeCount && !this.queryCommandValue(command)){
+ var range = selection.getRangeAt(0);
+ var sc = range.startContainer;
+ if(sc && sc.nodeType == 3){
+ // text node. Lets see if there is a node before it that isn't
+ // some sort of breaker.
+ if(!range.startOffset){
+ // We're at the beginning of a text area. It may have been br split
+ // Who knows? In any event, we must create the list manually
+ // or IE may shove too much into the list element. It seems to
+ // grab content before the text node too if it's br split.
+ // Why can't IE work like everyone else?
+
+ // Create a space, we'll select and bold it, so
+ // the whole word doesn't get bolded
+ var lType = "ul";
+ if(command === "insertorderedlist"){
+ lType = "ol";
+ }
+ var list = this.document.createElement(lType);
+ var li = domConstruct.create("li", null, list);
+ domConstruct.place(list, sc, "before");
+ // Move in the text node as part of the li.
+ li.appendChild(sc);
+ // We need a br after it or the enter key handler
+ // sometimes throws errors.
+ domConstruct.create("br", null, list, "after");
+ // Okay, now lets move our cursor to the beginning.
+ var newrange = rangeapi.create(this.window);
+ newrange.setStart(sc, 0);
+ newrange.setEnd(sc, sc.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ this._sCall("collapse", [true]);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ },
+
+ _handleTextColorOrProperties: function(command, argument){
+ // summary:
+ // This function handles appplying text color as best it is
+ // able to do so when the selection is collapsed, making the
+ // behavior cross-browser consistent. It also handles the name
+ // and size for IE.
+ // command:
+ // The command.
+ // argument:
+ // Any additional arguments.
+ // tags:
+ // private
+ var selection = rangeapi.getSelection(this.window);
+ var doc = this.document;
+ var rs, ret, range, txt, startNode, endNode, breaker, sNode;
+ argument = argument || null;
+ if(command && selection && selection.isCollapsed){
+ if(selection.rangeCount){
+ range = selection.getRangeAt(0);
+ rs = range.startContainer;
+ if(rs && rs.nodeType === 3){
+ // Text node, we have to split it.
+ var offset = range.startOffset;
+ if(rs.length < offset){
+ //We are not splitting the right node, try to locate the correct one
+ ret = this._adjustNodeAndOffset(rs, offset);
+ rs = ret.node;
+ offset = ret.offset;
+ }
+ txt = rs.nodeValue;
+ startNode = doc.createTextNode(txt.substring(0, offset));
+ var endText = txt.substring(offset);
+ if(endText !== ""){
+ endNode = doc.createTextNode(txt.substring(offset));
+ }
+ // Create a space, we'll select and bold it, so
+ // the whole word doesn't get bolded
+ breaker = doc.createElement("span");
+ sNode = doc.createTextNode(".");
+ breaker.appendChild(sNode);
+ // Create a junk node to avoid it trying to style the breaker.
+ // This will get destroyed later.
+ var extraSpan = doc.createElement("span");
+ breaker.appendChild(extraSpan);
+ if(startNode.length){
+ domConstruct.place(startNode, rs, "after");
+ }else{
+ startNode = rs;
+ }
+ domConstruct.place(breaker, startNode, "after");
+ if(endNode){
+ domConstruct.place(endNode, breaker, "after");
+ }
+ domConstruct.destroy(rs);
+ var newrange = rangeapi.create(this.window);
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(has("webkit")){
+ // WebKit is frustrating with positioning the cursor.
+ // It stinks to have a selected space, but there really
+ // isn't much choice here.
+ var style = "color";
+ if(command === "hilitecolor" || command === "backcolor"){
+ style = "backgroundColor";
+ }
+ domStyle.set(breaker, style, argument);
+ this._sCall("remove", []);
+ domConstruct.destroy(extraSpan);
+ breaker.innerHTML = "&#160;"; // &nbsp;
+ this._sCall("selectElement", [breaker]);
+ this.focus();
+ }else{
+ this.execCommand(command, argument);
+ domConstruct.place(breaker.firstChild, breaker, "before");
+ domConstruct.destroy(breaker);
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ this._sCall("collapse", [false]);
+ sNode.parentNode.removeChild(sNode);
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+
+ _adjustNodeAndOffset: function(/*DomNode*/node, /*Int*/offset){
+ // summary:
+ // In the case there are multiple text nodes in a row the offset may not be within the node.
+ // If the offset is larger than the node length, it will attempt to find
+ // the next text sibling until it locates the text node in which the offset refers to
+ // node:
+ // The node to check.
+ // offset:
+ // The position to find within the text node
+ // tags:
+ // private.
+ while(node.length < offset && node.nextSibling && node.nextSibling.nodeType === 3){
+ //Adjust the offset and node in the case of multiple text nodes in a row
+ offset = offset - node.length;
+ node = node.nextSibling;
+ }
+ return {"node": node, "offset": offset};
+ },
+
+ _tagNamesForCommand: function(command){
+ // summary:
+ // Function to return the tab names that are associated
+ // with a particular style.
+ // command: String
+ // The command to return tags for.
+ // tags:
+ // private
+ if(command === "bold"){
+ return ["b", "strong"];
+ }else if(command === "italic"){
+ return ["i","em"];
+ }else if(command === "strikethrough"){
+ return ["s", "strike"];
+ }else if(command === "superscript"){
+ return ["sup"];
+ }else if(command === "subscript"){
+ return ["sub"];
+ }else if(command === "underline"){
+ return ["u"];
+ }
+ return [];
+ },
+
+ _stripBreakerNodes: function(/*DOMNode*/ node){
+ // summary:
+ // Function for stripping out the breaker spans inserted by the formatting command.
+ // Registered as a filter for IE, handles the breaker spans needed to fix up
+ // How bold/italic/etc, work when selection is collapsed (single cursor).
+ if(!this.isLoaded){ return; } // this method requires init to be complete
+ query(".ieFormatBreakerSpan", node).forEach(function(b){
+ while(b.firstChild){
+ domConstruct.place(b.firstChild, b, "before");
+ }
+ domConstruct.destroy(b);
+ });
+ return node;
+ }
+});
+
+return RichText;
+
+});
diff --git a/lib/dijit/_editor/_Plugin.js b/lib/dijit/_editor/_Plugin.js
index 7eff3ba01..36b7fae98 100644
--- a/lib/dijit/_editor/_Plugin.js
+++ b/lib/dijit/_editor/_Plugin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/_Plugin",["dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","../form/Button"],function(_1,_2,_3,_4){var _5=_2("dijit._editor._Plugin",null,{constructor:function(_6){this.params=_6||{};_3.mixin(this,this.params);this._connects=[];this._attrPairNames={};},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,command:"",useDefaultCommand:true,buttonClass:_4,disabled:false,getLabel:function(_7){return this.editor.commands[_7];},_initButton:function(){if(this.command.length){var _8=this.getLabel(this.command),_9=this.editor,_a=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);if(!this.button){var _b=_3.mixin({label:_8,dir:_9.dir,lang:_9.lang,showLabel:false,iconClass:_a,dropDown:this.dropDown,tabIndex:"-1"},this.params||{});this.button=new this.buttonClass(_b);}}if(this.get("disabled")&&this.button){this.button.set("disabled",this.get("disabled"));}},destroy:function(){var h;while(h=this._connects.pop()){h.remove();}if(this.dropDown){this.dropDown.destroyRecursive();}},connect:function(o,f,tf){this._connects.push(_1.connect(o,f,this,tf));},updateState:function(){var e=this.editor,c=this.command,_c,_d;if(!e||!e.isLoaded||!c.length){return;}var _e=this.get("disabled");if(this.button){try{_d=!_e&&e.queryCommandEnabled(c);if(this.enabled!==_d){this.enabled=_d;this.button.set("disabled",!_d);}if(typeof this.button.checked=="boolean"){_c=e.queryCommandState(c);if(this.checked!==_c){this.checked=_c;this.button.set("checked",e.queryCommandState(c));}}}catch(e){}}},setEditor:function(_f){this.editor=_f;this._initButton();if(this.button&&this.useDefaultCommand){if(this.editor.queryCommandAvailable(this.command)){this.connect(this.button,"onClick",_3.hitch(this.editor,"execCommand",this.command,this.commandArg));}else{this.button.domNode.style.display="none";}}this.connect(this.editor,"onNormalizedDisplayChanged","updateState");},setToolbar:function(_10){if(this.button){_10.addChild(this.button);}},set:function(_11,_12){if(typeof _11==="object"){for(var x in _11){this.set(x,_11[x]);}return this;}var _13=this._getAttrNames(_11);if(this[_13.s]){var _14=this[_13.s].apply(this,Array.prototype.slice.call(arguments,1));}else{this._set(_11,_12);}return _14||this;},get:function(_15){var _16=this._getAttrNames(_15);return this[_16.g]?this[_16.g]():this[_15];},_setDisabledAttr:function(_17){this.disabled=_17;this.updateState();},_getAttrNames:function(_18){var apn=this._attrPairNames;if(apn[_18]){return apn[_18];}var uc=_18.charAt(0).toUpperCase()+_18.substr(1);return (apn[_18]={s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});},_set:function(_19,_1a){this[_19]=_1a;}});_5.registry={};return _5;}); \ No newline at end of file
+define("dijit/_editor/_Plugin",["dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","../form/Button"],function(_1,_2,_3,_4){var _5=_2("dijit._editor._Plugin",null,{constructor:function(_6){this.params=_6||{};_3.mixin(this,this.params);this._connects=[];this._attrPairNames={};},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,command:"",useDefaultCommand:true,buttonClass:_4,disabled:false,getLabel:function(_7){return this.editor.commands[_7];},_initButton:function(){if(this.command.length){var _8=this.getLabel(this.command),_9=this.editor,_a=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);if(!this.button){var _b=_3.mixin({label:_8,ownerDocument:_9.ownerDocument,dir:_9.dir,lang:_9.lang,showLabel:false,iconClass:_a,dropDown:this.dropDown,tabIndex:"-1"},this.params||{});this.button=new this.buttonClass(_b);}}if(this.get("disabled")&&this.button){this.button.set("disabled",this.get("disabled"));}},destroy:function(){var h;while(h=this._connects.pop()){h.remove();}if(this.dropDown){this.dropDown.destroyRecursive();}},connect:function(o,f,tf){this._connects.push(_1.connect(o,f,this,tf));},updateState:function(){var e=this.editor,c=this.command,_c,_d;if(!e||!e.isLoaded||!c.length){return;}var _e=this.get("disabled");if(this.button){try{_d=!_e&&e.queryCommandEnabled(c);if(this.enabled!==_d){this.enabled=_d;this.button.set("disabled",!_d);}if(_d){if(typeof this.button.checked=="boolean"){_c=e.queryCommandState(c);if(this.checked!==_c){this.checked=_c;this.button.set("checked",e.queryCommandState(c));}}}}catch(e){}}},setEditor:function(_f){this.editor=_f;this._initButton();if(this.button&&this.useDefaultCommand){if(this.editor.queryCommandAvailable(this.command)){this.connect(this.button,"onClick",_3.hitch(this.editor,"execCommand",this.command,this.commandArg));}else{this.button.domNode.style.display="none";}}this.connect(this.editor,"onNormalizedDisplayChanged","updateState");},setToolbar:function(_10){if(this.button){_10.addChild(this.button);}},set:function(_11,_12){if(typeof _11==="object"){for(var x in _11){this.set(x,_11[x]);}return this;}var _13=this._getAttrNames(_11);if(this[_13.s]){var _14=this[_13.s].apply(this,Array.prototype.slice.call(arguments,1));}else{this._set(_11,_12);}return _14||this;},get:function(_15){var _16=this._getAttrNames(_15);return this[_16.g]?this[_16.g]():this[_15];},_setDisabledAttr:function(_17){this.disabled=_17;this.updateState();},_getAttrNames:function(_18){var apn=this._attrPairNames;if(apn[_18]){return apn[_18];}var uc=_18.charAt(0).toUpperCase()+_18.substr(1);return (apn[_18]={s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});},_set:function(_19,_1a){this[_19]=_1a;}});_5.registry={};return _5;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/_Plugin.js.uncompressed.js b/lib/dijit/_editor/_Plugin.js.uncompressed.js
new file mode 100644
index 000000000..18d8d4e25
--- /dev/null
+++ b/lib/dijit/_editor/_Plugin.js.uncompressed.js
@@ -0,0 +1,302 @@
+define("dijit/_editor/_Plugin", [
+ "dojo/_base/connect", // connect.connect
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.mixin, lang.hitch
+ "../form/Button"
+], function(connect, declare, lang, Button){
+
+// module:
+// dijit/_editor/_Plugin
+// summary:
+// Base class for a "plugin" to the editor, which is usually
+// a single button on the Toolbar and some associated code
+
+
+var _Plugin = declare("dijit._editor._Plugin", null, {
+ // summary:
+ // Base class for a "plugin" to the editor, which is usually
+ // a single button on the Toolbar and some associated code
+
+ constructor: function(args){
+ // summary:
+ // Create the plugin.
+ // args: Object?
+ // Initial settings for any of the attributes.
+
+ this.params = args || {};
+ lang.mixin(this, this.params);
+ this._connects=[];
+ this._attrPairNames = {};
+ },
+
+ // editor: [const] dijit.Editor
+ // Points to the parent editor
+ editor: null,
+
+ // iconClassPrefix: [const] String
+ // The CSS class name for the button node is formed from `iconClassPrefix` and `command`
+ iconClassPrefix: "dijitEditorIcon",
+
+ // button: dijit/_WidgetBase?
+ // Pointer to `dijit/form/Button` or other widget (ex: `dijit/form/FilteringSelect`)
+ // that is added to the toolbar to control this plugin.
+ // If not specified, will be created on initialization according to `buttonClass`
+ button: null,
+
+ // command: String
+ // String like "insertUnorderedList", "outdent", "justifyCenter", etc. that represents an editor command.
+ // Passed to editor.execCommand() if `useDefaultCommand` is true.
+ command: "",
+
+ // useDefaultCommand: Boolean
+ // If true, this plugin executes by calling Editor.execCommand() with the argument specified in `command`.
+ useDefaultCommand: true,
+
+ // buttonClass: Widget Class
+ // Class of widget (ex: dijit.form.Button or dijit/form/FilteringSelect)
+ // that is added to the toolbar to control this plugin.
+ // This is used to instantiate the button, unless `button` itself is specified directly.
+ buttonClass: Button,
+
+ // disabled: Boolean
+ // Flag to indicate if this plugin has been disabled and should do nothing
+ // helps control button state, among other things. Set via the setter api.
+ disabled: false,
+
+ getLabel: function(/*String*/key){
+ // summary:
+ // Returns the label to use for the button
+ // tags:
+ // private
+ return this.editor.commands[key]; // String
+ },
+
+ _initButton: function(){
+ // summary:
+ // Initialize the button or other widget that will control this plugin.
+ // This code only works for plugins controlling built-in commands in the editor.
+ // tags:
+ // protected extension
+ if(this.command.length){
+ var label = this.getLabel(this.command),
+ editor = this.editor,
+ className = this.iconClassPrefix+" "+this.iconClassPrefix + this.command.charAt(0).toUpperCase() + this.command.substr(1);
+ if(!this.button){
+ var props = lang.mixin({
+ label: label,
+ ownerDocument: editor.ownerDocument,
+ dir: editor.dir,
+ lang: editor.lang,
+ showLabel: false,
+ iconClass: className,
+ dropDown: this.dropDown,
+ tabIndex: "-1"
+ }, this.params || {});
+ this.button = new this.buttonClass(props);
+ }
+ }
+ if(this.get("disabled") && this.button){
+ this.button.set("disabled", this.get("disabled"));
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Destroy this plugin
+
+ var h;
+ while(h = this._connects.pop()){ h.remove(); }
+ if(this.dropDown){
+ this.dropDown.destroyRecursive();
+ }
+ },
+
+ connect: function(o, f, tf){
+ // summary:
+ // Make a connect.connect() that is automatically disconnected when this plugin is destroyed.
+ // Similar to `dijit/_Widget.connect()`.
+ // tags:
+ // protected
+ this._connects.push(connect.connect(o, f, this, tf));
+ },
+
+ updateState: function(){
+ // summary:
+ // Change state of the plugin to respond to events in the editor.
+ // description:
+ // This is called on meaningful events in the editor, such as change of selection
+ // or caret position (but not simple typing of alphanumeric keys). It gives the
+ // plugin a chance to update the CSS of its button.
+ //
+ // For example, the "bold" plugin will highlight/unhighlight the bold button depending on whether the
+ // characters next to the caret are bold or not.
+ //
+ // Only makes sense when `useDefaultCommand` is true, as it calls Editor.queryCommandEnabled(`command`).
+ var e = this.editor,
+ c = this.command,
+ checked, enabled;
+ if(!e || !e.isLoaded || !c.length){ return; }
+ var disabled = this.get("disabled");
+ if(this.button){
+ try{
+ enabled = !disabled && e.queryCommandEnabled(c);
+ if(this.enabled !== enabled){
+ this.enabled = enabled;
+ this.button.set('disabled', !enabled);
+ }
+ if(enabled){
+ if(typeof this.button.checked == 'boolean'){
+ checked = e.queryCommandState(c);
+ if(this.checked !== checked){
+ this.checked = checked;
+ this.button.set('checked', e.queryCommandState(c));
+ }
+ }
+ }
+ }catch(e){
+ console.log(e); // FIXME: we shouldn't have debug statements in our code. Log as an error?
+ }
+ }
+ },
+
+ setEditor: function(/*dijit/Editor*/ editor){
+ // summary:
+ // Tell the plugin which Editor it is associated with.
+
+ // TODO: refactor code to just pass editor to constructor.
+
+ // FIXME: detach from previous editor!!
+ this.editor = editor;
+
+ // FIXME: prevent creating this if we don't need to (i.e., editor can't handle our command)
+ this._initButton();
+
+ // Processing for buttons that execute by calling editor.execCommand()
+ if(this.button && this.useDefaultCommand){
+ if(this.editor.queryCommandAvailable(this.command)){
+ this.connect(this.button, "onClick",
+ lang.hitch(this.editor, "execCommand", this.command, this.commandArg)
+ );
+ }else{
+ // hide button because editor doesn't support command (due to browser limitations)
+ this.button.domNode.style.display = "none";
+ }
+ }
+
+ this.connect(this.editor, "onNormalizedDisplayChanged", "updateState");
+ },
+
+ setToolbar: function(/*dijit/Toolbar*/ toolbar){
+ // summary:
+ // Tell the plugin to add it's controller widget (often a button)
+ // to the toolbar. Does nothing if there is no controller widget.
+
+ // TODO: refactor code to just pass toolbar to constructor.
+
+ if(this.button){
+ toolbar.addChild(this.button);
+ }
+ // console.debug("adding", this.button, "to:", toolbar);
+ },
+
+ set: function(/* attribute */ name, /* anything */ value){
+ // summary:
+ // Set a property on a plugin
+ // name:
+ // The property to set.
+ // value:
+ // The value to set in the property.
+ // description:
+ // Sets named properties on a plugin which may potentially be handled by a
+ // setter in the plugin.
+ // For example, if the plugin has a properties "foo"
+ // and "bar" and a method named "_setFooAttr", calling:
+ // | plugin.set("foo", "Howdy!");
+ // would be equivalent to writing:
+ // | plugin._setFooAttr("Howdy!");
+ // and:
+ // | plugin.set("bar", 3);
+ // would be equivalent to writing:
+ // | plugin.bar = 3;
+ //
+ // set() may also be called with a hash of name/value pairs, ex:
+ // | plugin.set({
+ // | foo: "Howdy",
+ // | bar: 3
+ // | })
+ // This is equivalent to calling set(foo, "Howdy") and set(bar, 3)
+ if(typeof name === "object"){
+ for(var x in name){
+ this.set(x, name[x]);
+ }
+ return this;
+ }
+ var names = this._getAttrNames(name);
+ if(this[names.s]){
+ // use the explicit setter
+ var result = this[names.s].apply(this, Array.prototype.slice.call(arguments, 1));
+ }else{
+ this._set(name, value);
+ }
+ return result || this;
+ },
+
+ get: function(name){
+ // summary:
+ // Get a property from a plugin.
+ // name:
+ // The property to get.
+ // description:
+ // Get a named property from a plugin. The property may
+ // potentially be retrieved via a getter method. If no getter is defined, this
+ // just retrieves the object's property.
+ // For example, if the plugin has a properties "foo"
+ // and "bar" and a method named "_getFooAttr", calling:
+ // | plugin.get("foo");
+ // would be equivalent to writing:
+ // | plugin._getFooAttr();
+ // and:
+ // | plugin.get("bar");
+ // would be equivalent to writing:
+ // | plugin.bar;
+ var names = this._getAttrNames(name);
+ return this[names.g] ? this[names.g]() : this[name];
+ },
+
+ _setDisabledAttr: function(disabled){
+ // summary:
+ // Function to set the plugin state and call updateState to make sure the
+ // button is updated appropriately.
+ this.disabled = disabled;
+ this.updateState();
+ },
+
+ _getAttrNames: function(name){
+ // summary:
+ // Helper function for get() and set().
+ // Caches attribute name values so we don't do the string ops every time.
+ // tags:
+ // private
+
+ var apn = this._attrPairNames;
+ if(apn[name]){ return apn[name]; }
+ var uc = name.charAt(0).toUpperCase() + name.substr(1);
+ return (apn[name] = {
+ s: "_set"+uc+"Attr",
+ g: "_get"+uc+"Attr"
+ });
+ },
+
+ _set: function(/*String*/ name, /*anything*/ value){
+ // summary:
+ // Helper function to set new value for specified attribute
+ this[name] = value;
+ }
+});
+
+// Hash mapping plugin name to factory, used for registering plugins
+_Plugin.registry = {};
+
+return _Plugin;
+
+});
diff --git a/lib/dijit/_editor/html.js b/lib/dijit/_editor/html.js
index 45becc4b0..dc19ffba8 100644
--- a/lib/dijit/_editor/html.js
+++ b/lib/dijit/_editor/html.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/html",["dojo/_base/lang","dojo/_base/sniff",".."],function(_1,_2,_3){_1.getObject("_editor",true,_3);_3._editor.escapeXml=function(_4,_5){_4=_4.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_5){_4=_4.replace(/'/gm,"&#39;");}return _4;};_3._editor.getNodeHtml=function(_6){var _7;switch(_6.nodeType){case 1:var _8=_6.nodeName.toLowerCase();if(!_8||_8.charAt(0)=="/"){return "";}_7="<"+_8;var _9=[];var _a;if(_2("ie")&&_6.outerHTML){var s=_6.outerHTML;s=s.substr(0,s.indexOf(">")).replace(/(['"])[^"']*\1/g,"");var _b=/(\b\w+)\s?=/g;var m,_c;while((m=_b.exec(s))){_c=m[1];if(_c.substr(0,3)!="_dj"){if(_c=="src"||_c=="href"){if(_6.getAttribute("_djrealurl")){_9.push([_c,_6.getAttribute("_djrealurl")]);continue;}}var _d,_e;switch(_c){case "style":_d=_6.style.cssText.toLowerCase();break;case "class":_d=_6.className;break;case "width":if(_8==="img"){_e=/width=(\S+)/i.exec(s);if(_e){_d=_e[1];}break;}case "height":if(_8==="img"){_e=/height=(\S+)/i.exec(s);if(_e){_d=_e[1];}break;}default:_d=_6.getAttribute(_c);}if(_d!=null){_9.push([_c,_d.toString()]);}}}}else{var i=0;while((_a=_6.attributes[i++])){var n=_a.name;if(n.substr(0,3)!="_dj"){var v=_a.value;if(n=="src"||n=="href"){if(_6.getAttribute("_djrealurl")){v=_6.getAttribute("_djrealurl");}}_9.push([n,v]);}}}_9.sort(function(a,b){return a[0]<b[0]?-1:(a[0]==b[0]?0:1);});var j=0;while((_a=_9[j++])){_7+=" "+_a[0]+"=\""+(_1.isString(_a[1])?_3._editor.escapeXml(_a[1],true):_a[1])+"\"";}if(_8==="script"){_7+=">"+_6.innerHTML+"</"+_8+">";}else{if(_6.childNodes.length){_7+=">"+_3._editor.getChildrenHtml(_6)+"</"+_8+">";}else{switch(_8){case "br":case "hr":case "img":case "input":case "base":case "meta":case "area":case "basefont":_7+=" />";break;default:_7+="></"+_8+">";}}}break;case 4:case 3:_7=_3._editor.escapeXml(_6.nodeValue,true);break;case 8:_7="<!--"+_3._editor.escapeXml(_6.nodeValue,true)+"-->";break;default:_7="<!-- Element not recognized - Type: "+_6.nodeType+" Name: "+_6.nodeName+"-->";}return _7;};_3._editor.getChildrenHtml=function(_f){var out="";if(!_f){return out;}var _10=_f["childNodes"]||_f;var _11=!_2("ie")||_10!==_f;var _12,i=0;while((_12=_10[i++])){if(!_11||_12.parentNode==_f){out+=_3._editor.getNodeHtml(_12);}}return out;};return _3._editor;}); \ No newline at end of file
+define("dijit/_editor/html",["dojo/_base/array","dojo/_base/lang","dojo/sniff"],function(_1,_2,_3){var _4={};_2.setObject("dijit._editor.html",_4);var _5=_4.escapeXml=function(_6,_7){_6=_6.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;");if(!_7){_6=_6.replace(/'/gm,"&#39;");}return _6;};_4.getNodeHtml=function(_8){var _9=[];_4.getNodeHtmlHelper(_8,_9);return _9.join("");};_4.getNodeHtmlHelper=function(_a,_b){switch(_a.nodeType){case 1:var _c=_a.nodeName.toLowerCase();if(!_c||_c.charAt(0)=="/"){return "";}_b.push("<",_c);var _d=[],_e={};var _f;if(_3("dom-attributes-explicit")||_3("dom-attributes-specified-flag")){var i=0;while((_f=_a.attributes[i++])){var n=_f.name;if(n.substr(0,3)!=="_dj"&&(!_3("dom-attributes-specified-flag")||_f.specified)&&!(n in _e)){var v=_f.value;if(n=="src"||n=="href"){if(_a.getAttribute("_djrealurl")){v=_a.getAttribute("_djrealurl");}}if(_3("ie")===8&&n==="style"){v=v.replace("HEIGHT:","height:").replace("WIDTH:","width:");}_d.push([n,v]);_e[n]=v;}}}else{var _10=/^input$|^img$/i.test(_a.nodeName)?_a:_a.cloneNode(false);var s=_10.outerHTML;var _11=/[\w-]+=("[^"]*"|'[^']*'|\S*)/gi;var _12=s.match(_11);s=s.substr(0,s.indexOf(">"));_1.forEach(_12,function(_13){if(_13){var idx=_13.indexOf("=");if(idx>0){var key=_13.substring(0,idx);if(key.substr(0,3)!="_dj"){if(key=="src"||key=="href"){if(_a.getAttribute("_djrealurl")){_d.push([key,_a.getAttribute("_djrealurl")]);return;}}var val,_14;switch(key){case "style":val=_a.style.cssText.toLowerCase();break;case "class":val=_a.className;break;case "width":if(_c==="img"){_14=/width=(\S+)/i.exec(s);if(_14){val=_14[1];}break;}case "height":if(_c==="img"){_14=/height=(\S+)/i.exec(s);if(_14){val=_14[1];}break;}default:val=_a.getAttribute(key);}if(val!=null){_d.push([key,val.toString()]);}}}}},this);}_d.sort(function(a,b){return a[0]<b[0]?-1:(a[0]==b[0]?0:1);});var j=0;while((_f=_d[j++])){_b.push(" ",_f[0],"=\"",(typeof _f[1]==="string"?_5(_f[1],true):_f[1]),"\"");}switch(_c){case "br":case "hr":case "img":case "input":case "base":case "meta":case "area":case "basefont":_b.push(" />");break;case "script":_b.push(">",_a.innerHTML,"</",_c,">");break;default:_b.push(">");if(_a.hasChildNodes()){_4.getChildrenHtmlHelper(_a,_b);}_b.push("</",_c,">");}break;case 4:case 3:_b.push(_5(_a.nodeValue,true));break;case 8:_b.push("<!--",_5(_a.nodeValue,true),"-->");break;default:_b.push("<!-- Element not recognized - Type: ",_a.nodeType," Name: ",_a.nodeName,"-->");}};_4.getChildrenHtml=function(_15){var _16=[];_4.getChildrenHtmlHelper(_15,_16);return _16.join("");};_4.getChildrenHtmlHelper=function(dom,_17){if(!dom){return;}var _18=dom["childNodes"]||dom;var _19=!_3("ie")||_18!==dom;var _1a,i=0;while((_1a=_18[i++])){if(!_19||_1a.parentNode==dom){_4.getNodeHtmlHelper(_1a,_17);}}};return _4;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/html.js.uncompressed.js b/lib/dijit/_editor/html.js.uncompressed.js
new file mode 100644
index 000000000..76d591a30
--- /dev/null
+++ b/lib/dijit/_editor/html.js.uncompressed.js
@@ -0,0 +1,223 @@
+define("dijit/_editor/html", [
+ "dojo/_base/array",
+ "dojo/_base/lang", // lang.setObject
+ "dojo/sniff" // has("ie")
+], function(array, lang, has){
+
+// module:
+// dijit/_editor/html
+// summary:
+// HTML serialization utility functions used by editor
+
+var exports = {};
+lang.setObject("dijit._editor.html", exports);
+
+var escape = exports.escapeXml = function(/*String*/ str, /*Boolean?*/ noSingleQuotes){
+ // summary:
+ // Adds escape sequences for special characters in XML: `&<>"'`.
+ // Optionally skips escapes for single quotes.
+ str = str.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;");
+ if(!noSingleQuotes){
+ str = str.replace(/'/gm, "&#39;");
+ }
+ return str; // string
+};
+
+
+exports.getNodeHtml = function(/*DomNode*/ node){
+ // summary:
+ // Return string representing HTML for node and it's children
+ var output = [];
+ exports.getNodeHtmlHelper(node, output);
+ return output.join("");
+};
+
+exports.getNodeHtmlHelper = function(/*DomNode*/ node, /*String[]*/ output){
+ // summary:
+ // Pushes array of strings into output[] which represent HTML for node and it's children
+ switch(node.nodeType){
+ case 1: // element node
+ var lName = node.nodeName.toLowerCase();
+ if(!lName || lName.charAt(0) == "/"){
+ // IE does some strange things with malformed HTML input, like
+ // treating a close tag </span> without an open tag <span>, as
+ // a new tag with tagName of /span. Corrupts output HTML, remove
+ // them. Other browsers don't prefix tags that way, so will
+ // never show up.
+ return "";
+ }
+ output.push('<', lName);
+
+ // store the list of attributes and sort it to have the
+ // attributes appear in the dictionary order
+ var attrarray = [], attrhash = {};
+ var attr;
+ if(has("dom-attributes-explicit") || has("dom-attributes-specified-flag")){
+ // IE8+ and all other browsers.
+ var i = 0;
+ while((attr = node.attributes[i++])){
+ // ignore all attributes starting with _dj which are
+ // internal temporary attributes used by the editor
+ var n = attr.name;
+ if(n.substr(0,3) !== '_dj' &&
+ (!has("dom-attributes-specified-flag") || attr.specified) &&
+ !(n in attrhash)){ // workaround repeated attributes bug in IE8 (LinkDialog test)
+ var v = attr.value;
+ if(n == 'src' || n == 'href'){
+ if(node.getAttribute('_djrealurl')){
+ v = node.getAttribute('_djrealurl');
+ }
+ }
+ if(has("ie") === 8 && n === "style"){
+ v = v.replace("HEIGHT:", "height:").replace("WIDTH:", "width:");
+ }
+ attrarray.push([n,v]);
+ attrhash[n] = v;
+ }
+ }
+ }else{
+ // IE6-7 code path
+ var clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false);
+ var s = clone.outerHTML;
+ // Split up and manage the attrs via regexp
+ // similar to prettyPrint attr logic.
+ var rgxp_attrsMatch = /[\w-]+=("[^"]*"|'[^']*'|\S*)/gi
+ var attrSplit = s.match(rgxp_attrsMatch);
+ s = s.substr(0, s.indexOf('>'));
+ array.forEach(attrSplit, function(attr){
+ if(attr){
+ var idx = attr.indexOf("=");
+ if(idx > 0){
+ var key = attr.substring(0,idx);
+ if(key.substr(0,3) != '_dj'){
+ if(key == 'src' || key == 'href'){
+ if(node.getAttribute('_djrealurl')){
+ attrarray.push([key,node.getAttribute('_djrealurl')]);
+ return;
+ }
+ }
+ var val, match;
+ switch(key){
+ case 'style':
+ val = node.style.cssText.toLowerCase();
+ break;
+ case 'class':
+ val = node.className;
+ break;
+ case 'width':
+ if(lName === "img"){
+ // This somehow gets lost on IE for IMG tags and the like
+ // and we have to find it in outerHTML, known IE oddity.
+ match=/width=(\S+)/i.exec(s);
+ if(match){
+ val = match[1];
+ }
+ break;
+ }
+ case 'height':
+ if(lName === "img"){
+ // This somehow gets lost on IE for IMG tags and the like
+ // and we have to find it in outerHTML, known IE oddity.
+ match=/height=(\S+)/i.exec(s);
+ if(match){
+ val = match[1];
+ }
+ break;
+ }
+ default:
+ val = node.getAttribute(key);
+ }
+ if(val != null){
+ attrarray.push([key, val.toString()]);
+ }
+ }
+ }
+ }
+ }, this);
+ }
+ attrarray.sort(function(a,b){
+ return a[0] < b[0] ? -1 : (a[0] == b[0] ? 0 : 1);
+ });
+ var j = 0;
+ while((attr = attrarray[j++])){
+ output.push(' ', attr[0], '="',
+ (typeof attr[1] === "string" ? escape(attr[1], true) : attr[1]), '"');
+ }
+ switch(lName){
+ case 'br':
+ case 'hr':
+ case 'img':
+ case 'input':
+ case 'base':
+ case 'meta':
+ case 'area':
+ case 'basefont':
+ // These should all be singly closed
+ output.push(' />');
+ break;
+ case 'script':
+ // Browsers handle script tags differently in how you get content,
+ // but innerHTML always seems to work, so insert its content that way
+ // Yes, it's bad to allow script tags in the editor code, but some people
+ // seem to want to do it, so we need to at least return them right.
+ // other plugins/filters can strip them.
+ output.push('>', node.innerHTML, '</', lName, '>');
+ break;
+ default:
+ output.push('>');
+ if(node.hasChildNodes()){
+ exports.getChildrenHtmlHelper(node, output);
+ }
+ output.push('</', lName, '>');
+ }
+ break;
+ case 4: // cdata
+ case 3: // text
+ // FIXME:
+ output.push(escape(node.nodeValue, true));
+ break;
+ case 8: // comment
+ // FIXME:
+ output.push('<!--', escape(node.nodeValue, true), '-->');
+ break;
+ default:
+ output.push("<!-- Element not recognized - Type: ", node.nodeType, " Name: ", node.nodeName, "-->");
+ }
+};
+
+exports.getChildrenHtml = function(/*DomNode*/ node){
+ // summary:
+ // Returns the html content of a DomNode's children
+ var output = [];
+ exports.getChildrenHtmlHelper(node, output);
+ return output.join("");
+};
+
+exports.getChildrenHtmlHelper = function(/*DomNode*/ dom, /*String[]*/ output){
+ // summary:
+ // Pushes the html content of a DomNode's children into out[]
+
+ if(!dom){ return; }
+ var nodes = dom["childNodes"] || dom;
+
+ // IE issue.
+ // If we have an actual node we can check parent relationships on for IE,
+ // We should check, as IE sometimes builds invalid DOMS. If no parent, we can't check
+ // And should just process it and hope for the best.
+ var checkParent = !has("ie") || nodes !== dom;
+
+ var node, i = 0;
+ while((node = nodes[i++])){
+ // IE is broken. DOMs are supposed to be a tree. But in the case of malformed HTML, IE generates a graph
+ // meaning one node ends up with multiple references (multiple parents). This is totally wrong and invalid, but
+ // such is what it is. We have to keep track and check for this because otherwise the source output HTML will have dups.
+ // No other browser generates a graph. Leave it to IE to break a fundamental DOM rule. So, we check the parent if we can
+ // If we can't, nothing more we can do other than walk it.
+ if(!checkParent || node.parentNode == dom){
+ exports.getNodeHtmlHelper(node, output);
+ }
+ }
+};
+
+return exports;
+});
diff --git a/lib/dijit/_editor/nls/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..07d0f0723
--- /dev/null
+++ b/lib/dijit/_editor/nls/FontChoice.js.uncompressed.js
@@ -0,0 +1,62 @@
+define("dijit/_editor/nls/FontChoice", { root:
+//begin v1.x content
+({
+ fontSize: "Size",
+ fontName: "Font",
+ formatBlock: "Format",
+
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+
+ noFormat: "None",
+ p: "Paragraph",
+ h1: "Heading",
+ h2: "Subheading",
+ h3: "Sub-subheading",
+ pre: "Pre-formatted",
+
+ 1: "xx-small",
+ 2: "x-small",
+ 3: "small",
+ 4: "medium",
+ 5: "large",
+ 6: "x-large",
+ 7: "xx-large"
+})
+//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/_editor/nls/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..543f87a8e
--- /dev/null
+++ b/lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js
@@ -0,0 +1,48 @@
+define("dijit/_editor/nls/LinkDialog", { root:
+//begin v1.x content
+({
+ createLinkTitle: "Link Properties",
+ insertImageTitle: "Image Properties",
+ url: "URL:",
+ text: "Description:",
+ target: "Target:",
+ set: "Set",
+ currentWindow: "Current Window",
+ parentWindow: "Parent Window",
+ topWindow: "Topmost Window",
+ newWindow: "New Window"
+})
+//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/_editor/nls/ar/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..ea2818c92
--- /dev/null
+++ b/lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/ar/FontChoice", ({
+ fontSize: "الحجم",
+ fontName: "طاقم طباعة",
+ formatBlock: "النسق",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "أحادي المسافة",
+ cursive: "كتابة بحروف متصلة",
+ fantasy: "خيالي",
+ noFormat: "‏لا شيء‏",
+ p: "فقرة",
+ h1: "عنوان",
+ h2: "عنوان فرعي",
+ h3: "فرعي-عنوان فرعي",
+ pre: "منسق بصفة مسبقة",
+ 1: "صغير جدا جدا",
+ 2: "صغير جدا",
+ 3: "صغير",
+ 4: "متوسط",
+ 5: "كبير",
+ 6: "كبير جدا",
+ 7: "كبير جدا جدا"
+})
+);
diff --git a/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..157b55d04
--- /dev/null
+++ b/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/ar/LinkDialog", ({
+ createLinkTitle: "خصائص الوصلة",
+ insertImageTitle: "خصائص الصورة",
+ url: "‏عنوان URL:‏",
+ text: "الوصف:",
+ target: "الهدف:",
+ set: "تحديد",
+ currentWindow: "النافذة الحالية",
+ parentWindow: "النافذة الرئيسية",
+ topWindow: "النافذة العلوية",
+ newWindow: "‏نافذة جديدة‏"
+})
+);
diff --git a/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js
new file mode 100644
index 000000000..cb8d8dfbd
--- /dev/null
+++ b/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ar/commands", ({
+ 'bold': 'عري~ض',
+ 'copy': 'نسخ',
+ 'cut': 'قص',
+ 'delete': 'حذف',
+ 'indent': 'ازاحة للداخل',
+ 'insertHorizontalRule': 'مسطرة أفقية',
+ 'insertOrderedList': '‏كشف مرقم‏',
+ 'insertUnorderedList': 'كشف نقطي',
+ 'italic': '~مائل',
+ 'justifyCenter': 'محاذاة في الوسط',
+ 'justifyFull': 'ضبط',
+ 'justifyLeft': 'محاذاة الى اليسار',
+ 'justifyRight': 'محاذاة الى اليمين',
+ 'outdent': 'ازاحة للخارج',
+ 'paste': 'لصق',
+ 'redo': '‏اعادة‏',
+ 'removeFormat': 'ازالة النسق',
+ 'selectAll': '‏اختيار كل‏',
+ 'strikethrough': 'تشطيب',
+ 'subscript': 'رمز سفلي',
+ 'superscript': 'رمز علوي',
+ 'underline': '~تسطير',
+ 'undo': 'تراجع',
+ 'unlink': 'ازالة وصلة',
+ 'createLink': 'تكوين وصلة',
+ 'toggleDir': 'تبديل الاتجاه',
+ 'insertImage': 'ادراج صورة',
+ 'insertTable': 'ادراج/تحرير جدول',
+ 'toggleTableBorder': 'تبديل حدود الجدول',
+ 'deleteTable': 'حذف جدول',
+ 'tableProp': 'خصائص الجدول',
+ 'htmlToggle': 'مصدر HTML',
+ 'foreColor': 'لون الواجهة الأمامية',
+ 'hiliteColor': '‏لون الخلفية‏',
+ 'plainFormatBlock': 'نمط الفقرة',
+ 'formatBlock': 'نمط الفقرة',
+ 'fontSize': 'حجم طاقم الطباعة',
+ 'fontName': 'اسم طاقم الطباعة',
+ 'tabIndent': 'ازاحة علامة الجدولة للداخل',
+ "fullScreen": "تبديل الشاشة الكاملة",
+ "viewSource": "مشاهدة مصدر HTML",
+ "print": "طباعة",
+ "newPage": "صفحة جديدة",
+ /* Error messages */
+ 'systemShortcut': 'يكون التصرف "${0}" متاحا فقط ببرنامج الاستعراض الخاص بك باستخدام المسار المختصر للوحة المفاتيح. استخدم ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..19c4deefa
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/az/FontChoice", ({
+ "1" : "xx-kiçik",
+ "2" : "x-kiçik",
+ "formatBlock" : "Format",
+ "3" : "kiçik",
+ "4" : "orta",
+ "5" : "böyük",
+ "6" : "çox-böyük",
+ "7" : "ən böyük",
+ "fantasy" : "fantaziya",
+ "serif" : "serif",
+ "p" : "Abzas",
+ "pre" : "Əvvəldən düzəldilmiş",
+ "sans-serif" : "sans-serif",
+ "fontName" : "Şrift",
+ "h1" : "Başlıq",
+ "h2" : "Alt Başlıq",
+ "h3" : "Alt Alt Başlıq",
+ "monospace" : "Tək aralıqlı",
+ "fontSize" : "Ölçü",
+ "cursive" : "Əl yazısı",
+ "noFormat" : "Heç biri"
+})
+);
diff --git a/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..66d46ad1c
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/az/LinkDialog", ({
+ "text" : "Yazı:",
+ "insertImageTitle" : "Şəkil başlığı əlavə et",
+ "set" : "Yönəlt",
+ "newWindow" : "Yeni pəncərə",
+ "topWindow" : "Üst pəncərə",
+ "target" : "Hədəf:",
+ "createLinkTitle" : "Köprü başlığı yarat",
+ "parentWindow" : "Ana pəncərə",
+ "currentWindow" : "Hazırki pəncərə",
+ "url" : "URL:"
+})
+);
diff --git a/lib/dijit/_editor/nls/az/commands.js.uncompressed.js b/lib/dijit/_editor/nls/az/commands.js.uncompressed.js
new file mode 100644
index 000000000..2aba5f318
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/commands.js.uncompressed.js
@@ -0,0 +1,50 @@
+define(
+"dijit/_editor/nls/az/commands", ({
+ "removeFormat" : "Formatı Sil",
+ "copy" :"Köçür",
+ "paste" :"Yapışdır",
+ "selectAll" :"Hamısını seç",
+ "insertOrderedList" :"Nömrəli siyahı",
+ "insertTable" :"Cədvəl əlavə et",
+ "print" :"Yazdır",
+ "underline" :"Altıxətli",
+ "foreColor" :"Ön plan rəngi",
+ "htmlToggle" :"HTML kodu",
+ "formatBlock" :"Abzas stili",
+ "newPage" :"Yeni səhifə",
+ "insertHorizontalRule" :"Üfüqi qayda",
+ "delete" :"Sil",
+ "insertUnorderedList" :"İşarələnmiş siyahı",
+ "tableProp" :"Cədvəl xüsusiyyətləri",
+ "insertImage" :"Şəkil əlavə et",
+ "superscript" :"Üst işarə",
+ "subscript" :"Alt işarə",
+ "createLink" :"Körpü yarat",
+ "undo" :"Geriyə al",
+ "fullScreen" :"Tam ekran aç",
+ "italic" :"İtalik",
+ "fontName" :"Yazı tipi",
+ "justifyLeft" :"Sol tərəfə Doğrult",
+ "unlink" :"Körpünü sil",
+ "toggleTableBorder" :"Cədvəl kənarlarını göstər/Gizlət",
+ "viewSource" :"HTML qaynaq kodunu göstər",
+ "fontSize" :"Yazı tipi böyüklüğü",
+ "systemShortcut" :"\"${0}\" prosesi yalnız printerinizdə klaviatura qısayolu ilə istifadə oluna bilər. Bundan istifadə edin",
+ "indent" :"Girinti",
+ "redo" :"Yenilə",
+ "strikethrough" :"Üstündən xətt çəkilmiş",
+ "justifyFull" :"Doğrult",
+ "justifyCenter" :"Ortaya doğrult",
+ "hiliteColor" :"Arxa plan rəngi",
+ "deleteTable" :"Cədvəli sil",
+ "outdent" :"Çıxıntı",
+ "cut" :"Kəs",
+ "plainFormatBlock" :"Abzas stili",
+ "toggleDir" :"İstiqaməti dəyişdir",
+ "bold" :"Qalın",
+ "tabIndent" :"Qulp girintisi",
+ "justifyRight" :"Sağa doğrult",
+ "appleKey" : "⌘${0}",
+ "ctrlKey" : "ctrl+${0}"
+})
+);
diff --git a/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..46237c108
--- /dev/null
+++ b/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/ca/FontChoice", ({
+ fontSize: "Mida",
+ fontName: "Tipus de lletra",
+ formatBlock: "Format",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monoespai",
+ cursive: "Cursiva",
+ fantasy: "Fantasia",
+ noFormat: "Cap",
+ p: "Paràgraf",
+ h1: "Títol",
+ h2: "Subtítol",
+ h3: "Subsubtítol",
+ pre: "Format previ",
+ 1: "xx-petit",
+ 2: "x-petit",
+ 3: "petit",
+ 4: "mitjà",
+ 5: "gran",
+ 6: "x-gran",
+ 7: "xx-gran"
+})
+);
diff --git a/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..8726255f9
--- /dev/null
+++ b/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/ca/LinkDialog", ({
+ createLinkTitle: "Propietats de l\'enllaç",
+ insertImageTitle: "Propietats de la imatge",
+ url: "URL:",
+ text: "Descripció:",
+ target: "Destinació:",
+ set: "Defineix",
+ currentWindow: "Finestra actual",
+ parentWindow: "Finestra pare",
+ topWindow: "Finestra superior",
+ newWindow: "Finestra nova"
+})
+);
diff --git a/lib/dijit/_editor/nls/ca/commands.js b/lib/dijit/_editor/nls/ca/commands.js
index 0b724df79..7449c5024 100644
--- a/lib/dijit/_editor/nls/ca/commands.js
+++ b/lib/dijit/_editor/nls/ca/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ca/commands",({"bold":"Negreta","copy":"Copia","cut":"Retalla","delete":"Suprimeix","indent":"Sagnat","insertHorizontalRule":"Regla horitzontal","insertOrderedList":"Llista numerada","insertUnorderedList":"Llista de vinyetes","italic":"Cursiva","justifyCenter":"Centra","justifyFull":"Justifica","justifyLeft":"Alinea a l'esquerra","justifyRight":"Alinea a la dreta","outdent":"Sagna a l'esquerra","paste":"Enganxa","redo":"Refés","removeFormat":"Elimina el format","selectAll":"Selecciona-ho tot","strikethrough":"Ratllat","subscript":"Subíndex","superscript":"Superíndex","underline":"Subratllat","undo":"Desfés","unlink":"Elimina l'enllaç","createLink":"Crea un enllaç","toggleDir":"Inverteix la direcció","insertImage":"Insereix imatge","insertTable":"Insereix/edita la taula","toggleTableBorder":"Inverteix els contorns de taula","deleteTable":"Suprimeix la taula","tableProp":"Propietat de taula","htmlToggle":"Font HTML","foreColor":"Color de primer pla","hiliteColor":"Color de fons","plainFormatBlock":"Estil de paràgraf","formatBlock":"Estil de paràgraf","fontSize":"Cos de la lletra","fontName":"Nom del tipus de lletra","tabIndent":"Sagnat","fullScreen":"Commuta pantalla completa","viewSource":"Visualitza font HTML","print":"Imprimeix","newPage":"Pàgina nova","systemShortcut":"L'acció \"${0}\" és l'única disponible al navegador utilitzant una drecera del teclat. Utilitzeu ${1}.","ctrlKey":"control+${0}"})); \ No newline at end of file
+define("dijit/_editor/nls/ca/commands",({"bold":"Negreta","copy":"Copia","cut":"Retalla","delete":"Suprimeix","indent":"Sagnat","insertHorizontalRule":"Regla horitzontal","insertOrderedList":"Llista numerada","insertUnorderedList":"Llista de vinyetes","italic":"Cursiva","justifyCenter":"Centra","justifyFull":"Justifica","justifyLeft":"Alinea a l'esquerra","justifyRight":"Alinea a la dreta","outdent":"Sagna a l'esquerra","paste":"Enganxa","redo":"Refés","removeFormat":"Elimina el format","selectAll":"Selecciona-ho tot","strikethrough":"Ratllat","subscript":"Subíndex","superscript":"Superíndex","underline":"Subratllat","undo":"Desfés","unlink":"Elimina l'enllaç","createLink":"Crea un enllaç","toggleDir":"Inverteix la direcció","insertImage":"Insereix imatge","insertTable":"Insereix/edita la taula","toggleTableBorder":"Inverteix els contorns de taula","deleteTable":"Suprimeix la taula","tableProp":"Propietat de taula","htmlToggle":"Font HTML","foreColor":"Color de primer pla","hiliteColor":"Color de fons","plainFormatBlock":"Estil de paràgraf","formatBlock":"Estil de paràgraf","fontSize":"Cos de la lletra","fontName":"Nom del tipus de lletra","tabIndent":"Sagnat","fullScreen":"Commuta pantalla completa","viewSource":"Visualitza font HTML","print":"Imprimeix","newPage":"Pàgina nova","systemShortcut":"L'acció \"${0}\" és l'única disponible al navegador utilitzant una drecera del teclat. Utilitzeu ${1}.","ctrlKey":"control+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js
new file mode 100644
index 000000000..601b0dddd
--- /dev/null
+++ b/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ca/commands", ({
+ 'bold': 'Negreta',
+ 'copy': 'Copia',
+ 'cut': 'Retalla',
+ 'delete': 'Suprimeix',
+ 'indent': 'Sagnat',
+ 'insertHorizontalRule': 'Regla horitzontal',
+ 'insertOrderedList': 'Llista numerada',
+ 'insertUnorderedList': 'Llista de vinyetes',
+ 'italic': 'Cursiva',
+ 'justifyCenter': 'Centra',
+ 'justifyFull': 'Justifica',
+ 'justifyLeft': 'Alinea a l\'esquerra',
+ 'justifyRight': 'Alinea a la dreta',
+ 'outdent': 'Sagna a l\'esquerra',
+ 'paste': 'Enganxa',
+ 'redo': 'Refés',
+ 'removeFormat': 'Elimina el format',
+ 'selectAll': 'Selecciona-ho tot',
+ 'strikethrough': 'Ratllat',
+ 'subscript': 'Subíndex',
+ 'superscript': 'Superíndex',
+ 'underline': 'Subratllat',
+ 'undo': 'Desfés',
+ 'unlink': 'Elimina l\'enllaç',
+ 'createLink': 'Crea un enllaç',
+ 'toggleDir': 'Inverteix la direcció',
+ 'insertImage': 'Insereix imatge',
+ 'insertTable': 'Insereix/edita la taula',
+ 'toggleTableBorder': 'Inverteix els contorns de taula',
+ 'deleteTable': 'Suprimeix la taula',
+ 'tableProp': 'Propietat de taula',
+ 'htmlToggle': 'Font HTML',
+ 'foreColor': 'Color de primer pla',
+ 'hiliteColor': 'Color de fons',
+ 'plainFormatBlock': 'Estil de paràgraf',
+ 'formatBlock': 'Estil de paràgraf',
+ 'fontSize': 'Cos de la lletra',
+ 'fontName': 'Nom del tipus de lletra',
+ 'tabIndent': 'Sagnat',
+ "fullScreen": "Commuta pantalla completa",
+ "viewSource": "Visualitza font HTML",
+ "print": "Imprimeix",
+ "newPage": "Pàgina nova",
+ /* Error messages */
+ 'systemShortcut': 'L\'acció "${0}" és l\'única disponible al navegador utilitzant una drecera del teclat. Utilitzeu ${1}.',
+ 'ctrlKey':'control+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/commands.js.uncompressed.js b/lib/dijit/_editor/nls/commands.js.uncompressed.js
new file mode 100644
index 000000000..344b5ec23
--- /dev/null
+++ b/lib/dijit/_editor/nls/commands.js.uncompressed.js
@@ -0,0 +1,85 @@
+define("dijit/_editor/nls/commands", { root:
+//begin v1.x content
+({
+ 'bold': 'Bold',
+ 'copy': 'Copy',
+ 'cut': 'Cut',
+ 'delete': 'Delete',
+ 'indent': 'Indent',
+ 'insertHorizontalRule': 'Horizontal Rule',
+ 'insertOrderedList': 'Numbered List',
+ 'insertUnorderedList': 'Bullet List',
+ 'italic': 'Italic',
+ 'justifyCenter': 'Align Center',
+ 'justifyFull': 'Justify',
+ 'justifyLeft': 'Align Left',
+ 'justifyRight': 'Align Right',
+ 'outdent': 'Outdent',
+ 'paste': 'Paste',
+ 'redo': 'Redo',
+ 'removeFormat': 'Remove Format',
+ 'selectAll': 'Select All',
+ 'strikethrough': 'Strikethrough',
+ 'subscript': 'Subscript',
+ 'superscript': 'Superscript',
+ 'underline': 'Underline',
+ 'undo': 'Undo',
+ 'unlink': 'Remove Link',
+ 'createLink': 'Create Link',
+ 'toggleDir': 'Toggle Direction',
+ 'insertImage': 'Insert Image',
+ 'insertTable': 'Insert/Edit Table',
+ 'toggleTableBorder': 'Toggle Table Border',
+ 'deleteTable': 'Delete Table',
+ 'tableProp': 'Table Property',
+ 'htmlToggle': 'HTML Source',
+ 'foreColor': 'Foreground Color',
+ 'hiliteColor': 'Background Color',
+ 'plainFormatBlock': 'Paragraph Style',
+ 'formatBlock': 'Paragraph Style',
+ 'fontSize': 'Font Size',
+ 'fontName': 'Font Name',
+ 'tabIndent': 'Tab Indent',
+ "fullScreen": "Toggle Full Screen",
+ "viewSource": "View HTML Source",
+ "print": "Print",
+ "newPage": "New Page",
+ /* Error messages */
+ 'systemShortcut': 'The "${0}" action is only available in your browser using a keyboard shortcut. Use ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+//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/_editor/nls/cs/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..42fbbaee2
--- /dev/null
+++ b/lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/cs/FontChoice", ({
+ fontSize: "Velikost",
+ fontName: "Písmo",
+ formatBlock: "Formát",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Žádný",
+ p: "Odstavec",
+ h1: "Nadpis",
+ h2: "Podnadpis",
+ h3: "Podnadpis 2",
+ pre: "Předformátované",
+ 1: "extra malé",
+ 2: "velmi malé",
+ 3: "malé",
+ 4: "střední",
+ 5: "velké",
+ 6: "velmi velké",
+ 7: "extra velké"
+})
+);
diff --git a/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..d437975be
--- /dev/null
+++ b/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/cs/LinkDialog", ({
+ createLinkTitle: "Vlastnosti odkazu",
+ insertImageTitle: "Vlastnosti obrázku",
+ url: "Adresa URL:",
+ text: "Popis:",
+ target: "Cíl:",
+ set: "Nastavit",
+ currentWindow: "Aktuální okno",
+ parentWindow: "Nadřízené okno",
+ topWindow: "Okno nejvyšší úrovně",
+ newWindow: "Nové okno"
+})
+);
diff --git a/lib/dijit/_editor/nls/cs/commands.js b/lib/dijit/_editor/nls/cs/commands.js
index a2927caea..7b26dd96d 100644
--- a/lib/dijit/_editor/nls/cs/commands.js
+++ b/lib/dijit/_editor/nls/cs/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/cs/commands",({"bold":"Tučné","copy":"Kopírovat","cut":"Vyjmout","delete":"Odstranit","indent":"Odsadit","insertHorizontalRule":"Vodorovná čára","insertOrderedList":"Číslovaný seznam","insertUnorderedList":"Seznam s odrážkami","italic":"Kurzíva","justifyCenter":"Zarovnat na střed","justifyFull":"Do bloku","justifyLeft":"Zarovnat vlevo","justifyRight":"Zarovnat vpravo","outdent":"Předsadit","paste":"Vložit","redo":"Opakovat","removeFormat":"Odebrat formát","selectAll":"Vybrat vše","strikethrough":"Přeškrtnutí","subscript":"Dolní index","superscript":"Horní index","underline":"Podtržení","undo":"Zpět","unlink":"Odebrat odkaz","createLink":"Vytvořit odkaz","toggleDir":"Přepnout směr","insertImage":"Vložit obrázek","insertTable":"Vložit/upravit tabulku","toggleTableBorder":"Přepnout ohraničení tabulky","deleteTable":"Odstranit tabulku","tableProp":"Vlastnost tabulky","htmlToggle":"Zdroj HTML","foreColor":"Barva popředí","hiliteColor":"Barva pozadí","plainFormatBlock":"Styl odstavce","formatBlock":"Styl odstavce","fontSize":"Velikost písma","fontName":"Název písma","tabIndent":"Odsazení tabulátoru","fullScreen":"Přepnout celou obrazovku","viewSource":"Zobrazit zdroj HTML","print":"Tisk","newPage":"Nová stránka","systemShortcut":"Akce \"${0}\" je v prohlížeči dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesovou zkratku ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/cs/commands",({"bold":"Tučné","copy":"Kopírovat","cut":"Vyjmout","delete":"Odstranit","indent":"Odsadit","insertHorizontalRule":"Vodorovná čára","insertOrderedList":"Číslovaný seznam","insertUnorderedList":"Seznam s odrážkami","italic":"Kurzíva","justifyCenter":"Zarovnat na střed","justifyFull":"Do bloku","justifyLeft":"Zarovnat vlevo","justifyRight":"Zarovnat vpravo","outdent":"Předsadit","paste":"Vložit","redo":"Opakovat","removeFormat":"Odebrat formát","selectAll":"Vybrat vše","strikethrough":"Přeškrtnutí","subscript":"Dolní index","superscript":"Horní index","underline":"Podtržení","undo":"Zpět","unlink":"Odebrat odkaz","createLink":"Vytvořit odkaz","toggleDir":"Přepnout směr","insertImage":"Vložit obrázek","insertTable":"Vložit/upravit tabulku","toggleTableBorder":"Přepnout ohraničení tabulky","deleteTable":"Odstranit tabulku","tableProp":"Vlastnost tabulky","htmlToggle":"Zdroj HTML","foreColor":"Barva popředí","hiliteColor":"Barva pozadí","plainFormatBlock":"Styl odstavce","formatBlock":"Styl odstavce","fontSize":"Velikost písma","fontName":"Název písma","tabIndent":"Odsazení tabulátoru","fullScreen":"Přepnout celou obrazovku","viewSource":"Zobrazit zdroj HTML","print":"Tisk","newPage":"Nová stránka","systemShortcut":"Akce \"${0}\" je v prohlížeči dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesovou zkratku ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js b/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js
new file mode 100644
index 000000000..d69aca728
--- /dev/null
+++ b/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/cs/commands", ({
+ 'bold': 'Tučné',
+ 'copy': 'Kopírovat',
+ 'cut': 'Vyjmout',
+ 'delete': 'Odstranit',
+ 'indent': 'Odsadit',
+ 'insertHorizontalRule': 'Vodorovná čára',
+ 'insertOrderedList': 'Číslovaný seznam',
+ 'insertUnorderedList': 'Seznam s odrážkami',
+ 'italic': 'Kurzíva',
+ 'justifyCenter': 'Zarovnat na střed',
+ 'justifyFull': 'Do bloku',
+ 'justifyLeft': 'Zarovnat vlevo',
+ 'justifyRight': 'Zarovnat vpravo',
+ 'outdent': 'Předsadit',
+ 'paste': 'Vložit',
+ 'redo': 'Opakovat',
+ 'removeFormat': 'Odebrat formát',
+ 'selectAll': 'Vybrat vše',
+ 'strikethrough': 'Přeškrtnutí',
+ 'subscript': 'Dolní index',
+ 'superscript': 'Horní index',
+ 'underline': 'Podtržení',
+ 'undo': 'Zpět',
+ 'unlink': 'Odebrat odkaz',
+ 'createLink': 'Vytvořit odkaz',
+ 'toggleDir': 'Přepnout směr',
+ 'insertImage': 'Vložit obrázek',
+ 'insertTable': 'Vložit/upravit tabulku',
+ 'toggleTableBorder': 'Přepnout ohraničení tabulky',
+ 'deleteTable': 'Odstranit tabulku',
+ 'tableProp': 'Vlastnost tabulky',
+ 'htmlToggle': 'Zdroj HTML',
+ 'foreColor': 'Barva popředí',
+ 'hiliteColor': 'Barva pozadí',
+ 'plainFormatBlock': 'Styl odstavce',
+ 'formatBlock': 'Styl odstavce',
+ 'fontSize': 'Velikost písma',
+ 'fontName': 'Název písma',
+ 'tabIndent': 'Odsazení tabulátoru',
+ "fullScreen": "Přepnout celou obrazovku",
+ "viewSource": "Zobrazit zdroj HTML",
+ "print": "Tisk",
+ "newPage": "Nová stránka",
+ /* Error messages */
+ 'systemShortcut': 'Akce "${0}" je v prohlížeči dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesovou zkratku ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..a5f959b0b
--- /dev/null
+++ b/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/da/FontChoice", ({
+ fontSize: "Størrelse",
+ fontName: "Skrifttype",
+ formatBlock: "Format",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "kursiv",
+ fantasy: "fantasy",
+ noFormat: "Ingen",
+ p: "Afsnit",
+ h1: "Overskrift",
+ h2: "Underoverskrift",
+ h3: "Underunderoverskrift",
+ pre: "Forudformateret",
+ 1: "xx-small",
+ 2: "x-small",
+ 3: "small",
+ 4: "medium",
+ 5: "large",
+ 6: "x-large",
+ 7: "xx-large"
+})
+);
diff --git a/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..1712160e4
--- /dev/null
+++ b/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/da/LinkDialog", ({
+ createLinkTitle: "Linkegenskaber",
+ insertImageTitle: "Billedegenskaber",
+ url: "URL:",
+ text: "Beskrivelse:",
+ target: "Mål:",
+ set: "Definér",
+ currentWindow: "Aktuelt vindue",
+ parentWindow: "Overordnet vindue",
+ topWindow: "Øverste vindue",
+ newWindow: "Nyt vindue"
+})
+);
diff --git a/lib/dijit/_editor/nls/da/commands.js b/lib/dijit/_editor/nls/da/commands.js
index a7b86591b..d193a9715 100644
--- a/lib/dijit/_editor/nls/da/commands.js
+++ b/lib/dijit/_editor/nls/da/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/da/commands",({"bold":"Fed","copy":"Kopiér","cut":"Klip","delete":"Slet","indent":"Indrykning","insertHorizontalRule":"Vandret linje","insertOrderedList":"Nummereret liste","insertUnorderedList":"Punktliste","italic":"Kursiv","justifyCenter":"Centreret","justifyFull":"Lige margener","justifyLeft":"Venstrejusteret","justifyRight":"Højrejusteret","outdent":"Udrykning","paste":"Sæt ind","redo":"Annullér Fortryd","removeFormat":"Fjern format","selectAll":"Markér alle","strikethrough":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget","undo":"Fortryd","unlink":"Fjern link","createLink":"Opret link","toggleDir":"Skift retning","insertImage":"Indsæt billede","insertTable":"Indsæt/redigér tabel","toggleTableBorder":"Skift tabelramme","deleteTable":"Slet tabel","tableProp":"Tabelegenskab","htmlToggle":"HTML-kilde","foreColor":"Forgrundsfarve","hiliteColor":"Baggrundsfarve","plainFormatBlock":"Afsnitstypografi","formatBlock":"Afsnitstypografi","fontSize":"Skriftstørrelse","fontName":"Skriftnavn","tabIndent":"Indrykning med tabulator","fullScreen":"Aktivér/deaktivér fuldskærm","viewSource":"Vis HTML-kilde","print":"Udskriv","newPage":"Ny side","systemShortcut":"Funktionen \"${0}\" kan kun bruges i din browser med en tastaturgenvej. Brug ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/da/commands",({"bold":"Fed","copy":"Kopiér","cut":"Klip","delete":"Slet","indent":"Indrykning","insertHorizontalRule":"Vandret linje","insertOrderedList":"Nummereret liste","insertUnorderedList":"Punktliste","italic":"Kursiv","justifyCenter":"Centreret","justifyFull":"Lige margener","justifyLeft":"Venstrejusteret","justifyRight":"Højrejusteret","outdent":"Udrykning","paste":"Sæt ind","redo":"Annullér Fortryd","removeFormat":"Fjern format","selectAll":"Markér alle","strikethrough":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget","undo":"Fortryd","unlink":"Fjern link","createLink":"Opret link","toggleDir":"Skift retning","insertImage":"Indsæt billede","insertTable":"Indsæt/redigér tabel","toggleTableBorder":"Skift tabelramme","deleteTable":"Slet tabel","tableProp":"Tabelegenskab","htmlToggle":"HTML-kilde","foreColor":"Forgrundsfarve","hiliteColor":"Baggrundsfarve","plainFormatBlock":"Afsnitstypografi","formatBlock":"Afsnitstypografi","fontSize":"Skriftstørrelse","fontName":"Skriftnavn","tabIndent":"Tabulatorindrykning","fullScreen":"Fuld skærm til/fra","viewSource":"Vis HTML-kilde","print":"Udskriv","newPage":"Ny side","systemShortcut":"Funktionen \"${0}\" kan kun bruges i din browser med en tastaturgenvej. Brug ${1}.","ctrlKey":"Ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/da/commands.js.uncompressed.js b/lib/dijit/_editor/nls/da/commands.js.uncompressed.js
new file mode 100644
index 000000000..25987432c
--- /dev/null
+++ b/lib/dijit/_editor/nls/da/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/da/commands", ({
+ 'bold': 'Fed',
+ 'copy': 'Kopiér',
+ 'cut': 'Klip',
+ 'delete': 'Slet',
+ 'indent': 'Indrykning',
+ 'insertHorizontalRule': 'Vandret linje',
+ 'insertOrderedList': 'Nummereret liste',
+ 'insertUnorderedList': 'Punktliste',
+ 'italic': 'Kursiv',
+ 'justifyCenter': 'Centreret',
+ 'justifyFull': 'Lige margener',
+ 'justifyLeft': 'Venstrejusteret',
+ 'justifyRight': 'Højrejusteret',
+ 'outdent': 'Udrykning',
+ 'paste': 'Sæt ind',
+ 'redo': 'Annullér Fortryd',
+ 'removeFormat': 'Fjern format',
+ 'selectAll': 'Markér alle',
+ 'strikethrough': 'Gennemstreget',
+ 'subscript': 'Sænket skrift',
+ 'superscript': 'Hævet skrift',
+ 'underline': 'Understreget',
+ 'undo': 'Fortryd',
+ 'unlink': 'Fjern link',
+ 'createLink': 'Opret link',
+ 'toggleDir': 'Skift retning',
+ 'insertImage': 'Indsæt billede',
+ 'insertTable': 'Indsæt/redigér tabel',
+ 'toggleTableBorder': 'Skift tabelramme',
+ 'deleteTable': 'Slet tabel',
+ 'tableProp': 'Tabelegenskab',
+ 'htmlToggle': 'HTML-kilde',
+ 'foreColor': 'Forgrundsfarve',
+ 'hiliteColor': 'Baggrundsfarve',
+ 'plainFormatBlock': 'Afsnitstypografi',
+ 'formatBlock': 'Afsnitstypografi',
+ 'fontSize': 'Skriftstørrelse',
+ 'fontName': 'Skriftnavn',
+ 'tabIndent': 'Tabulatorindrykning',
+ "fullScreen": "Fuld skærm til/fra",
+ "viewSource": "Vis HTML-kilde",
+ "print": "Udskriv",
+ "newPage": "Ny side",
+ /* Error messages */
+ 'systemShortcut': 'Funktionen "${0}" kan kun bruges i din browser med en tastaturgenvej. Brug ${1}.',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..ea54a023c
--- /dev/null
+++ b/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/de/FontChoice", ({
+ fontSize: "Größe",
+ fontName: "Schriftart",
+ formatBlock: "Format",
+ serif: "Serife",
+ "sans-serif": "Serifenlos",
+ monospace: "Monospaceschrift",
+ cursive: "Kursiv",
+ fantasy: "Fantasie",
+ noFormat: "Keine Angabe",
+ p: "Absatz",
+ h1: "Überschrift",
+ h2: "Unterüberschrift",
+ h3: "Unterunterüberschrift",
+ pre: "Vorformatiert",
+ 1: "XXS",
+ 2: "XS",
+ 3: "S",
+ 4: "M",
+ 5: "L",
+ 6: "XL",
+ 7: "XXL"
+})
+);
diff --git a/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..ca28bfd2b
--- /dev/null
+++ b/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/de/LinkDialog", ({
+ createLinkTitle: "Linkeigenschaften",
+ insertImageTitle: "Grafikeigenschaften",
+ url: "URL:",
+ text: "Beschreibung:",
+ target: "Ziel:",
+ set: "Festlegen",
+ currentWindow: "Aktuelles Fenster",
+ parentWindow: "Übergeordnetes Fenster",
+ topWindow: "Aktives Fenster",
+ newWindow: "Neues Fenster"
+})
+);
diff --git a/lib/dijit/_editor/nls/de/commands.js b/lib/dijit/_editor/nls/de/commands.js
index aff458b1c..e4eff7c66 100644
--- a/lib/dijit/_editor/nls/de/commands.js
+++ b/lib/dijit/_editor/nls/de/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/de/commands",({"bold":"Fett","copy":"Kopieren","cut":"Ausschneiden","delete":"Löschen","indent":"Einrücken","insertHorizontalRule":"Horizontaler Strich","insertOrderedList":"Nummerierung","insertUnorderedList":"Aufzählungszeichen","italic":"Kursiv","justifyCenter":"Zentriert","justifyFull":"Blocksatz","justifyLeft":"Linksbündig","justifyRight":"Rechtsbündig","outdent":"Ausrücken","paste":"Einfügen","redo":"Wiederherstellen","removeFormat":"Formatierung entfernen","selectAll":"Alles auswählen","strikethrough":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen","undo":"Rückgängig","unlink":"Link entfernen","createLink":"Link erstellen","toggleDir":"Wechselrichtung","insertImage":"Grafik einfügen","insertTable":"Tabelle einfügen/bearbeiten","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","deleteTable":"Tabelle löschen","tableProp":"Tabelleneigenschaft","htmlToggle":"HTML-Quelltext","foreColor":"Vordergrundfarbe","hiliteColor":"Hintergrundfarbe","plainFormatBlock":"Absatzstil","formatBlock":"Absatzstil","fontSize":"Schriftgröße","fontName":"Schriftartname","tabIndent":"Tabulatoreinrückung","fullScreen":"Gesamtanzeige","viewSource":"HTML-Quelle","print":"Drucken","newPage":"Neue Seite","systemShortcut":"Die Aktion \"${0}\" ist nur über einen Direktaufruf in Ihrem Browser verfügbar. Verwenden Sie ${1}.","ctrlKey":"Strg+${0}"})); \ No newline at end of file
+define("dijit/_editor/nls/de/commands",({"bold":"Fett","copy":"Kopieren","cut":"Ausschneiden","delete":"Löschen","indent":"Einrücken","insertHorizontalRule":"Horizontaler Strich","insertOrderedList":"Nummerierung","insertUnorderedList":"Aufzählungszeichen","italic":"Kursiv","justifyCenter":"Zentriert","justifyFull":"Blocksatz","justifyLeft":"Linksbündig","justifyRight":"Rechtsbündig","outdent":"Ausrücken","paste":"Einfügen","redo":"Wiederholen","removeFormat":"Formatierung entfernen","selectAll":"Alles auswählen","strikethrough":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen","undo":"Rückgängig","unlink":"Link entfernen","createLink":"Link erstellen","toggleDir":"Richtung wechseln","insertImage":"Grafik einfügen","insertTable":"Tabelle einfügen/bearbeiten","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","deleteTable":"Tabelle löschen","tableProp":"Tabelleneigenschaft","htmlToggle":"HTML-Quelltext","foreColor":"Vordergrundfarbe","hiliteColor":"Hintergrundfarbe","plainFormatBlock":"Absatzstil","formatBlock":"Absatzstil","fontSize":"Schriftgröße","fontName":"Schriftartname","tabIndent":"Registerkarteneinrückung","fullScreen":"Gesamtanzeige","viewSource":"HTML-Quelle","print":"Drucken","newPage":"Neue Seite","systemShortcut":"Die Aktion \"${0}\" ist im Browser nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.","ctrlKey":"Strg+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/de/commands.js.uncompressed.js b/lib/dijit/_editor/nls/de/commands.js.uncompressed.js
new file mode 100644
index 000000000..20917fe44
--- /dev/null
+++ b/lib/dijit/_editor/nls/de/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/de/commands", ({
+ 'bold': 'Fett',
+ 'copy': 'Kopieren',
+ 'cut': 'Ausschneiden',
+ 'delete': 'Löschen',
+ 'indent': 'Einrücken',
+ 'insertHorizontalRule': 'Horizontaler Strich',
+ 'insertOrderedList': 'Nummerierung',
+ 'insertUnorderedList': 'Aufzählungszeichen',
+ 'italic': 'Kursiv',
+ 'justifyCenter': 'Zentriert',
+ 'justifyFull': 'Blocksatz',
+ 'justifyLeft': 'Linksbündig',
+ 'justifyRight': 'Rechtsbündig',
+ 'outdent': 'Ausrücken',
+ 'paste': 'Einfügen',
+ 'redo': 'Wiederholen',
+ 'removeFormat': 'Formatierung entfernen',
+ 'selectAll': 'Alles auswählen',
+ 'strikethrough': 'Durchgestrichen',
+ 'subscript': 'Tiefgestellt',
+ 'superscript': 'Hochgestellt',
+ 'underline': 'Unterstrichen',
+ 'undo': 'Rückgängig',
+ 'unlink': 'Link entfernen',
+ 'createLink': 'Link erstellen',
+ 'toggleDir': 'Richtung wechseln',
+ 'insertImage': 'Grafik einfügen',
+ 'insertTable': 'Tabelle einfügen/bearbeiten',
+ 'toggleTableBorder': 'Tabellenumrandung ein-/ausschalten',
+ 'deleteTable': 'Tabelle löschen',
+ 'tableProp': 'Tabelleneigenschaft',
+ 'htmlToggle': 'HTML-Quelltext',
+ 'foreColor': 'Vordergrundfarbe',
+ 'hiliteColor': 'Hintergrundfarbe',
+ 'plainFormatBlock': 'Absatzstil',
+ 'formatBlock': 'Absatzstil',
+ 'fontSize': 'Schriftgröße',
+ 'fontName': 'Schriftartname',
+ 'tabIndent': 'Registerkarteneinrückung',
+ "fullScreen": "Gesamtanzeige",
+ "viewSource": "HTML-Quelle",
+ "print": "Drucken",
+ "newPage": "Neue Seite",
+ /* Error messages */
+ 'systemShortcut': 'Die Aktion "${0}" ist im Browser nur über einen Tastaturkurzbefehl verfügbar. Verwenden Sie ${1}.',
+ 'ctrlKey':'Strg+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..8c315b872
--- /dev/null
+++ b/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/el/FontChoice", ({
+ fontSize: "Μέγεθος",
+ fontName: "Γραμματοσειρά",
+ formatBlock: "Μορφή",
+ serif: "με πατούρες (serif)",
+ "sans-serif": "χωρίς πατούρες (sans-serif)",
+ monospace: "σταθερού πλάτους",
+ cursive: "πλάγιοι",
+ fantasy: "φαντασίας",
+ noFormat: "Χωρίς",
+ p: "Παράγραφος",
+ h1: "Επικεφαλίδα",
+ h2: "Δευτερεύουσα επικεφαλίδα",
+ h3: "Δευτερεύουσα επικεφαλίδα τρίτου επιπέδου",
+ pre: "Προ-μορφοποιημένο",
+ 1: "xx-μικρά",
+ 2: "x-μικρά",
+ 3: "μικρά",
+ 4: "μεσαία",
+ 5: "μεγάλα",
+ 6: "x-μεγάλα",
+ 7: "xx-μεγάλα"
+})
+);
diff --git a/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..69011f49a
--- /dev/null
+++ b/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/el/LinkDialog", ({
+ createLinkTitle: "Ιδιότητες σύνδεσης",
+ insertImageTitle: "Ιδιότητες εικόνας",
+ url: "Διεύθυνση URL:",
+ text: "Περιγραφή:",
+ target: "Προορισμός:",
+ set: "Ορισμός",
+ currentWindow: "Τρέχον παράθυρο",
+ parentWindow: "Γονικό παράθυρο",
+ topWindow: "Παράθυρο σε πρώτο πλάνο",
+ newWindow: "Νέο παράθυρο"
+})
+);
diff --git a/lib/dijit/_editor/nls/el/commands.js b/lib/dijit/_editor/nls/el/commands.js
index ea5403357..51ffaa440 100644
--- a/lib/dijit/_editor/nls/el/commands.js
+++ b/lib/dijit/_editor/nls/el/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/el/commands",({"bold":"Έντονα","copy":"Αντιγραφή","cut":"Αποκοπή","delete":"Διαγραφή","indent":"Εσοχή","insertHorizontalRule":"Οριζόντια γραμμή","insertOrderedList":"Αριθμημένη λίστα","insertUnorderedList":"Λίστα με κουκίδες","italic":"Πλάγια","justifyCenter":"Στοίχιση στο κέντρο","justifyFull":"Πλήρης στοίχιση","justifyLeft":"Στοίχιση αριστερά","justifyRight":"Στοίχιση δεξιά","outdent":"Μείωση περιθωρίου","paste":"Επικόλληση","redo":"Ακύρωση αναίρεσης","removeFormat":"Αφαίρεση μορφοποίησης","selectAll":"Επιλογή όλων","strikethrough":"Διαγράμμιση","subscript":"Δείκτης","superscript":"Εκθέτης","underline":"Υπογράμμιση","undo":"Αναίρεση","unlink":"Αφαίρεση σύνδεσης","createLink":"Δημιουργία σύνδεσης","toggleDir":"Εναλλαγή κατεύθυνσης","insertImage":"Εισαγωγή εικόνας","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","toggleTableBorder":"Εναλλαγή εμφάνισης περιγράμματος πίνακα","deleteTable":"Διαγραφή πίνακα","tableProp":"Ιδιότητα πίνακα","htmlToggle":"Πρωτογενής κώδικας HTML","foreColor":"Χρώμα προσκηνίου","hiliteColor":"Χρώμα φόντου","plainFormatBlock":"Στυλ παραγράφου","formatBlock":"Στυλ παραγράφου","fontSize":"Μέγεθος γραμματοσειράς","fontName":"Όνομα γραμματοσειράς","tabIndent":"Εσοχή με το πλήκτρο Tab","fullScreen":"Εναλλαγή κατάστασης πλήρους οθόνης","viewSource":"Προβολή προέλευσης HTML","print":"Εκτύπωση","newPage":"Νέα σελίδα","systemShortcut":"Σε αυτό το πρόγραμμα πλοήγησης, η ενέργεια \"${0}\" είναι διαθέσιμη μόνο με τη χρήση μιας συντόμευσης πληκτρολογίου. Χρησιμοποιήστε τη συντόμευση ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/el/commands",({"bold":"Έντονα","copy":"Αντιγραφή","cut":"Αποκοπή","delete":"Διαγραφή","indent":"Εσοχή","insertHorizontalRule":"Οριζόντια γραμμή","insertOrderedList":"Αριθμημένη λίστα","insertUnorderedList":"Λίστα με κουκίδες","italic":"Πλάγια","justifyCenter":"Στοίχιση στο κέντρο","justifyFull":"Πλήρης στοίχιση","justifyLeft":"Στοίχιση αριστερά","justifyRight":"Στοίχιση δεξιά","outdent":"Μείωση περιθωρίου","paste":"Επικόλληση","redo":"Ακύρωση αναίρεσης","removeFormat":"Αφαίρεση μορφοποίησης","selectAll":"Επιλογή όλων","strikethrough":"Διαγράμμιση","subscript":"Δείκτης","superscript":"Εκθέτης","underline":"Υπογράμμιση","undo":"Αναίρεση","unlink":"Αφαίρεση σύνδεσης","createLink":"Δημιουργία σύνδεσης","toggleDir":"Εναλλαγή κατεύθυνσης","insertImage":"Εισαγωγή εικόνας","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","toggleTableBorder":"Εναλλαγή εμφάνισης περιγράμματος πίνακα","deleteTable":"Διαγραφή πίνακα","tableProp":"Ιδιότητα πίνακα","htmlToggle":"Πρωτογενής κώδικας HTML","foreColor":"Χρώμα προσκηνίου","hiliteColor":"Χρώμα φόντου","plainFormatBlock":"Στυλ παραγράφου","formatBlock":"Στυλ παραγράφου","fontSize":"Μέγεθος γραμματοσειράς","fontName":"Όνομα γραμματοσειράς","tabIndent":"Εσοχή με το πλήκτρο Tab","fullScreen":"Εναλλαγή κατάστασης πλήρους οθόνης","viewSource":"Προβολή προέλευσης HTML","print":"Εκτύπωση","newPage":"Νέα σελίδα","systemShortcut":"Σε αυτό το πρόγραμμα πλοήγησης, η ενέργεια \"${0}\" είναι διαθέσιμη μόνο με τη χρήση μιας συντόμευσης πληκτρολογίου. Χρησιμοποιήστε τη συντόμευση ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/el/commands.js.uncompressed.js b/lib/dijit/_editor/nls/el/commands.js.uncompressed.js
new file mode 100644
index 000000000..bb12160be
--- /dev/null
+++ b/lib/dijit/_editor/nls/el/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/el/commands", ({
+ 'bold': 'Έντονα',
+ 'copy': 'Αντιγραφή',
+ 'cut': 'Αποκοπή',
+ 'delete': 'Διαγραφή',
+ 'indent': 'Εσοχή',
+ 'insertHorizontalRule': 'Οριζόντια γραμμή',
+ 'insertOrderedList': 'Αριθμημένη λίστα',
+ 'insertUnorderedList': 'Λίστα με κουκίδες',
+ 'italic': 'Πλάγια',
+ 'justifyCenter': 'Στοίχιση στο κέντρο',
+ 'justifyFull': 'Πλήρης στοίχιση',
+ 'justifyLeft': 'Στοίχιση αριστερά',
+ 'justifyRight': 'Στοίχιση δεξιά',
+ 'outdent': 'Μείωση περιθωρίου',
+ 'paste': 'Επικόλληση',
+ 'redo': 'Ακύρωση αναίρεσης',
+ 'removeFormat': 'Αφαίρεση μορφοποίησης',
+ 'selectAll': 'Επιλογή όλων',
+ 'strikethrough': 'Διαγράμμιση',
+ 'subscript': 'Δείκτης',
+ 'superscript': 'Εκθέτης',
+ 'underline': 'Υπογράμμιση',
+ 'undo': 'Αναίρεση',
+ 'unlink': 'Αφαίρεση σύνδεσης',
+ 'createLink': 'Δημιουργία σύνδεσης',
+ 'toggleDir': 'Εναλλαγή κατεύθυνσης',
+ 'insertImage': 'Εισαγωγή εικόνας',
+ 'insertTable': 'Εισαγωγή/Τροποποίηση πίνακα',
+ 'toggleTableBorder': 'Εναλλαγή εμφάνισης περιγράμματος πίνακα',
+ 'deleteTable': 'Διαγραφή πίνακα',
+ 'tableProp': 'Ιδιότητα πίνακα',
+ 'htmlToggle': 'Πρωτογενής κώδικας HTML',
+ 'foreColor': 'Χρώμα προσκηνίου',
+ 'hiliteColor': 'Χρώμα φόντου',
+ 'plainFormatBlock': 'Στυλ παραγράφου',
+ 'formatBlock': 'Στυλ παραγράφου',
+ 'fontSize': 'Μέγεθος γραμματοσειράς',
+ 'fontName': 'Όνομα γραμματοσειράς',
+ 'tabIndent': 'Εσοχή με το πλήκτρο Tab',
+ "fullScreen": "Εναλλαγή κατάστασης πλήρους οθόνης",
+ "viewSource": "Προβολή προέλευσης HTML",
+ "print": "Εκτύπωση",
+ "newPage": "Νέα σελίδα",
+ /* Error messages */
+ 'systemShortcut': 'Σε αυτό το πρόγραμμα πλοήγησης, η ενέργεια "${0}" είναι διαθέσιμη μόνο με τη χρήση μιας συντόμευσης πληκτρολογίου. Χρησιμοποιήστε τη συντόμευση ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..ed8e6ff23
--- /dev/null
+++ b/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/es/FontChoice", ({
+ fontSize: "Tamaño",
+ fontName: "Font",
+ formatBlock: "Formato",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "espacio sencillo",
+ cursive: "cursiva",
+ fantasy: "fantasía",
+ noFormat: "Ninguno",
+ p: "Párrafo",
+ h1: "Cabecera",
+ h2: "Subcabecera",
+ h3: "Sub-subcabecera",
+ pre: "Preformateado",
+ 1: "xx-pequeño",
+ 2: "x-pequeño",
+ 3: "pequeño",
+ 4: "medio",
+ 5: "grande",
+ 6: "x-grande",
+ 7: "xx-grande"
+})
+);
diff --git a/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..de34f6770
--- /dev/null
+++ b/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/es/LinkDialog", ({
+ createLinkTitle: "Propiedades del enlace",
+ insertImageTitle: "Propiedades de la imagen",
+ url: "URL:",
+ text: "Descripción:",
+ target: "Destino:",
+ set: "Establecer",
+ currentWindow: "Ventana actual",
+ parentWindow: "Ventana padre",
+ topWindow: "Ventana superior",
+ newWindow: "Nueva ventana"
+})
+);
diff --git a/lib/dijit/_editor/nls/es/commands.js b/lib/dijit/_editor/nls/es/commands.js
index eae7c635d..b01975fd3 100644
--- a/lib/dijit/_editor/nls/es/commands.js
+++ b/lib/dijit/_editor/nls/es/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/es/commands",({"bold":"Negrita","copy":"Copiar","cut":"Cortar","delete":"Suprimir","indent":"Sangría","insertHorizontalRule":"Regla horizontal","insertOrderedList":"Lista numerada","insertUnorderedList":"Lista con viñetas","italic":"Cursiva","justifyCenter":"Alinear centro","justifyFull":"Justificar","justifyLeft":"Alinear izquierda","justifyRight":"Alinear derecha","outdent":"Anular sangría","paste":"Pegar","redo":"Rehacer","removeFormat":"Eliminar formato","selectAll":"Seleccionar todo","strikethrough":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado","undo":"Deshacer","unlink":"Eliminar enlace","createLink":"Crear enlace","toggleDir":"Conmutar dirección","insertImage":"Insertar imagen","insertTable":"Insertar/Editar tabla","toggleTableBorder":"Conmutar borde de tabla","deleteTable":"Suprimir tabla","tableProp":"Propiedad de tabla","htmlToggle":"Fuente HTML","foreColor":"Color de primer plano","hiliteColor":"Color de segundo plano","plainFormatBlock":"Estilo de párrafo","formatBlock":"Estilo de párrafo","fontSize":"Tamaño de font","fontName":"Nombre de font","tabIndent":"Sangría de tabulador","fullScreen":"Conmutar pantalla completa","viewSource":"Ver fuente HTML","print":"Imprimir","newPage":"Nueva página","systemShortcut":"La acción \"${0}\" sólo está disponible en su navegador mediante un atajo de teclado. Utilice ${1}.","ctrlKey":"control+${0}"})); \ No newline at end of file
+define("dijit/_editor/nls/es/commands",({"bold":"Negrita","copy":"Copiar","cut":"Cortar","delete":"Suprimir","indent":"Sangría","insertHorizontalRule":"Regla horizontal","insertOrderedList":"Lista numerada","insertUnorderedList":"Lista con viñetas","italic":"Cursiva","justifyCenter":"Alinear centro","justifyFull":"Justificar","justifyLeft":"Alinear izquierda","justifyRight":"Alinear derecha","outdent":"Anular sangría","paste":"Pegar","redo":"Rehacer","removeFormat":"Eliminar formato","selectAll":"Seleccionar todo","strikethrough":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado","undo":"Deshacer","unlink":"Eliminar enlace","createLink":"Crear enlace","toggleDir":"Conmutar dirección","insertImage":"Insertar imagen","insertTable":"Insertar/Editar tabla","toggleTableBorder":"Conmutar borde de tabla","deleteTable":"Suprimir tabla","tableProp":"Propiedad de tabla","htmlToggle":"Fuente HTML","foreColor":"Color de primer plano","hiliteColor":"Color de segundo plano","plainFormatBlock":"Estilo de párrafo","formatBlock":"Estilo de párrafo","fontSize":"Tamaño de font","fontName":"Nombre de font","tabIndent":"Sangría de tabulador","fullScreen":"Conmutar pantalla completa","viewSource":"Ver fuente HTML","print":"Imprimir","newPage":"Nueva página","systemShortcut":"La acción \"${0}\" sólo está disponible en su navegador mediante un atajo de teclado. Utilice ${1}.","ctrlKey":"control+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/es/commands.js.uncompressed.js b/lib/dijit/_editor/nls/es/commands.js.uncompressed.js
new file mode 100644
index 000000000..72e1b322a
--- /dev/null
+++ b/lib/dijit/_editor/nls/es/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/es/commands", ({
+ 'bold': 'Negrita',
+ 'copy': 'Copiar',
+ 'cut': 'Cortar',
+ 'delete': 'Suprimir',
+ 'indent': 'Sangría',
+ 'insertHorizontalRule': 'Regla horizontal',
+ 'insertOrderedList': 'Lista numerada',
+ 'insertUnorderedList': 'Lista con viñetas',
+ 'italic': 'Cursiva',
+ 'justifyCenter': 'Alinear centro',
+ 'justifyFull': 'Justificar',
+ 'justifyLeft': 'Alinear izquierda',
+ 'justifyRight': 'Alinear derecha',
+ 'outdent': 'Anular sangría',
+ 'paste': 'Pegar',
+ 'redo': 'Rehacer',
+ 'removeFormat': 'Eliminar formato',
+ 'selectAll': 'Seleccionar todo',
+ 'strikethrough': 'Tachado',
+ 'subscript': 'Subíndice',
+ 'superscript': 'Superíndice',
+ 'underline': 'Subrayado',
+ 'undo': 'Deshacer',
+ 'unlink': 'Eliminar enlace',
+ 'createLink': 'Crear enlace',
+ 'toggleDir': 'Conmutar dirección',
+ 'insertImage': 'Insertar imagen',
+ 'insertTable': 'Insertar/Editar tabla',
+ 'toggleTableBorder': 'Conmutar borde de tabla',
+ 'deleteTable': 'Suprimir tabla',
+ 'tableProp': 'Propiedad de tabla',
+ 'htmlToggle': 'Fuente HTML',
+ 'foreColor': 'Color de primer plano',
+ 'hiliteColor': 'Color de segundo plano',
+ 'plainFormatBlock': 'Estilo de párrafo',
+ 'formatBlock': 'Estilo de párrafo',
+ 'fontSize': 'Tamaño de font',
+ 'fontName': 'Nombre de font',
+ 'tabIndent': 'Sangría de tabulador',
+ "fullScreen": "Conmutar pantalla completa",
+ "viewSource": "Ver fuente HTML",
+ "print": "Imprimir",
+ "newPage": "Nueva página",
+ /* Error messages */
+ 'systemShortcut': 'La acción "${0}" sólo está disponible en su navegador mediante un atajo de teclado. Utilice ${1}.',
+ 'ctrlKey':'control+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/fi/FontChoice.js b/lib/dijit/_editor/nls/fi/FontChoice.js
index c2c1e7cd3..700b9e8a9 100644
--- a/lib/dijit/_editor/nls/fi/FontChoice.js
+++ b/lib/dijit/_editor/nls/fi/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/fi/FontChoice",({fontSize:"Koko",fontName:"Fontti",formatBlock:"Muoto",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"cursive",fantasy:"fantasy",noFormat:"Ei mitään",p:"Kappale",h1:"Otsikko",h2:"Alatason otsikko",h3:"Alimman tason otsikko",pre:"Esimuotoiltu",1:"xx-small",2:"x-small",3:"small",4:"medium",5:"large",6:"x-large",7:"xx-large"})); \ No newline at end of file
+define("dijit/_editor/nls/fi/FontChoice",({fontSize:"Koko",fontName:"Fontti",formatBlock:"Muotoile",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"cursive",fantasy:"fantasy",noFormat:"Ei mitään",p:"Kappale",h1:"Otsikko",h2:"Alatason otsikko",h3:"Alimman tason otsikko",pre:"Esimuotoiltu",1:"xx-small",2:"x-small",3:"small",4:"medium",5:"large",6:"x-large",7:"xx-large"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..30fa99971
--- /dev/null
+++ b/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/fi/FontChoice", ({
+ fontSize: "Koko",
+ fontName: "Fontti",
+ formatBlock: "Muotoile",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Ei mitään",
+ p: "Kappale",
+ h1: "Otsikko",
+ h2: "Alatason otsikko",
+ h3: "Alimman tason otsikko",
+ pre: "Esimuotoiltu",
+ 1: "xx-small",
+ 2: "x-small",
+ 3: "small",
+ 4: "medium",
+ 5: "large",
+ 6: "x-large",
+ 7: "xx-large"
+})
+);
diff --git a/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..ad6cfceca
--- /dev/null
+++ b/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/fi/LinkDialog", ({
+ createLinkTitle: "Linkin ominaisuudet",
+ insertImageTitle: "Kuvan ominaisuudet",
+ url: "URL-osoite:",
+ text: "Kuvaus:",
+ target: "Kohde:",
+ set: "Aseta",
+ currentWindow: "Nykyinen ikkuna",
+ parentWindow: "Pääikkuna",
+ topWindow: "Päällimmäinen ikkuna",
+ newWindow: "Uusi ikkuna"
+})
+);
diff --git a/lib/dijit/_editor/nls/fi/commands.js b/lib/dijit/_editor/nls/fi/commands.js
index 88a6f1886..3d77fc787 100644
--- a/lib/dijit/_editor/nls/fi/commands.js
+++ b/lib/dijit/_editor/nls/fi/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/fi/commands",({"bold":"Lihavointi","copy":"Kopioi","cut":"Leikkaa","delete":"Poista","indent":"Sisennä","insertHorizontalRule":"Vaakasuuntainen viiva","insertOrderedList":"Numeroitu luettelo","insertUnorderedList":"Numeroimaton luettelo","italic":"Kursivointi","justifyCenter":"Tasaus keskelle","justifyFull":"Tasaus","justifyLeft":"Tasaus vasemmalle","justifyRight":"Tasaus oikealle","outdent":"Ulonna","paste":"Liitä","redo":"Tee uudelleen","removeFormat":"Poista muotoilu","selectAll":"Valitse kaikki","strikethrough":"Yliviivaus","subscript":"Alaindeksi","superscript":"Yläindeksi","underline":"Alleviivaus","undo":"Kumoa","unlink":"Poista linkki","createLink":"Luo linkki","toggleDir":"Vaihda suuntaa","insertImage":"Lisää kuva","insertTable":"Lisää taulukko/muokkaa taulukkoa","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","deleteTable":"Poista taulukko","tableProp":"Taulukon ominaisuudet","htmlToggle":"HTML-lähde","foreColor":"Edustaväri","hiliteColor":"Taustaväri","plainFormatBlock":"Kappaletyyli","formatBlock":"Kappaletyyli","fontSize":"Fontin koko","fontName":"Fontin nimi","tabIndent":"Sarkainsisennys","fullScreen":"Vaihda koko näyttö","viewSource":"Näytä HTML-lähde","print":"Tulosta","newPage":"Uusi sivu","systemShortcut":"Toiminto \"${0}\" on käytettävissä selaimessa vain näppäimistön pikatoiminnolla. Käytä seuraavaa: ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/fi/commands",({"bold":"Lihavointi","copy":"Kopioi","cut":"Leikkaa","delete":"Poista","indent":"Sisennä","insertHorizontalRule":"Vaakasuuntainen viiva","insertOrderedList":"Numeroitu luettelo","insertUnorderedList":"Numeroimaton luettelo","italic":"Kursivointi","justifyCenter":"Tasaus keskelle","justifyFull":"Tasaus","justifyLeft":"Tasaus vasemmalle","justifyRight":"Tasaus oikealle","outdent":"Ulonna","paste":"Liitä","redo":"Tee uudelleen","removeFormat":"Poista muotoilu","selectAll":"Valitse kaikki","strikethrough":"Yliviivaus","subscript":"Alennettu","superscript":"Korotettu","underline":"Alleviivaus","undo":"Kumoa","unlink":"Poista linkki","createLink":"Luo linkki","toggleDir":"Vaihda suuntaa","insertImage":"Lisää kuva","insertTable":"Lisää taulukko/muokkaa taulukkoa","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","deleteTable":"Poista taulukko","tableProp":"Taulukon ominaisuudet","htmlToggle":"HTML-lähde","foreColor":"Edustaväri","hiliteColor":"Taustaväri","plainFormatBlock":"Kappaletyyli","formatBlock":"Kappaletyyli","fontSize":"Fonttikoko","fontName":"Fontin nimi","tabIndent":"Sarkainsisennys","fullScreen":"Vaihda koko näyttö","viewSource":"Näytä HTML-lähde","print":"Tulosta","newPage":"Uusi sivu","systemShortcut":"Toiminto \"${0}\" on käytettävissä selaimessa vain näppäimistön pikatoiminnolla. Käytä seuraavaa: ${1}.","ctrlKey":"Ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js b/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js
new file mode 100644
index 000000000..0eb730864
--- /dev/null
+++ b/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/fi/commands", ({
+ 'bold': 'Lihavointi',
+ 'copy': 'Kopioi',
+ 'cut': 'Leikkaa',
+ 'delete': 'Poista',
+ 'indent': 'Sisennä',
+ 'insertHorizontalRule': 'Vaakasuuntainen viiva',
+ 'insertOrderedList': 'Numeroitu luettelo',
+ 'insertUnorderedList': 'Numeroimaton luettelo',
+ 'italic': 'Kursivointi',
+ 'justifyCenter': 'Tasaus keskelle',
+ 'justifyFull': 'Tasaus',
+ 'justifyLeft': 'Tasaus vasemmalle',
+ 'justifyRight': 'Tasaus oikealle',
+ 'outdent': 'Ulonna',
+ 'paste': 'Liitä',
+ 'redo': 'Tee uudelleen',
+ 'removeFormat': 'Poista muotoilu',
+ 'selectAll': 'Valitse kaikki',
+ 'strikethrough': 'Yliviivaus',
+ 'subscript': 'Alennettu',
+ 'superscript': 'Korotettu',
+ 'underline': 'Alleviivaus',
+ 'undo': 'Kumoa',
+ 'unlink': 'Poista linkki',
+ 'createLink': 'Luo linkki',
+ 'toggleDir': 'Vaihda suuntaa',
+ 'insertImage': 'Lisää kuva',
+ 'insertTable': 'Lisää taulukko/muokkaa taulukkoa',
+ 'toggleTableBorder': 'Ota taulukon kehys käyttöön/poista kehys käytöstä',
+ 'deleteTable': 'Poista taulukko',
+ 'tableProp': 'Taulukon ominaisuudet',
+ 'htmlToggle': 'HTML-lähde',
+ 'foreColor': 'Edustaväri',
+ 'hiliteColor': 'Taustaväri',
+ 'plainFormatBlock': 'Kappaletyyli',
+ 'formatBlock': 'Kappaletyyli',
+ 'fontSize': 'Fonttikoko',
+ 'fontName': 'Fontin nimi',
+ 'tabIndent': 'Sarkainsisennys',
+ "fullScreen": "Vaihda koko näyttö",
+ "viewSource": "Näytä HTML-lähde",
+ "print": "Tulosta",
+ "newPage": "Uusi sivu",
+ /* Error messages */
+ 'systemShortcut': 'Toiminto "${0}" on käytettävissä selaimessa vain näppäimistön pikatoiminnolla. Käytä seuraavaa: ${1}.',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..8fba25433
--- /dev/null
+++ b/lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/fr/FontChoice", ({
+ fontSize: "Taille",
+ fontName: "Police",
+ formatBlock: "Mise en forme",
+ serif: "serif",
+ "sans-serif": "sans serif",
+ monospace: "espacement fixe",
+ cursive: "cursive",
+ fantasy: "fantaisie",
+ noFormat: "Néant",
+ p: "Paragraphe",
+ h1: "En-tête",
+ h2: "Sous-en-tête",
+ h3: "Sous-sous-en-tête",
+ pre: "Pré-mise en forme",
+ 1: "très très petite",
+ 2: "très petite",
+ 3: "petite",
+ 4: "moyenne",
+ 5: "grande",
+ 6: "très grande",
+ 7: "très très grande"
+})
+);
diff --git a/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..46ee185ad
--- /dev/null
+++ b/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/fr/LinkDialog", ({
+ createLinkTitle: "Propriétés du lien",
+ insertImageTitle: "Propriétés de l'image",
+ url: "URL :",
+ text: "Description :",
+ target: "Cible :",
+ set: "Définir",
+ currentWindow: "Fenêtre actuelle",
+ parentWindow: "Fenêtre parent",
+ topWindow: "Fenêtre supérieure",
+ newWindow: "Nouvelle fenêtre"
+})
+);
diff --git a/lib/dijit/_editor/nls/fr/commands.js b/lib/dijit/_editor/nls/fr/commands.js
index b1b471b54..cb25f3633 100644
--- a/lib/dijit/_editor/nls/fr/commands.js
+++ b/lib/dijit/_editor/nls/fr/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/fr/commands",({"bold":"Gras","copy":"Copier","cut":"Couper","delete":"Supprimer","indent":"Retrait","insertHorizontalRule":"Règle horizontale","insertOrderedList":"Liste numérotée","insertUnorderedList":"Liste à puces","italic":"Italique","justifyCenter":"Aligner au centre","justifyFull":"Justifier","justifyLeft":"Aligner à gauche","justifyRight":"Aligner à droite","outdent":"Retrait négatif","paste":"Coller","redo":"Rétablir","removeFormat":"Supprimer la mise en forme","selectAll":"Sélectionner tout","strikethrough":"Barrer","subscript":"Indice","superscript":"Exposant","underline":"Souligner","undo":"Annuler","unlink":"Supprimer le lien","createLink":"Créer un lien","toggleDir":"Changer de sens","insertImage":"Insérer une image","insertTable":"Insérer/Modifier un tableau","toggleTableBorder":"Afficher/Masquer la bordure du tableau","deleteTable":"Supprimer le tableau","tableProp":"Propriété du tableau","htmlToggle":"Source HTML","foreColor":"Couleur d'avant-plan","hiliteColor":"Couleur d'arrière-plan","plainFormatBlock":"Style de paragraphe","formatBlock":"Style de paragraphe","fontSize":"Taille de police","fontName":"Nom de police","tabIndent":"Retrait de tabulation","fullScreen":"Basculer en plein écran","viewSource":"Afficher la source HTML","print":"Imprimer","newPage":"Nouvelle page","systemShortcut":"L'action \"${0}\" est disponible dans votre navigateur uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/fr/commands",({"bold":"Gras","copy":"Copier","cut":"Couper","delete":"Supprimer","indent":"Retrait","insertHorizontalRule":"Règle horizontale","insertOrderedList":"Liste numérotée","insertUnorderedList":"Liste à puces","italic":"Italique","justifyCenter":"Aligner au centre","justifyFull":"Justifier","justifyLeft":"Aligner à gauche","justifyRight":"Aligner à droite","outdent":"Retrait négatif","paste":"Coller","redo":"Rétablir","removeFormat":"Supprimer la mise en forme","selectAll":"Sélectionner tout","strikethrough":"Barrer","subscript":"Indice","superscript":"Exposant","underline":"Souligner","undo":"Annuler","unlink":"Supprimer le lien","createLink":"Créer un lien","toggleDir":"Changer de sens","insertImage":"Insérer une image","insertTable":"Insérer/Modifier un tableau","toggleTableBorder":"Afficher/Masquer la bordure du tableau","deleteTable":"Supprimer le tableau","tableProp":"Propriété du tableau","htmlToggle":"Source HTML","foreColor":"Couleur d'avant-plan","hiliteColor":"Couleur d'arrière-plan","plainFormatBlock":"Style de paragraphe","formatBlock":"Style de paragraphe","fontSize":"Taille de police","fontName":"Nom de police","tabIndent":"Retrait de tabulation","fullScreen":"Basculer en plein écran","viewSource":"Afficher la source HTML","print":"Imprimer","newPage":"Nouvelle page","systemShortcut":"L'action \"${0}\" est disponible dans votre navigateur uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js b/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js
new file mode 100644
index 000000000..27b6a4031
--- /dev/null
+++ b/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/fr/commands", ({
+ 'bold': 'Gras',
+ 'copy': 'Copier',
+ 'cut': 'Couper',
+ 'delete': 'Supprimer',
+ 'indent': 'Retrait',
+ 'insertHorizontalRule': 'Règle horizontale',
+ 'insertOrderedList': 'Liste numérotée',
+ 'insertUnorderedList': 'Liste à puces',
+ 'italic': 'Italique',
+ 'justifyCenter': 'Aligner au centre',
+ 'justifyFull': 'Justifier',
+ 'justifyLeft': 'Aligner à gauche',
+ 'justifyRight': 'Aligner à droite',
+ 'outdent': 'Retrait négatif',
+ 'paste': 'Coller',
+ 'redo': 'Rétablir',
+ 'removeFormat': 'Supprimer la mise en forme',
+ 'selectAll': 'Sélectionner tout',
+ 'strikethrough': 'Barrer',
+ 'subscript': 'Indice',
+ 'superscript': 'Exposant',
+ 'underline': 'Souligner',
+ 'undo': 'Annuler',
+ 'unlink': 'Supprimer le lien',
+ 'createLink': 'Créer un lien',
+ 'toggleDir': 'Changer de sens',
+ 'insertImage': 'Insérer une image',
+ 'insertTable': 'Insérer/Modifier un tableau',
+ 'toggleTableBorder': 'Afficher/Masquer la bordure du tableau',
+ 'deleteTable': 'Supprimer le tableau',
+ 'tableProp': 'Propriété du tableau',
+ 'htmlToggle': 'Source HTML',
+ 'foreColor': 'Couleur d\'avant-plan',
+ 'hiliteColor': 'Couleur d\'arrière-plan',
+ 'plainFormatBlock': 'Style de paragraphe',
+ 'formatBlock': 'Style de paragraphe',
+ 'fontSize': 'Taille de police',
+ 'fontName': 'Nom de police',
+ 'tabIndent': 'Retrait de tabulation',
+ "fullScreen": "Basculer en plein écran",
+ "viewSource": "Afficher la source HTML",
+ "print": "Imprimer",
+ "newPage": "Nouvelle page",
+ /* Error messages */
+ 'systemShortcut': 'L\'action "${0}" est disponible dans votre navigateur uniquement, par le biais d\'un raccourci-clavier. Utilisez ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..c8bee2c34
--- /dev/null
+++ b/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/he/FontChoice", ({
+ fontSize: "גודל",
+ fontName: "גופן",
+ formatBlock: "עיצוב",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "ללא ",
+ p: "פיסקה",
+ h1: "כותרת",
+ h2: "תת-כותרת",
+ h3: "תת-תת-כותרת",
+ pre: "מעוצב מראש",
+ 1: "קטן ביות",
+ 2: "קטן מאוד",
+ 3: "קטן",
+ 4: "בינוני",
+ 5: "גדול",
+ 6: "גדול מאוד",
+ 7: "גדול ביותר"
+})
+);
diff --git a/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..5a5de943c
--- /dev/null
+++ b/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/he/LinkDialog", ({
+ createLinkTitle: "תכונות קישור",
+ insertImageTitle: "תכונות תמונה",
+ url: "URL:‏",
+ text: "תיאור:",
+ target: "יעד:",
+ set: "הגדרה",
+ currentWindow: "חלון נוכחי",
+ parentWindow: "חלון אב",
+ topWindow: "חלון עליון",
+ newWindow: "חלון חדש"
+})
+);
diff --git a/lib/dijit/_editor/nls/he/commands.js.uncompressed.js b/lib/dijit/_editor/nls/he/commands.js.uncompressed.js
new file mode 100644
index 000000000..cf719d478
--- /dev/null
+++ b/lib/dijit/_editor/nls/he/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/he/commands", ({
+ 'bold': 'מודגש',
+ 'copy': 'עותק',
+ 'cut': 'גזירה',
+ 'delete': 'מחיקה',
+ 'indent': 'הגדלת כניסה',
+ 'insertHorizontalRule': 'קו אופקי',
+ 'insertOrderedList': 'רשימה ממוספרת',
+ 'insertUnorderedList': 'רשימה עם תבליטים',
+ 'italic': 'נטוי',
+ 'justifyCenter': 'יישור למרכז',
+ 'justifyFull': 'יישור דו-צדדי',
+ 'justifyLeft': 'יישור לשמאל',
+ 'justifyRight': 'יישור לימין',
+ 'outdent': 'הקטנת כניסה',
+ 'paste': 'הדבקה',
+ 'redo': 'שחזור פעולה',
+ 'removeFormat': 'סילוק עיצוב',
+ 'selectAll': 'בחירת הכל',
+ 'strikethrough': 'קו חוצה',
+ 'subscript': 'כתב תחתי',
+ 'superscript': 'כתב עילי',
+ 'underline': 'קו תחתי',
+ 'undo': 'ביטול פעולה',
+ 'unlink': 'סילוק הקישור',
+ 'createLink': 'יצירת קישור',
+ 'toggleDir': 'מיתוג כיוון',
+ 'insertImage': 'הוספת תמונה',
+ 'insertTable': 'הוספת/עריכת טבלה',
+ 'toggleTableBorder': 'מיתוג גבול טבלה',
+ 'deleteTable': 'מחיקת טבלה',
+ 'tableProp': 'תכונת טבלה',
+ 'htmlToggle': 'מקור HTML',
+ 'foreColor': 'צבע חזית',
+ 'hiliteColor': 'צבע רקע',
+ 'plainFormatBlock': 'סגנון פיסקה',
+ 'formatBlock': 'סגנון פיסקה',
+ 'fontSize': 'גופן יחסי',
+ 'fontName': 'שם גופן',
+ 'tabIndent': 'כניסת טאב',
+ "fullScreen": "מיתוג מסך מלא",
+ "viewSource": "הצגת מקור HTML",
+ "print": "הדפסה",
+ "newPage": "דף חדש",
+ /* Error messages */
+ 'systemShortcut': 'הפעולה "${0}" זמינה בדפדפן רק באמצעות קיצור דרך במקלדת. השתמשו בקיצור ${1}.',
+ 'ctrlKey':'ctrl+${0}‎',
+ 'appleKey':'\u2318${0}‎' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..82e9bad43
--- /dev/null
+++ b/lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/hr/FontChoice", ({
+ fontSize: "Veličina",
+ fontName: "Font",
+ formatBlock: "Oblikovanje",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "jednaki razmak",
+ cursive: "rukopisni",
+ fantasy: "fantastika",
+ noFormat: "Nijedan",
+ p: "Odlomak",
+ h1: "Naslov",
+ h2: "Podnaslov",
+ h3: "Pod-podnaslov",
+ pre: "Prethodno formatirano",
+ 1: "vrlo vrlo malo",
+ 2: "vrlo malo",
+ 3: "malo",
+ 4: "srednje",
+ 5: "veliko",
+ 6: "vrlo veliko",
+ 7: "vrlo vrlo veliko"
+})
+);
diff --git a/lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..43869cceb
--- /dev/null
+++ b/lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/hr/LinkDialog", ({
+ createLinkTitle: "Svojstva veze",
+ insertImageTitle: "Svojstva slike",
+ url: "URL:",
+ text: "Opis:",
+ target: "Cilj:",
+ set: "Postavi",
+ currentWindow: "Aktivni prozor",
+ parentWindow: "Nadređeni prozor",
+ topWindow: "Najviši prozor",
+ newWindow: "Novi prozor"
+})
+);
diff --git a/lib/dijit/_editor/nls/hr/commands.js.uncompressed.js b/lib/dijit/_editor/nls/hr/commands.js.uncompressed.js
new file mode 100644
index 000000000..d61bf4899
--- /dev/null
+++ b/lib/dijit/_editor/nls/hr/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/hr/commands", ({
+ 'bold': 'Podebljaj',
+ 'copy': 'Kopiraj',
+ 'cut': 'Izreži',
+ 'delete': 'Izbriši',
+ 'indent': 'Uvuci',
+ 'insertHorizontalRule': 'Vodoravno ravnalo',
+ 'insertOrderedList': 'Numerirani popis',
+ 'insertUnorderedList': 'Popis s grafičkim oznakama',
+ 'italic': 'Kurziv',
+ 'justifyCenter': 'Centriraj',
+ 'justifyFull': 'Poravnaj',
+ 'justifyLeft': 'Poravnaj lijevo',
+ 'justifyRight': 'Poravnaj desno',
+ 'outdent': 'Izvuci',
+ 'paste': 'Zalijepi',
+ 'redo': 'Ponovno napravi',
+ 'removeFormat': 'Ukloni oblikovanje',
+ 'selectAll': 'Izaberi sve',
+ 'strikethrough': 'Precrtaj',
+ 'subscript': 'Indeks',
+ 'superscript': 'Superskript',
+ 'underline': 'Podcrtaj',
+ 'undo': 'Poništi',
+ 'unlink': 'Ukloni vezu',
+ 'createLink': 'Kreiraj vezu',
+ 'toggleDir': 'Prebaci smjer',
+ 'insertImage': 'Umetni sliku',
+ 'insertTable': 'Umetni/Uredi tablicu',
+ 'toggleTableBorder': 'Prebaci rub tablice',
+ 'deleteTable': 'Izbriši tablicu',
+ 'tableProp': 'Svojstvo tablice',
+ 'htmlToggle': 'HTML izvor',
+ 'foreColor': 'Boja prednjeg plana',
+ 'hiliteColor': 'Boja pozadine',
+ 'plainFormatBlock': 'Stil odlomka',
+ 'formatBlock': 'Stil odlomka',
+ 'fontSize': 'Veličina fonta',
+ 'fontName': 'Ime fonta',
+ 'tabIndent': 'Tabulator uvlačenja',
+ "fullScreen": "Prebaci na potpun ekran",
+ "viewSource": "Pogledaj HTML izvor",
+ "print": "Ispis",
+ "newPage": "Nova stranica",
+ /* Error messages */
+ 'systemShortcut': '"${0}" akcija je dostupna jedino u vašem pregledniku upotrebom prečice tipkovnice. Koristite ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..2868348ed
--- /dev/null
+++ b/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/hu/FontChoice", ({
+ fontSize: "Méret",
+ fontName: "Betűtípus",
+ formatBlock: "Formátum",
+ serif: "talpas",
+ "sans-serif": "talpatlan",
+ monospace: "rögzített szélességű",
+ cursive: "kurzív",
+ fantasy: "fantázia",
+ noFormat: "Nincs",
+ p: "Bekezdés",
+ h1: "Címsor",
+ h2: "Alcím",
+ h3: "Al-alcím",
+ pre: "Előformázott",
+ 1: "xx-kicsi",
+ 2: "x-kicsi",
+ 3: "kicsi",
+ 4: "közepes",
+ 5: "nagy",
+ 6: "x-nagy",
+ 7: "xx-nagy"
+})
+);
diff --git a/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..6558a2b42
--- /dev/null
+++ b/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/hu/LinkDialog", ({
+ createLinkTitle: "Hivatkozás tulajdonságai",
+ insertImageTitle: "Kép tulajdonságai",
+ url: "URL:",
+ text: "Leírás:",
+ target: "Cél:",
+ set: "Beállítás",
+ currentWindow: "Aktuális ablak",
+ parentWindow: "Szülő ablak",
+ topWindow: "Legfelső szintű ablak",
+ newWindow: "Új ablak"
+})
+);
diff --git a/lib/dijit/_editor/nls/hu/commands.js b/lib/dijit/_editor/nls/hu/commands.js
index 39d06ddb9..b10b15512 100644
--- a/lib/dijit/_editor/nls/hu/commands.js
+++ b/lib/dijit/_editor/nls/hu/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/hu/commands",({"bold":"Félkövér","copy":"Másolás","cut":"Kivágás","delete":"Törlés","indent":"Behúzás","insertHorizontalRule":"Vízszintes vonalzó","insertOrderedList":"Számozott lista","insertUnorderedList":"Felsorolásjeles lista","italic":"Dőlt","justifyCenter":"Középre igazítás","justifyFull":"Sorkizárás","justifyLeft":"Balra igazítás","justifyRight":"Jobbra igazítás","outdent":"Negatív behúzás","paste":"Beillesztés","redo":"Újra","removeFormat":"Formázás eltávolítása","selectAll":"Összes kijelölése","strikethrough":"Áthúzott","subscript":"Alsó index","superscript":"Felső index","underline":"Aláhúzott","undo":"Visszavonás","unlink":"Hivatkozás eltávolítása","createLink":"Hivatkozás létrehozása","toggleDir":"Irány váltókapcsoló","insertImage":"Kép beszúrása","insertTable":"Táblázat beszúrása/szerkesztése","toggleTableBorder":"Táblázatszegély ki-/bekapcsolása","deleteTable":"Táblázat törlése","tableProp":"Táblázat tulajdonságai","htmlToggle":"HTML forrás","foreColor":"Előtérszín","hiliteColor":"Háttérszín","plainFormatBlock":"Bekezdés stílusa","formatBlock":"Bekezdés stílusa","fontSize":"Betűméret","fontName":"Betűtípus","tabIndent":"Tab behúzás","fullScreen":"Váltás teljes képernyőre","viewSource":"HTML forrás megjelenítése","print":"Nyomtatás","newPage":"Új oldal","systemShortcut":"A(z) \"${0}\" művelet a böngészőben csak billentyűparancs használatával érhető el. Használja a következőt: ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/hu/commands",({"bold":"Félkövér","copy":"Másolás","cut":"Kivágás","delete":"Törlés","indent":"Behúzás","insertHorizontalRule":"Vízszintes vonalzó","insertOrderedList":"Számozott lista","insertUnorderedList":"Felsorolásjeles lista","italic":"Dőlt","justifyCenter":"Középre igazítás","justifyFull":"Sorkizárás","justifyLeft":"Balra igazítás","justifyRight":"Jobbra igazítás","outdent":"Negatív behúzás","paste":"Beillesztés","redo":"Újra","removeFormat":"Formázás eltávolítása","selectAll":"Összes kijelölése","strikethrough":"Áthúzott","subscript":"Alsó index","superscript":"Felső index","underline":"Aláhúzott","undo":"Visszavonás","unlink":"Hivatkozás eltávolítása","createLink":"Hivatkozás létrehozása","toggleDir":"Irány váltókapcsoló","insertImage":"Kép beszúrása","insertTable":"Táblázat beszúrása/szerkesztése","toggleTableBorder":"Táblázatszegély ki-/bekapcsolása","deleteTable":"Táblázat törlése","tableProp":"Táblázat tulajdonságai","htmlToggle":"HTML forrás","foreColor":"Előtérszín","hiliteColor":"Háttérszín","plainFormatBlock":"Bekezdés stílusa","formatBlock":"Bekezdés stílusa","fontSize":"Betűméret","fontName":"Betűtípus","tabIndent":"Tab behúzás","fullScreen":"Váltás teljes képernyőre","viewSource":"HTML forrás megjelenítése","print":"Nyomtatás","newPage":"Új oldal","systemShortcut":"A(z) \"${0}\" művelet a böngészőben csak billentyűparancs használatával érhető el. Használja a következőt: ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js b/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js
new file mode 100644
index 000000000..10b86ea90
--- /dev/null
+++ b/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/hu/commands", ({
+ 'bold': 'Félkövér',
+ 'copy': 'Másolás',
+ 'cut': 'Kivágás',
+ 'delete': 'Törlés',
+ 'indent': 'Behúzás',
+ 'insertHorizontalRule': 'Vízszintes vonalzó',
+ 'insertOrderedList': 'Számozott lista',
+ 'insertUnorderedList': 'Felsorolásjeles lista',
+ 'italic': 'Dőlt',
+ 'justifyCenter': 'Középre igazítás',
+ 'justifyFull': 'Sorkizárás',
+ 'justifyLeft': 'Balra igazítás',
+ 'justifyRight': 'Jobbra igazítás',
+ 'outdent': 'Negatív behúzás',
+ 'paste': 'Beillesztés',
+ 'redo': 'Újra',
+ 'removeFormat': 'Formázás eltávolítása',
+ 'selectAll': 'Összes kijelölése',
+ 'strikethrough': 'Áthúzott',
+ 'subscript': 'Alsó index',
+ 'superscript': 'Felső index',
+ 'underline': 'Aláhúzott',
+ 'undo': 'Visszavonás',
+ 'unlink': 'Hivatkozás eltávolítása',
+ 'createLink': 'Hivatkozás létrehozása',
+ 'toggleDir': 'Irány váltókapcsoló',
+ 'insertImage': 'Kép beszúrása',
+ 'insertTable': 'Táblázat beszúrása/szerkesztése',
+ 'toggleTableBorder': 'Táblázatszegély ki-/bekapcsolása',
+ 'deleteTable': 'Táblázat törlése',
+ 'tableProp': 'Táblázat tulajdonságai',
+ 'htmlToggle': 'HTML forrás',
+ 'foreColor': 'Előtérszín',
+ 'hiliteColor': 'Háttérszín',
+ 'plainFormatBlock': 'Bekezdés stílusa',
+ 'formatBlock': 'Bekezdés stílusa',
+ 'fontSize': 'Betűméret',
+ 'fontName': 'Betűtípus',
+ 'tabIndent': 'Tab behúzás',
+ "fullScreen": "Váltás teljes képernyőre",
+ "viewSource": "HTML forrás megjelenítése",
+ "print": "Nyomtatás",
+ "newPage": "Új oldal",
+ /* Error messages */
+ 'systemShortcut': 'A(z) "${0}" művelet a böngészőben csak billentyűparancs használatával érhető el. Használja a következőt: ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..1d181d3b3
--- /dev/null
+++ b/lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/it/FontChoice", ({
+ fontSize: "Dimensione",
+ fontName: "Carattere",
+ formatBlock: "Formato",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "spaziatura fissa",
+ cursive: "corsivo",
+ fantasy: "fantasy",
+ noFormat: "Nessuna",
+ p: "Paragrafo",
+ h1: "Intestazione",
+ h2: "Sottointestazione",
+ h3: "Sottointestazione secondaria",
+ pre: "Preformattato",
+ 1: "piccolissimo",
+ 2: "molto piccolo",
+ 3: "piccolo",
+ 4: "medio",
+ 5: "grande",
+ 6: "molto grande",
+ 7: "grandissimo"
+})
+);
diff --git a/lib/dijit/_editor/nls/it/LinkDialog.js b/lib/dijit/_editor/nls/it/LinkDialog.js
index 8e6eb0002..5682ac9f9 100644
--- a/lib/dijit/_editor/nls/it/LinkDialog.js
+++ b/lib/dijit/_editor/nls/it/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/it/LinkDialog",({createLinkTitle:"Proprietà collegamento",insertImageTitle:"Proprietà immagine",url:"URL:",text:"Descrizione:",target:"Destinazione:",set:"Imposta",currentWindow:"Finestra corrente",parentWindow:"Finestra parent",topWindow:"Finestra in primo piano",newWindow:"Nuova finestra"})); \ No newline at end of file
+define("dijit/_editor/nls/it/LinkDialog",({createLinkTitle:"Proprietà collegamento",insertImageTitle:"Proprietà immagine",url:"URL:",text:"Descrizione:",target:"Destinazione:",set:"Imposta",currentWindow:"Finestra corrente",parentWindow:"Finestra padre",topWindow:"Finestra superiore",newWindow:"Nuova finestra"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..e59b36583
--- /dev/null
+++ b/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/it/LinkDialog", ({
+ createLinkTitle: "Proprietà collegamento",
+ insertImageTitle: "Proprietà immagine",
+ url: "URL:",
+ text: "Descrizione:",
+ target: "Destinazione:",
+ set: "Imposta",
+ currentWindow: "Finestra corrente",
+ parentWindow: "Finestra padre",
+ topWindow: "Finestra superiore",
+ newWindow: "Nuova finestra"
+})
+);
diff --git a/lib/dijit/_editor/nls/it/commands.js b/lib/dijit/_editor/nls/it/commands.js
index f413791b7..82ae3ae5a 100644
--- a/lib/dijit/_editor/nls/it/commands.js
+++ b/lib/dijit/_editor/nls/it/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/it/commands",({"bold":"Grassetto","copy":"Copia","cut":"Taglia","delete":"Elimina","indent":"Rientra","insertHorizontalRule":"Righello orizzontale","insertOrderedList":"Elenco numerato","insertUnorderedList":"Elenco puntato","italic":"Corsivo","justifyCenter":"Allinea al centro","justifyFull":"Giustifica","justifyLeft":"Allinea a sinistra","justifyRight":"Allinea a destra","outdent":"Rimuovi rientro","paste":"Incolla","redo":"Ripristina","removeFormat":"Rimuovi formato","selectAll":"Seleziona tutto","strikethrough":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato","undo":"Annulla","unlink":"Rimuovi collegamento","createLink":"Crea collegamento","toggleDir":"Inverti direzione","insertImage":"Inserisci immagine","insertTable":"Inserisci/Modifica tabella","toggleTableBorder":"Mostra/Nascondi margine tabella","deleteTable":"Elimina tabella","tableProp":"Proprietà tabella","htmlToggle":"Origine HTML","foreColor":"Colore primo piano","hiliteColor":"Colore sfondo","plainFormatBlock":"Stile paragrafo","formatBlock":"Stile paragrafo","fontSize":"Dimensione carattere","fontName":"Nome carattere","tabIndent":"Rientranza tabulazione","fullScreen":"Attiva/Disattiva schermo intero","viewSource":"Visualizza origine HTML","print":"Stampa","newPage":"Nuova pagina","systemShortcut":"Azione \"${0}\" disponibile sul proprio browser solo mediante i tasti di scelta rapida della tastiera. Utilizzare ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/it/commands",({"bold":"Grassetto","copy":"Copia","cut":"Taglia","delete":"Annulla","indent":"Rientra","insertHorizontalRule":"Righello orizzontale","insertOrderedList":"Elenco numerato","insertUnorderedList":"Elenco a punti","italic":"Corsivo","justifyCenter":"Allinea al centro","justifyFull":"Giustifica","justifyLeft":"Allinea a sinistra","justifyRight":"Allinea a destra","outdent":"Annulla rientro","paste":"Incolla","redo":"Ripeti","removeFormat":"Rimuovi formato","selectAll":"Seleziona tutto","strikethrough":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolinea","undo":"Annulla","unlink":"Rimuovi collegamento","createLink":"Crea collegamento","toggleDir":"Attiva/Disattiva direzione","insertImage":"Inserisci immagine","insertTable":"Inserisci/Modifica tabella","toggleTableBorder":"Attiva/Disattiva bordo tabella","deleteTable":"Elimina tabella","tableProp":"Proprietà tabella","htmlToggle":"Origine HTML","foreColor":"Colore in primo piano","hiliteColor":"Colore di sfondo","plainFormatBlock":"Stile paragrafo","formatBlock":"Stile paragrafo","fontSize":"Dimensione tipo di carattere","fontName":"Nome tipo di carattere","tabIndent":"Rientro tabulazione","fullScreen":"Attiva/Disattiva schermo intero","viewSource":"Visualizza origine HTML","print":"Stampa","newPage":"Nuova pagina","systemShortcut":"Azione \"${0}\" disponibile nel browser solo utilizzando una scelta rapida da tastiera. Utilizzare ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/it/commands.js.uncompressed.js b/lib/dijit/_editor/nls/it/commands.js.uncompressed.js
new file mode 100644
index 000000000..5b1b53a4b
--- /dev/null
+++ b/lib/dijit/_editor/nls/it/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/it/commands", ({
+ 'bold': 'Grassetto',
+ 'copy': 'Copia',
+ 'cut': 'Taglia',
+ 'delete': 'Annulla',
+ 'indent': 'Rientra',
+ 'insertHorizontalRule': 'Righello orizzontale',
+ 'insertOrderedList': 'Elenco numerato',
+ 'insertUnorderedList': 'Elenco a punti',
+ 'italic': 'Corsivo',
+ 'justifyCenter': 'Allinea al centro',
+ 'justifyFull': 'Giustifica',
+ 'justifyLeft': 'Allinea a sinistra',
+ 'justifyRight': 'Allinea a destra',
+ 'outdent': 'Annulla rientro',
+ 'paste': 'Incolla',
+ 'redo': 'Ripeti',
+ 'removeFormat': 'Rimuovi formato',
+ 'selectAll': 'Seleziona tutto',
+ 'strikethrough': 'Barrato',
+ 'subscript': 'Pedice',
+ 'superscript': 'Apice',
+ 'underline': 'Sottolinea',
+ 'undo': 'Annulla',
+ 'unlink': 'Rimuovi collegamento',
+ 'createLink': 'Crea collegamento',
+ 'toggleDir': 'Attiva/Disattiva direzione',
+ 'insertImage': 'Inserisci immagine',
+ 'insertTable': 'Inserisci/Modifica tabella',
+ 'toggleTableBorder': 'Attiva/Disattiva bordo tabella',
+ 'deleteTable': 'Elimina tabella',
+ 'tableProp': 'Proprietà tabella',
+ 'htmlToggle': 'Origine HTML',
+ 'foreColor': 'Colore in primo piano',
+ 'hiliteColor': 'Colore di sfondo',
+ 'plainFormatBlock': 'Stile paragrafo',
+ 'formatBlock': 'Stile paragrafo',
+ 'fontSize': 'Dimensione tipo di carattere',
+ 'fontName': 'Nome tipo di carattere',
+ 'tabIndent': 'Rientro tabulazione',
+ "fullScreen": "Attiva/Disattiva schermo intero",
+ "viewSource": "Visualizza origine HTML",
+ "print": "Stampa",
+ "newPage": "Nuova pagina",
+ /* Error messages */
+ 'systemShortcut': 'Azione "${0}" disponibile nel browser solo utilizzando una scelta rapida da tastiera. Utilizzare ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..51232f1a5
--- /dev/null
+++ b/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/ja/FontChoice", ({
+ fontSize: "サイズ",
+ fontName: "フォント",
+ formatBlock: "フォーマット",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "なし",
+ p: "段落",
+ h1: "見出し",
+ h2: "副見出し",
+ h3: "副見出しの副見出し",
+ pre: "事前フォーマット済み",
+ 1: "超極小",
+ 2: "極小",
+ 3: "小",
+ 4: "標準",
+ 5: "大",
+ 6: "特大",
+ 7: "超特大"
+})
+);
diff --git a/lib/dijit/_editor/nls/ja/LinkDialog.js b/lib/dijit/_editor/nls/ja/LinkDialog.js
index 408e45ed6..d3d5e53cf 100644
--- a/lib/dijit/_editor/nls/ja/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ja/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ja/LinkDialog",({createLinkTitle:"リンク・プロパティー",insertImageTitle:"イメージ・プロパティー",url:"URL:",text:"説明:",target:"ターゲット:",set:"設定",currentWindow:"現行ウィンドウ",parentWindow:"親ウィンドウ",topWindow:"最上位ウィンドウ",newWindow:"新規ウィンドウ"})); \ No newline at end of file
+define("dijit/_editor/nls/ja/LinkDialog",({createLinkTitle:"リンク・プロパティー",insertImageTitle:"イメージ・プロパティー",url:"URL:",text:"説明:",target:"ターゲット: ",set:"設定",currentWindow:"現在のウィンドウ",parentWindow:"親ウィンドウ",topWindow:"最上位ウィンドウ",newWindow:"新規ウィンドウ"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..6f4e06567
--- /dev/null
+++ b/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/ja/LinkDialog", ({
+ createLinkTitle: "リンク・プロパティー",
+ insertImageTitle: "イメージ・プロパティー",
+ url: "URL:",
+ text: "説明:",
+ target: "ターゲット: ",
+ set: "設定",
+ currentWindow: "現在のウィンドウ",
+ parentWindow: "親ウィンドウ",
+ topWindow: "最上位ウィンドウ",
+ newWindow: "新規ウィンドウ"
+})
+);
diff --git a/lib/dijit/_editor/nls/ja/commands.js b/lib/dijit/_editor/nls/ja/commands.js
index 56026d1e3..5cc5e5796 100644
--- a/lib/dijit/_editor/nls/ja/commands.js
+++ b/lib/dijit/_editor/nls/ja/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ja/commands",({"bold":"太字","copy":"コピー","cut":"切り取り","delete":"削除","indent":"インデント","insertHorizontalRule":"水平罫線","insertOrderedList":"番号付きリスト","insertUnorderedList":"黒丸付きリスト","italic":"イタリック","justifyCenter":"中央揃え","justifyFull":"両端揃え","justifyLeft":"左揃え","justifyRight":"右揃え","outdent":"アウトデント","paste":"貼り付け","redo":"やり直し","removeFormat":"書式のクリア","selectAll":"すべて選択","strikethrough":"取り消し線","subscript":"下付き文字","superscript":"上付き文字","underline":"下線","undo":"元に戻す","unlink":"リンクの削除","createLink":"リンクの作成","toggleDir":"方向の切り替え","insertImage":"イメージの挿入","insertTable":"テーブルの挿入/編集","toggleTableBorder":"テーブル・ボーダーの切り替え","deleteTable":"テーブルの削除","tableProp":"テーブル・プロパティー","htmlToggle":"HTML ソース","foreColor":"前景色","hiliteColor":"マーカー","plainFormatBlock":"段落スタイル","formatBlock":"段落スタイル","fontSize":"フォント・サイズ","fontName":"フォント名","tabIndent":"タブ・インデント","fullScreen":"全画面表示に切り替え","viewSource":"HTML ソースの表示","print":"印刷","newPage":"新規ページ","systemShortcut":"\"${0}\" アクションを使用できるのは、ブラウザーでキーボード・ショートカットを使用する場合のみです。${1} を使用してください。","ctrlKey":"Ctrl+${0}"})); \ No newline at end of file
+define("dijit/_editor/nls/ja/commands",({"bold":"太字","copy":"コピー","cut":"切り取り","delete":"削除","indent":"インデント","insertHorizontalRule":"水平罫線","insertOrderedList":"番号付きリスト","insertUnorderedList":"黒丸付きリスト","italic":"イタリック","justifyCenter":"中央揃え","justifyFull":"両端揃え","justifyLeft":"左揃え","justifyRight":"右揃え","outdent":"アウトデント","paste":"貼り付け","redo":"やり直し","removeFormat":"形式の削除","selectAll":"すべて選択","strikethrough":"取り消し線","subscript":"下付き文字","superscript":"上付き文字","underline":"下線","undo":"元に戻す","unlink":"リンクの削除","createLink":"リンクの作成","toggleDir":"方向の切り替え","insertImage":"イメージの挿入","insertTable":"テーブルの挿入/編集","toggleTableBorder":"テーブルボーダーの切り替え","deleteTable":"テーブルの削除","tableProp":"テーブルプロパティ","htmlToggle":"HTML ソース","foreColor":"前景色","hiliteColor":"背景色","plainFormatBlock":"段落スタイル","formatBlock":"段落スタイル","fontSize":"フォントサイズ","fontName":"フォント名","tabIndent":"タブインデント","fullScreen":"全画面表示に切り替え","viewSource":"HTML ソースの表示","print":"印刷","newPage":"新しいページ","systemShortcut":"\"${0}\" アクションを使用できるのは、ブラウザーでキーボードショートカットを使用する場合のみです。 ${1} を使用してください。","ctrlKey":"Ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js
new file mode 100644
index 000000000..8c41419c5
--- /dev/null
+++ b/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ja/commands", ({
+ 'bold': '太字',
+ 'copy': 'コピー',
+ 'cut': '切り取り',
+ 'delete': '削除',
+ 'indent': 'インデント',
+ 'insertHorizontalRule': '水平罫線',
+ 'insertOrderedList': '番号付きリスト',
+ 'insertUnorderedList': '黒丸付きリスト',
+ 'italic': 'イタリック',
+ 'justifyCenter': '中央揃え',
+ 'justifyFull': '両端揃え',
+ 'justifyLeft': '左揃え',
+ 'justifyRight': '右揃え',
+ 'outdent': 'アウトデント',
+ 'paste': '貼り付け',
+ 'redo': 'やり直し',
+ 'removeFormat': '形式の削除',
+ 'selectAll': 'すべて選択',
+ 'strikethrough': '取り消し線',
+ 'subscript': '下付き文字',
+ 'superscript': '上付き文字',
+ 'underline': '下線',
+ 'undo': '元に戻す',
+ 'unlink': 'リンクの削除',
+ 'createLink': 'リンクの作成',
+ 'toggleDir': '方向の切り替え',
+ 'insertImage': 'イメージの挿入',
+ 'insertTable': 'テーブルの挿入/編集',
+ 'toggleTableBorder': 'テーブルボーダーの切り替え',
+ 'deleteTable': 'テーブルの削除',
+ 'tableProp': 'テーブルプロパティ',
+ 'htmlToggle': 'HTML ソース',
+ 'foreColor': '前景色',
+ 'hiliteColor': '背景色',
+ 'plainFormatBlock': '段落スタイル',
+ 'formatBlock': '段落スタイル',
+ 'fontSize': 'フォントサイズ',
+ 'fontName': 'フォント名',
+ 'tabIndent': 'タブインデント',
+ "fullScreen": "全画面表示に切り替え",
+ "viewSource": "HTML ソースの表示",
+ "print": "印刷",
+ "newPage": "新しいページ",
+ /* Error messages */
+ 'systemShortcut': '"${0}" アクションを使用できるのは、ブラウザーでキーボードショートカットを使用する場合のみです。 ${1} を使用してください。',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/kk/FontChoice.js b/lib/dijit/_editor/nls/kk/FontChoice.js
index 1569c30b2..ee4db4392 100644
--- a/lib/dijit/_editor/nls/kk/FontChoice.js
+++ b/lib/dijit/_editor/nls/kk/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/kk/FontChoice",({fontSize:"Өлшемі",fontName:"Қаріп",formatBlock:"Пішім",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"көлбеу",fantasy:"қиял-ғажайып",noFormat:"Ешбір",p:"Еже",h1:"Үстіңгі деректеме",h2:"Ішкі тақырып",h3:"Ішкі-ішкі тақырып",pre:"Алдын ала пішімделген",1:"xx-кіші",2:"x-кіші",3:"кіші",4:"орташа",5:"үлкен",6:"x-үлкен",7:"xx-үлкен"})); \ No newline at end of file
+define("dijit/_editor/nls/kk/FontChoice",({fontSize:"Өлшемі",fontName:"Қаріп",formatBlock:"Пішім",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"көлбеу",fantasy:"fantasy",noFormat:"Ешбір",p:"Еже",h1:"Тақырып",h2:"Ішкі тақырып",h3:"Ішкі-ішкі тақырып",pre:"Алдын ала пішімделген",1:"xx-кіші",2:"x-кіші",3:"кіші",4:"орташа",5:"үлкен",6:"x-үлкен",7:"xx-үлкен"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..e7a52c87a
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/kk/FontChoice", ({
+ fontSize: "Өлшемі",
+ fontName: "Қаріп",
+ formatBlock: "Пішім",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "көлбеу",
+ fantasy: "fantasy",
+ noFormat: "Ешбір",
+ p: "Еже",
+ h1: "Тақырып",
+ h2: "Ішкі тақырып",
+ h3: "Ішкі-ішкі тақырып",
+ pre: "Алдын ала пішімделген",
+ 1: "xx-кіші",
+ 2: "x-кіші",
+ 3: "кіші",
+ 4: "орташа",
+ 5: "үлкен",
+ 6: "x-үлкен",
+ 7: "xx-үлкен"
+})
+);
diff --git a/lib/dijit/_editor/nls/kk/LinkDialog.js b/lib/dijit/_editor/nls/kk/LinkDialog.js
index b186e824a..0967b8094 100644
--- a/lib/dijit/_editor/nls/kk/LinkDialog.js
+++ b/lib/dijit/_editor/nls/kk/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/kk/LinkDialog",({createLinkTitle:"Сілтеме сипаттары",insertImageTitle:"Сурет сипаттары",url:"URL мекенжайы:",text:"Сипаттама:",target:"Мақсат:",set:"Орнату",currentWindow:"Ағымдағы терезе",parentWindow:"Басты терезе",topWindow:"Ең жоғарғы терезе",newWindow:"Жаңа терезе"})); \ No newline at end of file
+define("dijit/_editor/nls/kk/LinkDialog",({createLinkTitle:"Сілтеме сипаттары",insertImageTitle:"Сурет сипаттары",url:"URL:",text:"Сипаттама:",target:"Мақсат:",set:"Орнату",currentWindow:"Ағымдағы терезе",parentWindow:"Басты терезе",topWindow:"Ең жоғарғы терезе",newWindow:"Жаңа терезе"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..1a78a3295
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/kk/LinkDialog", ({
+ createLinkTitle: "Сілтеме сипаттары",
+ insertImageTitle: "Сурет сипаттары",
+ url: "URL:",
+ text: "Сипаттама:",
+ target: "Мақсат:",
+ set: "Орнату",
+ currentWindow: "Ағымдағы терезе",
+ parentWindow: "Басты терезе",
+ topWindow: "Ең жоғарғы терезе",
+ newWindow: "Жаңа терезе"
+})
+);
diff --git a/lib/dijit/_editor/nls/kk/commands.js b/lib/dijit/_editor/nls/kk/commands.js
index 15d253122..32a22f964 100644
--- a/lib/dijit/_editor/nls/kk/commands.js
+++ b/lib/dijit/_editor/nls/kk/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/kk/commands",({"bold":"Қалың","copy":"Көшіру","cut":"Қиып алу","delete":"Жою","indent":"Шегіндіру","insertHorizontalRule":"Көлденең сызғыш","insertOrderedList":"Нөмірленген тізім","insertUnorderedList":"Таңбалауыш тізім","italic":"Көлбеу","justifyCenter":"Ортасы бойынша туралау","justifyFull":"Туралау","justifyLeft":"Сол жақ бойынша туралау","justifyRight":"Оң жақ бойынша туралау","outdent":"Шығыңқы","paste":"Қою","redo":"Қайтару","removeFormat":"Пішімді алып тастау","selectAll":"Барлығын таңдау","strikethrough":"Сызылған","subscript":"Жоласты","superscript":"Жолүсті","underline":"Асты сызылған","undo":"Болдырмау ","unlink":"Сілтемені жою","createLink":"Сілтеме жасау","toggleDir":"Бағытты қосу","insertImage":"Сурет кірістіру","insertTable":"Кестені кірістіру/өңдеу","toggleTableBorder":"Кесте жиегін қосу","deleteTable":"Кестені жою","tableProp":"Кесте сипаты","htmlToggle":"HTML көзі","foreColor":"Алды түсі","hiliteColor":"Өң түсі","plainFormatBlock":"Еже мәнері","formatBlock":"Еже мәнері","fontSize":"Қаріп өлшемі","fontName":"Қаріп атауы","tabIndent":"Қойынды шегінісі","fullScreen":"Толық экранды қосу","viewSource":"HTML көзін қарау","print":"Басып шығару","newPage":"Жаңа бет","systemShortcut":"\"${0}\" әрекеті шолғышта тек пернелер тіркесімі арқылы қол жетімді. ${1} пайдаланыңыз."})); \ No newline at end of file
+define("dijit/_editor/nls/kk/commands",({"bold":"Қалың","copy":"Көшіру","cut":"Қиып алу","delete":"Жою","indent":"Шегіндіру","insertHorizontalRule":"Көлденең сызғыш","insertOrderedList":"Нөмірленген тізім","insertUnorderedList":"Таңбалауыш тізім","italic":"Көлбеу","justifyCenter":"Ортасы бойынша туралау","justifyFull":"Туралау","justifyLeft":"Сол жақ бойынша туралау","justifyRight":"Оң жақ бойынша туралау","outdent":"Солға ығысу","paste":"Қою","redo":"Қайтару","removeFormat":"Пішімді алып тастау","selectAll":"Барлығын таңдау","strikethrough":"Сызылған","subscript":"Жоласты","superscript":"Жолүсті","underline":"Асты сызылған","undo":"Болдырмау","unlink":"Сілтемені алып тастау","createLink":"Сілтеме жасау","toggleDir":"Бағытты қосу","insertImage":"Суретті кірістіру","insertTable":"Кестені кірістіру/өңдеу","toggleTableBorder":"Кесте жиегін қосу","deleteTable":"Кестені жою","tableProp":"Кесте сипаты","htmlToggle":"HTML көзі","foreColor":"Алды түсі","hiliteColor":"Өң түсі","plainFormatBlock":"Еже мәнері","formatBlock":"Еже мәнері","fontSize":"Қаріп өлшемі","fontName":"Қаріп атауы","tabIndent":"Қойынды шегінісі","fullScreen":"Толық экранды қосу","viewSource":"HTML көзін қарау","print":"Басып шығару","newPage":"Жаңа бет","systemShortcut":"\"${0}\" әрекеті шолғышта тек пернелер тіркесімі арқылы қол жетімді. ${1} пайдаланыңыз.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js b/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js
new file mode 100644
index 000000000..ea78dd296
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/kk/commands", ({
+ 'bold': 'Қалың',
+ 'copy': 'Көшіру',
+ 'cut': 'Қиып алу',
+ 'delete': 'Жою',
+ 'indent': 'Шегіндіру',
+ 'insertHorizontalRule': 'Көлденең сызғыш',
+ 'insertOrderedList': 'Нөмірленген тізім',
+ 'insertUnorderedList': 'Таңбалауыш тізім',
+ 'italic': 'Көлбеу',
+ 'justifyCenter': 'Ортасы бойынша туралау',
+ 'justifyFull': 'Туралау',
+ 'justifyLeft': 'Сол жақ бойынша туралау',
+ 'justifyRight': 'Оң жақ бойынша туралау',
+ 'outdent': 'Солға ығысу',
+ 'paste': 'Қою',
+ 'redo': 'Қайтару',
+ 'removeFormat': 'Пішімді алып тастау',
+ 'selectAll': 'Барлығын таңдау',
+ 'strikethrough': 'Сызылған',
+ 'subscript': 'Жоласты',
+ 'superscript': 'Жолүсті',
+ 'underline': 'Асты сызылған',
+ 'undo': 'Болдырмау',
+ 'unlink': 'Сілтемені алып тастау',
+ 'createLink': 'Сілтеме жасау',
+ 'toggleDir': 'Бағытты қосу',
+ 'insertImage': 'Суретті кірістіру',
+ 'insertTable': 'Кестені кірістіру/өңдеу',
+ 'toggleTableBorder': 'Кесте жиегін қосу',
+ 'deleteTable': 'Кестені жою',
+ 'tableProp': 'Кесте сипаты',
+ 'htmlToggle': 'HTML көзі',
+ 'foreColor': 'Алды түсі',
+ 'hiliteColor': 'Өң түсі',
+ 'plainFormatBlock': 'Еже мәнері',
+ 'formatBlock': 'Еже мәнері',
+ 'fontSize': 'Қаріп өлшемі',
+ 'fontName': 'Қаріп атауы',
+ 'tabIndent': 'Қойынды шегінісі',
+ "fullScreen": "Толық экранды қосу",
+ "viewSource": "HTML көзін қарау",
+ "print": "Басып шығару",
+ "newPage": "Жаңа бет",
+ /* Error messages */
+ 'systemShortcut': '"${0}" әрекеті шолғышта тек пернелер тіркесімі арқылы қол жетімді. ${1} пайдаланыңыз.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..ae20a2c66
--- /dev/null
+++ b/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/ko/FontChoice", ({
+ fontSize: "크기",
+ fontName: "글꼴",
+ formatBlock: "서식",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "없음",
+ p: "단락",
+ h1: "제목",
+ h2: "부제목",
+ h3: "하위 부제목",
+ pre: "서식이 지정됨",
+ 1: "가장 작게",
+ 2: "조금 작게",
+ 3: "작게",
+ 4: "중간",
+ 5: "크게",
+ 6: "조금 크게",
+ 7: "가장 크게"
+})
+);
diff --git a/lib/dijit/_editor/nls/ko/LinkDialog.js b/lib/dijit/_editor/nls/ko/LinkDialog.js
index a8b7c7c9e..a5b4baea3 100644
--- a/lib/dijit/_editor/nls/ko/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ko/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ko/LinkDialog",({createLinkTitle:"링크 등록 정보",insertImageTitle:"이미지 등록 정보",url:"URL:",text:"설명:",target:"대상",set:"설정",currentWindow:"현재 창",parentWindow:"상위 창",topWindow:"최상위 창",newWindow:"새 창"})); \ No newline at end of file
+define("dijit/_editor/nls/ko/LinkDialog",({createLinkTitle:"링크 특성",insertImageTitle:"이미지 특성",url:"URL:",text:"설명:",target:"대상",set:"설정",currentWindow:"현재 창",parentWindow:"상위 창",topWindow:"최상위 창",newWindow:"새 창"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..02d50173f
--- /dev/null
+++ b/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/ko/LinkDialog", ({
+ createLinkTitle: "링크 특성",
+ insertImageTitle: "이미지 특성",
+ url: "URL:",
+ text: "설명:",
+ target: "대상",
+ set: "설정",
+ currentWindow: "현재 창",
+ parentWindow: "상위 창",
+ topWindow: "최상위 창",
+ newWindow: "새 창"
+})
+);
diff --git a/lib/dijit/_editor/nls/ko/commands.js b/lib/dijit/_editor/nls/ko/commands.js
index 6ad5e7137..ff62c8d1a 100644
--- a/lib/dijit/_editor/nls/ko/commands.js
+++ b/lib/dijit/_editor/nls/ko/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ko/commands",({"bold":"굵게","copy":"복사","cut":"잘라내기","delete":"삭제","indent":"들여쓰기","insertHorizontalRule":"수평 자","insertOrderedList":"번호 목록","insertUnorderedList":"글머리표 목록","italic":"기울임꼴","justifyCenter":"가운데 맞춤","justifyFull":"양쪽 맞춤","justifyLeft":"왼쪽 맞춤","justifyRight":"오른쪽 맞춤","outdent":"내어쓰기","paste":"붙여넣기","redo":"다시 실행","removeFormat":"형식 제거","selectAll":"모두 선택","strikethrough":"취소선","subscript":"아래첨자","superscript":"위첨자","underline":"밑줄","undo":"실행 취소","unlink":"링크 제거","createLink":"링크 작성","toggleDir":"방향 토글","insertImage":"이미지 삽입","insertTable":"테이블 삽입/편집","toggleTableBorder":"테이블 외곽선 토글","deleteTable":"테이블 삭제","tableProp":"테이블 특성","htmlToggle":"HTML 소스","foreColor":"전경색","hiliteColor":"배경색","plainFormatBlock":"단락 양식","formatBlock":"단락 양식","fontSize":"글꼴 크기","fontName":"글꼴 이름","tabIndent":"탭 들여쓰기","fullScreen":"전체 화면 토글","viewSource":"HTML 소스 보기","print":"인쇄","newPage":"새 페이지","systemShortcut":"\"${0}\" 조치는 브라우저에서 키보드 단축키를 통해서만 사용 가능합니다. ${1}을(를) 사용하십시오."})); \ No newline at end of file
+define("dijit/_editor/nls/ko/commands",({"bold":"굵게","copy":"복사","cut":"잘라내기","delete":"삭제","indent":"들여쓰기","insertHorizontalRule":"가로 줄","insertOrderedList":"번호 목록","insertUnorderedList":"글머리표 목록","italic":"기울임꼴","justifyCenter":"가운데 맞춤","justifyFull":"양쪽 맞춤","justifyLeft":"왼쪽 맞춤","justifyRight":"오른쪽 맞춤","outdent":"내어쓰기","paste":"붙여넣기","redo":"다시 실행","removeFormat":"형식 제거","selectAll":"모두 선택","strikethrough":"취소선","subscript":"아래첨자","superscript":"위첨자","underline":"밑줄","undo":"실행 취소","unlink":"링크 제거","createLink":"링크 작성","toggleDir":"방향 토글","insertImage":"이미지 삽입","insertTable":"테이블 삽입/편집","toggleTableBorder":"테이블 외곽선 토글","deleteTable":"테이블 삭제","tableProp":"테이블 특성","htmlToggle":"HTML 소스","foreColor":"전경색","hiliteColor":"배경색","plainFormatBlock":"단락 양식","formatBlock":"단락 양식","fontSize":"글꼴 크기","fontName":"글꼴 이름","tabIndent":"탭 들여쓰기","fullScreen":"전체 화면 토글","viewSource":"HTML 소스 보기","print":"인쇄","newPage":"새 페이지","systemShortcut":"\"${0}\" 조치는 브라우저에서 키보드 단축키를 통해서만 사용 가능합니다. ${1}을(를) 사용하십시오.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js
new file mode 100644
index 000000000..893da2609
--- /dev/null
+++ b/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ko/commands", ({
+ 'bold': '굵게',
+ 'copy': '복사',
+ 'cut': '잘라내기',
+ 'delete': '삭제',
+ 'indent': '들여쓰기',
+ 'insertHorizontalRule': '가로 줄',
+ 'insertOrderedList': '번호 목록',
+ 'insertUnorderedList': '글머리표 목록',
+ 'italic': '기울임꼴',
+ 'justifyCenter': '가운데 맞춤',
+ 'justifyFull': '양쪽 맞춤',
+ 'justifyLeft': '왼쪽 맞춤',
+ 'justifyRight': '오른쪽 맞춤',
+ 'outdent': '내어쓰기',
+ 'paste': '붙여넣기',
+ 'redo': '다시 실행',
+ 'removeFormat': '형식 제거',
+ 'selectAll': '모두 선택',
+ 'strikethrough': '취소선',
+ 'subscript': '아래첨자',
+ 'superscript': '위첨자',
+ 'underline': '밑줄',
+ 'undo': '실행 취소',
+ 'unlink': '링크 제거',
+ 'createLink': '링크 작성',
+ 'toggleDir': '방향 토글',
+ 'insertImage': '이미지 삽입',
+ 'insertTable': '테이블 삽입/편집',
+ 'toggleTableBorder': '테이블 외곽선 토글',
+ 'deleteTable': '테이블 삭제',
+ 'tableProp': '테이블 특성',
+ 'htmlToggle': 'HTML 소스',
+ 'foreColor': '전경색',
+ 'hiliteColor': '배경색',
+ 'plainFormatBlock': '단락 양식',
+ 'formatBlock': '단락 양식',
+ 'fontSize': '글꼴 크기',
+ 'fontName': '글꼴 이름',
+ 'tabIndent': '탭 들여쓰기',
+ "fullScreen": "전체 화면 토글",
+ "viewSource": "HTML 소스 보기",
+ "print": "인쇄",
+ "newPage": "새 페이지",
+ /* Error messages */
+ 'systemShortcut': '"${0}" 조치는 브라우저에서 키보드 단축키를 통해서만 사용 가능합니다. ${1}을(를) 사용하십시오.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..edcbd6707
--- /dev/null
+++ b/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/nb/FontChoice", ({
+ fontSize: "Størrelse",
+ fontName: "Skrift",
+ formatBlock: "Format",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "kursiv",
+ fantasy: "fantasi",
+ noFormat: "Ingen",
+ p: "Avsnitt",
+ h1: "Overskrift",
+ h2: "Undertittel",
+ h3: "Under-undertittel",
+ pre: "Forhåndsformatert",
+ 1: "xx-liten",
+ 2: "x-liten",
+ 3: "liten",
+ 4: "middels",
+ 5: "stor",
+ 6: "x-stor",
+ 7: "xx-stor"
+})
+);
diff --git a/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..02595e10f
--- /dev/null
+++ b/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/nb/LinkDialog", ({
+ createLinkTitle: "Koblingsegenskaper",
+ insertImageTitle: "Bildeegenskaper",
+ url: "URL:",
+ text: "Beskrivelse:",
+ target: "Mål:",
+ set: "Definer",
+ currentWindow: "Gjeldende vindu",
+ parentWindow: "Overordnet vindu",
+ topWindow: "Øverste vindu",
+ newWindow: "Nytt vindu"
+})
+);
diff --git a/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js b/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js
new file mode 100644
index 000000000..4ffc6c151
--- /dev/null
+++ b/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/nb/commands", ({
+ 'bold': 'Fet',
+ 'copy': 'Kopier',
+ 'cut': 'Klipp ut',
+ 'delete': 'Slett',
+ 'indent': 'Innrykk',
+ 'insertHorizontalRule': 'Vannrett strek',
+ 'insertOrderedList': 'Nummerert liste',
+ 'insertUnorderedList': 'Punktliste',
+ 'italic': 'Kursiv',
+ 'justifyCenter': 'Midtstill',
+ 'justifyFull': 'Juster',
+ 'justifyLeft': 'Venstrejuster',
+ 'justifyRight': 'Høyrejuster',
+ 'outdent': 'Fjern innrykk',
+ 'paste': 'Lim inn',
+ 'redo': 'Gjør om',
+ 'removeFormat': 'Fjern format',
+ 'selectAll': 'Velg alle',
+ 'strikethrough': 'Gjennomstreking',
+ 'subscript': 'Senket skrift',
+ 'superscript': 'Hevet skrift',
+ 'underline': 'Understreking',
+ 'undo': 'Angre',
+ 'unlink': 'Fjern kobling',
+ 'createLink': 'Opprett kobling',
+ 'toggleDir': 'Bytt retning',
+ 'insertImage': 'Sett inn bilde',
+ 'insertTable': 'Sett inn/rediger tabell',
+ 'toggleTableBorder': 'Bytt tabellkant',
+ 'deleteTable': 'Slett tabell',
+ 'tableProp': 'Tabellegenskap',
+ 'htmlToggle': 'HTML-kilde',
+ 'foreColor': 'Forgrunnsfarge',
+ 'hiliteColor': 'Bakgrunnsfarge',
+ 'plainFormatBlock': 'Avsnittsstil',
+ 'formatBlock': 'Avsnittsstil',
+ 'fontSize': 'Skriftstørrelse',
+ 'fontName': 'Skriftnavn',
+ 'tabIndent': 'Tabulatorinnrykk',
+ "fullScreen": "Slå på/av full skjerm",
+ "viewSource": "Vis HTML-kilde",
+ "print": "Skriv ut",
+ "newPage": "Ny side",
+ /* Error messages */
+ 'systemShortcut': 'Handlingen "${0}" er bare tilgjengelig i nettleseren ved hjelp av en tastatursnarvei. Bruk ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..05657e5d0
--- /dev/null
+++ b/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/nl/FontChoice", ({
+ fontSize: "Grootte",
+ fontName: "Lettertype",
+ formatBlock: "Opmaak",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursief",
+ fantasy: "fantasy",
+ noFormat: "Geen",
+ p: "Alinea",
+ h1: "Kop",
+ h2: "Subkop",
+ h3: "Sub-subkop",
+ pre: "Vooraf opgemaakt",
+ 1: "xx-klein",
+ 2: "x-klein",
+ 3: "klein",
+ 4: "gemiddeld",
+ 5: "groot",
+ 6: "x-groot",
+ 7: "xx-groot"
+})
+);
diff --git a/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..63cbfd8a8
--- /dev/null
+++ b/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/nl/LinkDialog", ({
+ createLinkTitle: "Linkeigenschappen",
+ insertImageTitle: "Afbeeldingseigenschappen",
+ url: "URL:",
+ text: "Beschrijving:",
+ target: "Doel:",
+ set: "Instellen",
+ currentWindow: "Huidig venster",
+ parentWindow: "Hoofdvenster",
+ topWindow: "Bovenste venster",
+ newWindow: "Nieuw venster"
+})
+);
diff --git a/lib/dijit/_editor/nls/nl/commands.js b/lib/dijit/_editor/nls/nl/commands.js
index 30564deba..2f368b221 100644
--- a/lib/dijit/_editor/nls/nl/commands.js
+++ b/lib/dijit/_editor/nls/nl/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/nl/commands",({"bold":"Vet","copy":"Kopiëren","cut":"Knippen","delete":"Wissen","indent":"Inspringen","insertHorizontalRule":"Horizontale liniaal","insertOrderedList":"Genummerde lijst","insertUnorderedList":"Lijst met opsommingstekens","italic":"Cursief","justifyCenter":"Centreren","justifyFull":"Uitvullen","justifyLeft":"Links uitlijnen","justifyRight":"Rechts uitlijnen","outdent":"Uitspringen","paste":"Plakken","redo":"Opnieuw","removeFormat":"Opmaak verwijderen","selectAll":"Alles selecteren","strikethrough":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstrepen","undo":"Ongedaan maken","unlink":"Link verwijderen","createLink":"Link maken","toggleDir":"Schrijfrichting wijzigen","insertImage":"Afbeelding invoegen","insertTable":"Tabel invoegen/bewerken","toggleTableBorder":"Tabelkader wijzigen","deleteTable":"Tabel wissen","tableProp":"Tabeleigenschap","htmlToggle":"HTML-bron","foreColor":"Voorgrondkleur","hiliteColor":"Achtergrondkleur","plainFormatBlock":"Alineastijl","formatBlock":"Alineastijl","fontSize":"Lettergrootte","fontName":"Lettertype","tabIndent":"Inspringen","fullScreen":"Volledig scherm in-/uitschakelen","viewSource":"HTML-bron bekijken","print":"Afdrukken","newPage":"Nieuwe pagina","systemShortcut":"De actie \"${0}\" is alleen beschikbaar in uw browser via een sneltoetscombinatie. Gebruik ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/nl/commands",({"bold":"Vet","copy":"Kopiëren","cut":"Knippen","delete":"Wissen","indent":"Inspringen","insertHorizontalRule":"Horizontale liniaal","insertOrderedList":"Genummerde lijst","insertUnorderedList":"Lijst met opsommingstekens","italic":"Cursief","justifyCenter":"Centreren","justifyFull":"Uitvullen","justifyLeft":"Links uitlijnen","justifyRight":"Rechts uitlijnen","outdent":"Uitspringen","paste":"Plakken","redo":"Opnieuw","removeFormat":"Opmaak verwijderen","selectAll":"Alles selecteren","strikethrough":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstrepen","undo":"Ongedaan maken","unlink":"Link verwijderen","createLink":"Link maken","toggleDir":"Schrijfrichting wijzigen","insertImage":"Afbeelding invoegen","insertTable":"Tabel invoegen/bewerken","toggleTableBorder":"Tabelkader wijzigen","deleteTable":"Tabel wissen","tableProp":"Tabeleigenschap","htmlToggle":"HTML-bron","foreColor":"Voorgrondkleur","hiliteColor":"Achtergrondkleur","plainFormatBlock":"Alineastijl","formatBlock":"Alineastijl","fontSize":"Lettergrootte","fontName":"Lettertype","tabIndent":"Inspringen","fullScreen":"Volledig scherm in-/uitschakelen","viewSource":"HTML-bron bekijken","print":"Afdrukken","newPage":"Nieuwe pagina","systemShortcut":"De actie \"${0}\" is alleen beschikbaar in uw browser via een sneltoetscombinatie. Gebruik ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js b/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js
new file mode 100644
index 000000000..588289fad
--- /dev/null
+++ b/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/nl/commands", ({
+ 'bold': 'Vet',
+ 'copy': 'Kopiëren',
+ 'cut': 'Knippen',
+ 'delete': 'Wissen',
+ 'indent': 'Inspringen',
+ 'insertHorizontalRule': 'Horizontale liniaal',
+ 'insertOrderedList': 'Genummerde lijst',
+ 'insertUnorderedList': 'Lijst met opsommingstekens',
+ 'italic': 'Cursief',
+ 'justifyCenter': 'Centreren',
+ 'justifyFull': 'Uitvullen',
+ 'justifyLeft': 'Links uitlijnen',
+ 'justifyRight': 'Rechts uitlijnen',
+ 'outdent': 'Uitspringen',
+ 'paste': 'Plakken',
+ 'redo': 'Opnieuw',
+ 'removeFormat': 'Opmaak verwijderen',
+ 'selectAll': 'Alles selecteren',
+ 'strikethrough': 'Doorhalen',
+ 'subscript': 'Subscript',
+ 'superscript': 'Superscript',
+ 'underline': 'Onderstrepen',
+ 'undo': 'Ongedaan maken',
+ 'unlink': 'Link verwijderen',
+ 'createLink': 'Link maken',
+ 'toggleDir': 'Schrijfrichting wijzigen',
+ 'insertImage': 'Afbeelding invoegen',
+ 'insertTable': 'Tabel invoegen/bewerken',
+ 'toggleTableBorder': 'Tabelkader wijzigen',
+ 'deleteTable': 'Tabel wissen',
+ 'tableProp': 'Tabeleigenschap',
+ 'htmlToggle': 'HTML-bron',
+ 'foreColor': 'Voorgrondkleur',
+ 'hiliteColor': 'Achtergrondkleur',
+ 'plainFormatBlock': 'Alineastijl',
+ 'formatBlock': 'Alineastijl',
+ 'fontSize': 'Lettergrootte',
+ 'fontName': 'Lettertype',
+ 'tabIndent': 'Inspringen',
+ "fullScreen": "Volledig scherm in-/uitschakelen",
+ "viewSource": "HTML-bron bekijken",
+ "print": "Afdrukken",
+ "newPage": "Nieuwe pagina",
+ /* Error messages */
+ 'systemShortcut': 'De actie "${0}" is alleen beschikbaar in uw browser via een sneltoetscombinatie. Gebruik ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/pl/FontChoice.js b/lib/dijit/_editor/nls/pl/FontChoice.js
index 4255ea21a..e4d6f09ee 100644
--- a/lib/dijit/_editor/nls/pl/FontChoice.js
+++ b/lib/dijit/_editor/nls/pl/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/pl/FontChoice",({fontSize:"Wielkość",fontName:"Czcionka",formatBlock:"Format",serif:"szeryfowa","sans-serif":"bezszeryfowa",monospace:"czcionka o stałej szerokości",cursive:"kursywa",fantasy:"fantazyjna",noFormat:"Brak",p:"Akapit",h1:"Nagłówek",h2:"Nagłówek 2-go poziomu",h3:"Nagłówek 3-go poziomu",pre:"Wstępnie sformatowane",1:"najmniejsza",2:"mniejsza",3:"mała",4:"średnia",5:"duża",6:"większa",7:"największa"})); \ No newline at end of file
+define("dijit/_editor/nls/pl/FontChoice",({fontSize:"Rozmiar",fontName:"Czcionka",formatBlock:"Format",serif:"szeryfowa","sans-serif":"bezszeryfowa",monospace:"czcionka o stałej szerokości",cursive:"kursywa",fantasy:"fantazyjna",noFormat:"Brak",p:"Akapit",h1:"Nagłówek",h2:"Nagłówek 2-go poziomu",h3:"Nagłówek 3-go poziomu",pre:"Wstępnie sformatowane",1:"najmniejsza",2:"mniejsza",3:"mała",4:"średnia",5:"duże",6:"większa",7:"największa"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..d19712073
--- /dev/null
+++ b/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/pl/FontChoice", ({
+ fontSize: "Rozmiar",
+ fontName: "Czcionka",
+ formatBlock: "Format",
+ serif: "szeryfowa",
+ "sans-serif": "bezszeryfowa",
+ monospace: "czcionka o stałej szerokości",
+ cursive: "kursywa",
+ fantasy: "fantazyjna",
+ noFormat: "Brak",
+ p: "Akapit",
+ h1: "Nagłówek",
+ h2: "Nagłówek 2-go poziomu",
+ h3: "Nagłówek 3-go poziomu",
+ pre: "Wstępnie sformatowane",
+ 1: "najmniejsza",
+ 2: "mniejsza",
+ 3: "mała",
+ 4: "średnia",
+ 5: "duże",
+ 6: "większa",
+ 7: "największa"
+})
+);
diff --git a/lib/dijit/_editor/nls/pl/LinkDialog.js b/lib/dijit/_editor/nls/pl/LinkDialog.js
index 39efed70c..73f04a4ab 100644
--- a/lib/dijit/_editor/nls/pl/LinkDialog.js
+++ b/lib/dijit/_editor/nls/pl/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/pl/LinkDialog",({createLinkTitle:"Właściwości odsyłacza",insertImageTitle:"Właściwości obrazu",url:"Adres URL:",text:"Opis:",target:"Cel:",set:"Ustaw",currentWindow:"Bieżące okno",parentWindow:"Okno macierzyste",topWindow:"Okno najwyższego poziomu",newWindow:"Nowe okno"})); \ No newline at end of file
+define("dijit/_editor/nls/pl/LinkDialog",({createLinkTitle:"Właściwości odsyłacza",insertImageTitle:"Właściwości obrazu",url:"Adres URL:",text:"Opis:",target:"Docelowe:",set:"Ustaw",currentWindow:"Bieżące okno",parentWindow:"Okno macierzyste",topWindow:"Okno najwyższego poziomu",newWindow:"Nowe okno"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..5ff35a305
--- /dev/null
+++ b/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/pl/LinkDialog", ({
+ createLinkTitle: "Właściwości odsyłacza",
+ insertImageTitle: "Właściwości obrazu",
+ url: "Adres URL:",
+ text: "Opis:",
+ target: "Docelowe:",
+ set: "Ustaw",
+ currentWindow: "Bieżące okno",
+ parentWindow: "Okno macierzyste",
+ topWindow: "Okno najwyższego poziomu",
+ newWindow: "Nowe okno"
+})
+);
diff --git a/lib/dijit/_editor/nls/pl/commands.js b/lib/dijit/_editor/nls/pl/commands.js
index 70b6b1def..76dbf8c07 100644
--- a/lib/dijit/_editor/nls/pl/commands.js
+++ b/lib/dijit/_editor/nls/pl/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/pl/commands",({"bold":"Pogrubienie","copy":"Kopiuj","cut":"Wytnij","delete":"Usuń","indent":"Wcięcie","insertHorizontalRule":"Linia pozioma","insertOrderedList":"Lista numerowana","insertUnorderedList":"Lista wypunktowana","italic":"Kursywa","justifyCenter":"Wyrównaj do środka","justifyFull":"Wyrównaj do lewej i prawej","justifyLeft":"Wyrównaj do lewej","justifyRight":"Wyrównaj do prawej","outdent":"Usuń wcięcie","paste":"Wklej","redo":"Ponów","removeFormat":"Usuń formatowanie","selectAll":"Wybierz wszystko","strikethrough":"Przekreślenie","subscript":"Indeks dolny","superscript":"Indeks górny","underline":"Podkreślenie","undo":"Cofnij","unlink":"Usuń odsyłacz","createLink":"Utwórz odsyłacz","toggleDir":"Przełącz kierunek","insertImage":"Wstaw obraz","insertTable":"Wstaw/edytuj tabelę","toggleTableBorder":"Przełącz ramkę tabeli","deleteTable":"Usuń tabelę","tableProp":"Właściwość tabeli","htmlToggle":"Kod źródłowy HTML","foreColor":"Kolor pierwszego planu","hiliteColor":"Kolor tła","plainFormatBlock":"Styl akapitu","formatBlock":"Styl akapitu","fontSize":"Wielkość czcionki","fontName":"Nazwa czcionki","tabIndent":"Wcięcie o tabulator","fullScreen":"Przełącz pełny ekran","viewSource":"Wyświetl kod źródłowy HTML","print":"Drukuj","newPage":"Nowa strona","systemShortcut":"Działanie ${0} jest dostępne w tej przeglądarce wyłącznie przy użyciu skrótu klawiaturowego. Należy użyć klawiszy ${1}.","ctrlKey":"Ctrl+${0}"})); \ No newline at end of file
+define("dijit/_editor/nls/pl/commands",({"bold":"Pogrubienie","copy":"Kopiuj","cut":"Wytnij","delete":"Usuń","indent":"Wcięcie","insertHorizontalRule":"Linijka pozioma","insertOrderedList":"Lista numerowana","insertUnorderedList":"Lista wypunktowana","italic":"Kursywa","justifyCenter":"Wyśrodkowanie","justifyFull":"Wyrównaj do lewej i prawej","justifyLeft":"Wyrównanie do lewej","justifyRight":"Wyrównanie do prawej","outdent":"Usuwanie wcięcia","paste":"Wklej","redo":"Ponów","removeFormat":"Usuń formatowanie","selectAll":"Zaznacz wszystko","strikethrough":"Przekreślenie","subscript":"Indeks dolny","superscript":"Indeks górny","underline":"Podkreślenie","undo":"Cofnij","unlink":"Usuń odsyłacz","createLink":"Utwórz odsyłacz","toggleDir":"Przełącz kierunek","insertImage":"Wstaw obraz","insertTable":"Wstaw/edytuj tabelę","toggleTableBorder":"Przełącz ramkę tabeli","deleteTable":"Usuń tabelę","tableProp":"Właściwość tabeli","htmlToggle":"Źródło HTML","foreColor":"Kolor pierwszego planu","hiliteColor":"Kolor tła","plainFormatBlock":"Styl akapitu","formatBlock":"Styl akapitu","fontSize":"Rozmiar czcionki","fontName":"Nazwa czcionki","tabIndent":"Wcięcie o tabulator","fullScreen":"Przełącz pełny ekran","viewSource":"Wyświetl kod źródłowy HTML","print":"Drukuj","newPage":"Nowa strona","systemShortcut":"Działanie ${0} jest dostępne w tej przeglądarce wyłącznie przy użyciu skrótu klawiaturowego. Należy użyć klawiszy ${1}.","ctrlKey":"Ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js b/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js
new file mode 100644
index 000000000..e84a7aa60
--- /dev/null
+++ b/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/pl/commands", ({
+ 'bold': 'Pogrubienie',
+ 'copy': 'Kopiuj',
+ 'cut': 'Wytnij',
+ 'delete': 'Usuń',
+ 'indent': 'Wcięcie',
+ 'insertHorizontalRule': 'Linijka pozioma',
+ 'insertOrderedList': 'Lista numerowana',
+ 'insertUnorderedList': 'Lista wypunktowana',
+ 'italic': 'Kursywa',
+ 'justifyCenter': 'Wyśrodkowanie',
+ 'justifyFull': 'Wyrównaj do lewej i prawej',
+ 'justifyLeft': 'Wyrównanie do lewej',
+ 'justifyRight': 'Wyrównanie do prawej',
+ 'outdent': 'Usuwanie wcięcia',
+ 'paste': 'Wklej',
+ 'redo': 'Ponów',
+ 'removeFormat': 'Usuń formatowanie',
+ 'selectAll': 'Zaznacz wszystko',
+ 'strikethrough': 'Przekreślenie',
+ 'subscript': 'Indeks dolny',
+ 'superscript': 'Indeks górny',
+ 'underline': 'Podkreślenie',
+ 'undo': 'Cofnij',
+ 'unlink': 'Usuń odsyłacz',
+ 'createLink': 'Utwórz odsyłacz',
+ 'toggleDir': 'Przełącz kierunek',
+ 'insertImage': 'Wstaw obraz',
+ 'insertTable': 'Wstaw/edytuj tabelę',
+ 'toggleTableBorder': 'Przełącz ramkę tabeli',
+ 'deleteTable': 'Usuń tabelę',
+ 'tableProp': 'Właściwość tabeli',
+ 'htmlToggle': 'Źródło HTML',
+ 'foreColor': 'Kolor pierwszego planu',
+ 'hiliteColor': 'Kolor tła',
+ 'plainFormatBlock': 'Styl akapitu',
+ 'formatBlock': 'Styl akapitu',
+ 'fontSize': 'Rozmiar czcionki',
+ 'fontName': 'Nazwa czcionki',
+ 'tabIndent': 'Wcięcie o tabulator',
+ "fullScreen": "Przełącz pełny ekran",
+ "viewSource": "Wyświetl kod źródłowy HTML",
+ "print": "Drukuj",
+ "newPage": "Nowa strona",
+ /* Error messages */
+ 'systemShortcut': 'Działanie ${0} jest dostępne w tej przeglądarce wyłącznie przy użyciu skrótu klawiaturowego. Należy użyć klawiszy ${1}.',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..b06f43f23
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/pt-pt/FontChoice", ({
+ fontSize: "Tamanho",
+ fontName: "Tipo de letra",
+ formatBlock: "Formato",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Nenhum",
+ p: "Parágrafo",
+ h1: "Título",
+ h2: "Sub-título",
+ h3: "Sub-subtítulo",
+ pre: "Pré-formatado",
+ 1: "xxs",
+ 2: "xs",
+ 3: "small",
+ 4: "medium",
+ 5: "large",
+ 6: "xl",
+ 7: "xxl"
+})
+);
diff --git a/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..ff0409226
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/pt-pt/LinkDialog", ({
+ createLinkTitle: "Propriedades da ligação",
+ insertImageTitle: "Propriedades da imagem",
+ url: "URL:",
+ text: "Descrição:",
+ target: "Destino:",
+ set: "Definir",
+ currentWindow: "Janela actual",
+ parentWindow: "Janela ascendente",
+ topWindow: "Janela superior",
+ newWindow: "Nova janela"
+})
+);
diff --git a/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js b/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js
new file mode 100644
index 000000000..18cc55828
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js
@@ -0,0 +1,49 @@
+define(
+"dijit/_editor/nls/pt-pt/commands", ({
+ 'bold': 'Negrito',
+ 'copy': 'Copiar',
+ 'cut': 'Cortar',
+ 'delete': 'Eliminar',
+ 'indent': 'Indentar',
+ 'insertHorizontalRule': 'Régua horizontal',
+ 'insertOrderedList': 'Lista numerada',
+ 'insertUnorderedList': 'Lista marcada',
+ 'italic': 'Itálico',
+ 'justifyCenter': 'Alinhar ao centro',
+ 'justifyFull': 'Justificar',
+ 'justifyLeft': 'Alinhar à esquerda',
+ 'justifyRight': 'Alinhar à direita',
+ 'outdent': 'Recuar',
+ 'paste': 'Colar',
+ 'redo': 'Repetir',
+ 'removeFormat': 'Remover formato',
+ 'selectAll': 'Seleccionar tudo',
+ 'strikethrough': 'Rasurado',
+ 'subscript': 'Inferior à linha',
+ 'superscript': 'Superior à linha',
+ 'underline': 'Sublinhado',
+ 'undo': 'Anular',
+ 'unlink': 'Remover ligação',
+ 'createLink': 'Criar ligação',
+ 'toggleDir': 'Alternar direcção',
+ 'insertImage': 'Inserir imagem',
+ 'insertTable': 'Inserir/Editar tabela',
+ 'toggleTableBorder': 'Alternar contorno da tabela',
+ 'deleteTable': 'Eliminar tabela',
+ 'tableProp': 'Propriedades da tabela',
+ 'htmlToggle': 'Código-fonte de HTML',
+ 'foreColor': 'Cor de primeiro plano',
+ 'hiliteColor': 'Cor de segundo plano',
+ 'plainFormatBlock': 'Estilo de parágrafo',
+ 'formatBlock': 'Estilo de parágrafo',
+ 'fontSize': 'Tamanho do tipo de letra',
+ 'fontName': 'Nome do tipo de letra',
+ 'tabIndent': 'Indentar com a tecla Tab',
+ "fullScreen": "Alternar ecrã completo",
+ "viewSource": "Ver origem HTML",
+ "print": "Imprimir",
+ "newPage": "Nova página",
+ /* Error messages */
+ 'systemShortcut': 'A acção "${0}" apenas está disponível no navegador utilizando um atalho de teclado. Utilize ${1}.'
+})
+);
diff --git a/lib/dijit/_editor/nls/pt/FontChoice.js b/lib/dijit/_editor/nls/pt/FontChoice.js
index 57c44c79c..6ddeb434c 100644
--- a/lib/dijit/_editor/nls/pt/FontChoice.js
+++ b/lib/dijit/_editor/nls/pt/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/pt/FontChoice",({fontSize:"Tamanho",fontName:"Fonte",formatBlock:"Formatar",serif:"serif","sans-serif":"sans-serif",monospace:"espaço simples",cursive:"cursiva",fantasy:"fantasy",noFormat:"Nenhuma",p:"Parágrafo",h1:"Título",h2:"Subtítulo",h3:"Sub-subtítulo",pre:"Pré-formatado",1:"extra-extra-pequeno",2:"extra-pequeno",3:"pequena",4:"médio",5:"grande",6:"extra-grande",7:"extra-extra-grande"})); \ No newline at end of file
+define("dijit/_editor/nls/pt/FontChoice",({fontSize:"Tamanho",fontName:"Fonte",formatBlock:"Formatar",serif:"serif","sans-serif":"sans-serif",monospace:"espaço simples",cursive:"cursiva",fantasy:"fantasy",noFormat:"Nenhum",p:"Parágrafo",h1:"Título",h2:"Subtítulo",h3:"Sub-subtítulo",pre:"Pré-formatado",1:"extra-extra-pequeno",2:"extra-pequeno",3:"pequena",4:"médio",5:"grande",6:"extra-grande",7:"extra-extra-grande"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..a5e4cfca6
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/pt/FontChoice", ({
+ fontSize: "Tamanho",
+ fontName: "Fonte",
+ formatBlock: "Formatar",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "espaço simples",
+ cursive: "cursiva",
+ fantasy: "fantasy",
+ noFormat: "Nenhum",
+ p: "Parágrafo",
+ h1: "Título",
+ h2: "Subtítulo",
+ h3: "Sub-subtítulo",
+ pre: "Pré-formatado",
+ 1: "extra-extra-pequeno",
+ 2: "extra-pequeno",
+ 3: "pequena",
+ 4: "médio",
+ 5: "grande",
+ 6: "extra-grande",
+ 7: "extra-extra-grande"
+})
+);
diff --git a/lib/dijit/_editor/nls/pt/LinkDialog.js b/lib/dijit/_editor/nls/pt/LinkDialog.js
index 8d03b5561..c69e75880 100644
--- a/lib/dijit/_editor/nls/pt/LinkDialog.js
+++ b/lib/dijit/_editor/nls/pt/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/pt/LinkDialog",({createLinkTitle:"Propriedades de Link",insertImageTitle:"Propriedades de Imagem",url:"URL:",text:"Descrição:",target:"Destino:",set:"Definir",currentWindow:"Janela Atual",parentWindow:"Janela Pai",topWindow:"Primeira Janela",newWindow:"Nova Janela"})); \ No newline at end of file
+define("dijit/_editor/nls/pt/LinkDialog",({createLinkTitle:"Propriedades de Link",insertImageTitle:"Propriedades de Imagem",url:"URL:",text:"Descrição:",target:"Destino:",set:"Configurar",currentWindow:"Janela Atual",parentWindow:"Janela Pai",topWindow:"Primeira Janela",newWindow:"Nova Janela"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..d9b29633c
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/pt/LinkDialog", ({
+ createLinkTitle: "Propriedades de Link",
+ insertImageTitle: "Propriedades de Imagem",
+ url: "URL:",
+ text: "Descrição:",
+ target: "Destino:",
+ set: "Configurar",
+ currentWindow: "Janela Atual",
+ parentWindow: "Janela Pai",
+ topWindow: "Primeira Janela",
+ newWindow: "Nova Janela"
+})
+);
diff --git a/lib/dijit/_editor/nls/pt/commands.js b/lib/dijit/_editor/nls/pt/commands.js
index 35c6142ca..aaec7f3c8 100644
--- a/lib/dijit/_editor/nls/pt/commands.js
+++ b/lib/dijit/_editor/nls/pt/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/pt/commands",({"bold":"Negrito","copy":"Copiar","cut":"Recortar","delete":"Excluir","indent":"Recuar","insertHorizontalRule":"Régua Horizontal","insertOrderedList":"Lista Numerada","insertUnorderedList":"Lista com Marcadores","italic":"Itálico","justifyCenter":"Alinhar pelo Centro","justifyFull":"Justificar","justifyLeft":"Alinhar à Esquerda","justifyRight":"Alinhar à Direita","outdent":"Não chanfrado","paste":"Colar","redo":"Refazer","removeFormat":"Remover Formato","selectAll":"Selecionar Todos","strikethrough":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado","undo":"Desfazer","unlink":"Remover Link","createLink":"Criar Link","toggleDir":"Comutar Direção","insertImage":"Inserir Imagem","insertTable":"Inserir/Editar Tabela","toggleTableBorder":"Alternar Moldura da Tabela","deleteTable":"Excluir Tabela","tableProp":"Propriedade da Tabela","htmlToggle":"Origem HTML","foreColor":"Cor do Primeiro Plano","hiliteColor":"Cor do Segundo Plano","plainFormatBlock":"Estilo de Parágrafo","formatBlock":"Estilo de Parágrafo","fontSize":"Tamanho da Fonte","fontName":"Nome da Fonte","tabIndent":"Recuo de Guia","fullScreen":"Comutar Tela Cheia","viewSource":"Visualizar Origem HTML","print":"Imprimir","newPage":"Nova Página","systemShortcut":"A ação \"${0}\" está disponível em seu navegador apenas usando um atalho de teclado. Use ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/pt/commands",({"bold":"Negrito","copy":"Copiar","cut":"Recortar","delete":"Excluir","indent":"Recuar","insertHorizontalRule":"Régua Horizontal","insertOrderedList":"Lista Numerada","insertUnorderedList":"Lista com Marcadores","italic":"Itálico","justifyCenter":"Alinhar pelo Centro","justifyFull":"Justificar","justifyLeft":"Alinhar à Esquerda","justifyRight":"Alinhar à Direita","outdent":"Não chanfrado","paste":"Colar","redo":"Refazer","removeFormat":"Remover Formato","selectAll":"Selecionar Tudo","strikethrough":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado","undo":"Desfazer","unlink":"Remover Link","createLink":"Criar Link","toggleDir":"Comutar Direção","insertImage":"Inserir imagem","insertTable":"Inserir/Editar Tabela","toggleTableBorder":"Alternar Moldura da Tabela","deleteTable":"Excluir Tabela","tableProp":"Propriedade da Tabela","htmlToggle":"Origem HTML","foreColor":"Cor do Primeiro Plano","hiliteColor":"Cor do Segundo Plano","plainFormatBlock":"Estilo de Parágrafo","formatBlock":"Estilo de Parágrafo","fontSize":"Tamanho da Fonte","fontName":"Nome da Fonte","tabIndent":"Recuo de Guia","fullScreen":"Comutar Tela Cheia","viewSource":"Visualizar Origem HTML","print":"Imprimir","newPage":"Nova Página","systemShortcut":"A ação \"${0}\" está disponível em seu navegador apenas usando um atalho de teclado. Use ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js b/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js
new file mode 100644
index 000000000..55b380684
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/pt/commands", ({
+ 'bold': 'Negrito',
+ 'copy': 'Copiar',
+ 'cut': 'Recortar',
+ 'delete': 'Excluir',
+ 'indent': 'Recuar',
+ 'insertHorizontalRule': 'Régua Horizontal',
+ 'insertOrderedList': 'Lista Numerada',
+ 'insertUnorderedList': 'Lista com Marcadores',
+ 'italic': 'Itálico',
+ 'justifyCenter': 'Alinhar pelo Centro',
+ 'justifyFull': 'Justificar',
+ 'justifyLeft': 'Alinhar à Esquerda',
+ 'justifyRight': 'Alinhar à Direita',
+ 'outdent': 'Não chanfrado',
+ 'paste': 'Colar',
+ 'redo': 'Refazer',
+ 'removeFormat': 'Remover Formato',
+ 'selectAll': 'Selecionar Tudo',
+ 'strikethrough': 'Tachado',
+ 'subscript': 'Subscrito',
+ 'superscript': 'Sobrescrito',
+ 'underline': 'Sublinhado',
+ 'undo': 'Desfazer',
+ 'unlink': 'Remover Link',
+ 'createLink': 'Criar Link',
+ 'toggleDir': 'Comutar Direção',
+ 'insertImage': 'Inserir imagem',
+ 'insertTable': 'Inserir/Editar Tabela',
+ 'toggleTableBorder': 'Alternar Moldura da Tabela',
+ 'deleteTable': 'Excluir Tabela',
+ 'tableProp': 'Propriedade da Tabela',
+ 'htmlToggle': 'Origem HTML',
+ 'foreColor': 'Cor do Primeiro Plano',
+ 'hiliteColor': 'Cor do Segundo Plano',
+ 'plainFormatBlock': 'Estilo de Parágrafo',
+ 'formatBlock': 'Estilo de Parágrafo',
+ 'fontSize': 'Tamanho da Fonte',
+ 'fontName': 'Nome da Fonte',
+ 'tabIndent': 'Recuo de Guia',
+ "fullScreen": "Comutar Tela Cheia",
+ "viewSource": "Visualizar Origem HTML",
+ "print": "Imprimir",
+ "newPage": "Nova Página",
+ /* Error messages */
+ 'systemShortcut': 'A ação "${0}" está disponível em seu navegador apenas usando um atalho de teclado. Use ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/ro/FontChoice.js b/lib/dijit/_editor/nls/ro/FontChoice.js
index a65bf8319..d254655f0 100644
--- a/lib/dijit/_editor/nls/ro/FontChoice.js
+++ b/lib/dijit/_editor/nls/ro/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ro/FontChoice",({fontSize:"Dimensiune",fontName:"Font",formatBlock:"Format",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"cursive",fantasy:"fantasy",noFormat:"Fără",p:"Paragraf",h1:"Titlu",h2:"Subtitlu",h3:"Sub-subtitlu",pre:"Preformatat",1:"xxs (xx-small)",2:"xs (x-small)",3:"s (small)",4:"m (medium)",5:"l (large)",6:"xl (x-large)",7:"xxl (xx-large)"})); \ No newline at end of file
+define("dijit/_editor/nls/ro/FontChoice",({fontSize:"Mărime",fontName:"Font",formatBlock:"Format",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"cursive",fantasy:"fantasy",noFormat:"Nimic",p:"Paragraf",h1:"Titlu",h2:"Subtitlu",h3:"Sub-subtitlu",pre:"Preformatat",1:"xxs (xx-small)",2:"xs (x-small)",3:"s (small)",4:"m (medium)",5:"l (large)",6:"xl (x-large)",7:"xxl (xx-large)"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..9dd383953
--- /dev/null
+++ b/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/ro/FontChoice", ({
+ fontSize: "Mărime",
+ fontName: "Font",
+ formatBlock: "Format",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Nimic",
+ p: "Paragraf",
+ h1: "Titlu",
+ h2: "Subtitlu",
+ h3: "Sub-subtitlu",
+ pre: "Preformatat",
+ 1: "xxs (xx-small)",
+ 2: "xs (x-small)",
+ 3: "s (small)",
+ 4: "m (medium)",
+ 5: "l (large)",
+ 6: "xl (x-large)",
+ 7: "xxl (xx-large)"
+})
+);
diff --git a/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..9be4db081
--- /dev/null
+++ b/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/ro/LinkDialog", ({
+ createLinkTitle: "Proprietăţi legătură",
+ insertImageTitle: "Proprietăţi imagine",
+ url: "URL:",
+ text: "Descriere:",
+ target: "Destinaţie:",
+ set: "Setare",
+ currentWindow: "Fereastra curentă",
+ parentWindow: "Fereastra părinte",
+ topWindow: "Fereastra cea mai de sus",
+ newWindow: "Fereastra nouă"
+})
+);
diff --git a/lib/dijit/_editor/nls/ro/commands.js b/lib/dijit/_editor/nls/ro/commands.js
index dcbf9d3a9..8ba66adff 100644
--- a/lib/dijit/_editor/nls/ro/commands.js
+++ b/lib/dijit/_editor/nls/ro/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ro/commands",({"bold":"Aldin","copy":"Copiere","cut":"Tăiere","delete":"Ştergere","indent":"Micşorare indent","insertHorizontalRule":"Linie delimitatoare","insertOrderedList":"Listă numerotată","insertUnorderedList":"Listă cu marcator","italic":"Cursiv","justifyCenter":"Aliniere centru","justifyFull":"Aliniere stânga-dreapta","justifyLeft":"Aliniere stânga","justifyRight":"Aliniere dreapta","outdent":"Mărire indent","paste":"Lipire","redo":"Refacere acţiune","removeFormat":"Înlăturare format","selectAll":"Selectează tot","strikethrough":"Tăiere text cu o linie","subscript":"Scriere indice inferior","superscript":"Scriere indice superior","underline":"Subliniere","undo":"Anulare acţiune","unlink":"Înlăturare legătură","createLink":"Creare legătură","toggleDir":"Comutare direcţie","insertImage":"Inserare imagine","insertTable":"Inserare/Editare tabelă","toggleTableBorder":"Comutare bordură tabelă","deleteTable":"Ştergere tabelă","tableProp":"Proprietate tabelă","htmlToggle":"Sursă HTML","foreColor":"Culoare de prim-plan","hiliteColor":"Culoare de fundal","plainFormatBlock":"Stil paragraf","formatBlock":"Stil paragraf","fontSize":"Dimensiune font","fontName":"Nume font","tabIndent":"Indentare Tab","fullScreen":"Comutare ecran complet","viewSource":"Vizualizara sursă HTML","print":"Tipărire","newPage":"Pagină nouă","systemShortcut":"Acţiunea \"${0}\" este disponibilă în browser doar utilizând o comandă rapidă de la tastatură. Utilizaţi ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/ro/commands",({"bold":"Aldin","copy":"Copiere","cut":"Tăiere","delete":"Ştergere","indent":"Micşorare indent","insertHorizontalRule":"Linie delimitatoare","insertOrderedList":"Listă numerotată","insertUnorderedList":"Listă cu marcator","italic":"Cursiv","justifyCenter":"Aliniere centru","justifyFull":"Aliniere stânga-dreapta","justifyLeft":"Aliniere stânga","justifyRight":"Aliniere dreapta","outdent":"Mărire indent","paste":"Lipire","redo":"Refacere acţiune","removeFormat":"Înlăturare format","selectAll":"Selectează tot","strikethrough":"Tăiere text cu o linie","subscript":"Scriere indice inferior","superscript":"Scriere indice superior","underline":"Subliniere","undo":"Anulare acţiune","unlink":"Înlăturare legătură","createLink":"Creare legătură","toggleDir":"Comutare direcţie","insertImage":"Inserare imagine","insertTable":"Inserare/Editare tabelă","toggleTableBorder":"Comutare bordură tabelă","deleteTable":"Ştergere tabelă","tableProp":"Proprietate tabelă","htmlToggle":"Sursă HTML","foreColor":"Culoare de prim-plan","hiliteColor":"Culoare de fundal","plainFormatBlock":"Stil paragraf","formatBlock":"Stil paragraf","fontSize":"Dimensiune font","fontName":"Nume font","tabIndent":"Indentare Tab","fullScreen":"Comutare ecran complet","viewSource":"Vizualizara sursă HTML","print":"Tipărire","newPage":"Pagină nouă","systemShortcut":"Acţiunea \"${0}\" este disponibilă în browser doar utilizând o comandă rapidă de la tastatură. Utilizaţi ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js
new file mode 100644
index 000000000..565e2c3ec
--- /dev/null
+++ b/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ro/commands", ({
+ 'bold': 'Aldin',
+ 'copy': 'Copiere',
+ 'cut': 'Tăiere',
+ 'delete': 'Ştergere',
+ 'indent': 'Micşorare indent',
+ 'insertHorizontalRule': 'Linie delimitatoare',
+ 'insertOrderedList': 'Listă numerotată',
+ 'insertUnorderedList': 'Listă cu marcator',
+ 'italic': 'Cursiv',
+ 'justifyCenter': 'Aliniere centru',
+ 'justifyFull': 'Aliniere stânga-dreapta',
+ 'justifyLeft': 'Aliniere stânga',
+ 'justifyRight': 'Aliniere dreapta',
+ 'outdent': 'Mărire indent',
+ 'paste': 'Lipire',
+ 'redo': 'Refacere acţiune',
+ 'removeFormat': 'Înlăturare format',
+ 'selectAll': 'Selectează tot',
+ 'strikethrough': 'Tăiere text cu o linie',
+ 'subscript': 'Scriere indice inferior',
+ 'superscript': 'Scriere indice superior',
+ 'underline': 'Subliniere',
+ 'undo': 'Anulare acţiune',
+ 'unlink': 'Înlăturare legătură',
+ 'createLink': 'Creare legătură',
+ 'toggleDir': 'Comutare direcţie',
+ 'insertImage': 'Inserare imagine',
+ 'insertTable': 'Inserare/Editare tabelă',
+ 'toggleTableBorder': 'Comutare bordură tabelă',
+ 'deleteTable': 'Ştergere tabelă',
+ 'tableProp': 'Proprietate tabelă',
+ 'htmlToggle': 'Sursă HTML',
+ 'foreColor': 'Culoare de prim-plan',
+ 'hiliteColor': 'Culoare de fundal',
+ 'plainFormatBlock': 'Stil paragraf',
+ 'formatBlock': 'Stil paragraf',
+ 'fontSize': 'Dimensiune font',
+ 'fontName': 'Nume font',
+ 'tabIndent': 'Indentare Tab',
+ "fullScreen": "Comutare ecran complet",
+ "viewSource": "Vizualizara sursă HTML",
+ "print": "Tipărire",
+ "newPage": "Pagină nouă",
+ /* Error messages */
+ 'systemShortcut': 'Acţiunea "${0}" este disponibilă în browser doar utilizând o comandă rapidă de la tastatură. Utilizaţi ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..34b0396ba
--- /dev/null
+++ b/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/ru/FontChoice", ({
+ fontSize: "Размер",
+ fontName: "Шрифт",
+ formatBlock: "Формат",
+ serif: "с засечками",
+ "sans-serif": "без засечек",
+ monospace: "непропорциональный",
+ cursive: "курсив",
+ fantasy: "артистический",
+ noFormat: "Нет",
+ p: "Абзац",
+ h1: "Заголовок",
+ h2: "Подзаголовок",
+ h3: "Вложенный подзаголовок",
+ pre: "Заранее отформатированный",
+ 1: "самый маленький",
+ 2: "очень маленький",
+ 3: "маленький",
+ 4: "средний",
+ 5: "большой",
+ 6: "очень большой",
+ 7: "самый большой"
+})
+);
diff --git a/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..19b5f75f8
--- /dev/null
+++ b/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/ru/LinkDialog", ({
+ createLinkTitle: "Свойства ссылки",
+ insertImageTitle: "Свойства изображения",
+ url: "URL:",
+ text: "Описание:",
+ target: "Целевой объект:",
+ set: "Задать",
+ currentWindow: "Текущее окно",
+ parentWindow: "Родительское окно",
+ topWindow: "Верхнее окно",
+ newWindow: "Новое окно"
+})
+);
diff --git a/lib/dijit/_editor/nls/ru/commands.js b/lib/dijit/_editor/nls/ru/commands.js
index 6a6a5099a..5e463334e 100644
--- a/lib/dijit/_editor/nls/ru/commands.js
+++ b/lib/dijit/_editor/nls/ru/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/ru/commands",({"bold":"Полужирный","copy":"Копировать","cut":"Вырезать","delete":"Удалить","indent":"Отступ","insertHorizontalRule":"Горизонтальная линейка","insertOrderedList":"Нумерованный список","insertUnorderedList":"Список с маркерами","italic":"Курсив","justifyCenter":"По центру","justifyFull":"По ширине","justifyLeft":"По левому краю","justifyRight":"По правому краю","outdent":"Втяжка","paste":"Вставить","redo":"Повторить","removeFormat":"Удалить формат","selectAll":"Выбрать все","strikethrough":"Перечеркивание","subscript":"Нижний индекс","superscript":"Верхний индекс","underline":"Подчеркивание","undo":"Отменить","unlink":"Удалить ссылку","createLink":"Создать ссылку","toggleDir":"Изменить направление","insertImage":"Вставить изображение","insertTable":"Вставить/изменить таблицу","toggleTableBorder":"Переключить рамку таблицы","deleteTable":"Удалить таблицу","tableProp":"Свойства таблицы","htmlToggle":"Код HTML","foreColor":"Цвет текста","hiliteColor":"Цвет фона","plainFormatBlock":"Стиль абзаца","formatBlock":"Стиль абзаца","fontSize":"Размер шрифта","fontName":"Название шрифта","tabIndent":"Табуляция","fullScreen":"Переключить полноэкранный режим","viewSource":"Показать исходный код HTML","print":"Печать","newPage":"Создать страницу","systemShortcut":"Действие \"${0}\" можно выполнить в браузере только путем нажатия клавиш ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/ru/commands",({"bold":"Полужирный","copy":"Копировать","cut":"Вырезать","delete":"Удалить","indent":"Отступ","insertHorizontalRule":"Горизонтальная линейка","insertOrderedList":"Нумерованный список","insertUnorderedList":"Список с маркерами","italic":"Курсив","justifyCenter":"По центру","justifyFull":"По ширине","justifyLeft":"По левому краю","justifyRight":"По правому краю","outdent":"Втяжка","paste":"Вставить","redo":"Повторить","removeFormat":"Удалить формат","selectAll":"Выбрать все","strikethrough":"Перечеркивание","subscript":"Нижний индекс","superscript":"Верхний индекс","underline":"Подчеркивание","undo":"Отменить","unlink":"Удалить ссылку","createLink":"Создать ссылку","toggleDir":"Изменить направление","insertImage":"Вставить изображение","insertTable":"Вставить/изменить таблицу","toggleTableBorder":"Переключить рамку таблицы","deleteTable":"Удалить таблицу","tableProp":"Свойства таблицы","htmlToggle":"Код HTML","foreColor":"Цвет текста","hiliteColor":"Цвет фона","plainFormatBlock":"Стиль абзаца","formatBlock":"Стиль абзаца","fontSize":"Размер шрифта","fontName":"Название шрифта","tabIndent":"Табуляция","fullScreen":"Переключить полноэкранный режим","viewSource":"Показать исходный код HTML","print":"Печать","newPage":"Создать страницу","systemShortcut":"Действие \"${0}\" можно выполнить в браузере только путем нажатия клавиш ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js b/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js
new file mode 100644
index 000000000..8bfe3568e
--- /dev/null
+++ b/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ru/commands", ({
+ 'bold': 'Полужирный',
+ 'copy': 'Копировать',
+ 'cut': 'Вырезать',
+ 'delete': 'Удалить',
+ 'indent': 'Отступ',
+ 'insertHorizontalRule': 'Горизонтальная линейка',
+ 'insertOrderedList': 'Нумерованный список',
+ 'insertUnorderedList': 'Список с маркерами',
+ 'italic': 'Курсив',
+ 'justifyCenter': 'По центру',
+ 'justifyFull': 'По ширине',
+ 'justifyLeft': 'По левому краю',
+ 'justifyRight': 'По правому краю',
+ 'outdent': 'Втяжка',
+ 'paste': 'Вставить',
+ 'redo': 'Повторить',
+ 'removeFormat': 'Удалить формат',
+ 'selectAll': 'Выбрать все',
+ 'strikethrough': 'Перечеркивание',
+ 'subscript': 'Нижний индекс',
+ 'superscript': 'Верхний индекс',
+ 'underline': 'Подчеркивание',
+ 'undo': 'Отменить',
+ 'unlink': 'Удалить ссылку',
+ 'createLink': 'Создать ссылку',
+ 'toggleDir': 'Изменить направление',
+ 'insertImage': 'Вставить изображение',
+ 'insertTable': 'Вставить/изменить таблицу',
+ 'toggleTableBorder': 'Переключить рамку таблицы',
+ 'deleteTable': 'Удалить таблицу',
+ 'tableProp': 'Свойства таблицы',
+ 'htmlToggle': 'Код HTML',
+ 'foreColor': 'Цвет текста',
+ 'hiliteColor': 'Цвет фона',
+ 'plainFormatBlock': 'Стиль абзаца',
+ 'formatBlock': 'Стиль абзаца',
+ 'fontSize': 'Размер шрифта',
+ 'fontName': 'Название шрифта',
+ 'tabIndent': 'Табуляция',
+ "fullScreen": "Переключить полноэкранный режим",
+ "viewSource": "Показать исходный код HTML",
+ "print": "Печать",
+ "newPage": "Создать страницу",
+ /* Error messages */
+ 'systemShortcut': 'Действие "${0}" можно выполнить в браузере только путем нажатия клавиш ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..fbc1d786c
--- /dev/null
+++ b/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/sk/FontChoice", ({
+ fontSize: "Veľkosť",
+ fontName: "Písmo",
+ formatBlock: "Formát",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Žiadny",
+ p: "Odsek",
+ h1: "Hlavička",
+ h2: "Podhlavička",
+ h3: "Pod-podhlavička",
+ pre: "Predformátované",
+ 1: "xx-small",
+ 2: "x-small",
+ 3: "small",
+ 4: "medium",
+ 5: "large",
+ 6: "x-large",
+ 7: "xx-large"
+})
+);
diff --git a/lib/dijit/_editor/nls/sk/LinkDialog.js b/lib/dijit/_editor/nls/sk/LinkDialog.js
index 1251d38e7..ff02838ed 100644
--- a/lib/dijit/_editor/nls/sk/LinkDialog.js
+++ b/lib/dijit/_editor/nls/sk/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/sk/LinkDialog",({createLinkTitle:"Pripojiť vlastnosti",insertImageTitle:"Vlastnosti obrázka ",url:"URL:",text:"Opis:",target:"Cieľ:",set:"Nastaviť",currentWindow:"Aktuálne okno ",parentWindow:"Rodičovské okno ",topWindow:"Najvrchnejšie okno ",newWindow:"Nové okno "})); \ No newline at end of file
+define("dijit/_editor/nls/sk/LinkDialog",({createLinkTitle:"Vlastnosti prepojenia",insertImageTitle:"Vlastnosti obrázka",url:"Adresa URL:",text:"Opis:",target:"Cieľ:",set:"Nastaviť",currentWindow:"Aktuálne okno",parentWindow:"Rodičovské okno",topWindow:"Najvyššie okno",newWindow:"Nové okno"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..68b9ce3ac
--- /dev/null
+++ b/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/sk/LinkDialog", ({
+ createLinkTitle: "Vlastnosti prepojenia",
+ insertImageTitle: "Vlastnosti obrázka",
+ url: "Adresa URL:",
+ text: "Opis:",
+ target: "Cieľ:",
+ set: "Nastaviť",
+ currentWindow: "Aktuálne okno",
+ parentWindow: "Rodičovské okno",
+ topWindow: "Najvyššie okno",
+ newWindow: "Nové okno"
+})
+);
diff --git a/lib/dijit/_editor/nls/sk/commands.js b/lib/dijit/_editor/nls/sk/commands.js
index 1ba3b24c6..272d47e71 100644
--- a/lib/dijit/_editor/nls/sk/commands.js
+++ b/lib/dijit/_editor/nls/sk/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/sk/commands",({"bold":"Tučné písmo","copy":"Kopírovať","cut":"Vystrihnúť","delete":"Vymazať","indent":"Odsadiť","insertHorizontalRule":"Horizontálna čiara","insertOrderedList":"Číslovaný zoznam","insertUnorderedList":"Zoznam s odrážkami","italic":"Kurzíva","justifyCenter":"Zarovnať na stred","justifyFull":"Zarovnať podľa okraja","justifyLeft":"Zarovnať doľava","justifyRight":"Zarovnať doprava","outdent":"Predsadiť","paste":"Nalepiť","redo":"Znova vykonať","removeFormat":"Odstrániť formát","selectAll":"Vybrať všetko","strikethrough":"Prečiarknuť","subscript":"Dolný index","superscript":"Horný index","underline":"Podčiarknuť","undo":"Vrátiť späť","unlink":"Odstrániť prepojenie","createLink":"Vytvoriť prepojenie","toggleDir":"Prepnúť smer","insertImage":"Vložiť obrázok","insertTable":"Vložiť/upraviť tabuľku","toggleTableBorder":"Prepnúť rámček tabuľky","deleteTable":"Vymazať tabuľku","tableProp":"Vlastnosť tabuľky","htmlToggle":"Zdroj HTML","foreColor":"Farba popredia","hiliteColor":"Farba pozadia","plainFormatBlock":"Štýl odseku","formatBlock":"Štýl odseku","fontSize":"Veľkosť písma","fontName":"Názov písma","tabIndent":"Odsadenie tabulátora","fullScreen":"Zobraziť na celú obrazovku","viewSource":"Zobraziť zdrojový kód HTML ","print":"Tlačiť","newPage":"Nová stránka ","systemShortcut":"Akcia \"${0}\" je vo vašom prehliadači dostupná len s použitím klávesovej skratky. Použite ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/sk/commands",({"bold":"Tučné","copy":"Kopírovať","cut":"Vystrihnúť","delete":"Vymazať","indent":"Odsadiť","insertHorizontalRule":"Vodorovná čiara","insertOrderedList":"Číslovaný zoznam","insertUnorderedList":"Zoznam s odrážkami","italic":"Kurzíva","justifyCenter":"Zarovnať na stred","justifyFull":"Zarovnať k okrajom","justifyLeft":"Zarovnať vľavo","justifyRight":"Zarovnať vpravo","outdent":"Zmenšiť odsadenie","paste":"Prilepiť","redo":"Znova","removeFormat":"Odstrániť formátovanie","selectAll":"Vybrať všetko","strikethrough":"Prečiarknuť","subscript":"Dolný index","superscript":"Horný index","underline":"Podčiarknuť","undo":"Späť","unlink":"Odstrániť prepojenie","createLink":"Vytvoriť prepojenie","toggleDir":"Prepnúť smer","insertImage":"Vložiť obrázok","insertTable":"Vložiť/upraviť tabuľku","toggleTableBorder":"Prepnúť ohraničenie tabuľky","deleteTable":"Odstrániť tabuľku","tableProp":"Vlastnosť tabuľky","htmlToggle":"Zdrojový kód HTML","foreColor":"Farba popredia","hiliteColor":"Farba pozadia","plainFormatBlock":"Štýl odseku","formatBlock":"Štýl odseku","fontSize":"Veľkosť písma","fontName":"Názov písma","tabIndent":"Odsadenie tabulátora","fullScreen":"Prepnúť na celú obrazovku","viewSource":"Zobraziť zdrojový kód HTML","print":"Vytlačiť","newPage":"Nová stránka","systemShortcut":"Akcia \"${0}\" je vo vašom prehliadači dostupná iba prostredníctvom klávesovej skratky. Stlačte ${1}.","ctrlKey":"Ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js b/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js
new file mode 100644
index 000000000..bb8632e75
--- /dev/null
+++ b/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/sk/commands", ({
+ 'bold': 'Tučné',
+ 'copy': 'Kopírovať',
+ 'cut': 'Vystrihnúť',
+ 'delete': 'Vymazať',
+ 'indent': 'Odsadiť',
+ 'insertHorizontalRule': 'Vodorovná čiara',
+ 'insertOrderedList': 'Číslovaný zoznam',
+ 'insertUnorderedList': 'Zoznam s odrážkami',
+ 'italic': 'Kurzíva',
+ 'justifyCenter': 'Zarovnať na stred',
+ 'justifyFull': 'Zarovnať k okrajom',
+ 'justifyLeft': 'Zarovnať vľavo',
+ 'justifyRight': 'Zarovnať vpravo',
+ 'outdent': 'Zmenšiť odsadenie',
+ 'paste': 'Prilepiť',
+ 'redo': 'Znova',
+ 'removeFormat': 'Odstrániť formátovanie',
+ 'selectAll': 'Vybrať všetko',
+ 'strikethrough': 'Prečiarknuť',
+ 'subscript': 'Dolný index',
+ 'superscript': 'Horný index',
+ 'underline': 'Podčiarknuť',
+ 'undo': 'Späť',
+ 'unlink': 'Odstrániť prepojenie',
+ 'createLink': 'Vytvoriť prepojenie',
+ 'toggleDir': 'Prepnúť smer',
+ 'insertImage': 'Vložiť obrázok',
+ 'insertTable': 'Vložiť/upraviť tabuľku',
+ 'toggleTableBorder': 'Prepnúť ohraničenie tabuľky',
+ 'deleteTable': 'Odstrániť tabuľku',
+ 'tableProp': 'Vlastnosť tabuľky',
+ 'htmlToggle': 'Zdrojový kód HTML',
+ 'foreColor': 'Farba popredia',
+ 'hiliteColor': 'Farba pozadia',
+ 'plainFormatBlock': 'Štýl odseku',
+ 'formatBlock': 'Štýl odseku',
+ 'fontSize': 'Veľkosť písma',
+ 'fontName': 'Názov písma',
+ 'tabIndent': 'Odsadenie tabulátora',
+ "fullScreen": "Prepnúť na celú obrazovku",
+ "viewSource": "Zobraziť zdrojový kód HTML",
+ "print": "Vytlačiť",
+ "newPage": "Nová stránka",
+ /* Error messages */
+ 'systemShortcut': 'Akcia "${0}" je vo vašom prehliadači dostupná iba prostredníctvom klávesovej skratky. Stlačte ${1}.',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..3d9e927b1
--- /dev/null
+++ b/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/sl/FontChoice", ({
+ fontSize: "Velikost",
+ fontName: "Pisava",
+ formatBlock: "Oblika",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Brez",
+ p: "Odstavek",
+ h1: "Naslovni slog",
+ h2: "Podnaslovni slog",
+ h3: "Pod-podnaslovni slog",
+ pre: "Vnaprej oblikovan",
+ 1: "xx-majhno",
+ 2: "x-majhno",
+ 3: "majhno",
+ 4: "srednje",
+ 5: "veliko",
+ 6: "x-veliko",
+ 7: "xx-veliko"
+})
+);
diff --git a/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..c7f1c7252
--- /dev/null
+++ b/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/sl/LinkDialog", ({
+ createLinkTitle: "Lastnosti povezave",
+ insertImageTitle: "Lastnosti slike",
+ url: "URL:",
+ text: "Opis:",
+ target: "Cilj:",
+ set: "Nastavi",
+ currentWindow: "Trenutno okno",
+ parentWindow: "Nadrejeno okno",
+ topWindow: "Okno na vrhu",
+ newWindow: "Novo okno"
+})
+);
diff --git a/lib/dijit/_editor/nls/sl/commands.js b/lib/dijit/_editor/nls/sl/commands.js
index 9061e1602..d26ba426f 100644
--- a/lib/dijit/_editor/nls/sl/commands.js
+++ b/lib/dijit/_editor/nls/sl/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/sl/commands",({"bold":"Krepko","copy":"Prekopiraj","cut":"Izreži","delete":"Izbriši","indent":"Zamik","insertHorizontalRule":"Vodoravno ravnilo","insertOrderedList":"Oštevilčen seznam","insertUnorderedList":"Naštevni seznam","italic":"Ležeče","justifyCenter":"Poravnaj na sredino","justifyFull":"Poravnaj obojestransko","justifyLeft":"Poravnaj levo","justifyRight":"Poravnaj desno","outdent":"Primakni","paste":"Prilepi","redo":"Znova uveljavi","removeFormat":"Odstrani oblikovanje","selectAll":"Izberi vse","strikethrough":"Prečrtano","subscript":"Podpisano","superscript":"Nadpisano","underline":"Podčrtano","undo":"Razveljavi","unlink":"Odstrani povezavo","createLink":"Ustvari povezavo","toggleDir":"Preklopi smer","insertImage":"Vstavi sliko","insertTable":"Vstavi/uredi tabelo","toggleTableBorder":"Preklopi na rob tabele","deleteTable":"Izbriši tabelo","tableProp":"Lastnost tabele","htmlToggle":"Izvorna koda HTML","foreColor":"Barva ospredja","hiliteColor":"Barva ozadja","plainFormatBlock":"Slog odstavka","formatBlock":"Slog odstavka","fontSize":"Velikost pisave","fontName":"Ime pisave","tabIndent":"Zamik tabulatorja","fullScreen":"Preklopi na celozaslonski način","viewSource":"Prikaži izvorno kodo HTML","print":"Natisni","newPage":"Nova stran","systemShortcut":"Dejanje \"${0}\" lahko v vašem brskalniku uporabite samo z bližnjico na tipkovnici. Uporabite ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/sl/commands",({"bold":"Krepko","copy":"Prekopiraj","cut":"Izreži","delete":"Izbriši","indent":"Zamik","insertHorizontalRule":"Vodoravno ravnilo","insertOrderedList":"Oštevilčen seznam","insertUnorderedList":"Naštevni seznam","italic":"Ležeče","justifyCenter":"Poravnaj na sredino","justifyFull":"Poravnaj obojestransko","justifyLeft":"Poravnaj levo","justifyRight":"Poravnaj desno","outdent":"Primakni","paste":"Prilepi","redo":"Znova uveljavi","removeFormat":"Odstrani oblikovanje","selectAll":"Izberi vse","strikethrough":"Prečrtano","subscript":"Podpisano","superscript":"Nadpisano","underline":"Podčrtano","undo":"Razveljavi","unlink":"Odstrani povezavo","createLink":"Ustvari povezavo","toggleDir":"Preklopi smer","insertImage":"Vstavi sliko","insertTable":"Vstavi/uredi tabelo","toggleTableBorder":"Preklopi na obrobo tabele","deleteTable":"Izbriši tabelo","tableProp":"Lastnost tabele","htmlToggle":"Izvor HTML","foreColor":"Barva ospredja","hiliteColor":"Barva ozadja","plainFormatBlock":"Slog odstavka","formatBlock":"Slog odstavka","fontSize":"Velikost pisave","fontName":"Ime pisave","tabIndent":"Zamik tabulatorja","fullScreen":"Preklopi na celozaslonski način","viewSource":"Prikaži izvorno kodo HTML","print":"Natisni","newPage":"Nova stran","systemShortcut":"Dejanje \"${0}\" lahko v vašem brskalniku uporabite samo z bližnjico na tipkovnici. Uporabite ${1}."})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js b/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js
new file mode 100644
index 000000000..b03f5af33
--- /dev/null
+++ b/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js
@@ -0,0 +1,49 @@
+define(
+"dijit/_editor/nls/sl/commands", ({
+ 'bold': 'Krepko',
+ 'copy': 'Prekopiraj',
+ 'cut': 'Izreži',
+ 'delete': 'Izbriši',
+ 'indent': 'Zamik',
+ 'insertHorizontalRule': 'Vodoravno ravnilo',
+ 'insertOrderedList': 'Oštevilčen seznam',
+ 'insertUnorderedList': 'Naštevni seznam',
+ 'italic': 'Ležeče',
+ 'justifyCenter': 'Poravnaj na sredino',
+ 'justifyFull': 'Poravnaj obojestransko',
+ 'justifyLeft': 'Poravnaj levo',
+ 'justifyRight': 'Poravnaj desno',
+ 'outdent': 'Primakni',
+ 'paste': 'Prilepi',
+ 'redo': 'Znova uveljavi',
+ 'removeFormat': 'Odstrani oblikovanje',
+ 'selectAll': 'Izberi vse',
+ 'strikethrough': 'Prečrtano',
+ 'subscript': 'Podpisano',
+ 'superscript': 'Nadpisano',
+ 'underline': 'Podčrtano',
+ 'undo': 'Razveljavi',
+ 'unlink': 'Odstrani povezavo',
+ 'createLink': 'Ustvari povezavo',
+ 'toggleDir': 'Preklopi smer',
+ 'insertImage': 'Vstavi sliko',
+ 'insertTable': 'Vstavi/uredi tabelo',
+ 'toggleTableBorder': 'Preklopi na obrobo tabele',
+ 'deleteTable': 'Izbriši tabelo',
+ 'tableProp': 'Lastnost tabele',
+ 'htmlToggle': 'Izvor HTML',
+ 'foreColor': 'Barva ospredja',
+ 'hiliteColor': 'Barva ozadja',
+ 'plainFormatBlock': 'Slog odstavka',
+ 'formatBlock': 'Slog odstavka',
+ 'fontSize': 'Velikost pisave',
+ 'fontName': 'Ime pisave',
+ 'tabIndent': 'Zamik tabulatorja',
+ "fullScreen": "Preklopi na celozaslonski način",
+ "viewSource": "Prikaži izvorno kodo HTML",
+ "print": "Natisni",
+ "newPage": "Nova stran",
+ /* Error messages */
+ 'systemShortcut': 'Dejanje "${0}" lahko v vašem brskalniku uporabite samo z bližnjico na tipkovnici. Uporabite ${1}.'
+})
+);
diff --git a/lib/dijit/_editor/nls/sv/FontChoice.js b/lib/dijit/_editor/nls/sv/FontChoice.js
index 197fca5e3..c9db732a5 100644
--- a/lib/dijit/_editor/nls/sv/FontChoice.js
+++ b/lib/dijit/_editor/nls/sv/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/sv/FontChoice",({fontSize:"Storlek",fontName:"Teckensnitt",formatBlock:"Format",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"kursivt",fantasy:"fantasy",noFormat:"Ingen",p:"Stycke",h1:"Rubrik",h2:"Underrubrik",h3:"Underunderrubrik",pre:"Förformaterat",1:"mycket, mycket litet",2:"mycket litet",3:"litet",4:"medelstort",5:"stort",6:"extra stort",7:"extra extra stort"})); \ No newline at end of file
+define("dijit/_editor/nls/sv/FontChoice",({fontSize:"Storlek ",fontName:"Teckensnitt",formatBlock:"Format",serif:"serif","sans-serif":"sans-serif",monospace:"monospace",cursive:"cursive",fantasy:"fantasy",noFormat:"Inget",p:"Stycke",h1:"Rubrik 1",h2:"Rubrik 2",h3:"Rubrik 3",pre:"Förformaterad",1:"XXS",2:"XS",3:"S",4:"M",5:"L",6:"XL",7:"XXL"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..ba2ec83f2
--- /dev/null
+++ b/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/sv/FontChoice", ({
+ fontSize: "Storlek ",
+ fontName: "Teckensnitt",
+ formatBlock: "Format",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "Inget",
+ p: "Stycke",
+ h1: "Rubrik 1",
+ h2: "Rubrik 2",
+ h3: "Rubrik 3",
+ pre: "Förformaterad",
+ 1: "XXS",
+ 2: "XS",
+ 3: "S",
+ 4: "M",
+ 5: "L",
+ 6: "XL",
+ 7: "XXL"
+})
+);
diff --git a/lib/dijit/_editor/nls/sv/LinkDialog.js b/lib/dijit/_editor/nls/sv/LinkDialog.js
index 91eb3cb0e..3c3a39d68 100644
--- a/lib/dijit/_editor/nls/sv/LinkDialog.js
+++ b/lib/dijit/_editor/nls/sv/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/sv/LinkDialog",({createLinkTitle:"Länkegenskaper",insertImageTitle:"Bildegenskaper",url:"URL-adress:",text:"Beskrivning:",target:"Mål:",set:"Ange",currentWindow:"aktuellt fönster",parentWindow:"överordnat fönster",topWindow:"översta fönstret",newWindow:"nytt fönster"})); \ No newline at end of file
+define("dijit/_editor/nls/sv/LinkDialog",({createLinkTitle:"Länkegenskaper",insertImageTitle:"Bildegenskaper",url:"URL-adress:",text:"Beskrivning:",target:"Mål:",set:"Använd",currentWindow:"Aktuellt fönster",parentWindow:"Överordnat fönster",topWindow:"Översta fönstret",newWindow:"Nytt fönster"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..dca1fc0f6
--- /dev/null
+++ b/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/sv/LinkDialog", ({
+ createLinkTitle: "Länkegenskaper",
+ insertImageTitle: "Bildegenskaper",
+ url: "URL-adress:",
+ text: "Beskrivning:",
+ target: "Mål:",
+ set: "Använd",
+ currentWindow: "Aktuellt fönster",
+ parentWindow: "Överordnat fönster",
+ topWindow: "Översta fönstret",
+ newWindow: "Nytt fönster"
+})
+);
diff --git a/lib/dijit/_editor/nls/sv/commands.js b/lib/dijit/_editor/nls/sv/commands.js
index fb62d3068..c26d0020b 100644
--- a/lib/dijit/_editor/nls/sv/commands.js
+++ b/lib/dijit/_editor/nls/sv/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/sv/commands",({"bold":"Fetstil","copy":"Kopiera","cut":"Klipp ut","delete":"Ta bort","indent":"Indrag","insertHorizontalRule":"Horisontell linjal","insertOrderedList":"Numrerad lista","insertUnorderedList":"Punktlista","italic":"Kursiv","justifyCenter":"Centrera","justifyFull":"Marginaljustera","justifyLeft":"Vänsterjustera","justifyRight":"Högerjustera","outdent":"Utdrag","paste":"Klistra in","redo":"Gör om","removeFormat":"Ta bort format","selectAll":"Markera allt","strikethrough":"Genomstruken","subscript":"Nedsänkt","superscript":"Upphöjt","underline":"Understrykning","undo":"Ångra","unlink":"Ta bort länk","createLink":"Skapa länk","toggleDir":"Växla riktning","insertImage":"Infoga bild","insertTable":"Infoga/redigera tabell","toggleTableBorder":"Aktivera/avaktivera tabellram","deleteTable":"Ta bort tabell","tableProp":"Tabellegenskap","htmlToggle":"HTML-källkod","foreColor":"Förgrundsfärg","hiliteColor":"Bakgrundsfärg","plainFormatBlock":"Styckeformat","formatBlock":"Styckeformat","fontSize":"Teckenstorlek","fontName":"Teckensnittsnamn","tabIndent":"Tabbindrag","fullScreen":"Växla helskärm","viewSource":"Visa HTML-kod","print":"Skriv ut","newPage":"Ny sida","systemShortcut":"Åtgärden \"${0}\" är endast tillgänglig i webbläsaren med hjälp av ett kortkommando. Använd ${1}.","ctrlKey":"Ctrl+${0}","appleKey":"⌘+${0}"})); \ No newline at end of file
+define("dijit/_editor/nls/sv/commands",({"bold":"Halvfet","copy":"Kopiera ","cut":"Klipp ut ","delete":"Ta bort ","indent":"Indrag","insertHorizontalRule":"Horisontell linje","insertOrderedList":"Numrerad lista","insertUnorderedList":"Punktlista","italic":"Kursiv","justifyCenter":"Justera centrerat","justifyFull":"Justera","justifyLeft":"Justera till vänster","justifyRight":"Justera till höger","outdent":"Utdrag","paste":"Klistra in","redo":"Gör om","removeFormat":"Ta bort format","selectAll":"Markera allt","strikethrough":"Genomstrykning","subscript":"Nedsänkt","superscript":"Upphöjt","underline":"Understrykning","undo":"Ångra","unlink":"Ta bort länk","createLink":"Skapa länk","toggleDir":"Växla riktning","insertImage":"Infoga bild","insertTable":"Infoga/redigera tabell","toggleTableBorder":"Växla tabellkantlinjer","deleteTable":"Ta bort tabell","tableProp":"Tabellegenskap","htmlToggle":"HTML-källa","foreColor":"Förgrundsfärg","hiliteColor":"Bakgrundsfärg","plainFormatBlock":"Styckeformat","formatBlock":"Styckeformat","fontSize":"Teckenstorlek","fontName":"Teckensnitt","tabIndent":"Indrag tabb","fullScreen":"Växla fullskärm","viewSource":"Visa HTML-kod","print":"Skriv ut","newPage":"Ny sida","systemShortcut":"Åtgärden ${0} är endast tillgänglig i webbläsaren via ett tangentbordskommando. Använd ${1}.","ctrlKey":"Ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js b/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js
new file mode 100644
index 000000000..5950b0196
--- /dev/null
+++ b/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/sv/commands", ({
+ 'bold': 'Halvfet',
+ 'copy': 'Kopiera ',
+ 'cut': 'Klipp ut ',
+ 'delete': 'Ta bort ',
+ 'indent': 'Indrag',
+ 'insertHorizontalRule': 'Horisontell linje',
+ 'insertOrderedList': 'Numrerad lista',
+ 'insertUnorderedList': 'Punktlista',
+ 'italic': 'Kursiv',
+ 'justifyCenter': 'Justera centrerat',
+ 'justifyFull': 'Justera',
+ 'justifyLeft': 'Justera till vänster',
+ 'justifyRight': 'Justera till höger',
+ 'outdent': 'Utdrag',
+ 'paste': 'Klistra in',
+ 'redo': 'Gör om',
+ 'removeFormat': 'Ta bort format',
+ 'selectAll': 'Markera allt',
+ 'strikethrough': 'Genomstrykning',
+ 'subscript': 'Nedsänkt',
+ 'superscript': 'Upphöjt',
+ 'underline': 'Understrykning',
+ 'undo': 'Ångra',
+ 'unlink': 'Ta bort länk',
+ 'createLink': 'Skapa länk',
+ 'toggleDir': 'Växla riktning',
+ 'insertImage': 'Infoga bild',
+ 'insertTable': 'Infoga/redigera tabell',
+ 'toggleTableBorder': 'Växla tabellkantlinjer',
+ 'deleteTable': 'Ta bort tabell',
+ 'tableProp': 'Tabellegenskap',
+ 'htmlToggle': 'HTML-källa',
+ 'foreColor': 'Förgrundsfärg',
+ 'hiliteColor': 'Bakgrundsfärg',
+ 'plainFormatBlock': 'Styckeformat',
+ 'formatBlock': 'Styckeformat',
+ 'fontSize': 'Teckenstorlek',
+ 'fontName': 'Teckensnitt',
+ 'tabIndent': 'Indrag tabb',
+ "fullScreen": "Växla fullskärm",
+ "viewSource": "Visa HTML-kod",
+ "print": "Skriv ut",
+ "newPage": "Ny sida",
+ /* Error messages */
+ 'systemShortcut': 'Åtgärden ${0} är endast tillgänglig i webbläsaren via ett tangentbordskommando. Använd ${1}.',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..715e2e617
--- /dev/null
+++ b/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/th/FontChoice", ({
+ fontSize: "ขนาด",
+ fontName: "ฟอนต์",
+ formatBlock: "รูปแบบ",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "monospace",
+ cursive: "cursive",
+ fantasy: "fantasy",
+ noFormat: "ไม่มี",
+ p: "ย่อหน้า",
+ h1: "ส่วนหัว",
+ h2: "ส่วนหัวย่อย",
+ h3: "ส่วนย่อยของส่วนหัวย่อย",
+ pre: "การกำหนดรูปแบบล่วงหน้า",
+ 1: "xx-small",
+ 2: "x-small",
+ 3: "small",
+ 4: "medium",
+ 5: "large",
+ 6: "x-large",
+ 7: "xx-large"
+})
+);
diff --git a/lib/dijit/_editor/nls/th/LinkDialog.js b/lib/dijit/_editor/nls/th/LinkDialog.js
index 4b7756829..9d3352235 100644
--- a/lib/dijit/_editor/nls/th/LinkDialog.js
+++ b/lib/dijit/_editor/nls/th/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/th/LinkDialog",({createLinkTitle:"คุณสมบัติลิงก์",insertImageTitle:"คุณสมบัติอิมเมจ",url:"URL:",text:"รายละเอียด:",target:"เป้าหมาย:",set:"ตั้งค่า",currentWindow:"หน้าต่างปัจจุบัน",parentWindow:"หน้าต่างหลัก",topWindow:"หน้าต่างบนสุด",newWindow:"หน้าต่างใหม่"})); \ No newline at end of file
+define("dijit/_editor/nls/th/LinkDialog",({createLinkTitle:"คุณสมบัติลิงก์",insertImageTitle:"คุณสมบัติรูปภาพ",url:"URL:",text:"คำอธิบาย:",target:"เป้าหมาย:",set:"เซ็ต",currentWindow:"หน้าต่างปัจจุบัน",parentWindow:"หน้าต่างหลัก",topWindow:"หน้าต่างบนสุด",newWindow:"หน้าต่างใหม่"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..8df6810f4
--- /dev/null
+++ b/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/th/LinkDialog", ({
+ createLinkTitle: "คุณสมบัติลิงก์",
+ insertImageTitle: "คุณสมบัติรูปภาพ",
+ url: "URL:",
+ text: "คำอธิบาย:",
+ target: "เป้าหมาย:",
+ set: "เซ็ต",
+ currentWindow: "หน้าต่างปัจจุบัน",
+ parentWindow: "หน้าต่างหลัก",
+ topWindow: "หน้าต่างบนสุด",
+ newWindow: "หน้าต่างใหม่"
+})
+);
diff --git a/lib/dijit/_editor/nls/th/commands.js b/lib/dijit/_editor/nls/th/commands.js
index d7480eb96..6bba32e2b 100644
--- a/lib/dijit/_editor/nls/th/commands.js
+++ b/lib/dijit/_editor/nls/th/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/th/commands",({"bold":"ตัวหนา","copy":"คัดลอก","cut":"ตัด","delete":"ลบ","indent":"เพิ่มการเยื้อง","insertHorizontalRule":"ไม้บรรทัดแนวนอน","insertOrderedList":"ลำดับเลข","insertUnorderedList":"หัวข้อย่อย","italic":"ตัวเอียง","justifyCenter":"จัดกึ่งกลาง","justifyFull":"จัดชิดขอบ","justifyLeft":"จัดชิดซ้าย","justifyRight":"จัดชิดขวา","outdent":"ลดการเยื้อง","paste":"วาง","redo":"ทำซ้ำ","removeFormat":"ลบรูปแบบออก","selectAll":"เลือกทั้งหมด","strikethrough":"ขีดทับ","subscript":"ตัวห้อย","superscript":"ตัวยก","underline":"ขีดเส้นใต้","undo":"เลิกทำ","unlink":"ลบลิงก์ออก","createLink":"สร้างลิงก์","toggleDir":"สลับทิศทาง","insertImage":"แทรกอิมเมจ","insertTable":"แทรก/แก้ไขตาราง","toggleTableBorder":"สลับเส้นขอบตาราง","deleteTable":"ลบตาราง","tableProp":"คุณสมบัติตาราง","htmlToggle":"ซอร์ส HTML","foreColor":"สีพื้นหน้า","hiliteColor":"สีพื้นหลัง","plainFormatBlock":"ลักษณะย่อหน้า","formatBlock":"ลักษณะย่อหน้า","fontSize":"ขนาดฟอนต์","fontName":"ชื่อฟอนต์","tabIndent":"เยื้องแท็บ","fullScreen":"สลับจอภาพแบบเต็ม","viewSource":"ดูซอร์ส HTML","print":"พิมพ์","newPage":"หน้าใหม่","systemShortcut":"การดำเนินการ\"${0}\" ใช้งานได้เฉพาะกับเบราว์เซอร์ของคุณโดยใช้แป้นพิมพ์ลัด ใช้ ${1}"})); \ No newline at end of file
+define("dijit/_editor/nls/th/commands",({"bold":"ตัวหนา","copy":"คัดลอก","cut":"ตัด","delete":"ลบ","indent":"เพิ่มการเยื้อง","insertHorizontalRule":"ไม้บรรทัดแนวนอน","insertOrderedList":"ลำดับเลข","insertUnorderedList":"หัวข้อย่อย","italic":"ตัวเอียง","justifyCenter":"จัดแนวกึ่งกลาง","justifyFull":"ชิดขอบ","justifyLeft":"จัดชิดซ้าย","justifyRight":"จัดชิดขวา","outdent":"ลดการเยื้อง","paste":"วาง","redo":"ทำซ้ำ","removeFormat":"ลบรูปแบบออก","selectAll":"เลือกทั้งหมด","strikethrough":"ขีดทับ","subscript":"ตัวห้อย","superscript":"ตัวยก","underline":"ขีดเส้นใต้","undo":"เลิกทำ","unlink":"ลบลิงก์ออก","createLink":"สร้างลิงก์","toggleDir":"สลับทิศทาง","insertImage":"แทรกรูปภาพ","insertTable":"แทรก/แก้ไขตาราง","toggleTableBorder":"สลับเส้นขอบตาราง","deleteTable":"ลบตาราง","tableProp":"คุณสมบัติตาราง","htmlToggle":"ซอร์ส HTML","foreColor":"สีพื้นหน้า","hiliteColor":"สีพื้นหลัง","plainFormatBlock":"ลักษณะย่อหน้า","formatBlock":"ลักษณะย่อหน้า","fontSize":"ขนาดฟอนต์","fontName":"ชื่อฟอนต์","tabIndent":"เยื้องแท็บ","fullScreen":"สลับจอภาพแบบเต็ม","viewSource":"ดูซอร์ส HTML","print":"พิมพ์","newPage":"หน้าใหม่","systemShortcut":"การดำเนินการ\"${0}\" ใช้งานได้เฉพาะกับเบราว์เซอร์ของคุณโดยใช้แป้นพิมพ์ลัด ใช้ ${1}","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/th/commands.js.uncompressed.js b/lib/dijit/_editor/nls/th/commands.js.uncompressed.js
new file mode 100644
index 000000000..dced848cd
--- /dev/null
+++ b/lib/dijit/_editor/nls/th/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/th/commands", ({
+ 'bold': 'ตัวหนา',
+ 'copy': 'คัดลอก',
+ 'cut': 'ตัด',
+ 'delete': 'ลบ',
+ 'indent': 'เพิ่มการเยื้อง',
+ 'insertHorizontalRule': 'ไม้บรรทัดแนวนอน',
+ 'insertOrderedList': 'ลำดับเลข',
+ 'insertUnorderedList': 'หัวข้อย่อย',
+ 'italic': 'ตัวเอียง',
+ 'justifyCenter': 'จัดแนวกึ่งกลาง',
+ 'justifyFull': 'ชิดขอบ',
+ 'justifyLeft': 'จัดชิดซ้าย',
+ 'justifyRight': 'จัดชิดขวา',
+ 'outdent': 'ลดการเยื้อง',
+ 'paste': 'วาง',
+ 'redo': 'ทำซ้ำ',
+ 'removeFormat': 'ลบรูปแบบออก',
+ 'selectAll': 'เลือกทั้งหมด',
+ 'strikethrough': 'ขีดทับ',
+ 'subscript': 'ตัวห้อย',
+ 'superscript': 'ตัวยก',
+ 'underline': 'ขีดเส้นใต้',
+ 'undo': 'เลิกทำ',
+ 'unlink': 'ลบลิงก์ออก',
+ 'createLink': 'สร้างลิงก์',
+ 'toggleDir': 'สลับทิศทาง',
+ 'insertImage': 'แทรกรูปภาพ',
+ 'insertTable': 'แทรก/แก้ไขตาราง',
+ 'toggleTableBorder': 'สลับเส้นขอบตาราง',
+ 'deleteTable': 'ลบตาราง',
+ 'tableProp': 'คุณสมบัติตาราง',
+ 'htmlToggle': 'ซอร์ส HTML',
+ 'foreColor': 'สีพื้นหน้า',
+ 'hiliteColor': 'สีพื้นหลัง',
+ 'plainFormatBlock': 'ลักษณะย่อหน้า',
+ 'formatBlock': 'ลักษณะย่อหน้า',
+ 'fontSize': 'ขนาดฟอนต์',
+ 'fontName': 'ชื่อฟอนต์',
+ 'tabIndent': 'เยื้องแท็บ',
+ "fullScreen": "สลับจอภาพแบบเต็ม",
+ "viewSource": "ดูซอร์ส HTML",
+ "print": "พิมพ์",
+ "newPage": "หน้าใหม่",
+ /* Error messages */
+ 'systemShortcut': 'การดำเนินการ"${0}" ใช้งานได้เฉพาะกับเบราว์เซอร์ของคุณโดยใช้แป้นพิมพ์ลัด ใช้ ${1}',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..456d3c236
--- /dev/null
+++ b/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/tr/FontChoice", ({
+ fontSize: "Boyut",
+ fontName: "Yazı Tipi",
+ formatBlock: "Biçim",
+ serif: "serif",
+ "sans-serif": "sans-serif",
+ monospace: "tek aralıklı",
+ cursive: "el yazısı",
+ fantasy: "fantazi",
+ noFormat: "Yok",
+ p: "Paragraf",
+ h1: "Başlık",
+ h2: "Alt Başlık",
+ h3: "Alt Alt Başlık",
+ pre: "Önceden Biçimlendirilmiş",
+ 1: "xx-küçük",
+ 2: "x-küçük",
+ 3: "küçük",
+ 4: "orta",
+ 5: "büyük",
+ 6: "x-büyük",
+ 7: "xx-büyük"
+})
+);
diff --git a/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..bef0e704f
--- /dev/null
+++ b/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/tr/LinkDialog", ({
+ createLinkTitle: "Bağlantı Özellikleri",
+ insertImageTitle: "Resim Özellikleri",
+ url: "URL:",
+ text: "Açıklama:",
+ target: "Hedef:",
+ set: "Ayarla",
+ currentWindow: "Geçerli Pencere",
+ parentWindow: "Üst Pencere",
+ topWindow: "En Üst Pencere",
+ newWindow: "Yeni Pencere"
+})
+);
diff --git a/lib/dijit/_editor/nls/tr/commands.js b/lib/dijit/_editor/nls/tr/commands.js
index 5565b9a14..3b12fb511 100644
--- a/lib/dijit/_editor/nls/tr/commands.js
+++ b/lib/dijit/_editor/nls/tr/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/tr/commands",({"bold":"Kalın","copy":"Kopyala","cut":"Kes","delete":"Sil","indent":"Girinti","insertHorizontalRule":"Yatay Kural","insertOrderedList":"Numaralı Liste","insertUnorderedList":"Madde İşaretli Liste","italic":"İtalik","justifyCenter":"Ortaya Hizala","justifyFull":"Yasla","justifyLeft":"Sola Hizala","justifyRight":"Sağa Hizala","outdent":"Çıkıntı","paste":"Yapıştır","redo":"Yinele","removeFormat":"Biçimi Kaldır","selectAll":"Tümünü Seç","strikethrough":"Üstü Çizili","subscript":"Alt Simge","superscript":"Üst Simge","underline":"Altı Çizili","undo":"Geri Al","unlink":"Bağlantıyı Kaldır","createLink":"Bağlantı Oluştur","toggleDir":"Yönü Değiştir","insertImage":"Resim Ekle","insertTable":"Tablo Ekle/Düzenle","toggleTableBorder":"Tablo Kenarlığını Göster/Gizle","deleteTable":"Tabloyu Sil","tableProp":"Tablo Özelliği","htmlToggle":"HTML Kaynağı","foreColor":"Ön Plan Rengi","hiliteColor":"Arka Plan Rengi","plainFormatBlock":"Paragraf Stili","formatBlock":"Paragraf Stili","fontSize":"Yazı Tipi Boyutu","fontName":"Yazı Tipi Adı","tabIndent":"Sekme Girintisi","fullScreen":"Tam Ekranı Aç/Kapat","viewSource":"HTML Kaynağını Görüntüle","print":"Yazdır","newPage":"Yeni Sayfa","systemShortcut":"\"${0}\" işlemi yalnızca tarayıcınızda bir klavye kısayoluyla birlikte kullanılabilir. Şunu kullanın: ${1}."})); \ No newline at end of file
+define("dijit/_editor/nls/tr/commands",({"bold":"Kalın","copy":"Kopyala","cut":"Kes","delete":"Sil","indent":"Girinti","insertHorizontalRule":"Yatay Kural","insertOrderedList":"Numaralı Liste","insertUnorderedList":"Madde İşaretli Liste","italic":"İtalik","justifyCenter":"Ortaya Hizala","justifyFull":"Yasla","justifyLeft":"Sola Hizala","justifyRight":"Sağa Hizala","outdent":"Çıkıntı","paste":"Yapıştır","redo":"Yinele","removeFormat":"Biçimi Kaldır","selectAll":"Tümünü Seç","strikethrough":"Üstü Çizili","subscript":"Alt Simge","superscript":"Üst Simge","underline":"Altı Çizili","undo":"Geri Al","unlink":"Bağlantıyı Kaldır","createLink":"Bağlantı Oluştur","toggleDir":"Yönü Değiştir","insertImage":"Resim Ekle","insertTable":"Tablo Ekle/Düzenle","toggleTableBorder":"Tablo Kenarlığını Göster/Gizle","deleteTable":"Tabloyu Sil","tableProp":"Tablo Özelliği","htmlToggle":"HTML Kaynağı","foreColor":"Ön Plan Rengi","hiliteColor":"Arka Plan Rengi","plainFormatBlock":"Paragraf Stili","formatBlock":"Paragraf Stili","fontSize":"Yazı Tipi Boyutu","fontName":"Yazı Tipi Adı","tabIndent":"Sekme Girintisi","fullScreen":"Tam Ekranı Aç/Kapat","viewSource":"HTML Kaynağını Görüntüle","print":"Yazdır","newPage":"Yeni Sayfa","systemShortcut":"\"${0}\" işlemi yalnızca tarayıcınızda bir klavye kısayoluyla birlikte kullanılabilir. Şunu kullanın: ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js b/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js
new file mode 100644
index 000000000..a93e67ccd
--- /dev/null
+++ b/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/tr/commands", ({
+ 'bold': 'Kalın',
+ 'copy': 'Kopyala',
+ 'cut': 'Kes',
+ 'delete': 'Sil',
+ 'indent': 'Girinti',
+ 'insertHorizontalRule': 'Yatay Kural',
+ 'insertOrderedList': 'Numaralı Liste',
+ 'insertUnorderedList': 'Madde İşaretli Liste',
+ 'italic': 'İtalik',
+ 'justifyCenter': 'Ortaya Hizala',
+ 'justifyFull': 'Yasla',
+ 'justifyLeft': 'Sola Hizala',
+ 'justifyRight': 'Sağa Hizala',
+ 'outdent': 'Çıkıntı',
+ 'paste': 'Yapıştır',
+ 'redo': 'Yinele',
+ 'removeFormat': 'Biçimi Kaldır',
+ 'selectAll': 'Tümünü Seç',
+ 'strikethrough': 'Üstü Çizili',
+ 'subscript': 'Alt Simge',
+ 'superscript': 'Üst Simge',
+ 'underline': 'Altı Çizili',
+ 'undo': 'Geri Al',
+ 'unlink': 'Bağlantıyı Kaldır',
+ 'createLink': 'Bağlantı Oluştur',
+ 'toggleDir': 'Yönü Değiştir',
+ 'insertImage': 'Resim Ekle',
+ 'insertTable': 'Tablo Ekle/Düzenle',
+ 'toggleTableBorder': 'Tablo Kenarlığını Göster/Gizle',
+ 'deleteTable': 'Tabloyu Sil',
+ 'tableProp': 'Tablo Özelliği',
+ 'htmlToggle': 'HTML Kaynağı',
+ 'foreColor': 'Ön Plan Rengi',
+ 'hiliteColor': 'Arka Plan Rengi',
+ 'plainFormatBlock': 'Paragraf Stili',
+ 'formatBlock': 'Paragraf Stili',
+ 'fontSize': 'Yazı Tipi Boyutu',
+ 'fontName': 'Yazı Tipi Adı',
+ 'tabIndent': 'Sekme Girintisi',
+ "fullScreen": "Tam Ekranı Aç/Kapat",
+ "viewSource": "HTML Kaynağını Görüntüle",
+ "print": "Yazdır",
+ "newPage": "Yeni Sayfa",
+ /* Error messages */
+ 'systemShortcut': '"${0}" işlemi yalnızca tarayıcınızda bir klavye kısayoluyla birlikte kullanılabilir. Şunu kullanın: ${1}.',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..9fce29893
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/zh-tw/FontChoice", ({
+ fontSize: "大小",
+ fontName: "字型",
+ formatBlock: "格式",
+ serif: "新細明體",
+ "sans-serif": "新細明體",
+ monospace: "等寬",
+ cursive: "Cursive",
+ fantasy: "Fantasy",
+ noFormat: "無",
+ p: "段落",
+ h1: "標題",
+ h2: "子標題",
+ h3: "次子標題",
+ pre: "預先格式化",
+ 1: "最小",
+ 2: "較小",
+ 3: "小",
+ 4: "中",
+ 5: "大",
+ 6: "較大",
+ 7: "最大"
+})
+);
diff --git a/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..a51049592
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/zh-tw/LinkDialog", ({
+ createLinkTitle: "鏈結內容",
+ insertImageTitle: "影像內容",
+ url: "URL:",
+ text: "說明:",
+ target: "目標:",
+ set: "設定",
+ currentWindow: "現行視窗",
+ parentWindow: "上層視窗",
+ topWindow: "最上面的視窗",
+ newWindow: "新視窗"
+})
+);
diff --git a/lib/dijit/_editor/nls/zh-tw/commands.js b/lib/dijit/_editor/nls/zh-tw/commands.js
index 2f676219b..2cd9ad43f 100644
--- a/lib/dijit/_editor/nls/zh-tw/commands.js
+++ b/lib/dijit/_editor/nls/zh-tw/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/zh-tw/commands",({"bold":"粗體","copy":"複製","cut":"剪下","delete":"刪除","indent":"縮排","insertHorizontalRule":"水平尺規","insertOrderedList":"編號清單","insertUnorderedList":"項目符號清單","italic":"斜體","justifyCenter":"置中對齊","justifyFull":"對齊","justifyLeft":"靠左對齊","justifyRight":"靠右對齊","outdent":"凸排","paste":"貼上","redo":"重做","removeFormat":"移除格式","selectAll":"全選","strikethrough":"刪除線","subscript":"下標","superscript":"上標","underline":"底線","undo":"復原","unlink":"移除鏈結","createLink":"建立鏈結","toggleDir":"切換方向","insertImage":"插入影像","insertTable":"插入/編輯表格","toggleTableBorder":"切換表格邊框","deleteTable":"刪除表格","tableProp":"表格內容","htmlToggle":"HTML 原始檔","foreColor":"前景顏色","hiliteColor":"背景顏色","plainFormatBlock":"段落樣式","formatBlock":"段落樣式","fontSize":"字型大小","fontName":"字型名稱","tabIndent":"標籤縮排","fullScreen":"切換全螢幕","viewSource":"檢視 HTML 原始檔","print":"列印","newPage":"新頁面","systemShortcut":"\"${0}\" 動作在您的瀏覽器中,只能使用鍵盤快速鍵。請使用 ${1}。"})); \ No newline at end of file
+define("dijit/_editor/nls/zh-tw/commands",({"bold":"粗體","copy":"複製","cut":"剪下","delete":"刪除","indent":"縮排","insertHorizontalRule":"水平尺規","insertOrderedList":"編號清單","insertUnorderedList":"項目符號清單","italic":"斜體","justifyCenter":"置中對齊","justifyFull":"對齊","justifyLeft":"靠左對齊","justifyRight":"靠右對齊","outdent":"凸排","paste":"貼上","redo":"重做","removeFormat":"移除格式","selectAll":"全選","strikethrough":"刪除線","subscript":"下標","superscript":"上標","underline":"底線","undo":"復原","unlink":"移除鏈結","createLink":"建立鏈結","toggleDir":"切換方向","insertImage":"插入影像","insertTable":"插入/編輯表格","toggleTableBorder":"切換表格邊框","deleteTable":"刪除表格","tableProp":"表格內容","htmlToggle":"HTML 原始檔","foreColor":"前景顏色","hiliteColor":"背景顏色","plainFormatBlock":"段落樣式","formatBlock":"段落樣式","fontSize":"字型大小","fontName":"字型名稱","tabIndent":"標籤縮排","fullScreen":"切換全螢幕","viewSource":"檢視 HTML 原始檔","print":"列印","newPage":"新頁面","systemShortcut":"\"${0}\" 動作在您的瀏覽器中,只能使用鍵盤快速鍵。請使用 ${1}。","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js
new file mode 100644
index 000000000..a694fd174
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/zh-tw/commands", ({
+ 'bold': '粗體',
+ 'copy': '複製',
+ 'cut': '剪下',
+ 'delete': '刪除',
+ 'indent': '縮排',
+ 'insertHorizontalRule': '水平尺規',
+ 'insertOrderedList': '編號清單',
+ 'insertUnorderedList': '項目符號清單',
+ 'italic': '斜體',
+ 'justifyCenter': '置中對齊',
+ 'justifyFull': '對齊',
+ 'justifyLeft': '靠左對齊',
+ 'justifyRight': '靠右對齊',
+ 'outdent': '凸排',
+ 'paste': '貼上',
+ 'redo': '重做',
+ 'removeFormat': '移除格式',
+ 'selectAll': '全選',
+ 'strikethrough': '刪除線',
+ 'subscript': '下標',
+ 'superscript': '上標',
+ 'underline': '底線',
+ 'undo': '復原',
+ 'unlink': '移除鏈結',
+ 'createLink': '建立鏈結',
+ 'toggleDir': '切換方向',
+ 'insertImage': '插入影像',
+ 'insertTable': '插入/編輯表格',
+ 'toggleTableBorder': '切換表格邊框',
+ 'deleteTable': '刪除表格',
+ 'tableProp': '表格內容',
+ 'htmlToggle': 'HTML 原始檔',
+ 'foreColor': '前景顏色',
+ 'hiliteColor': '背景顏色',
+ 'plainFormatBlock': '段落樣式',
+ 'formatBlock': '段落樣式',
+ 'fontSize': '字型大小',
+ 'fontName': '字型名稱',
+ 'tabIndent': '標籤縮排',
+ "fullScreen": "切換全螢幕",
+ "viewSource": "檢視 HTML 原始檔",
+ "print": "列印",
+ "newPage": "新頁面",
+ /* Error messages */
+ 'systemShortcut': '"${0}" 動作在您的瀏覽器中,只能使用鍵盤快速鍵。請使用 ${1}。',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/nls/zh/FontChoice.js b/lib/dijit/_editor/nls/zh/FontChoice.js
index 67e802189..e692d0e2a 100644
--- a/lib/dijit/_editor/nls/zh/FontChoice.js
+++ b/lib/dijit/_editor/nls/zh/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/zh/FontChoice",({fontSize:"大小",fontName:"字体",formatBlock:"格式",serif:"有衬线","sans-serif":"无衬线",monospace:"等宽字体",cursive:"草书",fantasy:"虚线",noFormat:"无",p:"段落",h1:"标题",h2:"子标题",h3:"二级子标题",pre:"预设有格式的",1:"XXS 号",2:"XS 号",3:"S 号",4:"M 号",5:"L 号",6:"XL 号",7:"XXL 号"})); \ No newline at end of file
+define("dijit/_editor/nls/zh/FontChoice",({fontSize:"大小",fontName:"字体",formatBlock:"格式",serif:"有衬线","sans-serif":"无衬线",monospace:"等宽字体",cursive:"草书",fantasy:"虚线",noFormat:"无",p:"段落",h1:"标题",h2:"副标题",h3:"二级子标题",pre:"预设有格式的",1:"XX 小号",2:"X 小号",3:"小号",4:"中号",5:"大号",6:"X 大号",7:"XX 大号"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js b/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..dd8bd834b
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js
@@ -0,0 +1,25 @@
+define(
+"dijit/_editor/nls/zh/FontChoice", ({
+ fontSize: "大小",
+ fontName: "字体",
+ formatBlock: "格式",
+ serif: "有衬线",
+ "sans-serif": "无衬线",
+ monospace: "等宽字体",
+ cursive: "草书",
+ fantasy: "虚线",
+ noFormat: "无",
+ p: "段落",
+ h1: "标题",
+ h2: "副标题",
+ h3: "二级子标题",
+ pre: "预设有格式的",
+ 1: "XX 小号",
+ 2: "X 小号",
+ 3: "小号",
+ 4: "中号",
+ 5: "大号",
+ 6: "X 大号",
+ 7: "XX 大号"
+})
+);
diff --git a/lib/dijit/_editor/nls/zh/LinkDialog.js b/lib/dijit/_editor/nls/zh/LinkDialog.js
index 40cbebd24..0b7b66f70 100644
--- a/lib/dijit/_editor/nls/zh/LinkDialog.js
+++ b/lib/dijit/_editor/nls/zh/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/zh/LinkDialog",({createLinkTitle:"链接属性",insertImageTitle:"图像属性",url:"URL:",text:"描述:",target:"目标:",set:"设置",currentWindow:"当前窗口",parentWindow:"父窗口",topWindow:"顶层窗口",newWindow:"新建窗口"})); \ No newline at end of file
+define("dijit/_editor/nls/zh/LinkDialog",({createLinkTitle:"链接属性",insertImageTitle:"图像属性",url:"URL:",text:"说明:",target:"目标:",set:"集",currentWindow:"当前窗口",parentWindow:"父窗口",topWindow:"最顶层窗口",newWindow:"新建窗口"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..a954c9be8
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js
@@ -0,0 +1,14 @@
+define(
+"dijit/_editor/nls/zh/LinkDialog", ({
+ createLinkTitle: "链接属性",
+ insertImageTitle: "图像属性",
+ url: "URL:",
+ text: "说明:",
+ target: "目标:",
+ set: "集",
+ currentWindow: "当前窗口",
+ parentWindow: "父窗口",
+ topWindow: "最顶层窗口",
+ newWindow: "新建窗口"
+})
+);
diff --git a/lib/dijit/_editor/nls/zh/commands.js b/lib/dijit/_editor/nls/zh/commands.js
index bbac1fc3a..33cc25b2b 100644
--- a/lib/dijit/_editor/nls/zh/commands.js
+++ b/lib/dijit/_editor/nls/zh/commands.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/nls/zh/commands",({"bold":"粗体","copy":"复制","cut":"剪切","delete":"删除","indent":"增加缩进","insertHorizontalRule":"水平线","insertOrderedList":"编号列表","insertUnorderedList":"符号列表","italic":"斜体","justifyCenter":"居中","justifyFull":"对齐","justifyLeft":"左对齐","justifyRight":"右对齐","outdent":"减少缩进","paste":"粘贴","redo":"重做","removeFormat":"除去格式","selectAll":"全选","strikethrough":"删除线","subscript":"下标","superscript":"上标","underline":"下划线","undo":"撤销","unlink":"除去链接","createLink":"创建链接","toggleDir":"固定方向","insertImage":"插入图像","insertTable":"插入/编辑表","toggleTableBorder":"切换表边框","deleteTable":"删除表","tableProp":"表属性","htmlToggle":"HTML 源代码","foreColor":"前景色","hiliteColor":"背景色","plainFormatBlock":"段落样式","formatBlock":"段落样式","fontSize":"字体大小","fontName":"字体名称","tabIndent":"制表符缩进","fullScreen":"切换全屏幕","viewSource":"查看 HTML 源代码","print":"打印","newPage":"新建页面","systemShortcut":"只能在浏览器中通过键盘快捷方式执行“${0}”操作。使用 ${1}。"})); \ No newline at end of file
+define("dijit/_editor/nls/zh/commands",({"bold":"粗体","copy":"复制","cut":"剪切","delete":"删除","indent":"缩进","insertHorizontalRule":"水平线","insertOrderedList":"编号列表","insertUnorderedList":"符号列表","italic":"斜体","justifyCenter":"居中","justifyFull":"调整","justifyLeft":"左对齐","justifyRight":"右对齐","outdent":"凸出","paste":"粘贴","redo":"重做","removeFormat":"除去格式","selectAll":"全选","strikethrough":"删除线","subscript":"下标","superscript":"上标","underline":"下划线","undo":"撤销","unlink":"除去链接","createLink":"创建链接","toggleDir":"切换方向","insertImage":"插入图像","insertTable":"插入/编辑表","toggleTableBorder":"切换表格边框","deleteTable":"删除表格","tableProp":"表格属性","htmlToggle":"HTML 源","foreColor":"前景颜色","hiliteColor":"背景颜色","plainFormatBlock":"段落样式","formatBlock":"段落样式","fontSize":"字体大小","fontName":"字体名称","tabIndent":"跳格缩进","fullScreen":"切换全屏幕","viewSource":"查看 HTML 源","print":"打印","newPage":"新建页面","systemShortcut":"只能在浏览器中通过键盘快捷方式执行“${0}”操作。使用 ${1}。","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
diff --git a/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js b/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js
new file mode 100644
index 000000000..d1a567a53
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/zh/commands", ({
+ 'bold': '粗体',
+ 'copy': '复制',
+ 'cut': '剪切',
+ 'delete': '删除',
+ 'indent': '缩进',
+ 'insertHorizontalRule': '水平线',
+ 'insertOrderedList': '编号列表',
+ 'insertUnorderedList': '符号列表',
+ 'italic': '斜体',
+ 'justifyCenter': '居中',
+ 'justifyFull': '调整',
+ 'justifyLeft': '左对齐',
+ 'justifyRight': '右对齐',
+ 'outdent': '凸出',
+ 'paste': '粘贴',
+ 'redo': '重做',
+ 'removeFormat': '除去格式',
+ 'selectAll': '全选',
+ 'strikethrough': '删除线',
+ 'subscript': '下标',
+ 'superscript': '上标',
+ 'underline': '下划线',
+ 'undo': '撤销',
+ 'unlink': '除去链接',
+ 'createLink': '创建链接',
+ 'toggleDir': '切换方向',
+ 'insertImage': '插入图像',
+ 'insertTable': '插入/编辑表',
+ 'toggleTableBorder': '切换表格边框',
+ 'deleteTable': '删除表格',
+ 'tableProp': '表格属性',
+ 'htmlToggle': 'HTML 源',
+ 'foreColor': '前景颜色',
+ 'hiliteColor': '背景颜色',
+ 'plainFormatBlock': '段落样式',
+ 'formatBlock': '段落样式',
+ 'fontSize': '字体大小',
+ 'fontName': '字体名称',
+ 'tabIndent': '跳格缩进',
+ "fullScreen": "切换全屏幕",
+ "viewSource": "查看 HTML 源",
+ "print": "打印",
+ "newPage": "新建页面",
+ /* Error messages */
+ 'systemShortcut': '只能在浏览器中通过键盘快捷方式执行“${0}”操作。使用 ${1}。',
+ 'ctrlKey':'ctrl+${0}',
+ 'appleKey':'\u2318${0}' // "command" or open-apple key on Macintosh
+})
+);
diff --git a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
index 665b4bb7d..20a56fcfa 100644
--- a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
+++ b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/AlwaysShowToolbar",["dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","../_Plugin"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _1("dijit._editor.plugins.AlwaysShowToolbar",_8,{_handleScroll:true,setEditor:function(e){if(!e.iframe){return;}this.editor=e;e.onLoadDeferred.addCallback(_5.hitch(this,this.enable));},enable:function(d){this._updateHeight();this.connect(window,"onscroll","globalOnScrollHandler");this.connect(this.editor,"onNormalizedDisplayChanged","_updateHeight");return d;},_updateHeight:function(){var e=this.editor;if(!e.isLoaded){return;}if(e.height){return;}var _9=_4.getMarginSize(e.editNode).h;if(_6("opera")){_9=e.editNode.scrollHeight;}if(!_9){_9=_4.getMarginSize(e.document.body).h;}if(_9==0){return;}if(_6("ie")<=7&&this.editor.minHeight){var _a=parseInt(this.editor.minHeight);if(_9<_a){_9=_a;}}if(_9!=this._lastHeight){this._lastHeight=_9;_4.setMarginBox(e.iframe,{h:this._lastHeight});}},_lastHeight:0,globalOnScrollHandler:function(){var _b=_6("ie")<7;if(!this._handleScroll){return;}var _c=this.editor.header;if(!this._scrollSetUp){this._scrollSetUp=true;this._scrollThreshold=_4.position(_c,true).y;}var _d=_4.docScroll().y;var s=_c.style;if(_d>this._scrollThreshold&&_d<this._scrollThreshold+this._lastHeight){if(!this._fixEnabled){var _e=_4.getMarginSize(_c);this.editor.iframe.style.marginTop=_e.h+"px";if(_b){s.left=_4.position(_c).x;if(_c.previousSibling){this._IEOriginalPos=["after",_c.previousSibling];}else{if(_c.nextSibling){this._IEOriginalPos=["before",_c.nextSibling];}else{this._IEOriginalPos=["last",_c.parentNode];}}_7.body().appendChild(_c);_2.add(_c,"dijitIEFixedToolbar");}else{s.position="fixed";s.top="0px";}_4.setMarginBox(_c,{w:_e.w});s.zIndex=2000;this._fixEnabled=true;}var _f=(this.height)?parseInt(this.editor.height):this.editor._lastHeight;s.display=(_d>this._scrollThreshold+_f)?"none":"";}else{if(this._fixEnabled){this.editor.iframe.style.marginTop="";s.position="";s.top="";s.zIndex="";s.display="";if(_b){s.left="";_2.remove(_c,"dijitIEFixedToolbar");if(this._IEOriginalPos){_3.place(_c,this._IEOriginalPos[1],this._IEOriginalPos[0]);this._IEOriginalPos=null;}else{_3.place(_c,this.editor.iframe,"before");}}s.width="";this._fixEnabled=false;}}},destroy:function(){this._IEOriginalPos=null;this._handleScroll=false;this.inherited(arguments);if(_6("ie")<7){_2.remove(this.editor.header,"dijitIEFixedToolbar");}}});}); \ No newline at end of file
+define("dijit/_editor/plugins/AlwaysShowToolbar",["dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/lang","dojo/sniff","dojo/_base/window","../_Plugin"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _1("dijit._editor.plugins.AlwaysShowToolbar",_8,{_handleScroll:true,setEditor:function(e){if(!e.iframe){return;}this.editor=e;e.onLoadDeferred.then(_5.hitch(this,this.enable));},enable:function(d){this._updateHeight();this.connect(window,"onscroll","globalOnScrollHandler");this.connect(this.editor,"onNormalizedDisplayChanged","_updateHeight");return d;},_updateHeight:function(){var e=this.editor;if(!e.isLoaded){return;}if(e.height){return;}var _9=_4.getMarginSize(e.editNode).h;if(_6("opera")){_9=e.editNode.scrollHeight;}if(!_9){_9=_4.getMarginSize(e.document.body).h;}if(_9==0){return;}if(_6("ie")<=7&&this.editor.minHeight){var _a=parseInt(this.editor.minHeight);if(_9<_a){_9=_a;}}if(_9!=this._lastHeight){this._lastHeight=_9;_4.setMarginBox(e.iframe,{h:this._lastHeight});}},_lastHeight:0,globalOnScrollHandler:function(){var _b=_6("ie")<7;if(!this._handleScroll){return;}var _c=this.editor.header;if(!this._scrollSetUp){this._scrollSetUp=true;this._scrollThreshold=_4.position(_c,true).y;}var _d=_4.docScroll(this.editor.ownerDocument).y;var s=_c.style;if(_d>this._scrollThreshold&&_d<this._scrollThreshold+this._lastHeight){if(!this._fixEnabled){var _e=_4.getMarginSize(_c);this.editor.iframe.style.marginTop=_e.h+"px";if(_b){s.left=_4.position(_c).x;if(_c.previousSibling){this._IEOriginalPos=["after",_c.previousSibling];}else{if(_c.nextSibling){this._IEOriginalPos=["before",_c.nextSibling];}else{this._IEOriginalPos=["last",_c.parentNode];}}this.editor.ownerDocumentBody.appendChild(_c);_2.add(_c,"dijitIEFixedToolbar");}else{s.position="fixed";s.top="0px";}_4.setMarginBox(_c,{w:_e.w});s.zIndex=2000;this._fixEnabled=true;}var _f=(this.height)?parseInt(this.editor.height):this.editor._lastHeight;s.display=(_d>this._scrollThreshold+_f)?"none":"";}else{if(this._fixEnabled){this.editor.iframe.style.marginTop="";s.position="";s.top="";s.zIndex="";s.display="";if(_b){s.left="";_2.remove(_c,"dijitIEFixedToolbar");if(this._IEOriginalPos){_3.place(_c,this._IEOriginalPos[1],this._IEOriginalPos[0]);this._IEOriginalPos=null;}else{_3.place(_c,this.editor.iframe,"before");}}s.width="";this._fixEnabled=false;}}},destroy:function(){this._IEOriginalPos=null;this._handleScroll=false;this.inherited(arguments);if(_6("ie")<7){_2.remove(this.editor.header,"dijitIEFixedToolbar");}}});}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js
new file mode 100644
index 000000000..1f2b7a4e2
--- /dev/null
+++ b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js
@@ -0,0 +1,191 @@
+define("dijit/_editor/plugins/AlwaysShowToolbar", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-construct", // domConstruct.place
+ "dojo/dom-geometry",
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("ie") has("opera")
+ "dojo/_base/window", // win.body
+ "../_Plugin"
+], function(declare, domClass, domConstruct, domGeometry, lang, has, win, _Plugin){
+
+// module:
+// dijit/_editor/plugins/AlwaysShowToolbar
+
+return declare("dijit._editor.plugins.AlwaysShowToolbar", _Plugin, {
+ // summary:
+ // This plugin is required for Editors in auto-expand mode.
+ // It handles the auto-expansion as the user adds/deletes text,
+ // and keeps the editor's toolbar visible even when the top of the editor
+ // has scrolled off the top of the viewport (usually when editing a long
+ // document).
+ // description:
+ // Specify this in extraPlugins (or plugins) parameter and also set
+ // height to "".
+ // example:
+ // | <script type="dojo/require">
+ // | AlwaysShowToolbar: "dijit/_editor/plugins/AlwaysShowToolbar"
+ // | </script>
+ // | <div data-dojo-type="dijit/Editor" height=""
+ // | data-dojo-props="extraPlugins: [AlwaysShowToolbar]">
+
+ // _handleScroll: Boolean
+ // Enables/disables the handler for scroll events
+ _handleScroll: true,
+
+ setEditor: function(e){
+ // Overrides _Plugin.setEditor().
+ if(!e.iframe){
+ console.log('Port AlwaysShowToolbar plugin to work with Editor without iframe');
+ return;
+ }
+
+ this.editor = e;
+
+ e.onLoadDeferred.then(lang.hitch(this, this.enable));
+ },
+
+ enable: function(d){
+ // summary:
+ // Enable plugin. Called when Editor has finished initializing.
+ // tags:
+ // private
+
+ this._updateHeight();
+ this.connect(window, 'onscroll', "globalOnScrollHandler");
+ this.connect(this.editor, 'onNormalizedDisplayChanged', "_updateHeight");
+ return d;
+ },
+
+ _updateHeight: function(){
+ // summary:
+ // Updates the height of the editor area to fit the contents.
+ var e = this.editor;
+ if(!e.isLoaded){ return; }
+ if(e.height){ return; }
+
+ var height = domGeometry.getMarginSize(e.editNode).h;
+ if(has("opera")){
+ height = e.editNode.scrollHeight;
+ }
+ // console.debug('height',height);
+ // alert(this.editNode);
+
+ //height maybe zero in some cases even though the content is not empty,
+ //we try the height of body instead
+ if(!height){
+ height = domGeometry.getMarginSize(e.document.body).h;
+ }
+
+ if(height == 0){
+ console.debug("Can not figure out the height of the editing area!");
+ return; //prevent setting height to 0
+ }
+ if(has("ie") <= 7 && this.editor.minHeight){
+ var min = parseInt(this.editor.minHeight);
+ if(height < min){ height = min; }
+ }
+ if(height != this._lastHeight){
+ this._lastHeight = height;
+ // this.editorObject.style.height = this._lastHeight + "px";
+ domGeometry.setMarginBox(e.iframe, { h: this._lastHeight });
+ }
+ },
+
+ // _lastHeight: Integer
+ // Height in px of the editor at the last time we did sizing
+ _lastHeight: 0,
+
+ globalOnScrollHandler: function(){
+ // summary:
+ // Handler for scroll events that bubbled up to `<html>`
+ // tags:
+ // private
+
+ var isIE6 = has("ie") < 7;
+ if(!this._handleScroll){ return; }
+ var tdn = this.editor.header;
+ if(!this._scrollSetUp){
+ this._scrollSetUp = true;
+ this._scrollThreshold = domGeometry.position(tdn, true).y;
+// var db = win.body;
+// console.log("threshold:", this._scrollThreshold);
+ //what's this for?? comment out for now
+// if((isIE6)&&(db)&&(domStyle.set or get TODO(db, "backgroundIimage")=="none")){
+// db.style.backgroundImage = "url(" + dojo.uri.moduleUri("dijit", "templates/blank.gif") + ")";
+// db.style.backgroundAttachment = "fixed";
+// }
+ }
+
+ var scrollPos = domGeometry.docScroll(this.editor.ownerDocument).y;
+ var s = tdn.style;
+
+ if(scrollPos > this._scrollThreshold && scrollPos < this._scrollThreshold+this._lastHeight){
+ // dojo.debug(scrollPos);
+ if(!this._fixEnabled){
+ var tdnbox = domGeometry.getMarginSize(tdn);
+ this.editor.iframe.style.marginTop = tdnbox.h+"px";
+
+ if(isIE6){
+ s.left = domGeometry.position(tdn).x;
+ if(tdn.previousSibling){
+ this._IEOriginalPos = ['after',tdn.previousSibling];
+ }else if(tdn.nextSibling){
+ this._IEOriginalPos = ['before',tdn.nextSibling];
+ }else{
+ this._IEOriginalPos = ['last',tdn.parentNode];
+ }
+ this.editor.ownerDocumentBody.appendChild(tdn);
+ domClass.add(tdn,'dijitIEFixedToolbar');
+ }else{
+ s.position = "fixed";
+ s.top = "0px";
+ }
+
+ domGeometry.setMarginBox(tdn, { w: tdnbox.w });
+ s.zIndex = 2000;
+ this._fixEnabled = true;
+ }
+ // if we're showing the floating toolbar, make sure that if
+ // we've scrolled past the bottom of the editor that we hide
+ // the toolbar for this instance of the editor.
+
+ // TODO: when we get multiple editor toolbar support working
+ // correctly, ensure that we check this against the scroll
+ // position of the bottom-most editor instance.
+ var eHeight = (this.height) ? parseInt(this.editor.height) : this.editor._lastHeight;
+ s.display = (scrollPos > this._scrollThreshold+eHeight) ? "none" : "";
+ }else if(this._fixEnabled){
+ this.editor.iframe.style.marginTop = '';
+ s.position = "";
+ s.top = "";
+ s.zIndex = "";
+ s.display = "";
+ if(isIE6){
+ s.left = "";
+ domClass.remove(tdn,'dijitIEFixedToolbar');
+ if(this._IEOriginalPos){
+ domConstruct.place(tdn, this._IEOriginalPos[1], this._IEOriginalPos[0]);
+ this._IEOriginalPos = null;
+ }else{
+ domConstruct.place(tdn, this.editor.iframe, 'before');
+ }
+ }
+ s.width = "";
+ this._fixEnabled = false;
+ }
+ },
+
+ destroy: function(){
+ // Overrides _Plugin.destroy(). TODO: call this.inherited() rather than repeating code.
+ this._IEOriginalPos = null;
+ this._handleScroll = false;
+ this.inherited(arguments);
+
+ if(has("ie") < 7){
+ domClass.remove(this.editor.header, 'dijitIEFixedToolbar');
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/_editor/plugins/EnterKeyHandling.js b/lib/dijit/_editor/plugins/EnterKeyHandling.js
index 60b3baa8a..6d226232c 100644
--- a/lib/dijit/_editor/plugins/EnterKeyHandling.js
+++ b/lib/dijit/_editor/plugins/EnterKeyHandling.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/EnterKeyHandling",["dojo/_base/declare","dojo/dom-construct","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","dojo/window","../_Plugin","../RichText","../range","../selection"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){return _1("dijit._editor.plugins.EnterKeyHandling",_9,{blockNodeForEnter:"BR",constructor:function(_d){if(_d){if("blockNodeForEnter" in _d){_d.blockNodeForEnter=_d.blockNodeForEnter.toUpperCase();}_5.mixin(this,_d);}},setEditor:function(_e){if(this.editor===_e){return;}this.editor=_e;if(this.blockNodeForEnter=="BR"){this.editor.customUndo=true;_e.onLoadDeferred.then(_5.hitch(this,function(d){this.connect(_e.document,"onkeypress",function(e){if(e.charOrCode==_4.ENTER){var ne=_5.mixin({},e);ne.shiftKey=true;if(!this.handleEnterKey(ne)){_3.stop(e);}}});if(_6("ie")==9){this.connect(_e.document,"onpaste",function(e){setTimeout(dojo.hitch(this,function(){var r=this.editor.document.selection.createRange();r.move("character",-1);r.select();r.move("character",1);r.select();}),0);});}return d;}));}else{if(this.blockNodeForEnter){var h=_5.hitch(this,this.handleEnterKey);_e.addKeyHandler(13,0,0,h);_e.addKeyHandler(13,0,1,h);this.connect(this.editor,"onKeyPressed","onKeyPressed");}}},onKeyPressed:function(){if(this._checkListLater){if(_7.withGlobal(this.editor.window,"isCollapsed",dijit)){var _f=_7.withGlobal(this.editor.window,"getAncestorElement",_c,["LI"]);if(!_f){_a.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);var _10=_7.withGlobal(this.editor.window,"getAncestorElement",_c,[this.blockNodeForEnter]);if(_10){_10.innerHTML=this.bogusHtmlContent;if(_6("ie")){var r=this.editor.document.selection.createRange();r.move("character",-1);r.select();}}else{console.error("onKeyPressed: Cannot find the new block node");}}else{if(_6("mozilla")){if(_f.parentNode.parentNode.nodeName=="LI"){_f=_f.parentNode.parentNode;}}var fc=_f.firstChild;if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){_f.insertBefore(fc.ownerDocument.createTextNode(" "),fc);var _11=_b.create(this.editor.window);_11.setStart(_f.firstChild,0);var _12=_b.getSelection(this.editor.window,true);_12.removeAllRanges();_12.addRange(_11);}}}this._checkListLater=false;}if(this._pressedEnterInBlock){if(this._pressedEnterInBlock.previousSibling){this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);}delete this._pressedEnterInBlock;}},bogusHtmlContent:"&#160;",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){var _13,_14,_15,_16,_17,_18,doc=this.editor.document,br,rs,txt;if(e.shiftKey){var _19=_7.withGlobal(this.editor.window,"getParentElement",_c);var _1a=_b.getAncestor(_19,this.blockNodes);if(_1a){if(_1a.tagName=="LI"){return true;}_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);if(!_14.collapsed){_14.deleteContents();_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}if(_b.atBeginningOfContainer(_1a,_14.startContainer,_14.startOffset)){br=doc.createElement("br");_15=_b.create(this.editor.window);_1a.insertBefore(br,_1a.firstChild);_15.setStartAfter(br);_13.removeAllRanges();_13.addRange(_15);}else{if(_b.atEndOfContainer(_1a,_14.startContainer,_14.startOffset)){_15=_b.create(this.editor.window);br=doc.createElement("br");_1a.appendChild(br);_1a.appendChild(doc.createTextNode(" "));_15.setStart(_1a.lastChild,0);_13.removeAllRanges();_13.addRange(_15);}else{rs=_14.startContainer;if(rs&&rs.nodeType==3){txt=rs.nodeValue;_7.withGlobal(this.editor.window,function(){_16=doc.createTextNode(txt.substring(0,_14.startOffset));_17=doc.createTextNode(txt.substring(_14.startOffset));_18=doc.createElement("br");if(_17.nodeValue==""&&_6("webkit")){_17=doc.createTextNode(" ");}_2.place(_16,rs,"after");_2.place(_18,_16,"after");_2.place(_17,_18,"after");_2.destroy(rs);_15=_b.create();_15.setStart(_17,0);_13.removeAllRanges();_13.addRange(_15);});return false;}return true;}}}else{_13=_b.getSelection(this.editor.window);if(_13.rangeCount){_14=_13.getRangeAt(0);if(_14&&_14.startContainer){if(!_14.collapsed){_14.deleteContents();_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}rs=_14.startContainer;if(rs&&rs.nodeType==3){_7.withGlobal(this.editor.window,_5.hitch(this,function(){var _1b=false;var _1c=_14.startOffset;if(rs.length<_1c){ret=this._adjustNodeAndOffset(rs,_1c);rs=ret.node;_1c=ret.offset;}txt=rs.nodeValue;_16=doc.createTextNode(txt.substring(0,_1c));_17=doc.createTextNode(txt.substring(_1c));_18=doc.createElement("br");if(!_17.length){_17=doc.createTextNode(" ");_1b=true;}if(_16.length){_2.place(_16,rs,"after");}else{_16=rs;}_2.place(_18,_16,"after");_2.place(_17,_18,"after");_2.destroy(rs);_15=_b.create();_15.setStart(_17,0);_15.setEnd(_17,_17.length);_13.removeAllRanges();_13.addRange(_15);if(_1b&&!_6("webkit")){_c.remove();}else{_c.collapse(true);}}));}else{var _1d;if(_14.startOffset>=0){_1d=rs.childNodes[_14.startOffset];}_7.withGlobal(this.editor.window,_5.hitch(this,function(){var _1e=doc.createElement("br");var _1f=doc.createTextNode(" ");if(!_1d){rs.appendChild(_1e);rs.appendChild(_1f);}else{_2.place(_1e,_1d,"before");_2.place(_1f,_1e,"after");}_15=_b.create(_7.global);_15.setStart(_1f,0);_15.setEnd(_1f,_1f.length);_13.removeAllRanges();_13.addRange(_15);_c.collapse(true);}));}}}else{_a.prototype.execCommand.call(this.editor,"inserthtml","<br>");}}return false;}var _20=true;_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);if(!_14.collapsed){_14.deleteContents();_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}var _21=_b.getBlockAncestor(_14.endContainer,null,this.editor.editNode);var _22=_21.blockNode;if((this._checkListLater=(_22&&(_22.nodeName=="LI"||_22.parentNode.nodeName=="LI")))){if(_6("mozilla")){this._pressedEnterInBlock=_22;}if(/^(\s|&nbsp;|&#160;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|&#160;|\xA0)<\/span>)?(<br>)?$/.test(_22.innerHTML)){_22.innerHTML="";if(_6("webkit")){_15=_b.create(this.editor.window);_15.setStart(_22,0);_13.removeAllRanges();_13.addRange(_15);}this._checkListLater=false;}return true;}if(!_21.blockNode||_21.blockNode===this.editor.editNode){try{_a.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);}catch(e2){}_21={blockNode:_7.withGlobal(this.editor.window,"getAncestorElement",_c,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};if(_21.blockNode){if(_21.blockNode!=this.editor.editNode&&(!(_21.blockNode.textContent||_21.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){this.removeTrailingBr(_21.blockNode);return false;}}else{_21.blockNode=this.editor.editNode;}_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}var _23=doc.createElement(this.blockNodeForEnter);_23.innerHTML=this.bogusHtmlContent;this.removeTrailingBr(_21.blockNode);var _24=_14.endOffset;var _25=_14.endContainer;if(_25.length<_24){var ret=this._adjustNodeAndOffset(_25,_24);_25=ret.node;_24=ret.offset;}if(_b.atEndOfContainer(_21.blockNode,_25,_24)){if(_21.blockNode===_21.blockContainer){_21.blockNode.appendChild(_23);}else{_2.place(_23,_21.blockNode,"after");}_20=false;_15=_b.create(this.editor.window);_15.setStart(_23,0);_13.removeAllRanges();_13.addRange(_15);if(this.editor.height){_8.scrollIntoView(_23);}}else{if(_b.atBeginningOfContainer(_21.blockNode,_14.startContainer,_14.startOffset)){_2.place(_23,_21.blockNode,_21.blockNode===_21.blockContainer?"first":"before");if(_23.nextSibling&&this.editor.height){_15=_b.create(this.editor.window);_15.setStart(_23.nextSibling,0);_13.removeAllRanges();_13.addRange(_15);_8.scrollIntoView(_23.nextSibling);}_20=false;}else{if(_21.blockNode===_21.blockContainer){_21.blockNode.appendChild(_23);}else{_2.place(_23,_21.blockNode,"after");}_20=false;if(_21.blockNode.style){if(_23.style){if(_21.blockNode.style.cssText){_23.style.cssText=_21.blockNode.style.cssText;}}}rs=_14.startContainer;var _26;if(rs&&rs.nodeType==3){var _27,_28;_24=_14.endOffset;if(rs.length<_24){ret=this._adjustNodeAndOffset(rs,_24);rs=ret.node;_24=ret.offset;}txt=rs.nodeValue;_16=doc.createTextNode(txt.substring(0,_24));_17=doc.createTextNode(txt.substring(_24,txt.length));_2.place(_16,rs,"before");_2.place(_17,rs,"after");_2.destroy(rs);var _29=_16.parentNode;while(_29!==_21.blockNode){var tg=_29.tagName;var _2a=doc.createElement(tg);if(_29.style){if(_2a.style){if(_29.style.cssText){_2a.style.cssText=_29.style.cssText;}}}if(_29.tagName==="FONT"){if(_29.color){_2a.color=_29.color;}if(_29.face){_2a.face=_29.face;}if(_29.size){_2a.size=_29.size;}}_27=_17;while(_27){_28=_27.nextSibling;_2a.appendChild(_27);_27=_28;}_2.place(_2a,_29,"after");_16=_29;_17=_2a;_29=_29.parentNode;}_27=_17;if(_27.nodeType==1||(_27.nodeType==3&&_27.nodeValue)){_23.innerHTML="";}_26=_27;while(_27){_28=_27.nextSibling;_23.appendChild(_27);_27=_28;}}_15=_b.create(this.editor.window);var _2b;var _2c=_26;if(this.blockNodeForEnter!=="BR"){while(_2c){_2b=_2c;_28=_2c.firstChild;_2c=_28;}if(_2b&&_2b.parentNode){_23=_2b.parentNode;_15.setStart(_23,0);_13.removeAllRanges();_13.addRange(_15);if(this.editor.height){_8.scrollIntoView(_23);}if(_6("mozilla")){this._pressedEnterInBlock=_21.blockNode;}}else{_20=true;}}else{_15.setStart(_23,0);_13.removeAllRanges();_13.addRange(_15);if(this.editor.height){_8.scrollIntoView(_23);}if(_6("mozilla")){this._pressedEnterInBlock=_21.blockNode;}}}}return _20;},_adjustNodeAndOffset:function(_2d,_2e){while(_2d.length<_2e&&_2d.nextSibling&&_2d.nextSibling.nodeType==3){_2e=_2e-_2d.length;_2d=_2d.nextSibling;}return {"node":_2d,"offset":_2e};},removeTrailingBr:function(_2f){var _30=/P|DIV|LI/i.test(_2f.tagName)?_2f:_c.getParentOfType(_2f,["P","DIV","LI"]);if(!_30){return;}if(_30.lastChild){if((_30.childNodes.length>1&&_30.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_30.lastChild.nodeValue))||_30.lastChild.tagName=="BR"){_2.destroy(_30.lastChild);}}if(!_30.childNodes.length){_30.innerHTML=this.bogusHtmlContent;}}});}); \ No newline at end of file
+define("dijit/_editor/plugins/EnterKeyHandling",["dojo/_base/declare","dojo/dom-construct","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/_base/window","dojo/window","../_Plugin","../RichText","../range","../../_base/focus"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){return _1("dijit._editor.plugins.EnterKeyHandling",_9,{blockNodeForEnter:"BR",constructor:function(_d){if(_d){if("blockNodeForEnter" in _d){_d.blockNodeForEnter=_d.blockNodeForEnter.toUpperCase();}_5.mixin(this,_d);}},setEditor:function(_e){if(this.editor===_e){return;}this.editor=_e;if(this.blockNodeForEnter=="BR"){this.editor.customUndo=true;_e.onLoadDeferred.then(_5.hitch(this,function(d){this.connect(_e.document,"onkeypress",function(e){if(e.charOrCode==_4.ENTER){var ne=_5.mixin({},e);ne.shiftKey=true;if(!this.handleEnterKey(ne)){_3.stop(e);}}});if(_6("ie")>=9){this.connect(_e.document,"onpaste",function(e){setTimeout(dojo.hitch(this,function(){var r=this.editor.document.selection.createRange();r.move("character",-1);r.select();r.move("character",1);r.select();}),0);});}return d;}));}else{if(this.blockNodeForEnter){var h=_5.hitch(this,this.handleEnterKey);_e.addKeyHandler(13,0,0,h);_e.addKeyHandler(13,0,1,h);this.connect(this.editor,"onKeyPressed","onKeyPressed");}}},onKeyPressed:function(){if(this._checkListLater){if(_7.withGlobal(this.editor.window,"isCollapsed",_c)){var _f=this.editor._sCall("getAncestorElement",["LI"]);if(!_f){_a.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);var _10=this.editor._sCall("getAncestorElement",[this.blockNodeForEnter]);if(_10){_10.innerHTML=this.bogusHtmlContent;if(_6("ie")<=9){var r=this.editor.document.selection.createRange();r.move("character",-1);r.select();}}else{console.error("onKeyPressed: Cannot find the new block node");}}else{if(_6("mozilla")){if(_f.parentNode.parentNode.nodeName=="LI"){_f=_f.parentNode.parentNode;}}var fc=_f.firstChild;if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){_f.insertBefore(fc.ownerDocument.createTextNode(" "),fc);var _11=_b.create(this.editor.window);_11.setStart(_f.firstChild,0);var _12=_b.getSelection(this.editor.window,true);_12.removeAllRanges();_12.addRange(_11);}}}this._checkListLater=false;}if(this._pressedEnterInBlock){if(this._pressedEnterInBlock.previousSibling){this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);}delete this._pressedEnterInBlock;}},bogusHtmlContent:"&#160;",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){var _13,_14,_15,_16,_17,_18,doc=this.editor.document,br,rs,txt;if(e.shiftKey){var _19=this.editor._sCall("getParentElement",[]);var _1a=_b.getAncestor(_19,this.blockNodes);if(_1a){if(_1a.tagName=="LI"){return true;}_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);if(!_14.collapsed){_14.deleteContents();_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}if(_b.atBeginningOfContainer(_1a,_14.startContainer,_14.startOffset)){br=doc.createElement("br");_15=_b.create(this.editor.window);_1a.insertBefore(br,_1a.firstChild);_15.setStartAfter(br);_13.removeAllRanges();_13.addRange(_15);}else{if(_b.atEndOfContainer(_1a,_14.startContainer,_14.startOffset)){_15=_b.create(this.editor.window);br=doc.createElement("br");_1a.appendChild(br);_1a.appendChild(doc.createTextNode(" "));_15.setStart(_1a.lastChild,0);_13.removeAllRanges();_13.addRange(_15);}else{rs=_14.startContainer;if(rs&&rs.nodeType==3){txt=rs.nodeValue;_16=doc.createTextNode(txt.substring(0,_14.startOffset));_17=doc.createTextNode(txt.substring(_14.startOffset));_18=doc.createElement("br");if(_17.nodeValue==""&&_6("webkit")){_17=doc.createTextNode(" ");}_2.place(_16,rs,"after");_2.place(_18,_16,"after");_2.place(_17,_18,"after");_2.destroy(rs);_15=_b.create(this.editor.window);_15.setStart(_17,0);_13.removeAllRanges();_13.addRange(_15);return false;}return true;}}}else{_13=_b.getSelection(this.editor.window);if(_13.rangeCount){_14=_13.getRangeAt(0);if(_14&&_14.startContainer){if(!_14.collapsed){_14.deleteContents();_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}rs=_14.startContainer;if(rs&&rs.nodeType==3){var _1b=false;var _1c=_14.startOffset;if(rs.length<_1c){ret=this._adjustNodeAndOffset(rs,_1c);rs=ret.node;_1c=ret.offset;}txt=rs.nodeValue;_16=doc.createTextNode(txt.substring(0,_1c));_17=doc.createTextNode(txt.substring(_1c));_18=doc.createElement("br");if(!_17.length){_17=doc.createTextNode(" ");_1b=true;}if(_16.length){_2.place(_16,rs,"after");}else{_16=rs;}_2.place(_18,_16,"after");_2.place(_17,_18,"after");_2.destroy(rs);_15=_b.create(this.editor.window);_15.setStart(_17,0);_15.setEnd(_17,_17.length);_13.removeAllRanges();_13.addRange(_15);if(_1b&&!_6("webkit")){this.editor._sCall("remove",[]);}else{this.editor._sCall("collapse",[true]);}}else{var _1d;if(_14.startOffset>=0){_1d=rs.childNodes[_14.startOffset];}var _18=doc.createElement("br");var _17=doc.createTextNode(" ");if(!_1d){rs.appendChild(_18);rs.appendChild(_17);}else{_2.place(_18,_1d,"before");_2.place(_17,_18,"after");}_15=_b.create(this.editor.window);_15.setStart(_17,0);_15.setEnd(_17,_17.length);_13.removeAllRanges();_13.addRange(_15);this.editor._sCall("collapse",[true]);}}}else{_a.prototype.execCommand.call(this.editor,"inserthtml","<br>");}}return false;}var _1e=true;_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);if(!_14.collapsed){_14.deleteContents();_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}var _1f=_b.getBlockAncestor(_14.endContainer,null,this.editor.editNode);var _20=_1f.blockNode;if((this._checkListLater=(_20&&(_20.nodeName=="LI"||_20.parentNode.nodeName=="LI")))){if(_6("mozilla")){this._pressedEnterInBlock=_20;}if(/^(\s|&nbsp;|&#160;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|&#160;|\xA0)<\/span>)?(<br>)?$/.test(_20.innerHTML)){_20.innerHTML="";if(_6("webkit")){_15=_b.create(this.editor.window);_15.setStart(_20,0);_13.removeAllRanges();_13.addRange(_15);}this._checkListLater=false;}return true;}if(!_1f.blockNode||_1f.blockNode===this.editor.editNode){try{_a.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);}catch(e2){}_1f={blockNode:this.editor._sCall("getAncestorElement",[this.blockNodeForEnter]),blockContainer:this.editor.editNode};if(_1f.blockNode){if(_1f.blockNode!=this.editor.editNode&&(!(_1f.blockNode.textContent||_1f.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){this.removeTrailingBr(_1f.blockNode);return false;}}else{_1f.blockNode=this.editor.editNode;}_13=_b.getSelection(this.editor.window);_14=_13.getRangeAt(0);}var _21=doc.createElement(this.blockNodeForEnter);_21.innerHTML=this.bogusHtmlContent;this.removeTrailingBr(_1f.blockNode);var _22=_14.endOffset;var _23=_14.endContainer;if(_23.length<_22){var ret=this._adjustNodeAndOffset(_23,_22);_23=ret.node;_22=ret.offset;}if(_b.atEndOfContainer(_1f.blockNode,_23,_22)){if(_1f.blockNode===_1f.blockContainer){_1f.blockNode.appendChild(_21);}else{_2.place(_21,_1f.blockNode,"after");}_1e=false;_15=_b.create(this.editor.window);_15.setStart(_21,0);_13.removeAllRanges();_13.addRange(_15);if(this.editor.height){_8.scrollIntoView(_21);}}else{if(_b.atBeginningOfContainer(_1f.blockNode,_14.startContainer,_14.startOffset)){_2.place(_21,_1f.blockNode,_1f.blockNode===_1f.blockContainer?"first":"before");if(_21.nextSibling&&this.editor.height){_15=_b.create(this.editor.window);_15.setStart(_21.nextSibling,0);_13.removeAllRanges();_13.addRange(_15);_8.scrollIntoView(_21.nextSibling);}_1e=false;}else{if(_1f.blockNode===_1f.blockContainer){_1f.blockNode.appendChild(_21);}else{_2.place(_21,_1f.blockNode,"after");}_1e=false;if(_1f.blockNode.style){if(_21.style){if(_1f.blockNode.style.cssText){_21.style.cssText=_1f.blockNode.style.cssText;}}}rs=_14.startContainer;var _24;if(rs&&rs.nodeType==3){var _25,_26;_22=_14.endOffset;if(rs.length<_22){ret=this._adjustNodeAndOffset(rs,_22);rs=ret.node;_22=ret.offset;}txt=rs.nodeValue;_16=doc.createTextNode(txt.substring(0,_22));_17=doc.createTextNode(txt.substring(_22,txt.length));_2.place(_16,rs,"before");_2.place(_17,rs,"after");_2.destroy(rs);var _27=_16.parentNode;while(_27!==_1f.blockNode){var tg=_27.tagName;var _28=doc.createElement(tg);if(_27.style){if(_28.style){if(_27.style.cssText){_28.style.cssText=_27.style.cssText;}}}if(_27.tagName==="FONT"){if(_27.color){_28.color=_27.color;}if(_27.face){_28.face=_27.face;}if(_27.size){_28.size=_27.size;}}_25=_17;while(_25){_26=_25.nextSibling;_28.appendChild(_25);_25=_26;}_2.place(_28,_27,"after");_16=_27;_17=_28;_27=_27.parentNode;}_25=_17;if(_25.nodeType==1||(_25.nodeType==3&&_25.nodeValue)){_21.innerHTML="";}_24=_25;while(_25){_26=_25.nextSibling;_21.appendChild(_25);_25=_26;}}_15=_b.create(this.editor.window);var _29;var _2a=_24;if(this.blockNodeForEnter!=="BR"){while(_2a){_29=_2a;_26=_2a.firstChild;_2a=_26;}if(_29&&_29.parentNode){_21=_29.parentNode;_15.setStart(_21,0);_13.removeAllRanges();_13.addRange(_15);if(this.editor.height){_8.scrollIntoView(_21);}if(_6("mozilla")){this._pressedEnterInBlock=_1f.blockNode;}}else{_1e=true;}}else{_15.setStart(_21,0);_13.removeAllRanges();_13.addRange(_15);if(this.editor.height){_8.scrollIntoView(_21);}if(_6("mozilla")){this._pressedEnterInBlock=_1f.blockNode;}}}}return _1e;},_adjustNodeAndOffset:function(_2b,_2c){while(_2b.length<_2c&&_2b.nextSibling&&_2b.nextSibling.nodeType==3){_2c=_2c-_2b.length;_2b=_2b.nextSibling;}return {"node":_2b,"offset":_2c};},removeTrailingBr:function(_2d){var _2e=/P|DIV|LI/i.test(_2d.tagName)?_2d:this.editor._sCall("getParentOfType",[_2d,["P","DIV","LI"]]);if(!_2e){return;}if(_2e.lastChild){if((_2e.childNodes.length>1&&_2e.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_2e.lastChild.nodeValue))||_2e.lastChild.tagName=="BR"){_2.destroy(_2e.lastChild);}}if(!_2e.childNodes.length){_2e.innerHTML=this.bogusHtmlContent;}}});}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js b/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js
new file mode 100644
index 000000000..e5c7b7466
--- /dev/null
+++ b/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js
@@ -0,0 +1,622 @@
+define("dijit/_editor/plugins/EnterKeyHandling", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.destroy domConstruct.place
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys.ENTER
+ "dojo/_base/lang",
+ "dojo/sniff", // has("ie") has("mozilla") has("webkit")
+ "dojo/_base/window", // win.withGlobal
+ "dojo/window", // winUtils.scrollIntoView
+ "../_Plugin",
+ "../RichText",
+ "../range",
+ "../../_base/focus"
+], function(declare, domConstruct, event, keys, lang, has, win, winUtils, _Plugin, RichText, rangeapi, baseFocus){
+
+// module:
+// dijit/_editor/plugins/EnterKeyHandling
+
+return declare("dijit._editor.plugins.EnterKeyHandling", _Plugin, {
+ // summary:
+ // This plugin tries to make all browsers behave consistently with regard to
+ // how ENTER behaves in the editor window. It traps the ENTER key and alters
+ // the way DOM is constructed in certain cases to try to commonize the generated
+ // DOM and behaviors across browsers.
+ //
+ // description:
+ // This plugin has three modes:
+ //
+ // - blockNodeForEnter=BR
+ // - blockNodeForEnter=DIV
+ // - blockNodeForEnter=P
+ //
+ // In blockNodeForEnter=P, the ENTER key starts a new
+ // paragraph, and shift-ENTER starts a new line in the current paragraph.
+ // For example, the input:
+ //
+ // | first paragraph <shift-ENTER>
+ // | second line of first paragraph <ENTER>
+ // | second paragraph
+ //
+ // will generate:
+ //
+ // | <p>
+ // | first paragraph
+ // | <br/>
+ // | second line of first paragraph
+ // | </p>
+ // | <p>
+ // | second paragraph
+ // | </p>
+ //
+ // In BR and DIV mode, the ENTER key conceptually goes to a new line in the
+ // current paragraph, and users conceptually create a new paragraph by pressing ENTER twice.
+ // For example, if the user enters text into an editor like this:
+ //
+ // | one <ENTER>
+ // | two <ENTER>
+ // | three <ENTER>
+ // | <ENTER>
+ // | four <ENTER>
+ // | five <ENTER>
+ // | six <ENTER>
+ //
+ // It will appear on the screen as two 'paragraphs' of three lines each. Markupwise, this generates:
+ //
+ // BR:
+ // | one<br/>
+ // | two<br/>
+ // | three<br/>
+ // | <br/>
+ // | four<br/>
+ // | five<br/>
+ // | six<br/>
+ //
+ // DIV:
+ // | <div>one</div>
+ // | <div>two</div>
+ // | <div>three</div>
+ // | <div>&nbsp;</div>
+ // | <div>four</div>
+ // | <div>five</div>
+ // | <div>six</div>
+
+ // blockNodeForEnter: String
+ // This property decides the behavior of Enter key. It can be either P,
+ // DIV, BR, or empty (which means disable this feature). Anything else
+ // will trigger errors. The default is 'BR'
+ //
+ // See class description for more details.
+ blockNodeForEnter: 'BR',
+
+ constructor: function(args){
+ if(args){
+ if("blockNodeForEnter" in args){
+ args.blockNodeForEnter = args.blockNodeForEnter.toUpperCase();
+ }
+ lang.mixin(this,args);
+ }
+ },
+
+ setEditor: function(editor){
+ // Overrides _Plugin.setEditor().
+ if(this.editor === editor){ return; }
+ this.editor = editor;
+ if(this.blockNodeForEnter == 'BR'){
+ // While Moz has a mode tht mostly works, it's still a little different,
+ // So, try to just have a common mode and be consistent. Which means
+ // we need to enable customUndo, if not already enabled.
+ this.editor.customUndo = true;
+ editor.onLoadDeferred.then(lang.hitch(this,function(d){
+ this.connect(editor.document, "onkeypress", function(e){
+ if(e.charOrCode == keys.ENTER){
+ // Just do it manually. The handleEnterKey has a shift mode that
+ // Always acts like <br>, so just use it.
+ var ne = lang.mixin({},e);
+ ne.shiftKey = true;
+ if(!this.handleEnterKey(ne)){
+ event.stop(e);
+ }
+ }
+ });
+ if(has("ie") >= 9){
+ this.connect(editor.document, "onpaste", function(e){
+ setTimeout(dojo.hitch(this, function(){
+ // Use the old range/selection code to kick IE 9 into updating
+ // its range by moving it back, then forward, one 'character'.
+ var r = this.editor.document.selection.createRange();
+ r.move('character',-1);
+ r.select();
+ r.move('character',1);
+ r.select();
+ }),0);
+ });
+ }
+ return d;
+ }));
+ }else if(this.blockNodeForEnter){
+ // add enter key handler
+ // FIXME: need to port to the new event code!!
+ var h = lang.hitch(this,this.handleEnterKey);
+ editor.addKeyHandler(13, 0, 0, h); //enter
+ editor.addKeyHandler(13, 0, 1, h); //shift+enter
+ this.connect(this.editor,'onKeyPressed','onKeyPressed');
+ }
+ },
+ onKeyPressed: function(){
+ // summary:
+ // Handler for keypress events.
+ // tags:
+ // private
+ if(this._checkListLater){
+ if(win.withGlobal(this.editor.window, 'isCollapsed', baseFocus)){
+ var liparent = this.editor._sCall('getAncestorElement', ['LI']);
+ if(!liparent){
+ // circulate the undo detection code by calling RichText::execCommand directly
+ RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter);
+ // set the innerHTML of the new block node
+ var block = this.editor._sCall('getAncestorElement', [this.blockNodeForEnter]);
+ if(block){
+ block.innerHTML=this.bogusHtmlContent;
+ if(has("ie") <= 9){
+ // move to the start by moving backwards one char
+ var r = this.editor.document.selection.createRange();
+ r.move('character',-1);
+ r.select();
+ }
+ }else{
+ console.error('onKeyPressed: Cannot find the new block node'); // FIXME
+ }
+ }else{
+ if(has("mozilla")){
+ if(liparent.parentNode.parentNode.nodeName == 'LI'){
+ liparent=liparent.parentNode.parentNode;
+ }
+ }
+ var fc=liparent.firstChild;
+ if(fc && fc.nodeType == 1 && (fc.nodeName == 'UL' || fc.nodeName == 'OL')){
+ liparent.insertBefore(fc.ownerDocument.createTextNode('\xA0'),fc);
+ var newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(liparent.firstChild,0);
+ var selection = rangeapi.getSelection(this.editor.window, true);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ }
+ }
+ }
+ this._checkListLater = false;
+ }
+ if(this._pressedEnterInBlock){
+ // the new created is the original current P, so we have previousSibling below
+ if(this._pressedEnterInBlock.previousSibling){
+ this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
+ }
+ delete this._pressedEnterInBlock;
+ }
+ },
+
+ // bogusHtmlContent: [private] String
+ // HTML to stick into a new empty block
+ bogusHtmlContent: '&#160;', // &nbsp;
+
+ // blockNodes: [private] Regex
+ // Regex for testing if a given tag is a block level (display:block) tag
+ blockNodes: /^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,
+
+ handleEnterKey: function(e){
+ // summary:
+ // Handler for enter key events when blockNodeForEnter is DIV or P.
+ // description:
+ // Manually handle enter key event to make the behavior consistent across
+ // all supported browsers. See class description for details.
+ // tags:
+ // private
+
+ var selection, range, newrange, startNode, endNode, brNode, doc=this.editor.document,br,rs,txt;
+ if(e.shiftKey){ // shift+enter always generates <br>
+ var parent = this.editor._sCall('getParentElement', []);
+ var header = rangeapi.getAncestor(parent,this.blockNodes);
+ if(header){
+ if(header.tagName == 'LI'){
+ return true; // let browser handle
+ }
+ selection = rangeapi.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ if(!range.collapsed){
+ range.deleteContents();
+ selection = rangeapi.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ }
+ if(rangeapi.atBeginningOfContainer(header, range.startContainer, range.startOffset)){
+ br=doc.createElement('br');
+ newrange = rangeapi.create(this.editor.window);
+ header.insertBefore(br,header.firstChild);
+ newrange.setStartAfter(br);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ }else if(rangeapi.atEndOfContainer(header, range.startContainer, range.startOffset)){
+ newrange = rangeapi.create(this.editor.window);
+ br=doc.createElement('br');
+ header.appendChild(br);
+ header.appendChild(doc.createTextNode('\xA0'));
+ newrange.setStart(header.lastChild,0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ }else{
+ rs = range.startContainer;
+ if(rs && rs.nodeType == 3){
+ // Text node, we have to split it.
+ txt = rs.nodeValue;
+ startNode = doc.createTextNode(txt.substring(0, range.startOffset));
+ endNode = doc.createTextNode(txt.substring(range.startOffset));
+ brNode = doc.createElement("br");
+
+ if(endNode.nodeValue == "" && has("webkit")){
+ endNode = doc.createTextNode('\xA0')
+ }
+ domConstruct.place(startNode, rs, "after");
+ domConstruct.place(brNode, startNode, "after");
+ domConstruct.place(endNode, brNode, "after");
+ domConstruct.destroy(rs);
+ newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(endNode,0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ return false;
+ }
+ return true; // let browser handle
+ }
+ }else{
+ selection = rangeapi.getSelection(this.editor.window);
+ if(selection.rangeCount){
+ range = selection.getRangeAt(0);
+ if(range && range.startContainer){
+ if(!range.collapsed){
+ range.deleteContents();
+ selection = rangeapi.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ }
+ rs = range.startContainer;
+ if(rs && rs.nodeType == 3){
+ // Text node, we have to split it.
+ var endEmpty = false;
+
+ var offset = range.startOffset;
+ if(rs.length < offset){
+ //We are not splitting the right node, try to locate the correct one
+ ret = this._adjustNodeAndOffset(rs, offset);
+ rs = ret.node;
+ offset = ret.offset;
+ }
+ txt = rs.nodeValue;
+
+ startNode = doc.createTextNode(txt.substring(0, offset));
+ endNode = doc.createTextNode(txt.substring(offset));
+ brNode = doc.createElement("br");
+
+ if(!endNode.length){
+ endNode = doc.createTextNode('\xA0');
+ endEmpty = true;
+ }
+
+ if(startNode.length){
+ domConstruct.place(startNode, rs, "after");
+ }else{
+ startNode = rs;
+ }
+ domConstruct.place(brNode, startNode, "after");
+ domConstruct.place(endNode, brNode, "after");
+ domConstruct.destroy(rs);
+ newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(endNode,0);
+ newrange.setEnd(endNode, endNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(endEmpty && !has("webkit")){
+ this.editor._sCall("remove", []);
+ }else{
+ this.editor._sCall("collapse", [true]);
+ }
+ }else{
+ var targetNode;
+ if(range.startOffset >= 0){
+ targetNode = rs.childNodes[range.startOffset];
+ }
+ var brNode = doc.createElement("br");
+ var endNode = doc.createTextNode('\xA0');
+ if(!targetNode){
+ rs.appendChild(brNode);
+ rs.appendChild(endNode);
+ }else{
+ domConstruct.place(brNode, targetNode, "before");
+ domConstruct.place(endNode, brNode, "after");
+ }
+ newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(endNode,0);
+ newrange.setEnd(endNode, endNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ this.editor._sCall("collapse", [true]);
+ }
+ }
+ }else{
+ // don't change this: do not call this.execCommand, as that may have other logic in subclass
+ RichText.prototype.execCommand.call(this.editor, 'inserthtml', '<br>');
+ }
+ }
+ return false;
+ }
+ var _letBrowserHandle = true;
+
+ // first remove selection
+ selection = rangeapi.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ if(!range.collapsed){
+ range.deleteContents();
+ selection = rangeapi.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ }
+
+ var block = rangeapi.getBlockAncestor(range.endContainer, null, this.editor.editNode);
+ var blockNode = block.blockNode;
+
+ // if this is under a LI or the parent of the blockNode is LI, just let browser to handle it
+ if((this._checkListLater = (blockNode && (blockNode.nodeName == 'LI' || blockNode.parentNode.nodeName == 'LI')))){
+ if(has("mozilla")){
+ // press enter in middle of P may leave a trailing <br/>, let's remove it later
+ this._pressedEnterInBlock = blockNode;
+ }
+ // if this li only contains spaces, set the content to empty so the browser will outdent this item
+ if(/^(\s|&nbsp;|&#160;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|&#160;|\xA0)<\/span>)?(<br>)?$/.test(blockNode.innerHTML)){
+ // empty LI node
+ blockNode.innerHTML = '';
+ if(has("webkit")){ // WebKit tosses the range when innerHTML is reset
+ newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(blockNode, 0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ }
+ this._checkListLater = false; // nothing to check since the browser handles outdent
+ }
+ return true;
+ }
+
+ // text node directly under body, let's wrap them in a node
+ if(!block.blockNode || block.blockNode===this.editor.editNode){
+ try{
+ RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter);
+ }catch(e2){ /*squelch FF3 exception bug when editor content is a single BR*/ }
+ // get the newly created block node
+ // FIXME
+ block = {blockNode: this.editor._sCall('getAncestorElement', [this.blockNodeForEnter]),
+ blockContainer: this.editor.editNode};
+ if(block.blockNode){
+ if(block.blockNode != this.editor.editNode &&
+ (!(block.blockNode.textContent || block.blockNode.innerHTML).replace(/^\s+|\s+$/g, "").length)){
+ this.removeTrailingBr(block.blockNode);
+ return false;
+ }
+ }else{ // we shouldn't be here if formatblock worked
+ block.blockNode = this.editor.editNode;
+ }
+ selection = rangeapi.getSelection(this.editor.window);
+ range = selection.getRangeAt(0);
+ }
+
+ var newblock = doc.createElement(this.blockNodeForEnter);
+ newblock.innerHTML=this.bogusHtmlContent;
+ this.removeTrailingBr(block.blockNode);
+ var endOffset = range.endOffset;
+ var node = range.endContainer;
+ if(node.length < endOffset){
+ //We are not checking the right node, try to locate the correct one
+ var ret = this._adjustNodeAndOffset(node, endOffset);
+ node = ret.node;
+ endOffset = ret.offset;
+ }
+ if(rangeapi.atEndOfContainer(block.blockNode, node, endOffset)){
+ if(block.blockNode === block.blockContainer){
+ block.blockNode.appendChild(newblock);
+ }else{
+ domConstruct.place(newblock, block.blockNode, "after");
+ }
+ _letBrowserHandle = false;
+ // lets move caret to the newly created block
+ newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(newblock, 0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(this.editor.height){
+ winUtils.scrollIntoView(newblock);
+ }
+ }else if(rangeapi.atBeginningOfContainer(block.blockNode,
+ range.startContainer, range.startOffset)){
+ domConstruct.place(newblock, block.blockNode, block.blockNode === block.blockContainer ? "first" : "before");
+ if(newblock.nextSibling && this.editor.height){
+ // position input caret - mostly WebKit needs this
+ newrange = rangeapi.create(this.editor.window);
+ newrange.setStart(newblock.nextSibling, 0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ // browser does not scroll the caret position into view, do it manually
+ winUtils.scrollIntoView(newblock.nextSibling);
+ }
+ _letBrowserHandle = false;
+ }else{ //press enter in the middle of P/DIV/Whatever/
+ if(block.blockNode === block.blockContainer){
+ block.blockNode.appendChild(newblock);
+ }else{
+ domConstruct.place(newblock, block.blockNode, "after");
+ }
+ _letBrowserHandle = false;
+
+ // Clone any block level styles.
+ if(block.blockNode.style){
+ if(newblock.style){
+ if(block.blockNode.style.cssText){
+ newblock.style.cssText = block.blockNode.style.cssText;
+ }
+ }
+ }
+
+ // Okay, we probably have to split.
+ rs = range.startContainer;
+ var firstNodeMoved;
+ if(rs && rs.nodeType == 3){
+ // Text node, we have to split it.
+ var nodeToMove, tNode;
+ endOffset = range.endOffset;
+ if(rs.length < endOffset){
+ //We are not splitting the right node, try to locate the correct one
+ ret = this._adjustNodeAndOffset(rs, endOffset);
+ rs = ret.node;
+ endOffset = ret.offset;
+ }
+
+ txt = rs.nodeValue;
+ startNode = doc.createTextNode(txt.substring(0, endOffset));
+ endNode = doc.createTextNode(txt.substring(endOffset, txt.length));
+
+ // Place the split, then remove original nodes.
+ domConstruct.place(startNode, rs, "before");
+ domConstruct.place(endNode, rs, "after");
+ domConstruct.destroy(rs);
+
+ // Okay, we split the text. Now we need to see if we're
+ // parented to the block element we're splitting and if
+ // not, we have to split all the way up. Ugh.
+ var parentC = startNode.parentNode;
+ while(parentC !== block.blockNode){
+ var tg = parentC.tagName;
+ var newTg = doc.createElement(tg);
+ // Clone over any 'style' data.
+ if(parentC.style){
+ if(newTg.style){
+ if(parentC.style.cssText){
+ newTg.style.cssText = parentC.style.cssText;
+ }
+ }
+ }
+ // If font also need to clone over any font data.
+ if(parentC.tagName === "FONT"){
+ if(parentC.color){
+ newTg.color = parentC.color;
+ }
+ if(parentC.face){
+ newTg.face = parentC.face;
+ }
+ if(parentC.size){ // this check was necessary on IE
+ newTg.size = parentC.size;
+ }
+ }
+
+ nodeToMove = endNode;
+ while(nodeToMove){
+ tNode = nodeToMove.nextSibling;
+ newTg.appendChild(nodeToMove);
+ nodeToMove = tNode;
+ }
+ domConstruct.place(newTg, parentC, "after");
+ startNode = parentC;
+ endNode = newTg;
+ parentC = parentC.parentNode;
+ }
+
+ // Lastly, move the split out tags to the new block.
+ // as they should now be split properly.
+ nodeToMove = endNode;
+ if(nodeToMove.nodeType == 1 || (nodeToMove.nodeType == 3 && nodeToMove.nodeValue)){
+ // Non-blank text and non-text nodes need to clear out that blank space
+ // before moving the contents.
+ newblock.innerHTML = "";
+ }
+ firstNodeMoved = nodeToMove;
+ while(nodeToMove){
+ tNode = nodeToMove.nextSibling;
+ newblock.appendChild(nodeToMove);
+ nodeToMove = tNode;
+ }
+ }
+
+ //lets move caret to the newly created block
+ newrange = rangeapi.create(this.editor.window);
+ var nodeForCursor;
+ var innerMostFirstNodeMoved = firstNodeMoved;
+ if(this.blockNodeForEnter !== 'BR'){
+ while(innerMostFirstNodeMoved){
+ nodeForCursor = innerMostFirstNodeMoved;
+ tNode = innerMostFirstNodeMoved.firstChild;
+ innerMostFirstNodeMoved = tNode;
+ }
+ if(nodeForCursor && nodeForCursor.parentNode){
+ newblock = nodeForCursor.parentNode;
+ newrange.setStart(newblock, 0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(this.editor.height){
+ winUtils.scrollIntoView(newblock);
+ }
+ if(has("mozilla")){
+ // press enter in middle of P may leave a trailing <br/>, let's remove it later
+ this._pressedEnterInBlock = block.blockNode;
+ }
+ }else{
+ _letBrowserHandle = true;
+ }
+ }else{
+ newrange.setStart(newblock, 0);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(this.editor.height){
+ winUtils.scrollIntoView(newblock);
+ }
+ if(has("mozilla")){
+ // press enter in middle of P may leave a trailing <br/>, let's remove it later
+ this._pressedEnterInBlock = block.blockNode;
+ }
+ }
+ }
+ return _letBrowserHandle;
+ },
+
+ _adjustNodeAndOffset: function(/*DomNode*/node, /*Int*/offset){
+ // summary:
+ // In the case there are multiple text nodes in a row the offset may not be within the node. If the offset is larger than the node length, it will attempt to find
+ // the next text sibling until it locates the text node in which the offset refers to
+ // node:
+ // The node to check.
+ // offset:
+ // The position to find within the text node
+ // tags:
+ // private.
+ while(node.length < offset && node.nextSibling && node.nextSibling.nodeType==3){
+ //Adjust the offset and node in the case of multiple text nodes in a row
+ offset = offset - node.length;
+ node = node.nextSibling;
+ }
+ return {"node": node, "offset": offset};
+ },
+
+ removeTrailingBr: function(container){
+ // summary:
+ // If last child of container is a `<br>`, then remove it.
+ // tags:
+ // private
+ var para = /P|DIV|LI/i.test(container.tagName) ?
+ container : this.editor._sCall("getParentOfType", [container,['P','DIV','LI']]);
+
+ if(!para){ return; }
+ if(para.lastChild){
+ if((para.childNodes.length > 1 && para.lastChild.nodeType == 3 && /^[\s\xAD]*$/.test(para.lastChild.nodeValue)) ||
+ para.lastChild.tagName=='BR'){
+
+ domConstruct.destroy(para.lastChild);
+ }
+ }
+ if(!para.childNodes.length){
+ para.innerHTML=this.bogusHtmlContent;
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/_editor/plugins/FontChoice.js b/lib/dijit/_editor/plugins/FontChoice.js
index 7e12ac008..f96894ad7 100644
--- a/lib/dijit/_editor/plugins/FontChoice.js
+++ b/lib/dijit/_editor/plugins/FontChoice.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/FontChoice",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct","dojo/i18n","dojo/_base/lang","dojo/store/Memory","dojo/_base/window","../../registry","../../_Widget","../../_TemplatedMixin","../../_WidgetsInTemplateMixin","../../form/FilteringSelect","../_Plugin","../range","../selection","dojo/i18n!../nls/FontChoice"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){var _10=_2("dijit._editor.plugins._FontDropDown",[_9,_a,_b],{label:"",plainText:false,templateString:"<span style='white-space: nowrap' class='dijit dijitReset dijitInline'>"+"<label class='dijitLeft dijitInline' for='${selectId}'>${label}</label>"+"<input data-dojo-type='dijit.form.FilteringSelect' required='false' "+"data-dojo-props='labelType:\"html\", labelAttr:\"label\", searchAttr:\"name\"' "+"tabIndex='-1' id='${selectId}' data-dojo-attach-point='select' value=''/>"+"</span>",postMixInProperties:function(){this.inherited(arguments);this.strings=_4.getLocalization("dijit._editor","FontChoice");this.label=this.strings[this.command];this.id=_8.getUniqueId(this.declaredClass.replace(/\./g,"_"));this.selectId=this.id+"_select";this.inherited(arguments);},postCreate:function(){this.select.set("store",new _6({idProperty:"value",data:_1.map(this.values,function(_11){var _12=this.strings[_11]||_11;return {label:this.getLabel(_11,_12),name:_12,value:_11};},this)}));this.select.set("value","",false);this.disabled=this.select.get("disabled");},_setValueAttr:function(_13,_14){_14=_14!==false;this.select.set("value",_1.indexOf(this.values,_13)<0?"":_13,_14);if(!_14){this.select._lastValueReported=null;}},_getValueAttr:function(){return this.select.get("value");},focus:function(){this.select.focus();},_setDisabledAttr:function(_15){this.disabled=_15;this.select.set("disabled",_15);}});var _16=_2("dijit._editor.plugins._FontNameDropDown",_10,{generic:false,command:"fontName",postMixInProperties:function(){if(!this.values){this.values=this.generic?["serif","sans-serif","monospace","cursive","fantasy"]:["Arial","Times New Roman","Comic Sans MS","Courier New"];}this.inherited(arguments);},getLabel:function(_17,_18){if(this.plainText){return _18;}else{return "<div style='font-family: "+_17+"'>"+_18+"</div>";}},_setValueAttr:function(_19,_1a){_1a=_1a!==false;if(this.generic){var map={"Arial":"sans-serif","Helvetica":"sans-serif","Myriad":"sans-serif","Times":"serif","Times New Roman":"serif","Comic Sans MS":"cursive","Apple Chancery":"cursive","Courier":"monospace","Courier New":"monospace","Papyrus":"fantasy","Estrangelo Edessa":"cursive","Gabriola":"fantasy"};_19=map[_19]||_19;}this.inherited(arguments,[_19,_1a]);}});var _1b=_2("dijit._editor.plugins._FontSizeDropDown",_10,{command:"fontSize",values:[1,2,3,4,5,6,7],getLabel:function(_1c,_1d){if(this.plainText){return _1d;}else{return "<font size="+_1c+"'>"+_1d+"</font>";}},_setValueAttr:function(_1e,_1f){_1f=_1f!==false;if(_1e.indexOf&&_1e.indexOf("px")!=-1){var _20=parseInt(_1e,10);_1e={10:1,13:2,16:3,18:4,24:5,32:6,48:7}[_20]||_1e;}this.inherited(arguments,[_1e,_1f]);}});var _21=_2("dijit._editor.plugins._FormatBlockDropDown",_10,{command:"formatBlock",values:["noFormat","p","h1","h2","h3","pre"],postCreate:function(){this.inherited(arguments);this.set("value","noFormat",false);},getLabel:function(_22,_23){if(this.plainText||_22=="noFormat"){return _23;}else{return "<"+_22+">"+_23+"</"+_22+">";}},_execCommand:function(_24,_25,_26){if(_26==="noFormat"){var _27;var end;var sel=_e.getSelection(_24.window);if(sel&&sel.rangeCount>0){var _28=sel.getRangeAt(0);var _29,tag;if(_28){_27=_28.startContainer;end=_28.endContainer;while(_27&&_27!==_24.editNode&&_27!==_24.document.body&&_27.nodeType!==1){_27=_27.parentNode;}while(end&&end!==_24.editNode&&end!==_24.document.body&&end.nodeType!==1){end=end.parentNode;}var _2a=_5.hitch(this,function(_2b,ary){if(_2b.childNodes&&_2b.childNodes.length){var i;for(i=0;i<_2b.childNodes.length;i++){var c=_2b.childNodes[i];if(c.nodeType==1){if(_7.withGlobal(_24.window,"inSelection",_f,[c])){var tag=c.tagName?c.tagName.toLowerCase():"";if(_1.indexOf(this.values,tag)!==-1){ary.push(c);}_2a(c,ary);}}}}});var _2c=_5.hitch(this,function(_2d){if(_2d&&_2d.length){_24.beginEditing();while(_2d.length){this._removeFormat(_24,_2d.pop());}_24.endEditing();}});var _2e=[];if(_27==end){var _2f;_29=_27;while(_29&&_29!==_24.editNode&&_29!==_24.document.body){if(_29.nodeType==1){tag=_29.tagName?_29.tagName.toLowerCase():"";if(_1.indexOf(this.values,tag)!==-1){_2f=_29;break;}}_29=_29.parentNode;}_2a(_27,_2e);if(_2f){_2e=[_2f].concat(_2e);}_2c(_2e);}else{_29=_27;while(_7.withGlobal(_24.window,"inSelection",_f,[_29])){if(_29.nodeType==1){tag=_29.tagName?_29.tagName.toLowerCase():"";if(_1.indexOf(this.values,tag)!==-1){_2e.push(_29);}_2a(_29,_2e);}_29=_29.nextSibling;}_2c(_2e);}_24.onDisplayChanged();}}}else{_24.execCommand(_25,_26);}},_removeFormat:function(_30,_31){if(_30.customUndo){while(_31.firstChild){_3.place(_31.firstChild,_31,"before");}_31.parentNode.removeChild(_31);}else{_7.withGlobal(_30.window,"selectElementChildren",_f,[_31]);var _32=_7.withGlobal(_30.window,"getSelectedHtml",_f,[null]);_7.withGlobal(_30.window,"selectElement",_f,[_31]);_30.execCommand("inserthtml",_32||"");}}});var _33=_2("dijit._editor.plugins.FontChoice",_d,{useDefaultCommand:false,_initButton:function(){var _34={fontName:_16,fontSize:_1b,formatBlock:_21}[this.command],_35=this.params;if(this.params.custom){_35.values=this.params.custom;}var _36=this.editor;this.button=new _34(_5.delegate({dir:_36.dir,lang:_36.lang},_35));this.connect(this.button.select,"onChange",function(_37){this.editor.focus();if(this.command=="fontName"&&_37.indexOf(" ")!=-1){_37="'"+_37+"'";}if(this.button._execCommand){this.button._execCommand(this.editor,this.command,_37);}else{this.editor.execCommand(this.command,_37);}});},updateState:function(){var _38=this.editor;var _39=this.command;if(!_38||!_38.isLoaded||!_39.length){return;}if(this.button){var _3a=this.get("disabled");this.button.set("disabled",_3a);if(_3a){return;}var _3b;try{_3b=_38.queryCommandValue(_39)||"";}catch(e){_3b="";}var _3c=_5.isString(_3b)&&_3b.match(/'([^']*)'/);if(_3c){_3b=_3c[1];}if(_39==="formatBlock"){if(!_3b||_3b=="p"){_3b=null;var _3d;var sel=_e.getSelection(this.editor.window);if(sel&&sel.rangeCount>0){var _3e=sel.getRangeAt(0);if(_3e){_3d=_3e.endContainer;}}while(_3d&&_3d!==_38.editNode&&_3d!==_38.document){var tg=_3d.tagName?_3d.tagName.toLowerCase():"";if(tg&&_1.indexOf(this.button.values,tg)>-1){_3b=tg;break;}_3d=_3d.parentNode;}if(!_3b){_3b="noFormat";}}else{if(_1.indexOf(this.button.values,_3b)<0){_3b="noFormat";}}}if(_3b!==this.button.get("value")){this.button.set("value",_3b,false);}}}});_1.forEach(["fontName","fontSize","formatBlock"],function(_3f){_d.registry[_3f]=function(_40){return new _33({command:_3f,plainText:_40.plainText});};});}); \ No newline at end of file
+define("dijit/_editor/plugins/FontChoice",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct","dojo/i18n","dojo/_base/lang","dojo/store/Memory","../../registry","../../_Widget","../../_TemplatedMixin","../../_WidgetsInTemplateMixin","../../form/FilteringSelect","../_Plugin","../range","dojo/i18n!../nls/FontChoice"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d){var _e=_2("dijit._editor.plugins._FontDropDown",[_8,_9,_a],{label:"",plainText:false,templateString:"<span style='white-space: nowrap' class='dijit dijitReset dijitInline'>"+"<label class='dijitLeft dijitInline' for='${selectId}'>${label}</label>"+"<input data-dojo-type='dijit.form.FilteringSelect' required='false' "+"data-dojo-props='labelType:\"html\", labelAttr:\"label\", searchAttr:\"name\"' "+"tabIndex='-1' id='${selectId}' data-dojo-attach-point='select' value=''/>"+"</span>",postMixInProperties:function(){this.inherited(arguments);this.strings=_4.getLocalization("dijit._editor","FontChoice");this.label=this.strings[this.command];this.id=_7.getUniqueId(this.declaredClass.replace(/\./g,"_"));this.selectId=this.id+"_select";this.inherited(arguments);},postCreate:function(){this.select.set("store",new _6({idProperty:"value",data:_1.map(this.values,function(_f){var _10=this.strings[_f]||_f;return {label:this.getLabel(_f,_10),name:_10,value:_f};},this)}));this.select.set("value","",false);this.disabled=this.select.get("disabled");},_setValueAttr:function(_11,_12){_12=_12!==false;this.select.set("value",_1.indexOf(this.values,_11)<0?"":_11,_12);if(!_12){this.select._lastValueReported=null;}},_getValueAttr:function(){return this.select.get("value");},focus:function(){this.select.focus();},_setDisabledAttr:function(_13){this.disabled=_13;this.select.set("disabled",_13);}});var _14=_2("dijit._editor.plugins._FontNameDropDown",_e,{generic:false,command:"fontName",postMixInProperties:function(){if(!this.values){this.values=this.generic?["serif","sans-serif","monospace","cursive","fantasy"]:["Arial","Times New Roman","Comic Sans MS","Courier New"];}this.inherited(arguments);},getLabel:function(_15,_16){if(this.plainText){return _16;}else{return "<div style='font-family: "+_15+"'>"+_16+"</div>";}},_setValueAttr:function(_17,_18){_18=_18!==false;if(this.generic){var map={"Arial":"sans-serif","Helvetica":"sans-serif","Myriad":"sans-serif","Times":"serif","Times New Roman":"serif","Comic Sans MS":"cursive","Apple Chancery":"cursive","Courier":"monospace","Courier New":"monospace","Papyrus":"fantasy","Estrangelo Edessa":"cursive","Gabriola":"fantasy"};_17=map[_17]||_17;}this.inherited(arguments,[_17,_18]);}});var _19=_2("dijit._editor.plugins._FontSizeDropDown",_e,{command:"fontSize",values:[1,2,3,4,5,6,7],getLabel:function(_1a,_1b){if(this.plainText){return _1b;}else{return "<font size="+_1a+"'>"+_1b+"</font>";}},_setValueAttr:function(_1c,_1d){_1d=_1d!==false;if(_1c.indexOf&&_1c.indexOf("px")!=-1){var _1e=parseInt(_1c,10);_1c={10:1,13:2,16:3,18:4,24:5,32:6,48:7}[_1e]||_1c;}this.inherited(arguments,[_1c,_1d]);}});var _1f=_2("dijit._editor.plugins._FormatBlockDropDown",_e,{command:"formatBlock",values:["noFormat","p","h1","h2","h3","pre"],postCreate:function(){this.inherited(arguments);this.set("value","noFormat",false);},getLabel:function(_20,_21){if(this.plainText||_20=="noFormat"){return _21;}else{return "<"+_20+">"+_21+"</"+_20+">";}},_execCommand:function(_22,_23,_24){if(_24==="noFormat"){var _25;var end;var sel=_d.getSelection(_22.window);if(sel&&sel.rangeCount>0){var _26=sel.getRangeAt(0);var _27,tag;if(_26){_25=_26.startContainer;end=_26.endContainer;while(_25&&_25!==_22.editNode&&_25!==_22.document.body&&_25.nodeType!==1){_25=_25.parentNode;}while(end&&end!==_22.editNode&&end!==_22.document.body&&end.nodeType!==1){end=end.parentNode;}var _28=_5.hitch(this,function(_29,ary){if(_29.childNodes&&_29.childNodes.length){var i;for(i=0;i<_29.childNodes.length;i++){var c=_29.childNodes[i];if(c.nodeType==1){if(_22._sCall("inSelection",[c])){var tag=c.tagName?c.tagName.toLowerCase():"";if(_1.indexOf(this.values,tag)!==-1){ary.push(c);}_28(c,ary);}}}}});var _2a=_5.hitch(this,function(_2b){if(_2b&&_2b.length){_22.beginEditing();while(_2b.length){this._removeFormat(_22,_2b.pop());}_22.endEditing();}});var _2c=[];if(_25==end){var _2d;_27=_25;while(_27&&_27!==_22.editNode&&_27!==_22.document.body){if(_27.nodeType==1){tag=_27.tagName?_27.tagName.toLowerCase():"";if(_1.indexOf(this.values,tag)!==-1){_2d=_27;break;}}_27=_27.parentNode;}_28(_25,_2c);if(_2d){_2c=[_2d].concat(_2c);}_2a(_2c);}else{_27=_25;while(_22._sCall("inSelection",[_27])){if(_27.nodeType==1){tag=_27.tagName?_27.tagName.toLowerCase():"";if(_1.indexOf(this.values,tag)!==-1){_2c.push(_27);}_28(_27,_2c);}_27=_27.nextSibling;}_2a(_2c);}_22.onDisplayChanged();}}}else{_22.execCommand(_23,_24);}},_removeFormat:function(_2e,_2f){if(_2e.customUndo){while(_2f.firstChild){_3.place(_2f.firstChild,_2f,"before");}_2f.parentNode.removeChild(_2f);}else{_2e._sCall("selectElementChildren",[_2f]);var _30=_2e._sCall("getSelectedHtml",[]);_2e._sCall("selectElement",[_2f]);_2e.execCommand("inserthtml",_30||"");}}});var _31=_2("dijit._editor.plugins.FontChoice",_c,{useDefaultCommand:false,_initButton:function(){var _32={fontName:_14,fontSize:_19,formatBlock:_1f}[this.command],_33=this.params;if(this.params.custom){_33.values=this.params.custom;}var _34=this.editor;this.button=new _32(_5.delegate({dir:_34.dir,lang:_34.lang},_33));this.connect(this.button.select,"onChange",function(_35){this.editor.focus();if(this.command=="fontName"&&_35.indexOf(" ")!=-1){_35="'"+_35+"'";}if(this.button._execCommand){this.button._execCommand(this.editor,this.command,_35);}else{this.editor.execCommand(this.command,_35);}});},updateState:function(){var _36=this.editor;var _37=this.command;if(!_36||!_36.isLoaded||!_37.length){return;}if(this.button){var _38=this.get("disabled");this.button.set("disabled",_38);if(_38){return;}var _39;try{_39=_36.queryCommandValue(_37)||"";}catch(e){_39="";}var _3a=_5.isString(_39)&&_39.match(/'([^']*)'/);if(_3a){_39=_3a[1];}if(_37==="formatBlock"){if(!_39||_39=="p"){_39=null;var _3b;var sel=_d.getSelection(this.editor.window);if(sel&&sel.rangeCount>0){var _3c=sel.getRangeAt(0);if(_3c){_3b=_3c.endContainer;}}while(_3b&&_3b!==_36.editNode&&_3b!==_36.document){var tg=_3b.tagName?_3b.tagName.toLowerCase():"";if(tg&&_1.indexOf(this.button.values,tg)>-1){_39=tg;break;}_3b=_3b.parentNode;}if(!_39){_39="noFormat";}}else{if(_1.indexOf(this.button.values,_39)<0){_39="noFormat";}}}if(_39!==this.button.get("value")){this.button.set("value",_39,false);}}}});_1.forEach(["fontName","fontSize","formatBlock"],function(_3d){_c.registry[_3d]=function(_3e){return new _31({command:_3d,plainText:_3e.plainText});};});_31._FontDropDown=_e;_31._FontNameDropDown=_14;_31._FontSizeDropDown=_19;_31._FormatBlockDropDown=_1f;return _31;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js b/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js
new file mode 100644
index 000000000..713717351
--- /dev/null
+++ b/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js
@@ -0,0 +1,583 @@
+define("dijit/_editor/plugins/FontChoice", [
+ "dojo/_base/array", // array.indexOf array.map
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.place
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.delegate lang.hitch lang.isString
+ "dojo/store/Memory", // MemoryStore
+ "../../registry", // registry.getUniqueId
+ "../../_Widget",
+ "../../_TemplatedMixin",
+ "../../_WidgetsInTemplateMixin",
+ "../../form/FilteringSelect",
+ "../_Plugin",
+ "../range",
+ "dojo/i18n!../nls/FontChoice"
+], function(array, declare, domConstruct, i18n, lang, MemoryStore,
+ registry, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, FilteringSelect, _Plugin, rangeapi){
+
+
+// module:
+// dijit/_editor/plugins/FontChoice
+
+
+var _FontDropDown = declare("dijit._editor.plugins._FontDropDown",
+ [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], {
+ // summary:
+ // Base class for widgets that contains a label (like "Font:")
+ // and a FilteringSelect drop down to pick a value.
+ // Used as Toolbar entry.
+
+ // label: [public] String
+ // The label to apply to this particular FontDropDown.
+ label: "",
+
+ // plainText: [public] boolean
+ // Flag to indicate that the returned label should be plain text
+ // instead of an example.
+ plainText: false,
+
+ // templateString: [public] String
+ // The template used to construct the labeled dropdown.
+ templateString:
+ "<span style='white-space: nowrap' class='dijit dijitReset dijitInline'>" +
+ "<label class='dijitLeft dijitInline' for='${selectId}'>${label}</label>" +
+ "<input data-dojo-type='dijit.form.FilteringSelect' required='false' " +
+ "data-dojo-props='labelType:\"html\", labelAttr:\"label\", searchAttr:\"name\"' " +
+ "tabIndex='-1' id='${selectId}' data-dojo-attach-point='select' value=''/>" +
+ "</span>",
+
+ postMixInProperties: function(){
+ // summary:
+ // Over-ride to set specific properties.
+ this.inherited(arguments);
+
+ this.strings = i18n.getLocalization("dijit._editor", "FontChoice");
+
+ // Set some substitution variables used in the template
+ this.label = this.strings[this.command];
+
+ // _WidgetBase sets the id after postMixInProperties(), but we need it now.
+ // Alternative is to have a buildRendering() method and move this.selectId setting there,
+ // or alternately get rid of selectId variable and just access ${id} in template?
+ this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+
+ this.selectId = this.id + "_select"; // used in template
+
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ // summary:
+ // Over-ride for the default postCreate action
+ // This establishes the filtering selects and the like.
+
+ // Initialize the list of items in the drop down by creating data store with items like:
+ // {value: 1, name: "xx-small", label: "<font size=1>xx-small</font-size>" }
+ this.select.set("store", new MemoryStore({
+ idProperty: "value",
+ data: array.map(this.values, function(value){
+ var name = this.strings[value] || value;
+ return {
+ label: this.getLabel(value, name),
+ name: name,
+ value: value
+ };
+ }, this)
+ }));
+
+ this.select.set("value", "", false);
+ this.disabled = this.select.get("disabled");
+ },
+
+ _setValueAttr: function(value, priorityChange){
+ // summary:
+ // Over-ride for the default action of setting the
+ // widget value, maps the input to known values
+ // value: Object|String
+ // The value to set in the select.
+ // priorityChange:
+ // Optional parameter used to tell the select whether or not to fire
+ // onChange event.
+
+ // if the value is not a permitted value, just set empty string to prevent showing the warning icon
+ priorityChange = priorityChange !== false;
+ this.select.set('value', array.indexOf(this.values,value) < 0 ? "" : value, priorityChange);
+ if(!priorityChange){
+ // Clear the last state in case of updateState calls. Ref: #10466
+ this.select._lastValueReported=null;
+ }
+ },
+
+ _getValueAttr: function(){
+ // summary:
+ // Allow retrieving the value from the composite select on
+ // call to button.get("value");
+ return this.select.get('value');
+ },
+
+ focus: function(){
+ // summary:
+ // Over-ride for focus control of this widget. Delegates focus down to the
+ // filtering select.
+ this.select.focus();
+ },
+
+ _setDisabledAttr: function(value){
+ // summary:
+ // Over-ride for the button's 'disabled' attribute so that it can be
+ // disabled programmatically.
+
+ // Save off ths disabled state so the get retrieves it correctly
+ //without needing to have a function proxy it.
+ this.disabled = value;
+ this.select.set("disabled", value);
+ }
+});
+
+
+var _FontNameDropDown = declare("dijit._editor.plugins._FontNameDropDown", _FontDropDown, {
+ // summary:
+ // Dropdown to select a font; goes in editor toolbar.
+
+ // generic: [const] Boolean
+ // Use generic (web standard) font names
+ generic: false,
+
+ // command: [public] String
+ // The editor 'command' implemented by this plugin.
+ command: "fontName",
+
+ postMixInProperties: function(){
+ // summary:
+ // Over-ride for the default posr mixin control
+ if(!this.values){
+ this.values = this.generic ?
+ ["serif", "sans-serif", "monospace", "cursive", "fantasy"] : // CSS font-family generics
+ ["Arial", "Times New Roman", "Comic Sans MS", "Courier New"];
+ }
+ this.inherited(arguments);
+ },
+
+ getLabel: function(value, name){
+ // summary:
+ // Function used to generate the labels of the format dropdown
+ // will return a formatted, or plain label based on the value
+ // of the plainText option.
+ // value: String
+ // The 'insert value' associated with a name
+ // name: String
+ // The text name of the value
+ if(this.plainText){
+ return name;
+ }else{
+ return "<div style='font-family: "+value+"'>" + name + "</div>";
+ }
+ },
+
+ _setValueAttr: function(value, priorityChange){
+ // summary:
+ // Over-ride for the default action of setting the
+ // widget value, maps the input to known values
+
+ priorityChange = priorityChange !== false;
+ if(this.generic){
+ var map = {
+ "Arial": "sans-serif",
+ "Helvetica": "sans-serif",
+ "Myriad": "sans-serif",
+ "Times": "serif",
+ "Times New Roman": "serif",
+ "Comic Sans MS": "cursive",
+ "Apple Chancery": "cursive",
+ "Courier": "monospace",
+ "Courier New": "monospace",
+ "Papyrus": "fantasy",
+ "Estrangelo Edessa": "cursive", // Windows 7
+ "Gabriola": "fantasy" // Windows 7
+ };
+ value = map[value] || value;
+ }
+ this.inherited(arguments, [value, priorityChange]);
+ }
+});
+
+var _FontSizeDropDown = declare("dijit._editor.plugins._FontSizeDropDown", _FontDropDown, {
+ // summary:
+ // Dropdown to select a font size; goes in editor toolbar.
+
+ // command: [public] String
+ // The editor 'command' implemented by this plugin.
+ command: "fontSize",
+
+ // values: [public] Number[]
+ // The HTML font size values supported by this plugin
+ values: [1,2,3,4,5,6,7], // sizes according to the old HTML FONT SIZE
+
+ getLabel: function(value, name){
+ // summary:
+ // Function used to generate the labels of the format dropdown
+ // will return a formatted, or plain label based on the value
+ // of the plainText option.
+ // We're stuck using the deprecated FONT tag to correspond
+ // with the size measurements used by the editor
+ // value: String
+ // The 'insert value' associated with a name
+ // name: String
+ // The text name of the value
+ if(this.plainText){
+ return name;
+ }else{
+ return "<font size=" + value + "'>" + name + "</font>";
+ }
+ },
+
+ _setValueAttr: function(value, priorityChange){
+ // summary:
+ // Over-ride for the default action of setting the
+ // widget value, maps the input to known values
+ priorityChange = priorityChange !== false;
+ if(value.indexOf && value.indexOf("px") != -1){
+ var pixels = parseInt(value, 10);
+ value = {10:1, 13:2, 16:3, 18:4, 24:5, 32:6, 48:7}[pixels] || value;
+ }
+
+ this.inherited(arguments, [value, priorityChange]);
+ }
+});
+
+
+var _FormatBlockDropDown = declare("dijit._editor.plugins._FormatBlockDropDown", _FontDropDown, {
+ // summary:
+ // Dropdown to select a format (like paragraph or heading); goes in editor toolbar.
+
+ // command: [public] String
+ // The editor 'command' implemented by this plugin.
+ command: "formatBlock",
+
+ // values: [public] Array
+ // The HTML format tags supported by this plugin
+ values: ["noFormat", "p", "h1", "h2", "h3", "pre"],
+
+ postCreate: function(){
+ // Init and set the default value to no formatting. Update state will adjust it
+ // as needed.
+ this.inherited(arguments);
+ this.set("value", "noFormat", false);
+ },
+
+ getLabel: function(value, name){
+ // summary:
+ // Function used to generate the labels of the format dropdown
+ // will return a formatted, or plain label based on the value
+ // of the plainText option.
+ // value: String
+ // The 'insert value' associated with a name
+ // name: String
+ // The text name of the value
+ if(this.plainText || value == "noFormat"){
+ return name;
+ }else{
+ return "<" + value + ">" + name + "</" + value + ">";
+ }
+ },
+
+ _execCommand: function(editor, command, choice){
+ // summary:
+ // Over-ride for default exec-command label.
+ // Allows us to treat 'none' as special.
+ if(choice === "noFormat"){
+ var start;
+ var end;
+ var sel = rangeapi.getSelection(editor.window);
+ if(sel && sel.rangeCount > 0){
+ var range = sel.getRangeAt(0);
+ var node, tag;
+ if(range){
+ start = range.startContainer;
+ end = range.endContainer;
+
+ // find containing nodes of start/end.
+ while(start && start !== editor.editNode &&
+ start !== editor.document.body &&
+ start.nodeType !== 1){
+ start = start.parentNode;
+ }
+
+ while(end && end !== editor.editNode &&
+ end !== editor.document.body &&
+ end.nodeType !== 1){
+ end = end.parentNode;
+ }
+
+ var processChildren = lang.hitch(this, function(node, ary){
+ if(node.childNodes && node.childNodes.length){
+ var i;
+ for(i = 0; i < node.childNodes.length; i++){
+ var c = node.childNodes[i];
+ if(c.nodeType == 1){
+ if(editor._sCall("inSelection", [c])){
+ var tag = c.tagName? c.tagName.toLowerCase(): "";
+ if(array.indexOf(this.values, tag) !== -1){
+ ary.push(c);
+ }
+ processChildren(c, ary);
+ }
+ }
+ }
+ }
+ });
+
+ var unformatNodes = lang.hitch(this, function(nodes){
+ // summary:
+ // Internal function to clear format nodes.
+ // nodes:
+ // The array of nodes to strip formatting from.
+ if(nodes && nodes.length){
+ editor.beginEditing();
+ while(nodes.length){
+ this._removeFormat(editor, nodes.pop());
+ }
+ editor.endEditing();
+ }
+ });
+
+ var clearNodes = [];
+ if(start == end){
+ //Contained within the same block, may be collapsed, but who cares, see if we
+ // have a block element to remove.
+ var block;
+ node = start;
+ while(node && node !== editor.editNode && node !== editor.document.body){
+ if(node.nodeType == 1){
+ tag = node.tagName? node.tagName.toLowerCase(): "";
+ if(array.indexOf(this.values, tag) !== -1){
+ block = node;
+ break;
+ }
+ }
+ node = node.parentNode;
+ }
+
+ //Also look for all child nodes in the selection that may need to be
+ //cleared of formatting
+ processChildren(start, clearNodes);
+ if(block){ clearNodes = [block].concat(clearNodes); }
+ unformatNodes(clearNodes);
+ }else{
+ // Probably a multi select, so we have to process it. Whee.
+ node = start;
+ while(editor._sCall("inSelection", [node])){
+ if(node.nodeType == 1){
+ tag = node.tagName? node.tagName.toLowerCase(): "";
+ if(array.indexOf(this.values, tag) !== -1){
+ clearNodes.push(node);
+ }
+ processChildren(node,clearNodes);
+ }
+ node = node.nextSibling;
+ }
+ unformatNodes(clearNodes);
+ }
+ editor.onDisplayChanged();
+ }
+ }
+ }else{
+ editor.execCommand(command, choice);
+ }
+ },
+
+ _removeFormat: function(editor, node){
+ // summary:
+ // function to remove the block format node.
+ // node:
+ // The block format node to remove (and leave the contents behind)
+ if(editor.customUndo){
+ // So of course IE doesn't work right with paste-overs.
+ // We have to do this manually, which is okay since IE already uses
+ // customUndo and we turned it on for WebKit. WebKit pasted funny,
+ // so couldn't use the execCommand approach
+ while(node.firstChild){
+ domConstruct.place(node.firstChild, node, "before");
+ }
+ node.parentNode.removeChild(node);
+ }else{
+ // Everyone else works fine this way, a paste-over and is native
+ // undo friendly.
+ editor._sCall("selectElementChildren", [node])
+ var html = editor._sCall("getSelectedHtml", [])
+ editor._sCall("selectElement", [node])
+ editor.execCommand("inserthtml", html||"");
+ }
+ }
+});
+
+// TODO: for 2.0, split into FontChoice plugin into three separate classes,
+// one for each command (and change registry below)
+var FontChoice = declare("dijit._editor.plugins.FontChoice", _Plugin,{
+ // summary:
+ // This plugin provides three drop downs for setting style in the editor
+ // (font, font size, and format block), as controlled by command.
+ //
+ // description:
+ // The commands provided by this plugin are:
+ //
+ // - fontName: Provides a drop down to select from a list of font names
+ // - fontSize: Provides a drop down to select from a list of font sizes
+ // - formatBlock: Provides a drop down to select from a list of block styles
+ // which can easily be added to an editor by including one or more of the above commands
+ // in the `plugins` attribute as follows:
+ //
+ // | plugins="['fontName','fontSize',...]"
+ //
+ // It is possible to override the default dropdown list by providing an Array for the `custom` property when
+ // instantiating this plugin, e.g.
+ //
+ // | plugins="[{name:'dijit._editor.plugins.FontChoice', command:'fontName', values:['Verdana','Myriad','Garamond']},...]"
+ //
+ // Alternatively, for `fontName` only, `generic:true` may be specified to provide a dropdown with
+ // [CSS generic font families](http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families).
+ //
+ // Note that the editor is often unable to properly handle font styling information defined outside
+ // the context of the current editor instance, such as pre-populated HTML.
+
+ // useDefaultCommand: [protected] Boolean
+ // Override _Plugin.useDefaultCommand...
+ // processing is handled by this plugin, not by dijit/Editor.
+ useDefaultCommand: false,
+
+ _initButton: function(){
+ // summary:
+ // Overrides _Plugin._initButton(), to initialize the FilteringSelect+label in toolbar,
+ // rather than a simple button.
+ // tags:
+ // protected
+
+ // Create the widget to go into the toolbar (the so-called "button")
+ var clazz = {
+ fontName: _FontNameDropDown,
+ fontSize: _FontSizeDropDown,
+ formatBlock: _FormatBlockDropDown
+ }[this.command],
+ params = this.params;
+
+ // For back-compat reasons support setting custom values via "custom" parameter
+ // rather than "values" parameter. Remove in 2.0.
+ if(this.params.custom){
+ params.values = this.params.custom;
+ }
+
+ var editor = this.editor;
+ this.button = new clazz(lang.delegate({dir: editor.dir, lang: editor.lang}, params));
+
+ // Reflect changes to the drop down in the editor
+ this.connect(this.button.select, "onChange", function(choice){
+ // User invoked change, since all internal updates set priorityChange to false and will
+ // not trigger an onChange event.
+ this.editor.focus();
+
+ if(this.command == "fontName" && choice.indexOf(" ") != -1){ choice = "'" + choice + "'"; }
+
+ // Invoke, the editor already normalizes commands called through its
+ // execCommand.
+ if(this.button._execCommand){
+ this.button._execCommand(this.editor, this.command, choice);
+ }else{
+ this.editor.execCommand(this.command, choice);
+ }
+ });
+ },
+
+ updateState: function(){
+ // summary:
+ // Overrides _Plugin.updateState(). This controls updating the menu
+ // options to the right values on state changes in the document (that trigger a
+ // test of the actions.)
+ // It set value of drop down in toolbar to reflect font/font size/format block
+ // of text at current caret position.
+ // tags:
+ // protected
+ var _e = this.editor;
+ var _c = this.command;
+ if(!_e || !_e.isLoaded || !_c.length){ return; }
+
+ if(this.button){
+ var disabled = this.get("disabled");
+ this.button.set("disabled", disabled);
+ if(disabled){ return; }
+ var value;
+ try{
+ value = _e.queryCommandValue(_c) || "";
+ }catch(e){
+ //Firefox may throw error above if the editor is just loaded, ignore it
+ value = "";
+ }
+
+ // strip off single quotes, if any
+ var quoted = lang.isString(value) && value.match(/'([^']*)'/);
+ if(quoted){ value = quoted[1]; }
+
+ if(_c === "formatBlock"){
+ if(!value || value == "p"){
+ // Some browsers (WebKit) doesn't actually get the tag info right.
+ // and IE returns paragraph when in a DIV!, so incorrect a lot,
+ // so we have double-check it.
+ value = null;
+ var elem;
+ // Try to find the current element where the caret is.
+ var sel = rangeapi.getSelection(this.editor.window);
+ if(sel && sel.rangeCount > 0){
+ var range = sel.getRangeAt(0);
+ if(range){
+ elem = range.endContainer;
+ }
+ }
+
+ // Okay, now see if we can find one of the formatting types we're in.
+ while(elem && elem !== _e.editNode && elem !== _e.document){
+ var tg = elem.tagName?elem.tagName.toLowerCase():"";
+ if(tg && array.indexOf(this.button.values, tg) > -1){
+ value = tg;
+ break;
+ }
+ elem = elem.parentNode;
+ }
+ if(!value){
+ // Still no value, so lets select 'none'.
+ value = "noFormat";
+ }
+ }else{
+ // Check that the block format is one allowed, if not,
+ // null it so that it gets set to empty.
+ if(array.indexOf(this.button.values, value) < 0){
+ value = "noFormat";
+ }
+ }
+ }
+ if(value !== this.button.get("value")){
+ // Set the value, but denote it is not a priority change, so no
+ // onchange fires.
+ this.button.set('value', value, false);
+ }
+ }
+ }
+});
+
+// Register these plugins
+array.forEach(["fontName", "fontSize", "formatBlock"], function(name){
+ _Plugin.registry[name] = function(args){
+ return new FontChoice({
+ command: name,
+ plainText: args.plainText
+ });
+ };
+});
+
+// Make all classes available through AMD, and return main class
+FontChoice._FontDropDown = _FontDropDown;
+FontChoice._FontNameDropDown = _FontNameDropDown;
+FontChoice._FontSizeDropDown = _FontSizeDropDown;
+FontChoice._FormatBlockDropDown = _FormatBlockDropDown;
+return FontChoice;
+
+});
diff --git a/lib/dijit/_editor/plugins/FullScreen.js b/lib/dijit/_editor/plugins/FullScreen.js
index 139f630dc..458dbf8b7 100644
--- a/lib/dijit/_editor/plugins/FullScreen.js
+++ b/lib/dijit/_editor/plugins/FullScreen.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/FullScreen",["dojo/aspect","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/keys","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","dojo/window","../../focus","../_Plugin","../../form/ToggleButton","../../registry","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,on,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit._editor.plugins.FullScreen",_e,{zIndex:500,_origState:null,_origiFrameState:null,_resizeHandle:null,isFullscreen:false,toggle:function(){this.button.set("checked",!this.button.get("checked"));},_initButton:function(){var _12=_7.getLocalization("dijit._editor","commands"),_13=this.editor;this.button=new _f({label:_12["fullScreen"],dir:_13.dir,lang:_13.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"FullScreen",tabIndex:"-1",onChange:_9.hitch(this,"_setFullScreen")});},setEditor:function(_14){this.editor=_14;this._initButton();this.editor.addKeyHandler(_8.F11,true,true,_9.hitch(this,function(e){this.toggle();_6.stop(e);setTimeout(_9.hitch(this,function(){this.editor.focus();}),250);return true;}));this.connect(this.editor.domNode,"onkeydown","_containFocus");},_containFocus:function(e){if(this.isFullscreen){var ed=this.editor;if(!ed.isTabIndent&&ed._fullscreen_oldOnKeyDown&&e.keyCode===_8.TAB){var f=_d.curNode;var avn=this._getAltViewNode();if(f==ed.iframe||(avn&&f===avn)){setTimeout(_9.hitch(this,function(){ed.toolbar.focus();}),10);}else{if(avn&&_5.get(ed.iframe,"display")==="none"){setTimeout(_9.hitch(this,function(){_d.focus(avn);}),10);}else{setTimeout(_9.hitch(this,function(){ed.focus();}),10);}}_6.stop(e);}else{if(ed._fullscreen_oldOnKeyDown){ed._fullscreen_oldOnKeyDown(e);}}}},_resizeEditor:function(){var vp=_c.getBox();_4.setMarginBox(this.editor.domNode,{w:vp.w,h:vp.h});var _15=this.editor.getHeaderHeight();var _16=this.editor.getFooterHeight();var _17=_4.getPadBorderExtents(this.editor.domNode);var _18=_4.getPadBorderExtents(this.editor.iframe.parentNode);var _19=_4.getMarginExtents(this.editor.iframe.parentNode);var _1a=vp.h-(_15+_17.h+_16);_4.setMarginBox(this.editor.iframe.parentNode,{h:_1a,w:vp.w});_4.setMarginBox(this.editor.iframe,{h:_1a-(_18.h+_19.h)});},_getAltViewNode:function(){},_setFullScreen:function(_1b){var vp=_c.getBox();var ed=this.editor;var _1c=_b.body();var _1d=ed.domNode.parentNode;this.isFullscreen=_1b;if(_1b){while(_1d&&_1d!==_b.body()){_3.add(_1d,"dijitForceStatic");_1d=_1d.parentNode;}this._editorResizeHolder=this.editor.resize;ed.resize=function(){};ed._fullscreen_oldOnKeyDown=ed.onKeyDown;ed.onKeyDown=_9.hitch(this,this._containFocus);this._origState={};this._origiFrameState={};var _1e=ed.domNode,_1f=_1e&&_1e.style||{};this._origState={width:_1f.width||"",height:_1f.height||"",top:_5.get(_1e,"top")||"",left:_5.get(_1e,"left")||"",position:_5.get(_1e,"position")||"static",marginBox:_4.getMarginBox(ed.domNode)};var _20=ed.iframe,_21=_20&&_20.style||{};var bc=_5.get(ed.iframe,"backgroundColor");this._origiFrameState={backgroundColor:bc||"transparent",width:_21.width||"auto",height:_21.height||"auto",zIndex:_21.zIndex||""};_5.set(ed.domNode,{position:"absolute",top:"0px",left:"0px",zIndex:this.zIndex,width:vp.w+"px",height:vp.h+"px"});_5.set(ed.iframe,{height:"100%",width:"100%",zIndex:this.zIndex,backgroundColor:bc!=="transparent"&&bc!=="rgba(0, 0, 0, 0)"?bc:"white"});_5.set(ed.iframe.parentNode,{height:"95%",width:"100%"});if(_1c.style&&_1c.style.overflow){this._oldOverflow=_5.get(_1c,"overflow");}else{this._oldOverflow="";}if(_a("ie")&&!_a("quirks")){if(_1c.parentNode&&_1c.parentNode.style&&_1c.parentNode.style.overflow){this._oldBodyParentOverflow=_1c.parentNode.style.overflow;}else{try{this._oldBodyParentOverflow=_5.get(_1c.parentNode,"overflow");}catch(e){this._oldBodyParentOverflow="scroll";}}_5.set(_1c.parentNode,"overflow","hidden");}_5.set(_1c,"overflow","hidden");var _22=function(){var vp=_c.getBox();if("_prevW" in this&&"_prevH" in this){if(vp.w===this._prevW&&vp.h===this._prevH){return;}}else{this._prevW=vp.w;this._prevH=vp.h;}if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}this._resizer=setTimeout(_9.hitch(this,function(){delete this._resizer;this._resizeEditor();}),10);};this._resizeHandle=on(window,"resize",_9.hitch(this,_22));this._resizeHandle2=_1.after(ed,"onResize",_9.hitch(this,function(){if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}this._resizer=setTimeout(_9.hitch(this,function(){delete this._resizer;this._resizeEditor();}),10);}));this._resizeEditor();var dn=this.editor.toolbar.domNode;setTimeout(function(){_c.scrollIntoView(dn);},250);}else{if(this._resizeHandle){this._resizeHandle.remove();this._resizeHandle=null;}if(this._resizeHandle2){this._resizeHandle2.remove();this._resizeHandle2=null;}if(this._rst){clearTimeout(this._rst);this._rst=null;}while(_1d&&_1d!==_b.body()){_3.remove(_1d,"dijitForceStatic");_1d=_1d.parentNode;}if(this._editorResizeHolder){this.editor.resize=this._editorResizeHolder;}if(!this._origState&&!this._origiFrameState){return;}if(ed._fullscreen_oldOnKeyDown){ed.onKeyDown=ed._fullscreen_oldOnKeyDown;delete ed._fullscreen_oldOnKeyDown;}var _23=this;setTimeout(function(){var mb=_23._origState.marginBox;var oh=_23._origState.height;if(_a("ie")&&!_a("quirks")){_1c.parentNode.style.overflow=_23._oldBodyParentOverflow;delete _23._oldBodyParentOverflow;}_5.set(_1c,"overflow",_23._oldOverflow);delete _23._oldOverflow;_5.set(ed.domNode,_23._origState);_5.set(ed.iframe.parentNode,{height:"",width:""});_5.set(ed.iframe,_23._origiFrameState);delete _23._origState;delete _23._origiFrameState;var _24=_10.getEnclosingWidget(ed.domNode.parentNode);if(_24&&_24.resize){_24.resize();}else{if(!oh||oh.indexOf("%")<0){setTimeout(_9.hitch(this,function(){ed.resize({h:mb.h});}),0);}}_c.scrollIntoView(_23.editor.toolbar.domNode);},100);}},updateState:function(){this.button.set("disabled",this.get("disabled"));},destroy:function(){if(this._resizeHandle){this._resizeHandle.remove();this._resizeHandle=null;}if(this._resizeHandle2){this._resizeHandle2.remove();this._resizeHandle2=null;}if(this._resizer){clearTimeout(this._resizer);this._resizer=null;}this.inherited(arguments);}});_e.registry["fullScreen"]=_e.registry["fullscreen"]=function(_25){return new _11({zIndex:("zIndex" in _25)?_25.zIndex:500});};return _11;}); \ No newline at end of file
+define("dijit/_editor/plugins/FullScreen",["dojo/aspect","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/keys","dojo/_base/lang","dojo/on","dojo/sniff","dojo/_base/window","dojo/window","../../focus","../_Plugin","../../form/ToggleButton","../../registry","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,on,_a,_b,_c,_d,_e,_f,_10){var _11=_2("dijit._editor.plugins.FullScreen",_e,{zIndex:500,_origState:null,_origiFrameState:null,_resizeHandle:null,isFullscreen:false,toggle:function(){this.button.set("checked",!this.button.get("checked"));},_initButton:function(){var _12=_7.getLocalization("dijit._editor","commands"),_13=this.editor;this.button=new _f({label:_12["fullScreen"],ownerDocument:_13.ownerDocument,dir:_13.dir,lang:_13.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"FullScreen",tabIndex:"-1",onChange:_9.hitch(this,"_setFullScreen")});},setEditor:function(_14){this.editor=_14;this._initButton();this.editor.addKeyHandler(_8.F11,true,true,_9.hitch(this,function(e){this.toggle();_6.stop(e);setTimeout(_9.hitch(this,function(){this.editor.focus();}),250);return true;}));this.connect(this.editor.domNode,"onkeydown","_containFocus");},_containFocus:function(e){if(this.isFullscreen){var ed=this.editor;if(!ed.isTabIndent&&ed._fullscreen_oldOnKeyDown&&e.keyCode===_8.TAB){var f=_d.curNode;var avn=this._getAltViewNode();if(f==ed.iframe||(avn&&f===avn)){setTimeout(_9.hitch(this,function(){ed.toolbar.focus();}),10);}else{if(avn&&_5.get(ed.iframe,"display")==="none"){setTimeout(_9.hitch(this,function(){_d.focus(avn);}),10);}else{setTimeout(_9.hitch(this,function(){ed.focus();}),10);}}_6.stop(e);}else{if(ed._fullscreen_oldOnKeyDown){ed._fullscreen_oldOnKeyDown(e);}}}},_resizeEditor:function(){var vp=_c.getBox(this.editor.ownerDocument);_4.setMarginBox(this.editor.domNode,{w:vp.w,h:vp.h});var _15=this.editor.getHeaderHeight();var _16=this.editor.getFooterHeight();var _17=_4.getPadBorderExtents(this.editor.domNode);var _18=_4.getPadBorderExtents(this.editor.iframe.parentNode);var _19=_4.getMarginExtents(this.editor.iframe.parentNode);var _1a=vp.h-(_15+_17.h+_16);_4.setMarginBox(this.editor.iframe.parentNode,{h:_1a,w:vp.w});_4.setMarginBox(this.editor.iframe,{h:_1a-(_18.h+_19.h)});},_getAltViewNode:function(){},_setFullScreen:function(_1b){var ed=this.editor;var _1c=ed.ownerDocumentBody;var _1d=ed.domNode.parentNode;var vp=_c.getBox(ed.ownerDocument);this.isFullscreen=_1b;if(_1b){while(_1d&&_1d!==_1c){_3.add(_1d,"dijitForceStatic");_1d=_1d.parentNode;}this._editorResizeHolder=this.editor.resize;ed.resize=function(){};ed._fullscreen_oldOnKeyDown=ed.onKeyDown;ed.onKeyDown=_9.hitch(this,this._containFocus);this._origState={};this._origiFrameState={};var _1e=ed.domNode,_1f=_1e&&_1e.style||{};this._origState={width:_1f.width||"",height:_1f.height||"",top:_5.get(_1e,"top")||"",left:_5.get(_1e,"left")||"",position:_5.get(_1e,"position")||"static",marginBox:_4.getMarginBox(ed.domNode)};var _20=ed.iframe,_21=_20&&_20.style||{};var bc=_5.get(ed.iframe,"backgroundColor");this._origiFrameState={backgroundColor:bc||"transparent",width:_21.width||"auto",height:_21.height||"auto",zIndex:_21.zIndex||""};_5.set(ed.domNode,{position:"absolute",top:"0px",left:"0px",zIndex:this.zIndex,width:vp.w+"px",height:vp.h+"px"});_5.set(ed.iframe,{height:"100%",width:"100%",zIndex:this.zIndex,backgroundColor:bc!=="transparent"&&bc!=="rgba(0, 0, 0, 0)"?bc:"white"});_5.set(ed.iframe.parentNode,{height:"95%",width:"100%"});if(_1c.style&&_1c.style.overflow){this._oldOverflow=_5.get(_1c,"overflow");}else{this._oldOverflow="";}if(_a("ie")&&!_a("quirks")){if(_1c.parentNode&&_1c.parentNode.style&&_1c.parentNode.style.overflow){this._oldBodyParentOverflow=_1c.parentNode.style.overflow;}else{try{this._oldBodyParentOverflow=_5.get(_1c.parentNode,"overflow");}catch(e){this._oldBodyParentOverflow="scroll";}}_5.set(_1c.parentNode,"overflow","hidden");}_5.set(_1c,"overflow","hidden");var _22=function(){var vp=_c.getBox(ed.ownerDocument);if("_prevW" in this&&"_prevH" in this){if(vp.w===this._prevW&&vp.h===this._prevH){return;}}else{this._prevW=vp.w;this._prevH=vp.h;}if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}this._resizer=setTimeout(_9.hitch(this,function(){delete this._resizer;this._resizeEditor();}),10);};this._resizeHandle=on(window,"resize",_9.hitch(this,_22));this._resizeHandle2=_1.after(ed,"onResize",_9.hitch(this,function(){if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}this._resizer=setTimeout(_9.hitch(this,function(){delete this._resizer;this._resizeEditor();}),10);}));this._resizeEditor();var dn=this.editor.toolbar.domNode;setTimeout(function(){_c.scrollIntoView(dn);},250);}else{if(this._resizeHandle){this._resizeHandle.remove();this._resizeHandle=null;}if(this._resizeHandle2){this._resizeHandle2.remove();this._resizeHandle2=null;}if(this._rst){clearTimeout(this._rst);this._rst=null;}while(_1d&&_1d!==_1c){_3.remove(_1d,"dijitForceStatic");_1d=_1d.parentNode;}if(this._editorResizeHolder){this.editor.resize=this._editorResizeHolder;}if(!this._origState&&!this._origiFrameState){return;}if(ed._fullscreen_oldOnKeyDown){ed.onKeyDown=ed._fullscreen_oldOnKeyDown;delete ed._fullscreen_oldOnKeyDown;}var _23=this;setTimeout(function(){var mb=_23._origState.marginBox;var oh=_23._origState.height;if(_a("ie")&&!_a("quirks")){_1c.parentNode.style.overflow=_23._oldBodyParentOverflow;delete _23._oldBodyParentOverflow;}_5.set(_1c,"overflow",_23._oldOverflow);delete _23._oldOverflow;_5.set(ed.domNode,_23._origState);_5.set(ed.iframe.parentNode,{height:"",width:""});_5.set(ed.iframe,_23._origiFrameState);delete _23._origState;delete _23._origiFrameState;var _24=_10.getEnclosingWidget(ed.domNode.parentNode);if(_24&&_24.resize){_24.resize();}else{if(!oh||oh.indexOf("%")<0){setTimeout(_9.hitch(this,function(){ed.resize({h:mb.h});}),0);}}_c.scrollIntoView(_23.editor.toolbar.domNode);},100);}},updateState:function(){this.button.set("disabled",this.get("disabled"));},destroy:function(){if(this._resizeHandle){this._resizeHandle.remove();this._resizeHandle=null;}if(this._resizeHandle2){this._resizeHandle2.remove();this._resizeHandle2=null;}if(this._resizer){clearTimeout(this._resizer);this._resizer=null;}this.inherited(arguments);}});_e.registry["fullScreen"]=_e.registry["fullscreen"]=function(_25){return new _11({zIndex:("zIndex" in _25)?_25.zIndex:500});};return _11;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js b/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js
new file mode 100644
index 000000000..68f27954b
--- /dev/null
+++ b/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js
@@ -0,0 +1,450 @@
+define("dijit/_editor/plugins/FullScreen", [
+ "dojo/aspect",
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-geometry",
+ "dojo/dom-style",
+ "dojo/_base/event", // event.stop
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/keys", // keys.F11 keys.TAB
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on", // on()
+ "dojo/sniff", // has("ie"), has("quirks")
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.getBox winUtils.scrollIntoView
+ "../../focus", // focus.focus(), focus.curNode
+ "../_Plugin",
+ "../../form/ToggleButton",
+ "../../registry", // registry.getEnclosingWidget()
+ "dojo/i18n!../nls/commands"
+], function(aspect, declare, domClass, domGeometry, domStyle, event, i18n, keys, lang, on, has, win, winUtils,
+ focus, _Plugin, ToggleButton, registry){
+
+
+// module:
+// dijit/_editor/plugins/FullScreen
+
+
+var FullScreen = declare("dijit._editor.plugins.FullScreen",_Plugin,{
+ // summary:
+ // This plugin provides FullScreen capability to the editor. When
+ // toggled on, it will render the editor into the full window and
+ // overlay everything. It also binds to the hotkey: CTRL-SHIFT-F11
+ // for toggling fullscreen mode.
+
+ // zIndex: [public] Number
+ // zIndex value used for overlaying the full page.
+ // default is 500.
+ zIndex: 500,
+
+ // _origState: [private] Object
+ // The original view state of the editor.
+ _origState: null,
+
+ // _origiFrameState: [private] Object
+ // The original view state of the iframe of the editor.
+ _origiFrameState: null,
+
+ // _resizeHandle: [private] Object
+ // Connection point used for handling resize when window resizes.
+ _resizeHandle: null,
+
+ // isFullscreen: [const] boolean
+ // Read-Only variable used to denote of the editor is in fullscreen mode or not.
+ isFullscreen: false,
+
+ toggle: function(){
+ // summary:
+ // Function to allow programmatic toggling of the view.
+ this.button.set("checked", !this.button.get("checked"));
+ },
+
+ _initButton: function(){
+ // summary:
+ // Over-ride for creation of the resize button.
+ var strings = i18n.getLocalization("dijit._editor", "commands"),
+ editor = this.editor;
+ this.button = new ToggleButton({
+ label: strings["fullScreen"],
+ ownerDocument: editor.ownerDocument,
+ dir: editor.dir,
+ lang: editor.lang,
+ showLabel: false,
+ iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "FullScreen",
+ tabIndex: "-1",
+ onChange: lang.hitch(this, "_setFullScreen")
+ });
+ },
+
+ setEditor: function(editor){
+ // summary:
+ // Over-ride for the setting of the editor.
+ // editor: Object
+ // The editor to configure for this plugin to use.
+ this.editor = editor;
+ this._initButton();
+
+ this.editor.addKeyHandler(keys.F11, true, true, lang.hitch(this, function(e){
+ // Enable the CTRL-SHIFT-F11 hotkey for fullscreen mode.
+ this.toggle();
+ event.stop(e);
+ setTimeout(lang.hitch(this, function(){this.editor.focus();}), 250);
+ return true;
+ }));
+ this.connect(this.editor.domNode, "onkeydown", "_containFocus");
+ },
+
+ _containFocus: function(e){
+ // summary:
+ // When in Full Screen mode, it's good to try and retain focus in the editor
+ // so this function is intended to try and constrain the TAB key.
+ // e: Event
+ // The key event.
+ // tags:
+ // private
+ if(this.isFullscreen){
+ var ed = this.editor;
+ if(!ed.isTabIndent &&
+ ed._fullscreen_oldOnKeyDown &&
+ e.keyCode === keys.TAB){
+ // If we're in fullscreen mode, we want to take over how tab moves focus a bit.
+ // to keep it within the editor since it's hiding the rest of the page.
+ // IE hates changing focus IN the event handler, so need to put calls
+ // in a timeout. Gotta love IE.
+ // Also need to check for alternate view nodes if present and active.
+ var f = focus.curNode;
+ var avn = this._getAltViewNode();
+ if(f == ed.iframe ||
+ (avn && f === avn)){
+ setTimeout(lang.hitch(this, function(){
+ ed.toolbar.focus();
+ }), 10);
+ }else{
+ if(avn && domStyle.get(ed.iframe, "display") === "none"){
+ setTimeout(lang.hitch(this, function(){
+ focus.focus(avn);
+ }), 10);
+ }else{
+ setTimeout(lang.hitch(this, function(){
+ ed.focus();
+ }), 10);
+ }
+ }
+ event.stop(e);
+ }else if(ed._fullscreen_oldOnKeyDown){
+ // Only call up when it's a different function. Traps corner case event issue
+ // on IE which caused stack overflow on handler cleanup.
+ ed._fullscreen_oldOnKeyDown(e);
+ }
+ }
+ },
+
+ _resizeEditor: function(){
+ // summary:
+ // Function to handle resizing the editor as the viewport
+ // resizes (window scaled)
+ // tags:
+ // private
+ var vp = winUtils.getBox(this.editor.ownerDocument);
+ domGeometry.setMarginBox(this.editor.domNode, {
+ w: vp.w,
+ h: vp.h
+ });
+
+ //Adjust the internal heights too, as they can be a bit off.
+ var hHeight = this.editor.getHeaderHeight();
+ var fHeight = this.editor.getFooterHeight();
+ var extents = domGeometry.getPadBorderExtents(this.editor.domNode);
+ var fcpExtents = domGeometry.getPadBorderExtents(this.editor.iframe.parentNode);
+ var fcmExtents = domGeometry.getMarginExtents(this.editor.iframe.parentNode);
+
+ var cHeight = vp.h - (hHeight + extents.h + fHeight);
+ domGeometry.setMarginBox(this.editor.iframe.parentNode, {
+ h: cHeight,
+ w: vp.w
+ });
+ domGeometry.setMarginBox(this.editor.iframe, {
+ h: cHeight - (fcpExtents.h + fcmExtents.h)
+ });
+ },
+
+ _getAltViewNode: function(){
+ // summary:
+ // This function is intended as a hook point for setting an
+ // alternate view node for when in full screen mode and the
+ // editable iframe is hidden.
+ // tags:
+ // protected.
+ },
+
+ _setFullScreen: function(full){
+ // summary:
+ // Function to handle toggling between full screen and
+ // regular view.
+ // tags:
+ // private
+
+ //Alias this for shorter code.
+ var ed = this.editor;
+ var body = ed.ownerDocumentBody;
+ var editorParent = ed.domNode.parentNode;
+
+ var vp = winUtils.getBox(ed.ownerDocument);
+
+ this.isFullscreen = full;
+
+ if(full){
+ //Parent classes can royally screw up this plugin, so we
+ //have to set everything to position static.
+ while(editorParent && editorParent !== body){
+ domClass.add(editorParent, "dijitForceStatic");
+ editorParent = editorParent.parentNode;
+ }
+
+ // Save off the resize function. We want to kill its behavior.
+ this._editorResizeHolder = this.editor.resize;
+ ed.resize = function(){} ;
+
+ // Try to constrain focus control.
+ ed._fullscreen_oldOnKeyDown = ed.onKeyDown;
+ ed.onKeyDown = lang.hitch(this, this._containFocus);
+
+ this._origState = {};
+ this._origiFrameState = {};
+
+ // Store the basic editor state we have to restore later.
+ // Not using domStyle.get here, had problems, didn't
+ // give me stuff like 100%, gave me pixel calculated values.
+ // Need the exact original values.
+ var domNode = ed.domNode,
+ rawStyle = domNode && domNode.style || {};
+ this._origState = {
+ width: rawStyle.width || "",
+ height: rawStyle.height || "",
+ top: domStyle.get(domNode, "top") || "",
+ left: domStyle.get(domNode, "left") || "",
+ position: domStyle.get(domNode, "position") || "static",
+ marginBox: domGeometry.getMarginBox(ed.domNode)
+ };
+
+ // Store the iframe state we have to restore later.
+ // Not using domStyle.get here, had problems, didn't
+ // give me stuff like 100%, gave me pixel calculated values.
+ // Need the exact original values.
+ var iframe = ed.iframe,
+ iframeStyle = iframe && iframe.style || {};
+
+ var bc = domStyle.get(ed.iframe, "backgroundColor");
+ this._origiFrameState = {
+ backgroundColor: bc || "transparent",
+ width: iframeStyle.width || "auto",
+ height: iframeStyle.height || "auto",
+ zIndex: iframeStyle.zIndex || ""
+ };
+
+ // Okay, size everything.
+ domStyle.set(ed.domNode, {
+ position: "absolute",
+ top: "0px",
+ left: "0px",
+ zIndex: this.zIndex,
+ width: vp.w + "px",
+ height: vp.h + "px"
+ });
+
+ domStyle.set(ed.iframe, {
+ height: "100%",
+ width: "100%",
+ zIndex: this.zIndex,
+ backgroundColor: bc !== "transparent" &&
+ bc !== "rgba(0, 0, 0, 0)"?bc:"white"
+ });
+
+ domStyle.set(ed.iframe.parentNode, {
+ height: "95%",
+ width: "100%"
+ });
+
+ // Store the overflow state we have to restore later.
+ // IE had issues, so have to check that it's defined. Ugh.
+ if(body.style && body.style.overflow){
+ this._oldOverflow = domStyle.get(body, "overflow");
+ }else{
+ this._oldOverflow = "";
+ }
+
+ if(has("ie") && !has("quirks")){
+ // IE will put scrollbars in anyway, html (parent of body)
+ // also controls them in standards mode, so we have to
+ // remove them, argh.
+ if(body.parentNode &&
+ body.parentNode.style &&
+ body.parentNode.style.overflow){
+ this._oldBodyParentOverflow = body.parentNode.style.overflow;
+ }else{
+ try{
+ this._oldBodyParentOverflow = domStyle.get(body.parentNode, "overflow");
+ }catch(e){
+ this._oldBodyParentOverflow = "scroll";
+ }
+ }
+ domStyle.set(body.parentNode, "overflow", "hidden");
+ }
+ domStyle.set(body, "overflow", "hidden");
+
+ var resizer = function(){
+ // function to handle resize events.
+ // Will check current VP and only resize if
+ // different.
+ var vp = winUtils.getBox(ed.ownerDocument);
+ if("_prevW" in this && "_prevH" in this){
+ // No actual size change, ignore.
+ if(vp.w === this._prevW && vp.h === this._prevH){
+ return;
+ }
+ }else{
+ this._prevW = vp.w;
+ this._prevH = vp.h;
+ }
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ delete this._resizer;
+ }
+ // Timeout it to help avoid spamming resize on IE.
+ // Works for all browsers.
+ this._resizer = setTimeout(lang.hitch(this, function(){
+ delete this._resizer;
+ this._resizeEditor();
+ }), 10);
+ };
+ this._resizeHandle = on(window, "resize", lang.hitch(this, resizer));
+
+ // Also monitor for direct calls to resize and adapt editor.
+ this._resizeHandle2 = aspect.after(ed, "onResize", lang.hitch(this, function(){
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ delete this._resizer;
+ }
+ this._resizer = setTimeout(lang.hitch(this, function(){
+ delete this._resizer;
+ this._resizeEditor();
+ }), 10);
+ }));
+
+ // Call it once to work around IE glitchiness. Safe for other browsers too.
+ this._resizeEditor();
+ var dn = this.editor.toolbar.domNode;
+ setTimeout(function(){winUtils.scrollIntoView(dn);}, 250);
+ }else{
+ if(this._resizeHandle){
+ // Cleanup resizing listeners
+ this._resizeHandle.remove();
+ this._resizeHandle = null;
+ }
+ if(this._resizeHandle2){
+ // Cleanup resizing listeners
+ this._resizeHandle2.remove();
+ this._resizeHandle2 = null;
+ }
+ if(this._rst){
+ clearTimeout(this._rst);
+ this._rst = null;
+ }
+
+ //Remove all position static class assigns.
+ while(editorParent && editorParent !== body){
+ domClass.remove(editorParent, "dijitForceStatic");
+ editorParent = editorParent.parentNode;
+ }
+
+ // Restore resize function
+ if(this._editorResizeHolder){
+ this.editor.resize = this._editorResizeHolder;
+ }
+
+ if(!this._origState && !this._origiFrameState){
+ // If we actually didn't toggle, then don't do anything.
+ return;
+ }
+ if(ed._fullscreen_oldOnKeyDown){
+ ed.onKeyDown = ed._fullscreen_oldOnKeyDown;
+ delete ed._fullscreen_oldOnKeyDown;
+ }
+
+ // Add a timeout to make sure we don't have a resize firing in the
+ // background at the time of minimize.
+ var self = this;
+ setTimeout(function(){
+ // Restore all the editor state.
+ var mb = self._origState.marginBox;
+ var oh = self._origState.height;
+ if(has("ie") && !has("quirks")){
+ body.parentNode.style.overflow = self._oldBodyParentOverflow;
+ delete self._oldBodyParentOverflow;
+ }
+ domStyle.set(body, "overflow", self._oldOverflow);
+ delete self._oldOverflow;
+
+ domStyle.set(ed.domNode, self._origState);
+ domStyle.set(ed.iframe.parentNode, {
+ height: "",
+ width: ""
+ });
+ domStyle.set(ed.iframe, self._origiFrameState);
+ delete self._origState;
+ delete self._origiFrameState;
+ // In case it is contained in a layout and the layout changed size,
+ // go ahead and call resize.
+ var pWidget = registry.getEnclosingWidget(ed.domNode.parentNode);
+ if(pWidget && pWidget.resize){
+ pWidget.resize();
+ }else{
+ if(!oh || oh.indexOf("%") < 0){
+ // Resize if the original size wasn't set
+ // or wasn't in percent. Timeout is to avoid
+ // an IE crash in unit testing.
+ setTimeout(lang.hitch(this, function(){ed.resize({h: mb.h});}), 0);
+ }
+ }
+ winUtils.scrollIntoView(self.editor.toolbar.domNode);
+ }, 100);
+ }
+ },
+
+ updateState: function(){
+ // summary:
+ // Over-ride for button state control for disabled to work.
+ this.button.set("disabled", this.get("disabled"));
+ },
+
+ destroy: function(){
+ // summary:
+ // Over-ride to ensure the resize handle gets cleaned up.
+ if(this._resizeHandle){
+ // Cleanup resizing listeners
+ this._resizeHandle.remove();
+ this._resizeHandle = null;
+ }
+ if(this._resizeHandle2){
+ // Cleanup resizing listeners
+ this._resizeHandle2.remove();
+ this._resizeHandle2 = null;
+ }
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ this._resizer = null;
+ }
+ this.inherited(arguments);
+ }
+});
+
+// Register this plugin.
+// For back-compat accept "fullscreen" (all lowercase) too, remove in 2.0
+_Plugin.registry["fullScreen"] = _Plugin.registry["fullscreen"] = function(args){
+ return new FullScreen({
+ zIndex: ("zIndex" in args)?args.zIndex:500
+ });
+};
+
+return FullScreen;
+});
diff --git a/lib/dijit/_editor/plugins/LinkDialog.js b/lib/dijit/_editor/plugins/LinkDialog.js
index a70a9683c..f4fb0b56d 100644
--- a/lib/dijit/_editor/plugins/LinkDialog.js
+++ b/lib/dijit/_editor/plugins/LinkDialog.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/LinkDialog",["require","dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/string","dojo/_base/window","../../_Widget","../_Plugin","../../form/DropDownButton","../range","../selection"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d){var _e=_2("dijit._editor.plugins.LinkDialog",_a,{buttonClass:_b,useDefaultCommand:false,urlRegExp:"((https?|ftps?|file)\\://|./|/|)(/[a-zA-Z]{1,1}:/|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)*(?:[a-zA-Z](?:[-\\da-zA-Z]{0,80}[\\da-zA-Z])?)\\.?)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]|(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])|0[xX]0*[\\da-fA-F]{1,8}|([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}|([\\da-fA-F]{1,4}\\:){6}((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])))(\\:\\d+)?(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]{0,}(?:\\?[^?#\\s/]*)?(?:#.*)?)?)?",emailRegExp:"<?(mailto\\:)([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+"+"@"+"((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)+(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)\\.?)|localhost|^[^-][a-zA-Z0-9_-]*>?",htmlTemplate:"<a href=\"${urlInput}\" _djrealurl=\"${urlInput}\""+" target=\"${targetSelect}\""+">${textInput}</a>",tag:"a",_hostRxp:/^((([^\[:]+):)?([^@]+)@)?(\[([^\]]+)\]|([^\[:]*))(:([0-9]+))?$/,_userAtRxp:/^([!#-'*+\-\/-9=?A-Z^-~]+[.])*[!#-'*+\-\/-9=?A-Z^-~]+@/i,linkDialogTemplate:["<table><tr><td>","<label for='${id}_urlInput'>${url}</label>","</td><td>","<input data-dojo-type='dijit.form.ValidationTextBox' required='true' "+"id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","<label for='${id}_textInput'>${text}</label>","</td><td>","<input data-dojo-type='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' "+"name='textInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","<label for='${id}_targetSelect'>${target}</label>","</td><td>","<select id='${id}_targetSelect' name='targetSelect' data-dojo-type='dijit.form.Select'>","<option selected='selected' value='_self'>${currentWindow}</option>","<option value='_blank'>${newWindow}</option>","<option value='_top'>${topWindow}</option>","<option value='_parent'>${parentWindow}</option>","</select>","</td></tr><tr><td colspan='2'>","<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>","<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>","</td></tr></table>"].join(""),_initButton:function(){this.inherited(arguments);this.button.loadDropDown=_5.hitch(this,"_loadDropDown");this._connectTagEvents();},_loadDropDown:function(_f){_1(["dojo/i18n","../../TooltipDialog","../../registry","../../form/Button","../../form/Select","../../form/ValidationTextBox","dojo/i18n!../../nls/common","dojo/i18n!../nls/LinkDialog"],_5.hitch(this,function(_10,_11,_12){var _13=this;this.tag=this.command=="insertImage"?"img":"a";var _14=_5.delegate(_10.getLocalization("dijit","common",this.lang),_10.getLocalization("dijit._editor","LinkDialog",this.lang));var _15=(this.dropDown=this.button.dropDown=new _11({title:_14[this.command+"Title"],execute:_5.hitch(this,"setValue"),onOpen:function(){_13._onOpenDialog();_11.prototype.onOpen.apply(this,arguments);},onCancel:function(){setTimeout(_5.hitch(_13,"_onCloseDialog"),0);}}));_14.urlRegExp=this.urlRegExp;_14.id=_12.getUniqueId(this.editor.id);this._uniqueId=_14.id;this._setContent(_15.title+"<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>"+_7.substitute(this.linkDialogTemplate,_14));_15.startup();this._urlInput=_12.byId(this._uniqueId+"_urlInput");this._textInput=_12.byId(this._uniqueId+"_textInput");this._setButton=_12.byId(this._uniqueId+"_setButton");this.connect(_12.byId(this._uniqueId+"_cancelButton"),"onClick",function(){this.dropDown.onCancel();});if(this._urlInput){this.connect(this._urlInput,"onChange","_checkAndFixInput");}if(this._textInput){this.connect(this._textInput,"onChange","_checkAndFixInput");}this._urlRegExp=new RegExp("^"+this.urlRegExp+"$","i");this._emailRegExp=new RegExp("^"+this.emailRegExp+"$","i");this._urlInput.isValid=_5.hitch(this,function(){var _16=this._urlInput.get("value");return this._urlRegExp.test(_16)||this._emailRegExp.test(_16);});this.connect(_15.domNode,"onkeypress",function(e){if(e&&e.charOrCode==_4.ENTER&&!e.shiftKey&&!e.metaKey&&!e.ctrlKey&&!e.altKey){if(!this._setButton.get("disabled")){_15.onExecute();_15.execute(_15.get("value"));}}});_f();}));},_checkAndFixInput:function(){var _17=this;var url=this._urlInput.get("value");var _18=function(url){var _19=false;var _1a=false;if(url&&url.length>1){url=_5.trim(url);if(url.indexOf("mailto:")!==0){if(url.indexOf("/")>0){if(url.indexOf("://")===-1){if(url.charAt(0)!=="/"&&url.indexOf("./")!==0){if(_17._hostRxp.test(url)){_19=true;}}}}else{if(_17._userAtRxp.test(url)){_1a=true;}}}}if(_19){_17._urlInput.set("value","http://"+url);}if(_1a){_17._urlInput.set("value","mailto:"+url);}_17._setButton.set("disabled",!_17._isValid());};if(this._delayedCheck){clearTimeout(this._delayedCheck);this._delayedCheck=null;}this._delayedCheck=setTimeout(function(){_18(url);},250);},_connectTagEvents:function(){this.editor.onLoadDeferred.addCallback(_5.hitch(this,function(){this.connect(this.editor.editNode,"ondblclick",this._onDblClick);}));},_isValid:function(){return this._urlInput.isValid()&&this._textInput.isValid();},_setContent:function(_1b){this.dropDown.set({parserScope:"dojo",content:_1b});},_checkValues:function(_1c){if(_1c&&_1c.urlInput){_1c.urlInput=_1c.urlInput.replace(/"/g,"&quot;");}return _1c;},setValue:function(_1d){this._onCloseDialog();if(_6("ie")<9){var sel=_c.getSelection(this.editor.window);var _1e=sel.getRangeAt(0);var a=_1e.endContainer;if(a.nodeType===3){a=a.parentNode;}if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){a=_8.withGlobal(this.editor.window,"getSelectedElement",_d,[this.tag]);}if(a&&(a.nodeName&&a.nodeName.toLowerCase()===this.tag)){if(this.editor.queryCommandEnabled("unlink")){_8.withGlobal(this.editor.window,"selectElementChildren",_d,[a]);this.editor.execCommand("unlink");}}}_1d=this._checkValues(_1d);this.editor.execCommand("inserthtml",_7.substitute(this.htmlTemplate,_1d));},_onCloseDialog:function(){this.editor.focus();},_getCurrentValues:function(a){var url,_1f,_20;if(a&&a.tagName.toLowerCase()===this.tag){url=a.getAttribute("_djrealurl")||a.getAttribute("href");_20=a.getAttribute("target")||"_self";_1f=a.textContent||a.innerText;_8.withGlobal(this.editor.window,"selectElement",_d,[a,true]);}else{_1f=_8.withGlobal(this.editor.window,_d.getSelectedText);}return {urlInput:url||"",textInput:_1f||"",targetSelect:_20||""};},_onOpenDialog:function(){var a;if(_6("ie")<9){var sel=_c.getSelection(this.editor.window);var _21=sel.getRangeAt(0);a=_21.endContainer;if(a.nodeType===3){a=a.parentNode;}if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){a=_8.withGlobal(this.editor.window,"getSelectedElement",_d,[this.tag]);}}else{a=_8.withGlobal(this.editor.window,"getAncestorElement",_d,[this.tag]);}this.dropDown.reset();this._setButton.set("disabled",true);this.dropDown.set("value",this._getCurrentValues(a));},_onDblClick:function(e){if(e&&e.target){var t=e.target;var tg=t.tagName?t.tagName.toLowerCase():"";if(tg===this.tag&&_3.get(t,"href")){var _22=this.editor;_8.withGlobal(_22.window,"selectElement",_d,[t]);_22.onDisplayChanged();if(_22._updateTimer){clearTimeout(_22._updateTimer);delete _22._updateTimer;}_22.onNormalizedDisplayChanged();var _23=this.button;setTimeout(function(){_23.set("disabled",false);_23.loadAndOpenDropDown().then(function(){if(_23.dropDown.focus){_23.dropDown.focus();}});},10);}}}});var _24=_2("dijit._editor.plugins.ImgLinkDialog",[_e],{linkDialogTemplate:["<table><tr><td>","<label for='${id}_urlInput'>${url}</label>","</td><td>","<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' "+"required='true' id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","<label for='${id}_textInput'>${text}</label>","</td><td>","<input data-dojo-type='dijit.form.ValidationTextBox' required='false' id='${id}_textInput' "+"name='textInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","</td><td>","</td></tr><tr><td colspan='2'>","<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>","<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>","</td></tr></table>"].join(""),htmlTemplate:"<img src=\"${urlInput}\" _djrealurl=\"${urlInput}\" alt=\"${textInput}\" />",tag:"img",_getCurrentValues:function(img){var url,_25;if(img&&img.tagName.toLowerCase()===this.tag){url=img.getAttribute("_djrealurl")||img.getAttribute("src");_25=img.getAttribute("alt");_8.withGlobal(this.editor.window,"selectElement",_d,[img,true]);}else{_25=_8.withGlobal(this.editor.window,_d.getSelectedText);}return {urlInput:url||"",textInput:_25||""};},_isValid:function(){return this._urlInput.isValid();},_connectTagEvents:function(){this.inherited(arguments);this.editor.onLoadDeferred.addCallback(_5.hitch(this,function(){this.connect(this.editor.editNode,"onmousedown",this._selectTag);}));},_selectTag:function(e){if(e&&e.target){var t=e.target;var tg=t.tagName?t.tagName.toLowerCase():"";if(tg===this.tag){_8.withGlobal(this.editor.window,"selectElement",_d,[t]);}}},_checkValues:function(_26){if(_26&&_26.urlInput){_26.urlInput=_26.urlInput.replace(/"/g,"&quot;");}if(_26&&_26.textInput){_26.textInput=_26.textInput.replace(/"/g,"&quot;");}return _26;},_onDblClick:function(e){if(e&&e.target){var t=e.target;var tg=t.tagName?t.tagName.toLowerCase():"";if(tg===this.tag&&_3.get(t,"src")){var _27=this.editor;_8.withGlobal(_27.window,"selectElement",_d,[t]);_27.onDisplayChanged();if(_27._updateTimer){clearTimeout(_27._updateTimer);delete _27._updateTimer;}_27.onNormalizedDisplayChanged();var _28=this.button;setTimeout(function(){_28.set("disabled",false);_28.loadAndOpenDropDown().then(function(){if(_28.dropDown.focus){_28.dropDown.focus();}});},10);}}}});_a.registry["createLink"]=function(){return new _e({command:"createLink"});};_a.registry["insertImage"]=function(){return new _24({command:"insertImage"});};_e.ImgLinkDialog=_24;return _e;}); \ No newline at end of file
+define("dijit/_editor/plugins/LinkDialog",["require","dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/_base/query","dojo/string","../../_Widget","../_Plugin","../../form/DropDownButton","../range"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){var _d=_2("dijit._editor.plugins.LinkDialog",_a,{buttonClass:_b,useDefaultCommand:false,urlRegExp:"((https?|ftps?|file)\\://|./|../|/|)(/[a-zA-Z]{1,1}:/|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)*(?:[a-zA-Z](?:[-\\da-zA-Z]{0,80}[\\da-zA-Z])?)\\.?)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]|(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])|0[xX]0*[\\da-fA-F]{1,8}|([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}|([\\da-fA-F]{1,4}\\:){6}((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])))(\\:\\d+)?(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]{0,}(?:\\?[^?#\\s/]*)?(?:#.*)?)?)?",emailRegExp:"<?(mailto\\:)([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+"+"@"+"((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)+(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)\\.?)|localhost|^[^-][a-zA-Z0-9_-]*>?",htmlTemplate:"<a href=\"${urlInput}\" _djrealurl=\"${urlInput}\""+" target=\"${targetSelect}\""+">${textInput}</a>",tag:"a",_hostRxp:/^((([^\[:]+):)?([^@]+)@)?(\[([^\]]+)\]|([^\[:]*))(:([0-9]+))?$/,_userAtRxp:/^([!#-'*+\-\/-9=?A-Z^-~]+[.])*[!#-'*+\-\/-9=?A-Z^-~]+@/i,linkDialogTemplate:["<table role='presentation'><tr><td>","<label for='${id}_urlInput'>${url}</label>","</td><td>","<input data-dojo-type='dijit.form.ValidationTextBox' required='true' "+"id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","<label for='${id}_textInput'>${text}</label>","</td><td>","<input data-dojo-type='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' "+"name='textInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","<label for='${id}_targetSelect'>${target}</label>","</td><td>","<select id='${id}_targetSelect' name='targetSelect' data-dojo-type='dijit.form.Select'>","<option selected='selected' value='_self'>${currentWindow}</option>","<option value='_blank'>${newWindow}</option>","<option value='_top'>${topWindow}</option>","<option value='_parent'>${parentWindow}</option>","</select>","</td></tr><tr><td colspan='2'>","<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>","<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>","</td></tr></table>"].join(""),_initButton:function(){this.inherited(arguments);this.button.loadDropDown=_5.hitch(this,"_loadDropDown");this._connectTagEvents();},_loadDropDown:function(_e){_1(["dojo/i18n","../../TooltipDialog","../../registry","../../form/Button","../../form/Select","../../form/ValidationTextBox","dojo/i18n!../../nls/common","dojo/i18n!../nls/LinkDialog"],_5.hitch(this,function(_f,_10,_11){var _12=this;this.tag=this.command=="insertImage"?"img":"a";var _13=_5.delegate(_f.getLocalization("dijit","common",this.lang),_f.getLocalization("dijit._editor","LinkDialog",this.lang));var _14=(this.dropDown=this.button.dropDown=new _10({title:_13[this.command+"Title"],ownerDocument:this.editor.ownerDocument,dir:this.editor.dir,execute:_5.hitch(this,"setValue"),onOpen:function(){_12._onOpenDialog();_10.prototype.onOpen.apply(this,arguments);},onCancel:function(){setTimeout(_5.hitch(_12,"_onCloseDialog"),0);}}));_13.urlRegExp=this.urlRegExp;_13.id=_11.getUniqueId(this.editor.id);this._uniqueId=_13.id;this._setContent(_14.title+"<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>"+_8.substitute(this.linkDialogTemplate,_13));_14.startup();this._urlInput=_11.byId(this._uniqueId+"_urlInput");this._textInput=_11.byId(this._uniqueId+"_textInput");this._setButton=_11.byId(this._uniqueId+"_setButton");this.connect(_11.byId(this._uniqueId+"_cancelButton"),"onClick",function(){this.dropDown.onCancel();});if(this._urlInput){this.connect(this._urlInput,"onChange","_checkAndFixInput");}if(this._textInput){this.connect(this._textInput,"onChange","_checkAndFixInput");}this._urlRegExp=new RegExp("^"+this.urlRegExp+"$","i");this._emailRegExp=new RegExp("^"+this.emailRegExp+"$","i");this._urlInput.isValid=_5.hitch(this,function(){var _15=this._urlInput.get("value");return this._urlRegExp.test(_15)||this._emailRegExp.test(_15);});this.connect(_14.domNode,"onkeypress",function(e){if(e&&e.charOrCode==_4.ENTER&&!e.shiftKey&&!e.metaKey&&!e.ctrlKey&&!e.altKey){if(!this._setButton.get("disabled")){_14.onExecute();_14.execute(_14.get("value"));}}});_e();}));},_checkAndFixInput:function(){var _16=this;var url=this._urlInput.get("value");var _17=function(url){var _18=false;var _19=false;if(url&&url.length>1){url=_5.trim(url);if(url.indexOf("mailto:")!==0){if(url.indexOf("/")>0){if(url.indexOf("://")===-1){if(url.charAt(0)!=="/"&&url.indexOf("./")&&url.indexOf("../")!==0){if(_16._hostRxp.test(url)){_18=true;}}}}else{if(_16._userAtRxp.test(url)){_19=true;}}}}if(_18){_16._urlInput.set("value","http://"+url);}if(_19){_16._urlInput.set("value","mailto:"+url);}_16._setButton.set("disabled",!_16._isValid());};if(this._delayedCheck){clearTimeout(this._delayedCheck);this._delayedCheck=null;}this._delayedCheck=setTimeout(function(){_17(url);},250);},_connectTagEvents:function(){this.editor.onLoadDeferred.then(_5.hitch(this,function(){this.connect(this.editor.editNode,"ondblclick",this._onDblClick);}));},_isValid:function(){return this._urlInput.isValid()&&this._textInput.isValid();},_setContent:function(_1a){this.dropDown.set({parserScope:"dojo",content:_1a});},_checkValues:function(_1b){if(_1b&&_1b.urlInput){_1b.urlInput=_1b.urlInput.replace(/"/g,"&quot;");}return _1b;},setValue:function(_1c){this._onCloseDialog();if(_6("ie")<9){var sel=_c.getSelection(this.editor.window);var _1d=sel.getRangeAt(0);var a=_1d.endContainer;if(a.nodeType===3){a=a.parentNode;}if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){a=this.editor._sCall("getSelectedElement",[this.tag]);}if(a&&(a.nodeName&&a.nodeName.toLowerCase()===this.tag)){if(this.editor.queryCommandEnabled("unlink")){this.editor._sCall("selectElementChildren",[a]);this.editor.execCommand("unlink");}}}_1c=this._checkValues(_1c);this.editor.execCommand("inserthtml",_8.substitute(this.htmlTemplate,_1c));_7("a",this.editor.document).forEach(function(a){if(!a.innerHTML&&!_3.has(a,"name")){a.parentNode.removeChild(a);}},this);},_onCloseDialog:function(){this.editor.focus();},_getCurrentValues:function(a){var url,_1e,_1f;if(a&&a.tagName.toLowerCase()===this.tag){url=a.getAttribute("_djrealurl")||a.getAttribute("href");_1f=a.getAttribute("target")||"_self";_1e=a.textContent||a.innerText;this.editor._sCall("selectElement",[a,true]);}else{_1e=this.editor._sCall("getSelectedText");}return {urlInput:url||"",textInput:_1e||"",targetSelect:_1f||""};},_onOpenDialog:function(){var a,b,fc;if(_6("ie")){var sel=_c.getSelection(this.editor.window);if(sel.rangeCount){var _20=sel.getRangeAt(0);a=_20.endContainer;if(a.nodeType===3){a=a.parentNode;}if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){a=this.editor._sCall("getSelectedElement",[this.tag]);}if(!a||(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){b=this.editor._sCall("getAncestorElement",[this.tag]);if(b&&(b.nodeName&&b.nodeName.toLowerCase()==this.tag)){a=b;this.editor._sCall("selectElement",[a]);}else{if(_20.startContainer===_20.endContainer){fc=_20.startContainer.firstChild;if(fc&&(fc.nodeName&&fc.nodeName.toLowerCase()==this.tag)){a=fc;this.editor._sCall("selectElement",[a]);}}}}}}else{a=this.editor._sCall("getAncestorElement",[this.tag]);}this.dropDown.reset();this._setButton.set("disabled",true);this.dropDown.set("value",this._getCurrentValues(a));},_onDblClick:function(e){if(e&&e.target){var t=e.target;var tg=t.tagName?t.tagName.toLowerCase():"";if(tg===this.tag&&_3.get(t,"href")){var _21=this.editor;this.editor._sCall("selectElement",[t]);_21.onDisplayChanged();if(_21._updateTimer){_21._updateTimer.remove();delete _21._updateTimer;}_21.onNormalizedDisplayChanged();var _22=this.button;setTimeout(function(){_22.set("disabled",false);_22.loadAndOpenDropDown().then(function(){if(_22.dropDown.focus){_22.dropDown.focus();}});},10);}}}});var _23=_2("dijit._editor.plugins.ImgLinkDialog",[_d],{linkDialogTemplate:["<table role='presentation'><tr><td>","<label for='${id}_urlInput'>${url}</label>","</td><td>","<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' "+"required='true' id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","<label for='${id}_textInput'>${text}</label>","</td><td>","<input data-dojo-type='dijit.form.ValidationTextBox' required='false' id='${id}_textInput' "+"name='textInput' data-dojo-props='intermediateChanges:true'/>","</td></tr><tr><td>","</td><td>","</td></tr><tr><td colspan='2'>","<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>","<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>","</td></tr></table>"].join(""),htmlTemplate:"<img src=\"${urlInput}\" _djrealurl=\"${urlInput}\" alt=\"${textInput}\" />",tag:"img",_getCurrentValues:function(img){var url,_24;if(img&&img.tagName.toLowerCase()===this.tag){url=img.getAttribute("_djrealurl")||img.getAttribute("src");_24=img.getAttribute("alt");this.editor._sCall("selectElement",[img,true]);}else{_24=this.editor._sCall("getSelectedText",[]);}return {urlInput:url||"",textInput:_24||""};},_isValid:function(){return this._urlInput.isValid();},_connectTagEvents:function(){this.inherited(arguments);this.editor.onLoadDeferred.then(_5.hitch(this,function(){this.connect(this.editor.editNode,"onmousedown",this._selectTag);}));},_selectTag:function(e){if(e&&e.target){var t=e.target;var tg=t.tagName?t.tagName.toLowerCase():"";if(tg===this.tag){this.editor._sCall("selectElement",[t]);}}},_checkValues:function(_25){if(_25&&_25.urlInput){_25.urlInput=_25.urlInput.replace(/"/g,"&quot;");}if(_25&&_25.textInput){_25.textInput=_25.textInput.replace(/"/g,"&quot;");}return _25;},_onDblClick:function(e){if(e&&e.target){var t=e.target;var tg=t.tagName?t.tagName.toLowerCase():"";if(tg===this.tag&&_3.get(t,"src")){var _26=this.editor;this.editor._sCall("selectElement",[t]);_26.onDisplayChanged();if(_26._updateTimer){_26._updateTimer.remove();delete _26._updateTimer;}_26.onNormalizedDisplayChanged();var _27=this.button;setTimeout(function(){_27.set("disabled",false);_27.loadAndOpenDropDown().then(function(){if(_27.dropDown.focus){_27.dropDown.focus();}});},10);}}}});_a.registry["createLink"]=function(){return new _d({command:"createLink"});};_a.registry["insertImage"]=function(){return new _23({command:"insertImage"});};_d.ImgLinkDialog=_23;return _d;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..5ed6ce3da
--- /dev/null
+++ b/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js
@@ -0,0 +1,609 @@
+define("dijit/_editor/plugins/LinkDialog", [
+ "require",
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.get
+ "dojo/keys", // keys.ENTER
+ "dojo/_base/lang", // lang.delegate lang.hitch lang.trim
+ "dojo/sniff", // has("ie")
+ "dojo/_base/query", // query
+ "dojo/string", // string.substitute
+ "../../_Widget",
+ "../_Plugin",
+ "../../form/DropDownButton",
+ "../range"
+], function(require, declare, domAttr, keys, lang, has, query, string,
+ _Widget, _Plugin, DropDownButton, rangeapi){
+
+
+// module:
+// dijit/_editor/plugins/LinkDialog
+// summary:
+// Editor plugins: LinkDialog (for inserting links) and ImgLinkDialog (for inserting images)
+
+
+var LinkDialog = declare("dijit._editor.plugins.LinkDialog", _Plugin, {
+ // summary:
+ // This plugin provides the basis for an 'anchor' (link) dialog and an extension of it
+ // provides the image link dialog.
+ // description:
+ // The command provided by this plugin is:
+ //
+ // - createLink
+
+ // Override _Plugin.buttonClass. This plugin is controlled by a DropDownButton
+ // (which triggers a TooltipDialog).
+ buttonClass: DropDownButton,
+
+ // Override _Plugin.useDefaultCommand... processing is handled by this plugin, not by dijit/Editor.
+ useDefaultCommand: false,
+
+ // urlRegExp: [protected] String
+ // Used for validating input as correct URL. While file:// urls are not terribly
+ // useful, they are technically valid.
+ urlRegExp: "((https?|ftps?|file)\\://|\./|\.\./|/|)(/[a-zA-Z]{1,1}:/|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)*(?:[a-zA-Z](?:[-\\da-zA-Z]{0,80}[\\da-zA-Z])?)\\.?)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]|(0|[1-9]\\d{0,8}|[1-3]\\d{9}|4[01]\\d{8}|42[0-8]\\d{7}|429[0-3]\\d{6}|4294[0-8]\\d{5}|42949[0-5]\\d{4}|429496[0-6]\\d{3}|4294967[01]\\d{2}|42949672[0-8]\\d|429496729[0-5])|0[xX]0*[\\da-fA-F]{1,8}|([\\da-fA-F]{1,4}\\:){7}[\\da-fA-F]{1,4}|([\\da-fA-F]{1,4}\\:){6}((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])))(\\:\\d+)?(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]{0,}(?:\\?[^?#\\s/]*)?(?:#.*)?)?)?",
+
+ // emailRegExp: [protected] String
+ // Used for validating input as correct email address. Taken from dojox.validate
+ emailRegExp: "<?(mailto\\:)([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+" /*username*/ + "@" +
+ "((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)+(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)\\.?)|localhost|^[^-][a-zA-Z0-9_-]*>?", // host.
+
+ // htmlTemplate: [protected] String
+ // String used for templating the HTML to insert at the desired point.
+ htmlTemplate: "<a href=\"${urlInput}\" _djrealurl=\"${urlInput}\"" +
+ " target=\"${targetSelect}\"" +
+ ">${textInput}</a>",
+
+ // tag: [protected] String
+ // Tag used for the link type.
+ tag: "a",
+
+ // _hostRxp [private] RegExp
+ // Regular expression used to validate url fragments (ip address, hostname, etc)
+ _hostRxp: /^((([^\[:]+):)?([^@]+)@)?(\[([^\]]+)\]|([^\[:]*))(:([0-9]+))?$/,
+
+ // _userAtRxp [private] RegExp
+ // Regular expression used to validate e-mail address fragment.
+ _userAtRxp: /^([!#-'*+\-\/-9=?A-Z^-~]+[.])*[!#-'*+\-\/-9=?A-Z^-~]+@/i,
+
+ // linkDialogTemplate: [protected] String
+ // Template for contents of TooltipDialog to pick URL
+ linkDialogTemplate: [
+ "<table role='presentation'><tr><td>",
+ "<label for='${id}_urlInput'>${url}</label>",
+ "</td><td>",
+ "<input data-dojo-type='dijit.form.ValidationTextBox' required='true' " +
+ "id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>",
+ "</td></tr><tr><td>",
+ "<label for='${id}_textInput'>${text}</label>",
+ "</td><td>",
+ "<input data-dojo-type='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' " +
+ "name='textInput' data-dojo-props='intermediateChanges:true'/>",
+ "</td></tr><tr><td>",
+ "<label for='${id}_targetSelect'>${target}</label>",
+ "</td><td>",
+ "<select id='${id}_targetSelect' name='targetSelect' data-dojo-type='dijit.form.Select'>",
+ "<option selected='selected' value='_self'>${currentWindow}</option>",
+ "<option value='_blank'>${newWindow}</option>",
+ "<option value='_top'>${topWindow}</option>",
+ "<option value='_parent'>${parentWindow}</option>",
+ "</select>",
+ "</td></tr><tr><td colspan='2'>",
+ "<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>",
+ "<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>",
+ "</td></tr></table>"
+ ].join(""),
+
+ _initButton: function(){
+ this.inherited(arguments);
+
+ // Setup to lazy create TooltipDialog first time the button is clicked
+ this.button.loadDropDown = lang.hitch(this, "_loadDropDown");
+
+ this._connectTagEvents();
+ },
+ _loadDropDown: function(callback){
+ // Called the first time the button is pressed. Initialize TooltipDialog.
+ require([
+ "dojo/i18n", // i18n.getLocalization
+ "../../TooltipDialog",
+ "../../registry", // registry.byId, registry.getUniqueId
+ "../../form/Button", // used by template
+ "../../form/Select", // used by template
+ "../../form/ValidationTextBox", // used by template
+ "dojo/i18n!../../nls/common",
+ "dojo/i18n!../nls/LinkDialog"
+ ], lang.hitch(this, function(i18n, TooltipDialog, registry){
+ var _this = this;
+ this.tag = this.command == 'insertImage' ? 'img' : 'a';
+ var messages = lang.delegate(i18n.getLocalization("dijit", "common", this.lang),
+ i18n.getLocalization("dijit._editor", "LinkDialog", this.lang));
+ var dropDown = (this.dropDown = this.button.dropDown = new TooltipDialog({
+ title: messages[this.command + "Title"],
+ ownerDocument: this.editor.ownerDocument,
+ dir: this.editor.dir,
+ execute: lang.hitch(this, "setValue"),
+ onOpen: function(){
+ _this._onOpenDialog();
+ TooltipDialog.prototype.onOpen.apply(this, arguments);
+ },
+ onCancel: function(){
+ setTimeout(lang.hitch(_this, "_onCloseDialog"),0);
+ }
+ }));
+ messages.urlRegExp = this.urlRegExp;
+ messages.id = registry.getUniqueId(this.editor.id);
+ this._uniqueId = messages.id;
+ this._setContent(dropDown.title +
+ "<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>" +
+ string.substitute(this.linkDialogTemplate, messages));
+ dropDown.startup();
+ this._urlInput = registry.byId(this._uniqueId + "_urlInput");
+ this._textInput = registry.byId(this._uniqueId + "_textInput");
+ this._setButton = registry.byId(this._uniqueId + "_setButton");
+ this.connect(registry.byId(this._uniqueId + "_cancelButton"), "onClick", function(){
+ this.dropDown.onCancel();
+ });
+ if(this._urlInput){
+ this.connect(this._urlInput, "onChange", "_checkAndFixInput");
+ }
+ if(this._textInput){
+ this.connect(this._textInput, "onChange", "_checkAndFixInput");
+ }
+
+ // Build up the dual check for http/https/file:, and mailto formats.
+ this._urlRegExp = new RegExp("^" + this.urlRegExp + "$", "i");
+ this._emailRegExp = new RegExp("^" + this.emailRegExp + "$", "i");
+ this._urlInput.isValid = lang.hitch(this, function(){
+ // Function over-ride of isValid to test if the input matches a url or a mailto style link.
+ var value = this._urlInput.get("value");
+ return this._urlRegExp.test(value) || this._emailRegExp.test(value);
+ });
+
+ // Listen for enter and execute if valid.
+ this.connect(dropDown.domNode, "onkeypress", function(e){
+ if(e && e.charOrCode == keys.ENTER &&
+ !e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey){
+ if(!this._setButton.get("disabled")){
+ dropDown.onExecute();
+ dropDown.execute(dropDown.get('value'));
+ }
+ }
+ });
+
+ callback();
+ }));
+ },
+
+ _checkAndFixInput: function(){
+ // summary:
+ // A function to listen for onChange events and test the input contents
+ // for valid information, such as valid urls with http/https/ftp and if
+ // not present, try and guess if the input url is relative or not, and if
+ // not, append http:// to it. Also validates other fields as determined by
+ // the internal _isValid function.
+ var self = this;
+ var url = this._urlInput.get("value");
+ var fixupUrl = function(url){
+ var appendHttp = false;
+ var appendMailto = false;
+ if(url && url.length > 1){
+ url = lang.trim(url);
+ if(url.indexOf("mailto:") !== 0){
+ if(url.indexOf("/") > 0){
+ if(url.indexOf("://") === -1){
+ // Check that it doesn't start with /, ./, or ../, which would
+ // imply 'target server relativeness'
+ if(url.charAt(0) !== '/' && url.indexOf("./") && url.indexOf("../") !== 0){
+ if(self._hostRxp.test(url)){
+ appendHttp = true;
+ }
+ }
+ }
+ }else if(self._userAtRxp.test(url)){
+ // If it looks like a foo@, append a mailto.
+ appendMailto = true;
+ }
+ }
+ }
+ if(appendHttp){
+ self._urlInput.set("value", "http://" + url);
+ }
+ if(appendMailto){
+ self._urlInput.set("value", "mailto:" + url);
+ }
+ self._setButton.set("disabled", !self._isValid());
+ };
+ if(this._delayedCheck){
+ clearTimeout(this._delayedCheck);
+ this._delayedCheck = null;
+ }
+ this._delayedCheck = setTimeout(function(){
+ fixupUrl(url);
+ }, 250);
+ },
+
+ _connectTagEvents: function(){
+ // summary:
+ // Over-ridable function that connects tag specific events.
+ this.editor.onLoadDeferred.then(lang.hitch(this, function(){
+ this.connect(this.editor.editNode, "ondblclick", this._onDblClick);
+ }));
+ },
+
+ _isValid: function(){
+ // summary:
+ // Internal function to allow validating of the inputs
+ // for a link to determine if set should be disabled or not
+ // tags:
+ // protected
+ return this._urlInput.isValid() && this._textInput.isValid();
+ },
+
+ _setContent: function(staticPanel){
+ // summary:
+ // Helper for _initButton above. Not sure why it's a separate method.
+ this.dropDown.set({
+ parserScope: "dojo", // make parser search for dojoType/data-dojo-type even if page is multi-version
+ content: staticPanel
+ });
+ },
+
+ _checkValues: function(args){
+ // summary:
+ // Function to check the values in args and 'fix' them up as needed.
+ // args: Object
+ // Content being set.
+ // tags:
+ // protected
+ if(args && args.urlInput){
+ args.urlInput = args.urlInput.replace(/"/g, "&quot;");
+ }
+ return args;
+ },
+
+ setValue: function(args){
+ // summary:
+ // Callback from the dialog when user presses "set" button.
+ // tags:
+ // private
+
+ // TODO: prevent closing popup if the text is empty
+ this._onCloseDialog();
+ if(has("ie") < 9){ //see #4151
+ var sel = rangeapi.getSelection(this.editor.window);
+ var range = sel.getRangeAt(0);
+ var a = range.endContainer;
+ if(a.nodeType === 3){
+ // Text node, may be the link contents, so check parent.
+ // This plugin doesn't really support nested HTML elements
+ // in the link, it assumes all link content is text.
+ a = a.parentNode;
+ }
+ if(a && (a.nodeName && a.nodeName.toLowerCase() !== this.tag)){
+ // Still nothing, one last thing to try on IE, as it might be 'img'
+ // and thus considered a control.
+ a = this.editor._sCall("getSelectedElement", [this.tag]);
+ }
+ if(a && (a.nodeName && a.nodeName.toLowerCase() === this.tag)){
+ // Okay, we do have a match. IE, for some reason, sometimes pastes before
+ // instead of removing the targeted paste-over element, so we unlink the
+ // old one first. If we do not the <a> tag remains, but it has no content,
+ // so isn't readily visible (but is wrong for the action).
+ if(this.editor.queryCommandEnabled("unlink")){
+ // Select all the link children, then unlink. The following insert will
+ // then replace the selected text.
+ this.editor._sCall("selectElementChildren", [a]);
+ this.editor.execCommand("unlink");
+ }
+ }
+ }
+ // make sure values are properly escaped, etc.
+ args = this._checkValues(args);
+ this.editor.execCommand('inserthtml',
+ string.substitute(this.htmlTemplate, args));
+
+ // IE sometimes leaves a blank link, so we need to fix it up.
+ // Go ahead and do this for everyone just to avoid blank links
+ // in the page.
+ query("a", this.editor.document).forEach(function(a){
+ if(!a.innerHTML && !domAttr.has(a, "name")){
+ // Remove empty anchors that do not have "name" set.
+ // Empty ones with a name set could be a hidden hash
+ // anchor.
+ a.parentNode.removeChild(a);
+ }
+ }, this);
+ },
+
+ _onCloseDialog: function(){
+ // summary:
+ // Handler for close event on the dialog
+ this.editor.focus();
+ },
+
+ _getCurrentValues: function(a){
+ // summary:
+ // Over-ride for getting the values to set in the dropdown.
+ // a:
+ // The anchor/link to process for data for the dropdown.
+ // tags:
+ // protected
+ var url, text, target;
+ if(a && a.tagName.toLowerCase() === this.tag){
+ url = a.getAttribute('_djrealurl') || a.getAttribute('href');
+ target = a.getAttribute('target') || "_self";
+ text = a.textContent || a.innerText;
+ this.editor._sCall("selectElement", [a, true]);
+ }else{
+ text = this.editor._sCall("getSelectedText");
+ }
+ return {urlInput: url || '', textInput: text || '', targetSelect: target || ''}; //Object;
+ },
+
+ _onOpenDialog: function(){
+ // summary:
+ // Handler for when the dialog is opened.
+ // If the caret is currently in a URL then populate the URL's info into the dialog.
+ var a,b,fc;
+ if(has("ie")){
+ // IE, even IE10, is difficult to select the element in, using the range unified
+ // API seems to work reasonably well.
+ var sel = rangeapi.getSelection(this.editor.window);
+ if(sel.rangeCount){
+ var range = sel.getRangeAt(0);
+ a = range.endContainer;
+ if(a.nodeType === 3){
+ // Text node, may be the link contents, so check parent.
+ // This plugin doesn't really support nested HTML elements
+ // in the link, it assumes all link content is text.
+ a = a.parentNode;
+ }
+ if(a && (a.nodeName && a.nodeName.toLowerCase() !== this.tag)){
+ // Still nothing, one last thing to try on IE, as it might be 'img'
+ // and thus considered a control.
+ a = this.editor._sCall("getSelectedElement", [this.tag]);
+ }
+ if(!a || (a.nodeName && a.nodeName.toLowerCase() !== this.tag)){
+ // Try another lookup, IE's selection is just terrible.
+ b = this.editor._sCall("getAncestorElement", [this.tag]);
+ if(b && (b.nodeName && b.nodeName.toLowerCase() == this.tag)){
+ // Looks like we found an A tag, use it and make sure just it is
+ // selected.
+ a = b;
+ this.editor._sCall("selectElement", [a]);
+ }else if (range.startContainer === range.endContainer){
+ // STILL nothing. Trying one more thing. Lets look at the first child.
+ // It might be an anchor tag in a div by itself or the like. If it is,
+ // we'll use it otherwise we give up. The selection is not easily
+ // determinable to be on an existing anchor tag.
+ fc = range.startContainer.firstChild;
+ if(fc && (fc.nodeName && fc.nodeName.toLowerCase() == this.tag)){
+ a = fc;
+ this.editor._sCall("selectElement", [a]);
+ }
+ }
+ }
+ }
+ }else{
+ a = this.editor._sCall("getAncestorElement", [this.tag]);
+ }
+ this.dropDown.reset();
+ this._setButton.set("disabled", true);
+ this.dropDown.set("value", this._getCurrentValues(a));
+ },
+
+ _onDblClick: function(e){
+ // summary:
+ // Function to define a behavior on double clicks on the element
+ // type this dialog edits to select it and pop up the editor
+ // dialog.
+ // e: Object
+ // The double-click event.
+ // tags:
+ // protected.
+ if(e && e.target){
+ var t = e.target;
+ var tg = t.tagName ? t.tagName.toLowerCase() : "";
+ if(tg === this.tag && domAttr.get(t,"href")){
+ var editor = this.editor;
+
+ this.editor._sCall("selectElement", [t]);
+ editor.onDisplayChanged();
+
+ // Call onNormalizedDisplayChange() now, rather than on timer.
+ // On IE, when focus goes to the first <input> in the TooltipDialog, the editor loses it's selection.
+ // Later if onNormalizedDisplayChange() gets called via the timer it will disable the LinkDialog button
+ // (actually, all the toolbar buttons), at which point clicking the <input> will close the dialog,
+ // since (for unknown reasons) focus.js ignores disabled controls.
+ if(editor._updateTimer){
+ editor._updateTimer.remove();
+ delete editor._updateTimer;
+ }
+ editor.onNormalizedDisplayChanged();
+
+ var button = this.button;
+ setTimeout(function(){
+ // Focus shift outside the event handler.
+ // IE doesn't like focus changes in event handles.
+ button.set("disabled", false);
+ button.loadAndOpenDropDown().then(function(){
+ if(button.dropDown.focus){
+ button.dropDown.focus();
+ }
+ });
+ }, 10);
+ }
+ }
+ }
+});
+
+var ImgLinkDialog = declare("dijit._editor.plugins.ImgLinkDialog", [LinkDialog], {
+ // summary:
+ // This plugin extends LinkDialog and adds in a plugin for handling image links.
+ // provides the image link dialog.
+ // description:
+ // The command provided by this plugin is:
+ //
+ // - insertImage
+
+ // linkDialogTemplate: [protected] String
+ // Over-ride for template since img dialog doesn't need target that anchor tags may.
+ linkDialogTemplate: [
+ "<table role='presentation'><tr><td>",
+ "<label for='${id}_urlInput'>${url}</label>",
+ "</td><td>",
+ "<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' " +
+ "required='true' id='${id}_urlInput' name='urlInput' data-dojo-props='intermediateChanges:true'/>",
+ "</td></tr><tr><td>",
+ "<label for='${id}_textInput'>${text}</label>",
+ "</td><td>",
+ "<input data-dojo-type='dijit.form.ValidationTextBox' required='false' id='${id}_textInput' " +
+ "name='textInput' data-dojo-props='intermediateChanges:true'/>",
+ "</td></tr><tr><td>",
+ "</td><td>",
+ "</td></tr><tr><td colspan='2'>",
+ "<button data-dojo-type='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>",
+ "<button data-dojo-type='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>",
+ "</td></tr></table>"
+ ].join(""),
+
+ // htmlTemplate: [protected] String
+ // String used for templating the `<img>` HTML to insert at the desired point.
+ htmlTemplate: "<img src=\"${urlInput}\" _djrealurl=\"${urlInput}\" alt=\"${textInput}\" />",
+
+ // tag: [protected] String
+ // Tag used for the link type (img).
+ tag: "img",
+
+ _getCurrentValues: function(img){
+ // summary:
+ // Over-ride for getting the values to set in the dropdown.
+ // a:
+ // The anchor/link to process for data for the dropdown.
+ // tags:
+ // protected
+ var url, text;
+ if(img && img.tagName.toLowerCase() === this.tag){
+ url = img.getAttribute('_djrealurl') || img.getAttribute('src');
+ text = img.getAttribute('alt');
+ this.editor._sCall("selectElement", [img, true]);
+ }else{
+ text = this.editor._sCall("getSelectedText", []);
+ }
+ return {urlInput: url || '', textInput: text || ''}; //Object
+ },
+
+ _isValid: function(){
+ // summary:
+ // Over-ride for images. You can have alt text of blank, it is valid.
+ // tags:
+ // protected
+ return this._urlInput.isValid();
+ },
+
+ _connectTagEvents: function(){
+ // summary:
+ // Over-ridable function that connects tag specific events.
+ this.inherited(arguments);
+ this.editor.onLoadDeferred.then(lang.hitch(this, function(){
+ // Use onmousedown instead of onclick. Seems that IE eats the first onclick
+ // to wrap it in a selector box, then the second one acts as onclick. See #10420
+ this.connect(this.editor.editNode, "onmousedown", this._selectTag);
+ }));
+ },
+
+ _selectTag: function(e){
+ // summary:
+ // A simple event handler that lets me select an image if it is clicked on.
+ // makes it easier to select images in a standard way across browsers. Otherwise
+ // selecting an image for edit becomes difficult.
+ // e: Event
+ // The mousedown event.
+ // tags:
+ // private
+ if(e && e.target){
+ var t = e.target;
+ var tg = t.tagName? t.tagName.toLowerCase() : "";
+ if(tg === this.tag){
+ this.editor._sCall("selectElement", [t]);
+ }
+ }
+ },
+
+ _checkValues: function(args){
+ // summary:
+ // Function to check the values in args and 'fix' them up as needed
+ // (special characters in the url or alt text)
+ // args: Object
+ // Content being set.
+ // tags:
+ // protected
+ if(args && args.urlInput){
+ args.urlInput = args.urlInput.replace(/"/g, "&quot;");
+ }
+ if(args && args.textInput){
+ args.textInput = args.textInput.replace(/"/g, "&quot;");
+ }
+ return args;
+ },
+
+ _onDblClick: function(e){
+ // summary:
+ // Function to define a behavior on double clicks on the element
+ // type this dialog edits to select it and pop up the editor
+ // dialog.
+ // e: Object
+ // The double-click event.
+ // tags:
+ // protected.
+ if(e && e.target){
+ var t = e.target;
+ var tg = t.tagName ? t.tagName.toLowerCase() : "";
+ if(tg === this.tag && domAttr.get(t,"src")){
+ var editor = this.editor;
+
+ this.editor._sCall("selectElement", [t]);
+ editor.onDisplayChanged();
+
+ // Call onNormalizedDisplayChange() now, rather than on timer.
+ // On IE, when focus goes to the first <input> in the TooltipDialog, the editor loses it's selection.
+ // Later if onNormalizedDisplayChange() gets called via the timer it will disable the LinkDialog button
+ // (actually, all the toolbar buttons), at which point clicking the <input> will close the dialog,
+ // since (for unknown reasons) focus.js ignores disabled controls.
+ if(editor._updateTimer){
+ editor._updateTimer.remove();
+ delete editor._updateTimer;
+ }
+ editor.onNormalizedDisplayChanged();
+
+ var button = this.button;
+ setTimeout(function(){
+ // Focus shift outside the event handler.
+ // IE doesn't like focus changes in event handles.
+ button.set("disabled", false);
+ button.loadAndOpenDropDown().then(function(){
+ if(button.dropDown.focus){
+ button.dropDown.focus();
+ }
+ });
+ }, 10);
+ }
+ }
+ }
+});
+
+// Register these plugins
+_Plugin.registry["createLink"] = function(){
+ return new LinkDialog({command: "createLink"});
+};
+_Plugin.registry["insertImage"] = function(){
+ return new ImgLinkDialog({command: "insertImage"});
+};
+
+
+// Export both LinkDialog and ImgLinkDialog
+// TODO for 2.0: either return both classes in a hash, or split this file into two separate files.
+// Then the documentation for the module can be applied to the hash, and will show up in the API doc.
+LinkDialog.ImgLinkDialog = ImgLinkDialog;
+return LinkDialog;
+});
diff --git a/lib/dijit/_editor/plugins/NewPage.js b/lib/dijit/_editor/plugins/NewPage.js
index 911731a00..bdd07946e 100644
--- a/lib/dijit/_editor/plugins/NewPage.js
+++ b/lib/dijit/_editor/plugins/NewPage.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/NewPage",["dojo/_base/declare","dojo/i18n","dojo/_base/lang","../_Plugin","../../form/Button","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5){var _6=_1("dijit._editor.plugins.NewPage",_4,{content:"<br>",_initButton:function(){var _7=_2.getLocalization("dijit._editor","commands"),_8=this.editor;this.button=new _5({label:_7["newPage"],dir:_8.dir,lang:_8.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"NewPage",tabIndex:"-1",onClick:_3.hitch(this,"_newPage")});},setEditor:function(_9){this.editor=_9;this._initButton();},updateState:function(){this.button.set("disabled",this.get("disabled"));},_newPage:function(){this.editor.beginEditing();this.editor.set("value",this.content);this.editor.endEditing();this.editor.focus();}});_4.registry["newPage"]=_4.registry["newpage"]=function(_a){return new _6({content:("content" in _a)?_a.content:"<br>"});};return _6;}); \ No newline at end of file
+define("dijit/_editor/plugins/NewPage",["dojo/_base/declare","dojo/i18n","dojo/_base/lang","../_Plugin","../../form/Button","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5){var _6=_1("dijit._editor.plugins.NewPage",_4,{content:"<br>",_initButton:function(){var _7=_2.getLocalization("dijit._editor","commands"),_8=this.editor;this.button=new _5({label:_7["newPage"],ownerDocument:_8.ownerDocument,dir:_8.dir,lang:_8.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"NewPage",tabIndex:"-1",onClick:_3.hitch(this,"_newPage")});},setEditor:function(_9){this.editor=_9;this._initButton();},updateState:function(){this.button.set("disabled",this.get("disabled"));},_newPage:function(){this.editor.beginEditing();this.editor.set("value",this.content);this.editor.endEditing();this.editor.focus();}});_4.registry["newPage"]=_4.registry["newpage"]=function(_a){return new _6({content:("content" in _a)?_a.content:"<br>"});};return _6;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js b/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js
new file mode 100644
index 000000000..72b6f686a
--- /dev/null
+++ b/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js
@@ -0,0 +1,77 @@
+define("dijit/_editor/plugins/NewPage", [
+ "dojo/_base/declare", // declare
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.hitch
+ "../_Plugin",
+ "../../form/Button",
+ "dojo/i18n!../nls/commands"
+], function(declare, i18n, lang, _Plugin, Button){
+
+// module:
+// dijit/_editor/plugins/NewPage
+
+
+var NewPage = declare("dijit._editor.plugins.NewPage",_Plugin,{
+ // summary:
+ // This plugin provides a simple 'new page' capability. In other
+ // words, set content to some default user defined string.
+
+ // content: [public] String
+ // The default content to insert into the editor as the new page.
+ // The default is the `<br>` tag, a single blank line.
+ content: "<br>",
+
+ _initButton: function(){
+ // summary:
+ // Over-ride for creation of the Print button.
+ var strings = i18n.getLocalization("dijit._editor", "commands"),
+ editor = this.editor;
+ this.button = new Button({
+ label: strings["newPage"],
+ ownerDocument: editor.ownerDocument,
+ dir: editor.dir,
+ lang: editor.lang,
+ showLabel: false,
+ iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "NewPage",
+ tabIndex: "-1",
+ onClick: lang.hitch(this, "_newPage")
+ });
+ },
+
+ setEditor: function(/*dijit/Editor*/ editor){
+ // summary:
+ // Tell the plugin which Editor it is associated with.
+ // editor: Object
+ // The editor object to attach the newPage capability to.
+ this.editor = editor;
+ this._initButton();
+ },
+
+ updateState: function(){
+ // summary:
+ // Over-ride for button state control for disabled to work.
+ this.button.set("disabled", this.get("disabled"));
+ },
+
+ _newPage: function(){
+ // summary:
+ // Function to set the content to blank.
+ // tags:
+ // private
+ this.editor.beginEditing();
+ this.editor.set("value", this.content);
+ this.editor.endEditing();
+ this.editor.focus();
+ }
+});
+
+// Register this plugin.
+// For back-compat accept "newpage" (all lowercase) too, remove in 2.0
+_Plugin.registry["newPage"] = _Plugin.registry["newpage"] = function(args){
+ return new NewPage({
+ content: ("content" in args)?args.content:"<br>"
+ });
+};
+
+return NewPage;
+});
diff --git a/lib/dijit/_editor/plugins/Print.js b/lib/dijit/_editor/plugins/Print.js
index 7de192d52..b8d83cb2b 100644
--- a/lib/dijit/_editor/plugins/Print.js
+++ b/lib/dijit/_editor/plugins/Print.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/Print",["dojo/_base/declare","dojo/i18n","dojo/_base/lang","dojo/_base/sniff","../../focus","../_Plugin","../../form/Button","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5,_6,_7){var _8=_1("dijit._editor.plugins.Print",_6,{_initButton:function(){var _9=_2.getLocalization("dijit._editor","commands"),_a=this.editor;this.button=new _7({label:_9["print"],dir:_a.dir,lang:_a.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Print",tabIndex:"-1",onClick:_3.hitch(this,"_print")});},setEditor:function(_b){this.editor=_b;this._initButton();this.editor.onLoadDeferred.addCallback(_3.hitch(this,function(){if(!this.editor.iframe.contentWindow["print"]){this.button.set("disabled",true);}}));},updateState:function(){var _c=this.get("disabled");if(!this.editor.iframe.contentWindow["print"]){_c=true;}this.button.set("disabled",_c);},_print:function(){var _d=this.editor.iframe;if(_d.contentWindow["print"]){if(!_4("opera")&&!_4("chrome")){_5.focus(_d);_d.contentWindow.print();}else{var _e=this.editor.document;var _f=this.editor.get("value");_f="<html><head><meta http-equiv='Content-Type' "+"content='text/html; charset='UTF-8'></head><body>"+_f+"</body></html>";var win=window.open("javascript: ''","","status=0,menubar=0,location=0,toolbar=0,"+"width=1,height=1,resizable=0,scrollbars=0");win.document.open();win.document.write(_f);win.document.close();var _10=_e.getElementsByTagName("style");if(_10){var i;for(i=0;i<_10.length;i++){var _11=_10[i].innerHTML;var _12=win.document.createElement("style");_12.appendChild(win.document.createTextNode(_11));win.document.getElementsByTagName("head")[0].appendChild(_12);}}win.print();win.close();}}}});_6.registry["print"]=function(){return new _8({command:"print"});};return _8;}); \ No newline at end of file
+define("dijit/_editor/plugins/Print",["dojo/_base/declare","dojo/i18n","dojo/_base/lang","dojo/sniff","../../focus","../_Plugin","../../form/Button","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5,_6,_7){var _8=_1("dijit._editor.plugins.Print",_6,{_initButton:function(){var _9=_2.getLocalization("dijit._editor","commands"),_a=this.editor;this.button=new _7({label:_9["print"],ownerDocument:_a.ownerDocument,dir:_a.dir,lang:_a.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Print",tabIndex:"-1",onClick:_3.hitch(this,"_print")});},setEditor:function(_b){this.editor=_b;this._initButton();this.editor.onLoadDeferred.then(_3.hitch(this,function(){if(!this.editor.iframe.contentWindow["print"]){this.button.set("disabled",true);}}));},updateState:function(){var _c=this.get("disabled");if(!this.editor.iframe.contentWindow["print"]){_c=true;}this.button.set("disabled",_c);},_print:function(){var _d=this.editor.iframe;if(_d.contentWindow["print"]){if(!_4("opera")&&!_4("chrome")){_5.focus(_d);_d.contentWindow.print();}else{var _e=this.editor.document;var _f=this.editor.get("value");_f="<html><head><meta http-equiv='Content-Type' "+"content='text/html; charset='UTF-8'></head><body>"+_f+"</body></html>";var win=window.open("javascript: ''","","status=0,menubar=0,location=0,toolbar=0,"+"width=1,height=1,resizable=0,scrollbars=0");win.document.open();win.document.write(_f);win.document.close();var _10=_e.getElementsByTagName("style");if(_10){var i;for(i=0;i<_10.length;i++){var _11=_10[i].innerHTML;var _12=win.document.createElement("style");_12.appendChild(win.document.createTextNode(_11));win.document.getElementsByTagName("head")[0].appendChild(_12);}}win.print();win.close();}}}});_6.registry["print"]=function(){return new _8({command:"print"});};return _8;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/Print.js.uncompressed.js b/lib/dijit/_editor/plugins/Print.js.uncompressed.js
new file mode 100644
index 000000000..933633d24
--- /dev/null
+++ b/lib/dijit/_editor/plugins/Print.js.uncompressed.js
@@ -0,0 +1,123 @@
+define("dijit/_editor/plugins/Print", [
+ "dojo/_base/declare", // declare
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.hitch
+ "dojo/sniff", // has("chrome") has("opera")
+ "../../focus", // focus.focus()
+ "../_Plugin",
+ "../../form/Button",
+ "dojo/i18n!../nls/commands"
+], function(declare, i18n, lang, has, focus, _Plugin, Button){
+
+// module:
+// dijit/_editor/plugins/Print
+
+
+var Print = declare("dijit._editor.plugins.Print",_Plugin,{
+ // summary:
+ // This plugin provides Print capability to the editor. When
+ // clicked, the document in the editor frame will be printed.
+
+ _initButton: function(){
+ // summary:
+ // Over-ride for creation of the Print button.
+ var strings = i18n.getLocalization("dijit._editor", "commands"),
+ editor = this.editor;
+ this.button = new Button({
+ label: strings["print"],
+ ownerDocument: editor.ownerDocument,
+ dir: editor.dir,
+ lang: editor.lang,
+ showLabel: false,
+ iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "Print",
+ tabIndex: "-1",
+ onClick: lang.hitch(this, "_print")
+ });
+ },
+
+ setEditor: function(/*dijit/Editor*/ editor){
+ // summary:
+ // Tell the plugin which Editor it is associated with.
+ // editor: Object
+ // The editor object to attach the print capability to.
+ this.editor = editor;
+ this._initButton();
+
+ // Set up a check that we have a print function
+ // and disable button if we do not.
+ this.editor.onLoadDeferred.then(
+ lang.hitch(this, function(){
+ if(!this.editor.iframe.contentWindow["print"]){
+ this.button.set("disabled", true);
+ }
+ })
+ );
+ },
+
+ updateState: function(){
+ // summary:
+ // Over-ride for button state control for disabled to work.
+ var disabled = this.get("disabled");
+ if(!this.editor.iframe.contentWindow["print"]){
+ disabled = true;
+ }
+ this.button.set("disabled", disabled);
+ },
+
+ _print: function(){
+ // summary:
+ // Function to trigger printing of the editor document
+ // tags:
+ // private
+ var edFrame = this.editor.iframe;
+ if(edFrame.contentWindow["print"]){
+ // IE requires the frame to be focused for
+ // print to work, but since this is okay for all
+ // no special casing.
+ if(!has("opera") && !has("chrome")){
+ focus.focus(edFrame);
+ edFrame.contentWindow.print();
+ }else{
+ // Neither Opera nor Chrome 3 et you print single frames.
+ // So, open a new 'window', print it, and close it.
+ // Also, can't use size 0x0, have to use 1x1
+ var edDoc = this.editor.document;
+ var content = this.editor.get("value");
+ content = "<html><head><meta http-equiv='Content-Type' " +
+ "content='text/html; charset='UTF-8'></head><body>" +
+ content + "</body></html>";
+ var win = window.open("javascript: ''",
+ "",
+ "status=0,menubar=0,location=0,toolbar=0," +
+ "width=1,height=1,resizable=0,scrollbars=0");
+ win.document.open();
+ win.document.write(content);
+ win.document.close();
+
+ var styleNodes = edDoc.getElementsByTagName("style");
+ if(styleNodes){
+ // Clone over any editor view styles, since we can't print the iframe
+ // directly.
+ var i;
+ for(i = 0; i < styleNodes.length; i++){
+ var style = styleNodes[i].innerHTML;
+ var sNode = win.document.createElement("style");
+ sNode.appendChild(win.document.createTextNode(style));
+ win.document.getElementsByTagName("head")[0].appendChild(sNode);
+ }
+ }
+ win.print();
+ win.close();
+ }
+ }
+ }
+});
+
+// Register this plugin.
+_Plugin.registry["print"] = function(){
+ return new Print({command: "print"});
+};
+
+
+return Print;
+});
diff --git a/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js b/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js
new file mode 100644
index 000000000..3cd0a136b
--- /dev/null
+++ b/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js
@@ -0,0 +1,60 @@
+define("dijit/_editor/plugins/TabIndent", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.experimental
+ "../_Plugin",
+ "../../form/ToggleButton"
+], function(declare, kernel, _Plugin, ToggleButton){
+
+ // module:
+ // dijit/_editor/plugins/TabIndent
+
+ kernel.experimental("dijit._editor.plugins.TabIndent");
+
+
+ var TabIndent = declare("dijit._editor.plugins.TabIndent", _Plugin, {
+ // summary:
+ // This plugin is used to allow the use of the tab and shift-tab keys
+ // to indent/outdent list items. This overrides the default behavior
+ // of moving focus from/to the toolbar
+
+ // Override _Plugin.useDefaultCommand... processing is handled by this plugin, not by dijit/Editor.
+ useDefaultCommand: false,
+
+ // Override _Plugin.buttonClass to use a ToggleButton for this plugin rather than a vanilla Button
+ buttonClass: ToggleButton,
+
+ command: "tabIndent",
+
+ _initButton: function(){
+ // Override _Plugin._initButton() to setup listener on button click
+ this.inherited(arguments);
+
+ var e = this.editor;
+ this.connect(this.button, "onChange", function(val){
+ e.set("isTabIndent", val);
+ });
+
+ // Set initial checked state of button based on Editor.isTabIndent
+ this.updateState();
+ },
+
+ updateState: function(){
+ // Overrides _Plugin.updateState().
+ // Ctrl-m in the editor will switch tabIndent mode on/off, so we need to react to that.
+ var disabled = this.get("disabled");
+ this.button.set("disabled", disabled);
+ if(disabled){
+ return;
+ }
+ this.button.set('checked', this.editor.isTabIndent, false);
+ }
+ });
+
+ // Register this plugin.
+ _Plugin.registry["tabIndent"] = function(){
+ return new TabIndent({command: "tabIndent"});
+ };
+
+
+ return TabIndent;
+});
diff --git a/lib/dijit/_editor/plugins/TextColor.js b/lib/dijit/_editor/plugins/TextColor.js
index c7943d640..7aa50cd51 100644
--- a/lib/dijit/_editor/plugins/TextColor.js
+++ b/lib/dijit/_editor/plugins/TextColor.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/TextColor",["require","dojo/colors","dojo/_base/declare","dojo/_base/lang","../_Plugin","../../form/DropDownButton"],function(_1,_2,_3,_4,_5,_6){var _7=_3("dijit._editor.plugins.TextColor",_5,{buttonClass:_6,useDefaultCommand:false,_initButton:function(){this.inherited(arguments);var _8=this;this.button.loadDropDown=function(_9){_1(["../../ColorPalette"],_4.hitch(this,function(_a){this.dropDown=new _a({value:_8.value,onChange:function(_b){_8.editor.execCommand(_8.command,_b);}});_9();}));};},updateState:function(){var _c=this.editor;var _d=this.command;if(!_c||!_c.isLoaded||!_d.length){return;}if(this.button){var _e=this.get("disabled");this.button.set("disabled",_e);if(_e){return;}var _f;try{_f=_c.queryCommandValue(_d)||"";}catch(e){_f="";}}if(_f==""){_f="#000000";}if(_f=="transparent"){_f="#ffffff";}if(typeof _f=="string"){if(_f.indexOf("rgb")>-1){_f=_2.fromRgb(_f).toHex();}}else{_f=((_f&255)<<16)|(_f&65280)|((_f&16711680)>>>16);_f=_f.toString(16);_f="#000000".slice(0,7-_f.length)+_f;}this.value=_f;var _10=this.button.dropDown;if(_10&&_f!==_10.get("value")){_10.set("value",_f,false);}}});_5.registry["foreColor"]=function(){return new _7({command:"foreColor"});};_5.registry["hiliteColor"]=function(){return new _7({command:"hiliteColor"});};return _7;}); \ No newline at end of file
+define("dijit/_editor/plugins/TextColor",["require","dojo/colors","dojo/_base/declare","dojo/_base/lang","../_Plugin","../../form/DropDownButton"],function(_1,_2,_3,_4,_5,_6){var _7=_3("dijit._editor.plugins.TextColor",_5,{buttonClass:_6,useDefaultCommand:false,_initButton:function(){this.inherited(arguments);var _8=this;this.button.loadDropDown=function(_9){_1(["../../ColorPalette"],_4.hitch(this,function(_a){this.dropDown=new _a({dir:_8.editor.dir,ownerDocument:_8.editor.ownerDocument,value:_8.value,onChange:function(_b){_8.editor.execCommand(_8.command,_b);}});_9();}));};},updateState:function(){var _c=this.editor;var _d=this.command;if(!_c||!_c.isLoaded||!_d.length){return;}if(this.button){var _e=this.get("disabled");this.button.set("disabled",_e);if(_e){return;}var _f;try{_f=_c.queryCommandValue(_d)||"";}catch(e){_f="";}}if(_f==""){_f="#000000";}if(_f=="transparent"){_f="#ffffff";}if(typeof _f=="string"){if(_f.indexOf("rgb")>-1){_f=_2.fromRgb(_f).toHex();}}else{_f=((_f&255)<<16)|(_f&65280)|((_f&16711680)>>>16);_f=_f.toString(16);_f="#000000".slice(0,7-_f.length)+_f;}this.value=_f;var _10=this.button.dropDown;if(_10&&_f!==_10.get("value")){_10.set("value",_f,false);}}});_5.registry["foreColor"]=function(){return new _7({command:"foreColor"});};_5.registry["hiliteColor"]=function(){return new _7({command:"hiliteColor"});};return _7;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js b/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js
new file mode 100644
index 000000000..b8da7c4a6
--- /dev/null
+++ b/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js
@@ -0,0 +1,115 @@
+define("dijit/_editor/plugins/TextColor", [
+ "require",
+ "dojo/colors", // colors.fromRgb
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang",
+ "../_Plugin",
+ "../../form/DropDownButton"
+], function(require, colors, declare, lang, _Plugin, DropDownButton){
+
+// module:
+// dijit/_editor/plugins/TextColor
+
+
+var TextColor = declare("dijit._editor.plugins.TextColor", _Plugin, {
+ // summary:
+ // This plugin provides dropdown color pickers for setting text color and background color
+ // description:
+ // The commands provided by this plugin are:
+ //
+ // - foreColor - sets the text color
+ // - hiliteColor - sets the background color
+
+ // Override _Plugin.buttonClass to use DropDownButton (with ColorPalette) to control this plugin
+ buttonClass: DropDownButton,
+
+ // useDefaultCommand: Boolean
+ // False as we do not use the default editor command/click behavior.
+ useDefaultCommand: false,
+
+ _initButton: function(){
+ this.inherited(arguments);
+
+ // Setup to lazy load ColorPalette first time the button is clicked
+ var self = this;
+ this.button.loadDropDown = function(callback){
+ require(["../../ColorPalette"], lang.hitch(this, function(ColorPalette){
+ this.dropDown = new ColorPalette({
+ dir: self.editor.dir,
+ ownerDocument: self.editor.ownerDocument,
+ value: self.value,
+ onChange: function(color){
+ self.editor.execCommand(self.command, color);
+ }
+ });
+ callback();
+ }));
+ };
+ },
+
+ updateState: function(){
+ // summary:
+ // Overrides _Plugin.updateState(). This updates the ColorPalette
+ // to show the color of the currently selected text.
+ // tags:
+ // protected
+
+ var _e = this.editor;
+ var _c = this.command;
+ if(!_e || !_e.isLoaded || !_c.length){
+ return;
+ }
+
+ if(this.button){
+ var disabled = this.get("disabled");
+ this.button.set("disabled", disabled);
+ if(disabled){ return; }
+
+ var value;
+ try{
+ value = _e.queryCommandValue(_c)|| "";
+ }catch(e){
+ //Firefox may throw error above if the editor is just loaded, ignore it
+ value = "";
+ }
+ }
+
+ if(value == ""){
+ value = "#000000";
+ }
+ if(value == "transparent"){
+ value = "#ffffff";
+ }
+
+ if(typeof value == "string"){
+ //if RGB value, convert to hex value
+ if(value.indexOf("rgb")> -1){
+ value = colors.fromRgb(value).toHex();
+ }
+ }else{ //it's an integer(IE returns an MS access #)
+ value =((value & 0x0000ff)<< 16)|(value & 0x00ff00)|((value & 0xff0000)>>> 16);
+ value = value.toString(16);
+ value = "#000000".slice(0, 7 - value.length)+ value;
+
+ }
+
+ this.value = value;
+
+ var dropDown = this.button.dropDown;
+ if(dropDown && value !== dropDown.get('value')){
+ dropDown.set('value', value, false);
+ }
+ }
+});
+
+// Register this plugin.
+_Plugin.registry["foreColor"] = function(){
+ return new TextColor({command: "foreColor"});
+};
+_Plugin.registry["hiliteColor"] = function(){
+ return new TextColor({command: "hiliteColor"});
+};
+
+
+return TextColor;
+});
diff --git a/lib/dijit/_editor/plugins/ToggleDir.js b/lib/dijit/_editor/plugins/ToggleDir.js
index 058445a9c..bf16dce9c 100644
--- a/lib/dijit/_editor/plugins/ToggleDir.js
+++ b/lib/dijit/_editor/plugins/ToggleDir.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/ToggleDir",["dojo/_base/declare","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","../_Plugin","../../form/ToggleButton"],function(_1,_2,_3,_4,_5,_6){_3.experimental("dijit._editor.plugins.ToggleDir");var _7=_1("dijit._editor.plugins.ToggleDir",_5,{useDefaultCommand:false,command:"toggleDir",buttonClass:_6,_initButton:function(){this.inherited(arguments);this.editor.onLoadDeferred.addCallback(_4.hitch(this,function(){var _8=this.editor.editorObject.contentWindow.document.documentElement;_8=_8.getElementsByTagName("body")[0];var _9=_2.getComputedStyle(_8).direction=="ltr";this.button.set("checked",!_9);this.connect(this.button,"onChange","_setRtl");}));},updateState:function(){this.button.set("disabled",this.get("disabled"));},_setRtl:function(_a){var _b="ltr";if(_a){_b="rtl";}var _c=this.editor.editorObject.contentWindow.document.documentElement;_c=_c.getElementsByTagName("body")[0];_c.dir=_b;}});_5.registry["toggleDir"]=function(){return new _7({command:"toggleDir"});};return _7;}); \ No newline at end of file
+define("dijit/_editor/plugins/ToggleDir",["dojo/_base/declare","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","../_Plugin","../../form/ToggleButton"],function(_1,_2,_3,_4,_5,_6){_3.experimental("dijit._editor.plugins.ToggleDir");var _7=_1("dijit._editor.plugins.ToggleDir",_5,{useDefaultCommand:false,command:"toggleDir",buttonClass:_6,_initButton:function(){this.inherited(arguments);this.editor.onLoadDeferred.then(_4.hitch(this,function(){var _8=this.editor.editorObject.contentWindow.document.documentElement;_8=_8.getElementsByTagName("body")[0];var _9=_2.getComputedStyle(_8).direction=="ltr";this.button.set("checked",!_9);this.connect(this.button,"onChange","_setRtl");}));},updateState:function(){this.button.set("disabled",this.get("disabled"));},_setRtl:function(_a){var _b="ltr";if(_a){_b="rtl";}var _c=this.editor.editorObject.contentWindow.document.documentElement;_c=_c.getElementsByTagName("body")[0];_c.dir=_b;}});_5.registry["toggleDir"]=function(){return new _7({command:"toggleDir"});};return _7;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js b/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js
new file mode 100644
index 000000000..7b36a21d9
--- /dev/null
+++ b/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js
@@ -0,0 +1,69 @@
+define("dijit/_editor/plugins/ToggleDir", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/_base/kernel", // kernel.experimental
+ "dojo/_base/lang", // lang.hitch
+ "../_Plugin",
+ "../../form/ToggleButton"
+], function(declare, domStyle, kernel, lang, _Plugin, ToggleButton){
+
+ // module:
+ // dijit/_editor/plugins/ToggleDir
+
+ kernel.experimental("dijit._editor.plugins.ToggleDir");
+
+ var ToggleDir = declare("dijit._editor.plugins.ToggleDir", _Plugin, {
+ // summary:
+ // This plugin is used to toggle direction of the edited document,
+ // independent of what direction the whole page is.
+
+ // Override _Plugin.useDefaultCommand: processing is done in this plugin
+ // rather than by sending commands to the Editor
+ useDefaultCommand: false,
+
+ command: "toggleDir",
+
+ // Override _Plugin.buttonClass to use a ToggleButton for this plugin rather than a vanilla Button
+ buttonClass: ToggleButton,
+
+ _initButton: function(){
+ // Override _Plugin._initButton() to setup handler for button click events.
+ this.inherited(arguments);
+ this.editor.onLoadDeferred.then(lang.hitch(this, function(){
+ var editDoc = this.editor.editorObject.contentWindow.document.documentElement;
+ //IE direction has to toggle on the body, not document itself.
+ //If you toggle just the document, things get very strange in the
+ //view. But, the nice thing is this works for all supported browsers.
+ editDoc = editDoc.getElementsByTagName("body")[0];
+ var isLtr = domStyle.getComputedStyle(editDoc).direction == "ltr";
+ this.button.set("checked", !isLtr);
+ this.connect(this.button, "onChange", "_setRtl");
+ }));
+ },
+
+ updateState: function(){
+ // summary:
+ // Over-ride for button state control for disabled to work.
+ this.button.set("disabled", this.get("disabled"));
+ },
+
+ _setRtl: function(rtl){
+ // summary:
+ // Handler for button click events, to switch the text direction of the editor
+ var dir = "ltr";
+ if(rtl){
+ dir = "rtl";
+ }
+ var editDoc = this.editor.editorObject.contentWindow.document.documentElement;
+ editDoc = editDoc.getElementsByTagName("body")[0];
+ editDoc.dir/*html node*/ = dir;
+ }
+ });
+
+ // Register this plugin.
+ _Plugin.registry["toggleDir"] = function(){
+ return new ToggleDir({command: "toggleDir"});
+ };
+
+ return ToggleDir;
+});
diff --git a/lib/dijit/_editor/plugins/ViewSource.js b/lib/dijit/_editor/plugins/ViewSource.js
index c788fa048..e235ed09b 100644
--- a/lib/dijit/_editor/plugins/ViewSource.js
+++ b/lib/dijit/_editor/plugins/ViewSource.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/plugins/ViewSource",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/keys","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","dojo/window","../../focus","../_Plugin","../../form/ToggleButton","../..","../../registry","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,on,_b,_c,_d,_e,_f,_10,_11,_12){var _13=_2("dijit._editor.plugins.ViewSource",_f,{stripScripts:true,stripComments:true,stripIFrames:true,readOnly:false,_fsPlugin:null,toggle:function(){if(_b("webkit")){this._vsFocused=true;}this.button.set("checked",!this.button.get("checked"));},_initButton:function(){var _14=_8.getLocalization("dijit._editor","commands"),_15=this.editor;this.button=new _10({label:_14["viewSource"],dir:_15.dir,lang:_15.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ViewSource",tabIndex:"-1",onChange:_a.hitch(this,"_showSource")});if(_b("ie")==7){this._ieFixNode=_4.create("div",{style:{opacity:"0",zIndex:"-1000",position:"absolute",top:"-1000px"}},_c.body());}this.button.set("readOnly",false);},setEditor:function(_16){this.editor=_16;this._initButton();this.editor.addKeyHandler(_9.F12,true,true,_a.hitch(this,function(e){this.button.focus();this.toggle();_7.stop(e);setTimeout(_a.hitch(this,function(){this.editor.focus();}),100);}));},_showSource:function(_17){var ed=this.editor;var _18=ed._plugins;var _19;this._sourceShown=_17;var _1a=this;try{if(!this.sourceArea){this._createSourceView();}if(_17){ed._sourceQueryCommandEnabled=ed.queryCommandEnabled;ed.queryCommandEnabled=function(cmd){return cmd.toLowerCase()==="viewsource";};this.editor.onDisplayChanged();_19=ed.get("value");_19=this._filter(_19);ed.set("value",_19);_1.forEach(_18,function(p){if(!(p instanceof _13)){p.set("disabled",true);}});if(this._fsPlugin){this._fsPlugin._getAltViewNode=function(){return _1a.sourceArea;};}this.sourceArea.value=_19;this.sourceArea.style.height=ed.iframe.style.height;this.sourceArea.style.width=ed.iframe.style.width;_6.set(ed.iframe,"display","none");_6.set(this.sourceArea,{display:"block"});var _1b=function(){var vp=_d.getBox();if("_prevW" in this&&"_prevH" in this){if(vp.w===this._prevW&&vp.h===this._prevH){return;}else{this._prevW=vp.w;this._prevH=vp.h;}}else{this._prevW=vp.w;this._prevH=vp.h;}if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}this._resizer=setTimeout(_a.hitch(this,function(){delete this._resizer;this._resize();}),10);};this._resizeHandle=on(window,"resize",_a.hitch(this,_1b));setTimeout(_a.hitch(this,this._resize),100);this.editor.onNormalizedDisplayChanged();this.editor.__oldGetValue=this.editor.getValue;this.editor.getValue=_a.hitch(this,function(){var txt=this.sourceArea.value;txt=this._filter(txt);return txt;});}else{if(!ed._sourceQueryCommandEnabled){return;}this._resizeHandle.remove();delete this._resizeHandle;if(this.editor.__oldGetValue){this.editor.getValue=this.editor.__oldGetValue;delete this.editor.__oldGetValue;}ed.queryCommandEnabled=ed._sourceQueryCommandEnabled;if(!this._readOnly){_19=this.sourceArea.value;_19=this._filter(_19);ed.beginEditing();ed.set("value",_19);ed.endEditing();}_1.forEach(_18,function(p){p.set("disabled",false);});_6.set(this.sourceArea,"display","none");_6.set(ed.iframe,"display","block");delete ed._sourceQueryCommandEnabled;this.editor.onDisplayChanged();}setTimeout(_a.hitch(this,function(){var _1c=ed.domNode.parentNode;if(_1c){var _1d=_12.getEnclosingWidget(_1c);if(_1d&&_1d.resize){_1d.resize();}}ed.resize();}),300);}catch(e){}},updateState:function(){this.button.set("disabled",this.get("disabled"));},_resize:function(){var ed=this.editor;var tbH=ed.getHeaderHeight();var fH=ed.getFooterHeight();var eb=_5.position(ed.domNode);var _1e=_5.getPadBorderExtents(ed.iframe.parentNode);var _1f=_5.getMarginExtents(ed.iframe.parentNode);var _20=_5.getPadBorderExtents(ed.domNode);var edb={w:eb.w-_20.w,h:eb.h-(tbH+_20.h+ +fH)};if(this._fsPlugin&&this._fsPlugin.isFullscreen){var vp=_d.getBox();edb.w=(vp.w-_20.w);edb.h=(vp.h-(tbH+_20.h+fH));}if(_b("ie")){edb.h-=2;}if(this._ieFixNode){var _21=-this._ieFixNode.offsetTop/1000;edb.w=Math.floor((edb.w+0.9)/_21);edb.h=Math.floor((edb.h+0.9)/_21);}_5.setMarginBox(this.sourceArea,{w:edb.w-(_1e.w+_1f.w),h:edb.h-(_1e.h+_1f.h)});_5.setMarginBox(ed.iframe.parentNode,{h:edb.h});},_createSourceView:function(){var ed=this.editor;var _22=ed._plugins;this.sourceArea=_4.create("textarea");if(this.readOnly){_3.set(this.sourceArea,"readOnly",true);this._readOnly=true;}_6.set(this.sourceArea,{padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});_4.place(this.sourceArea,ed.iframe,"before");if(_b("ie")&&ed.iframe.parentNode.lastChild!==ed.iframe){_6.set(ed.iframe.parentNode.lastChild,{width:"0px",height:"0px",padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});}ed._viewsource_oldFocus=ed.focus;var _23=this;ed.focus=function(){if(_23._sourceShown){_23.setSourceAreaCaret();}else{try{if(this._vsFocused){delete this._vsFocused;_e.focus(ed.editNode);}else{ed._viewsource_oldFocus();}}catch(e){}}};var i,p;for(i=0;i<_22.length;i++){p=_22[i];if(p&&(p.declaredClass==="dijit._editor.plugins.FullScreen"||p.declaredClass===(_11._scopeName+"._editor.plugins.FullScreen"))){this._fsPlugin=p;break;}}if(this._fsPlugin){this._fsPlugin._viewsource_getAltViewNode=this._fsPlugin._getAltViewNode;this._fsPlugin._getAltViewNode=function(){return _23._sourceShown?_23.sourceArea:this._viewsource_getAltViewNode();};}this.connect(this.sourceArea,"onkeydown",_a.hitch(this,function(e){if(this._sourceShown&&e.keyCode==_9.F12&&e.ctrlKey&&e.shiftKey){this.button.focus();this.button.set("checked",false);setTimeout(_a.hitch(this,function(){ed.focus();}),100);_7.stop(e);}}));},_stripScripts:function(_24){if(_24){_24=_24.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig,"");_24=_24.replace(/<\s*script\b([^<>]|\s)*>?/ig,"");_24=_24.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig,"");}return _24;},_stripComments:function(_25){if(_25){_25=_25.replace(/<!--(.|\s){1,}?-->/g,"");}return _25;},_stripIFrames:function(_26){if(_26){_26=_26.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig,"");}return _26;},_filter:function(_27){if(_27){if(this.stripScripts){_27=this._stripScripts(_27);}if(this.stripComments){_27=this._stripComments(_27);}if(this.stripIFrames){_27=this._stripIFrames(_27);}}return _27;},setSourceAreaCaret:function(){var _28=_c.global;var _29=this.sourceArea;_e.focus(_29);if(this._sourceShown&&!this.readOnly){if(_b("ie")){if(this.sourceArea.createTextRange){var _2a=_29.createTextRange();_2a.collapse(true);_2a.moveStart("character",-99999);_2a.moveStart("character",0);_2a.moveEnd("character",0);_2a.select();}}else{if(_28.getSelection){if(_29.setSelectionRange){_29.setSelectionRange(0,0);}}}}},destroy:function(){if(this._ieFixNode){_c.body().removeChild(this._ieFixNode);}if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}if(this._resizeHandle){this._resizeHandle.remove();delete this._resizeHandle;}this.inherited(arguments);}});_f.registry["viewSource"]=_f.registry["viewsource"]=function(_2b){return new _13({readOnly:("readOnly" in _2b)?_2b.readOnly:false,stripComments:("stripComments" in _2b)?_2b.stripComments:true,stripScripts:("stripScripts" in _2b)?_2b.stripScripts:true,stripIFrames:("stripIFrames" in _2b)?_2b.stripIFrames:true});};return _13;}); \ No newline at end of file
+define("dijit/_editor/plugins/ViewSource",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/keys","dojo/_base/lang","dojo/on","dojo/sniff","dojo/_base/window","dojo/window","../../focus","../_Plugin","../../form/ToggleButton","../..","../../registry","dojo/aspect","dojo/i18n!../nls/commands"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,on,_b,_c,_d,_e,_f,_10,_11,_12,_13){var _14=_2("dijit._editor.plugins.ViewSource",_f,{stripScripts:true,stripComments:true,stripIFrames:true,readOnly:false,_fsPlugin:null,toggle:function(){if(_b("webkit")){this._vsFocused=true;}this.button.set("checked",!this.button.get("checked"));},_initButton:function(){var _15=_8.getLocalization("dijit._editor","commands"),_16=this.editor;this.button=new _10({label:_15["viewSource"],ownerDocument:_16.ownerDocument,dir:_16.dir,lang:_16.lang,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ViewSource",tabIndex:"-1",onChange:_a.hitch(this,"_showSource")});if(_b("ie")==7){this._ieFixNode=_4.create("div",{style:{opacity:"0",zIndex:"-1000",position:"absolute",top:"-1000px"}},_16.ownerDocumentBody);}this.button.set("readOnly",false);},setEditor:function(_17){this.editor=_17;this._initButton();this.editor.addKeyHandler(_9.F12,true,true,_a.hitch(this,function(e){this.button.focus();this.toggle();_7.stop(e);setTimeout(_a.hitch(this,function(){this.editor.focus();}),100);}));},_showSource:function(_18){var ed=this.editor;var _19=ed._plugins;var _1a;this._sourceShown=_18;var _1b=this;try{if(!this.sourceArea){this._createSourceView();}if(_18){ed._sourceQueryCommandEnabled=ed.queryCommandEnabled;ed.queryCommandEnabled=function(cmd){return cmd.toLowerCase()==="viewsource";};this.editor.onDisplayChanged();_1a=ed.get("value");_1a=this._filter(_1a);ed.set("value",_1a);_1.forEach(_19,function(p){if(p&&!(p instanceof _14)&&p.isInstanceOf(_f)){p.set("disabled",true);}});if(this._fsPlugin){this._fsPlugin._getAltViewNode=function(){return _1b.sourceArea;};}this.sourceArea.value=_1a;this.sourceArea.style.height=ed.iframe.style.height;this.sourceArea.style.width=ed.iframe.style.width;_6.set(ed.iframe,"display","none");_6.set(this.sourceArea,{display:"block"});var _1c=function(){var vp=_d.getBox(ed.ownerDocument);if("_prevW" in this&&"_prevH" in this){if(vp.w===this._prevW&&vp.h===this._prevH){return;}else{this._prevW=vp.w;this._prevH=vp.h;}}else{this._prevW=vp.w;this._prevH=vp.h;}if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}this._resizer=setTimeout(_a.hitch(this,function(){delete this._resizer;this._resize();}),10);};this._resizeHandle=on(window,"resize",_a.hitch(this,_1c));setTimeout(_a.hitch(this,this._resize),100);this.editor.onNormalizedDisplayChanged();this.editor.__oldGetValue=this.editor.getValue;this.editor.getValue=_a.hitch(this,function(){var txt=this.sourceArea.value;txt=this._filter(txt);return txt;});this._setListener=_13.after(this.editor,"setValue",_a.hitch(this,function(_1d){_1d=_1d||"";_1d=this._filter(_1d);this.sourceArea.value=_1d;}),true);}else{if(!ed._sourceQueryCommandEnabled){return;}this._setListener.remove();delete this._setListener;this._resizeHandle.remove();delete this._resizeHandle;if(this.editor.__oldGetValue){this.editor.getValue=this.editor.__oldGetValue;delete this.editor.__oldGetValue;}ed.queryCommandEnabled=ed._sourceQueryCommandEnabled;if(!this._readOnly){_1a=this.sourceArea.value;_1a=this._filter(_1a);ed.beginEditing();ed.set("value",_1a);ed.endEditing();}_1.forEach(_19,function(p){if(p&&p.isInstanceOf(_f)){p.set("disabled",false);}});_6.set(this.sourceArea,"display","none");_6.set(ed.iframe,"display","block");delete ed._sourceQueryCommandEnabled;this.editor.onDisplayChanged();}setTimeout(_a.hitch(this,function(){var _1e=ed.domNode.parentNode;if(_1e){var _1f=_12.getEnclosingWidget(_1e);if(_1f&&_1f.resize){_1f.resize();}}ed.resize();}),300);}catch(e){}},updateState:function(){this.button.set("disabled",this.get("disabled"));},_resize:function(){var ed=this.editor;var tbH=ed.getHeaderHeight();var fH=ed.getFooterHeight();var eb=_5.position(ed.domNode);var _20=_5.getPadBorderExtents(ed.iframe.parentNode);var _21=_5.getMarginExtents(ed.iframe.parentNode);var _22=_5.getPadBorderExtents(ed.domNode);var edb={w:eb.w-_22.w,h:eb.h-(tbH+_22.h+fH)};if(this._fsPlugin&&this._fsPlugin.isFullscreen){var vp=_d.getBox(ed.ownerDocument);edb.w=(vp.w-_22.w);edb.h=(vp.h-(tbH+_22.h+fH));}if(_b("ie")){edb.h-=2;}if(this._ieFixNode){var _23=-this._ieFixNode.offsetTop/1000;edb.w=Math.floor((edb.w+0.9)/_23);edb.h=Math.floor((edb.h+0.9)/_23);}_5.setMarginBox(this.sourceArea,{w:edb.w-(_20.w+_21.w),h:edb.h-(_20.h+_21.h)});_5.setMarginBox(ed.iframe.parentNode,{h:edb.h});},_createSourceView:function(){var ed=this.editor;var _24=ed._plugins;this.sourceArea=_4.create("textarea");if(this.readOnly){_3.set(this.sourceArea,"readOnly",true);this._readOnly=true;}_6.set(this.sourceArea,{padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});_4.place(this.sourceArea,ed.iframe,"before");if(_b("ie")&&ed.iframe.parentNode.lastChild!==ed.iframe){_6.set(ed.iframe.parentNode.lastChild,{width:"0px",height:"0px",padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});}ed._viewsource_oldFocus=ed.focus;var _25=this;ed.focus=function(){if(_25._sourceShown){_25.setSourceAreaCaret();}else{try{if(this._vsFocused){delete this._vsFocused;_e.focus(ed.editNode);}else{ed._viewsource_oldFocus();}}catch(e){}}};var i,p;for(i=0;i<_24.length;i++){p=_24[i];if(p&&(p.declaredClass==="dijit._editor.plugins.FullScreen"||p.declaredClass===(_11._scopeName+"._editor.plugins.FullScreen"))){this._fsPlugin=p;break;}}if(this._fsPlugin){this._fsPlugin._viewsource_getAltViewNode=this._fsPlugin._getAltViewNode;this._fsPlugin._getAltViewNode=function(){return _25._sourceShown?_25.sourceArea:this._viewsource_getAltViewNode();};}this.connect(this.sourceArea,"onkeydown",_a.hitch(this,function(e){if(this._sourceShown&&e.keyCode==_9.F12&&e.ctrlKey&&e.shiftKey){this.button.focus();this.button.set("checked",false);setTimeout(_a.hitch(this,function(){ed.focus();}),100);_7.stop(e);}}));},_stripScripts:function(_26){if(_26){_26=_26.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig,"");_26=_26.replace(/<\s*script\b([^<>]|\s)*>?/ig,"");_26=_26.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig,"");}return _26;},_stripComments:function(_27){if(_27){_27=_27.replace(/<!--(.|\s){1,}?-->/g,"");}return _27;},_stripIFrames:function(_28){if(_28){_28=_28.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig,"");}return _28;},_filter:function(_29){if(_29){if(this.stripScripts){_29=this._stripScripts(_29);}if(this.stripComments){_29=this._stripComments(_29);}if(this.stripIFrames){_29=this._stripIFrames(_29);}}return _29;},setSourceAreaCaret:function(){var _2a=_c.global;var _2b=this.sourceArea;_e.focus(_2b);if(this._sourceShown&&!this.readOnly){if(_b("ie")){if(this.sourceArea.createTextRange){var _2c=_2b.createTextRange();_2c.collapse(true);_2c.moveStart("character",-99999);_2c.moveStart("character",0);_2c.moveEnd("character",0);_2c.select();}}else{if(_2a.getSelection){if(_2b.setSelectionRange){_2b.setSelectionRange(0,0);}}}}},destroy:function(){if(this._ieFixNode){_4.destroy(this._ieFixNode);}if(this._resizer){clearTimeout(this._resizer);delete this._resizer;}if(this._resizeHandle){this._resizeHandle.remove();delete this._resizeHandle;}if(this._setListener){this._setListener.remove();delete this._setListener;}this.inherited(arguments);}});_f.registry["viewSource"]=_f.registry["viewsource"]=function(_2d){return new _14({readOnly:("readOnly" in _2d)?_2d.readOnly:false,stripComments:("stripComments" in _2d)?_2d.stripComments:true,stripScripts:("stripScripts" in _2d)?_2d.stripScripts:true,stripIFrames:("stripIFrames" in _2d)?_2d.stripIFrames:true});};return _14;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js b/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js
new file mode 100644
index 000000000..e70e05c22
--- /dev/null
+++ b/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js
@@ -0,0 +1,577 @@
+define("dijit/_editor/plugins/ViewSource", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-construct", // domConstruct.create domConstruct.place
+ "dojo/dom-geometry", // domGeometry.setMarginBox domGeometry.position
+ "dojo/dom-style", // domStyle.set
+ "dojo/_base/event", // event.stop
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/keys", // keys.F12
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on", // on()
+ "dojo/sniff", // has("ie") has("webkit")
+ "dojo/_base/window", // win.body win.global
+ "dojo/window", // winUtils.getBox
+ "../../focus", // focus.focus()
+ "../_Plugin",
+ "../../form/ToggleButton",
+ "../..", // dijit._scopeName
+ "../../registry", // registry.getEnclosingWidget()
+ "dojo/aspect", // Aspect commands for adice
+ "dojo/i18n!../nls/commands"
+], function(array, declare, domAttr, domConstruct, domGeometry, domStyle, event, i18n, keys, lang, on, has, win,
+ winUtils, focus, _Plugin, ToggleButton, dijit, registry, aspect){
+
+// module:
+// dijit/_editor/plugins/ViewSource
+
+
+var ViewSource = declare("dijit._editor.plugins.ViewSource",_Plugin, {
+ // summary:
+ // This plugin provides a simple view source capability. When view
+ // source mode is enabled, it disables all other buttons/plugins on the RTE.
+ // It also binds to the hotkey: CTRL-SHIFT-F11 for toggling ViewSource mode.
+
+ // stripScripts: [public] Boolean
+ // Boolean flag used to indicate if script tags should be stripped from the document.
+ // Defaults to true.
+ stripScripts: true,
+
+ // stripComments: [public] Boolean
+ // Boolean flag used to indicate if comment tags should be stripped from the document.
+ // Defaults to true.
+ stripComments: true,
+
+ // stripComments: [public] Boolean
+ // Boolean flag used to indicate if iframe tags should be stripped from the document.
+ // Defaults to true.
+ stripIFrames: true,
+
+ // readOnly: [const] Boolean
+ // Boolean flag used to indicate if the source view should be readonly or not.
+ // Cannot be changed after initialization of the plugin.
+ // Defaults to false.
+ readOnly: false,
+
+ // _fsPlugin: [private] Object
+ // Reference to a registered fullscreen plugin so that viewSource knows
+ // how to scale.
+ _fsPlugin: null,
+
+ toggle: function(){
+ // summary:
+ // Function to allow programmatic toggling of the view.
+
+ // For Webkit, we have to focus a very particular way.
+ // when swapping views, otherwise focus doesn't shift right
+ // but can't focus this way all the time, only for VS changes.
+ // If we did it all the time, buttons like bold, italic, etc
+ // break.
+ if(has("webkit")){this._vsFocused = true;}
+ this.button.set("checked", !this.button.get("checked"));
+
+ },
+
+ _initButton: function(){
+ // summary:
+ // Over-ride for creation of the resize button.
+ var strings = i18n.getLocalization("dijit._editor", "commands"),
+ editor = this.editor;
+ this.button = new ToggleButton({
+ label: strings["viewSource"],
+ ownerDocument: editor.ownerDocument,
+ dir: editor.dir,
+ lang: editor.lang,
+ showLabel: false,
+ iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "ViewSource",
+ tabIndex: "-1",
+ onChange: lang.hitch(this, "_showSource")
+ });
+
+ // IE 7 has a horrible bug with zoom, so we have to create this node
+ // to cross-check later. Sigh.
+ if(has("ie") == 7){
+ this._ieFixNode = domConstruct.create("div", {
+ style: {
+ opacity: "0",
+ zIndex: "-1000",
+ position: "absolute",
+ top: "-1000px"
+ }
+ }, editor.ownerDocumentBody);
+ }
+ // Make sure readonly mode doesn't make the wrong cursor appear over the button.
+ this.button.set("readOnly", false);
+ },
+
+
+ setEditor: function(/*dijit/Editor*/ editor){
+ // summary:
+ // Tell the plugin which Editor it is associated with.
+ // editor: Object
+ // The editor object to attach the print capability to.
+ this.editor = editor;
+ this._initButton();
+
+ this.editor.addKeyHandler(keys.F12, true, true, lang.hitch(this, function(e){
+ // Move the focus before switching
+ // It'll focus back. Hiding a focused
+ // node causes issues.
+ this.button.focus();
+ this.toggle();
+ event.stop(e);
+
+ // Call the focus shift outside of the handler.
+ setTimeout(lang.hitch(this, function(){
+ // We over-ride focus, so we just need to call.
+ this.editor.focus();
+ }), 100);
+ }));
+ },
+
+ _showSource: function(source){
+ // summary:
+ // Function to toggle between the source and RTE views.
+ // source: boolean
+ // Boolean value indicating if it should be in source mode or not.
+ // tags:
+ // private
+ var ed = this.editor;
+ var edPlugins = ed._plugins;
+ var html;
+ this._sourceShown = source;
+ var self = this;
+ try{
+ if(!this.sourceArea){
+ this._createSourceView();
+ }
+ if(source){
+ // Update the QueryCommandEnabled function to disable everything but
+ // the source view mode. Have to over-ride a function, then kick all
+ // plugins to check their state.
+ ed._sourceQueryCommandEnabled = ed.queryCommandEnabled;
+ ed.queryCommandEnabled = function(cmd){
+ return cmd.toLowerCase() === "viewsource";
+ };
+ this.editor.onDisplayChanged();
+ html = ed.get("value");
+ html = this._filter(html);
+ ed.set("value", html);
+ array.forEach(edPlugins, function(p){
+ // Turn off any plugins not controlled by queryCommandenabled.
+ if(p && !(p instanceof ViewSource) && p.isInstanceOf(_Plugin)){
+ p.set("disabled", true)
+ }
+ });
+
+ // We actually do need to trap this plugin and adjust how we
+ // display the textarea.
+ if(this._fsPlugin){
+ this._fsPlugin._getAltViewNode = function(){
+ return self.sourceArea;
+ };
+ }
+
+ this.sourceArea.value = html;
+
+ // Since neither iframe nor textarea have margin, border, or padding,
+ // just set sizes equal
+ this.sourceArea.style.height = ed.iframe.style.height;
+ this.sourceArea.style.width = ed.iframe.style.width;
+ domStyle.set(ed.iframe, "display", "none");
+ domStyle.set(this.sourceArea, {
+ display: "block"
+ });
+
+ var resizer = function(){
+ // function to handle resize events.
+ // Will check current VP and only resize if
+ // different.
+ var vp = winUtils.getBox(ed.ownerDocument);
+
+ if("_prevW" in this && "_prevH" in this){
+ // No actual size change, ignore.
+ if(vp.w === this._prevW && vp.h === this._prevH){
+ return;
+ }else{
+ this._prevW = vp.w;
+ this._prevH = vp.h;
+ }
+ }else{
+ this._prevW = vp.w;
+ this._prevH = vp.h;
+ }
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ delete this._resizer;
+ }
+ // Timeout it to help avoid spamming resize on IE.
+ // Works for all browsers.
+ this._resizer = setTimeout(lang.hitch(this, function(){
+ delete this._resizer;
+ this._resize();
+ }), 10);
+ };
+ this._resizeHandle = on(window, "resize", lang.hitch(this, resizer));
+
+ //Call this on a delay once to deal with IE glitchiness on initial size.
+ setTimeout(lang.hitch(this, this._resize), 100);
+
+ //Trigger a check for command enablement/disablement.
+ this.editor.onNormalizedDisplayChanged();
+
+ this.editor.__oldGetValue = this.editor.getValue;
+ this.editor.getValue = lang.hitch(this, function(){
+ var txt = this.sourceArea.value;
+ txt = this._filter(txt);
+ return txt;
+ });
+
+ this._setListener = aspect.after(this.editor, "setValue", lang.hitch(this, function(htmlTxt){
+ htmlTxt = htmlTxt || "";
+ htmlTxt = this._filter(htmlTxt);
+ this.sourceArea.value = htmlTxt;
+ }), true);
+ }else{
+ // First check that we were in source view before doing anything.
+ // corner case for being called with a value of false and we hadn't
+ // actually been in source display mode.
+ if(!ed._sourceQueryCommandEnabled){
+ return;
+ }
+
+ // Remove the set listener.
+ this._setListener.remove();
+ delete this._setListener;
+
+ this._resizeHandle.remove();
+ delete this._resizeHandle;
+
+ if(this.editor.__oldGetValue){
+ this.editor.getValue = this.editor.__oldGetValue;
+ delete this.editor.__oldGetValue;
+ }
+
+ // Restore all the plugin buttons state.
+ ed.queryCommandEnabled = ed._sourceQueryCommandEnabled;
+ if(!this._readOnly){
+ html = this.sourceArea.value;
+ html = this._filter(html);
+ ed.beginEditing();
+ ed.set("value", html);
+ ed.endEditing();
+ }
+
+ array.forEach(edPlugins, function(p){
+ // Turn back on any plugins we turned off.
+ if(p && p.isInstanceOf(_Plugin)){
+ p.set("disabled", false);
+ }
+ });
+
+ domStyle.set(this.sourceArea, "display", "none");
+ domStyle.set(ed.iframe, "display", "block");
+ delete ed._sourceQueryCommandEnabled;
+
+ //Trigger a check for command enablement/disablement.
+ this.editor.onDisplayChanged();
+ }
+ // Call a delayed resize to wait for some things to display in header/footer.
+ setTimeout(lang.hitch(this, function(){
+ // Make resize calls.
+ var parent = ed.domNode.parentNode;
+ if(parent){
+ var container = registry.getEnclosingWidget(parent);
+ if(container && container.resize){
+ container.resize();
+ }
+ }
+ ed.resize();
+ }), 300);
+ }catch(e){
+ console.log(e);
+ }
+ },
+
+ updateState: function(){
+ // summary:
+ // Over-ride for button state control for disabled to work.
+ this.button.set("disabled", this.get("disabled"));
+ },
+
+ _resize: function(){
+ // summary:
+ // Internal function to resize the source view
+ // tags:
+ // private
+ var ed = this.editor;
+ var tbH = ed.getHeaderHeight();
+ var fH = ed.getFooterHeight();
+ var eb = domGeometry.position(ed.domNode);
+
+ // Styles are now applied to the internal source container, so we have
+ // to subtract them off.
+ var containerPadding = domGeometry.getPadBorderExtents(ed.iframe.parentNode);
+ var containerMargin = domGeometry.getMarginExtents(ed.iframe.parentNode);
+
+ var extents = domGeometry.getPadBorderExtents(ed.domNode);
+ var edb = {
+ w: eb.w - extents.w,
+ h: eb.h - (tbH + extents.h + fH)
+ };
+
+ // Fullscreen gets odd, so we need to check for the FS plugin and
+ // adapt.
+ if(this._fsPlugin && this._fsPlugin.isFullscreen){
+ //Okay, probably in FS, adjust.
+ var vp = winUtils.getBox(ed.ownerDocument);
+ edb.w = (vp.w - extents.w);
+ edb.h = (vp.h - (tbH + extents.h + fH));
+ }
+
+ if(has("ie")){
+ // IE is always off by 2px, so we have to adjust here
+ // Note that IE ZOOM is broken here. I can't get
+ //it to scale right.
+ edb.h -= 2;
+ }
+
+ // IE has a horrible zoom bug. So, we have to try and account for
+ // it and fix up the scaling.
+ if(this._ieFixNode){
+ var _ie7zoom = -this._ieFixNode.offsetTop / 1000;
+ edb.w = Math.floor((edb.w + 0.9) / _ie7zoom);
+ edb.h = Math.floor((edb.h + 0.9) / _ie7zoom);
+ }
+
+ domGeometry.setMarginBox(this.sourceArea, {
+ w: edb.w - (containerPadding.w + containerMargin.w),
+ h: edb.h - (containerPadding.h + containerMargin.h)
+ });
+
+ // Scale the parent container too in this case.
+ domGeometry.setMarginBox(ed.iframe.parentNode, {
+ h: edb.h
+ });
+ },
+
+ _createSourceView: function(){
+ // summary:
+ // Internal function for creating the source view area.
+ // tags:
+ // private
+ var ed = this.editor;
+ var edPlugins = ed._plugins;
+ this.sourceArea = domConstruct.create("textarea");
+ if(this.readOnly){
+ domAttr.set(this.sourceArea, "readOnly", true);
+ this._readOnly = true;
+ }
+ domStyle.set(this.sourceArea, {
+ padding: "0px",
+ margin: "0px",
+ borderWidth: "0px",
+ borderStyle: "none"
+ });
+ domConstruct.place(this.sourceArea, ed.iframe, "before");
+
+ if(has("ie") && ed.iframe.parentNode.lastChild !== ed.iframe){
+ // There's some weirdo div in IE used for focus control
+ // But is messed up scaling the textarea if we don't config
+ // it some so it doesn't have a varying height.
+ domStyle.set(ed.iframe.parentNode.lastChild,{
+ width: "0px",
+ height: "0px",
+ padding: "0px",
+ margin: "0px",
+ borderWidth: "0px",
+ borderStyle: "none"
+ });
+ }
+
+ // We also need to take over editor focus a bit here, so that focus calls to
+ // focus the editor will focus to the right node when VS is active.
+ ed._viewsource_oldFocus = ed.focus;
+ var self = this;
+ ed.focus = function(){
+ if(self._sourceShown){
+ self.setSourceAreaCaret();
+ }else{
+ try{
+ if(this._vsFocused){
+ delete this._vsFocused;
+ // Must focus edit node in this case (webkit only) or
+ // focus doesn't shift right, but in normal
+ // cases we focus with the regular function.
+ focus.focus(ed.editNode);
+ }else{
+ ed._viewsource_oldFocus();
+ }
+ }catch(e){
+ console.log(e);
+ }
+ }
+ };
+
+ var i, p;
+ for(i = 0; i < edPlugins.length; i++){
+ // We actually do need to trap this plugin and adjust how we
+ // display the textarea.
+ p = edPlugins[i];
+ if(p && (p.declaredClass === "dijit._editor.plugins.FullScreen" ||
+ p.declaredClass === (dijit._scopeName +
+ "._editor.plugins.FullScreen"))){
+ this._fsPlugin = p;
+ break;
+ }
+ }
+ if(this._fsPlugin){
+ // Found, we need to over-ride the alt-view node function
+ // on FullScreen with our own, chain up to parent call when appropriate.
+ this._fsPlugin._viewsource_getAltViewNode = this._fsPlugin._getAltViewNode;
+ this._fsPlugin._getAltViewNode = function(){
+ return self._sourceShown?self.sourceArea:this._viewsource_getAltViewNode();
+ };
+ }
+
+ // Listen to the source area for key events as well, as we need to be able to hotkey toggle
+ // it from there too.
+ this.connect(this.sourceArea, "onkeydown", lang.hitch(this, function(e){
+ if(this._sourceShown && e.keyCode == keys.F12 && e.ctrlKey && e.shiftKey){
+ this.button.focus();
+ this.button.set("checked", false);
+ setTimeout(lang.hitch(this, function(){ed.focus();}), 100);
+ event.stop(e);
+ }
+ }));
+ },
+
+ _stripScripts: function(html){
+ // summary:
+ // Strips out script tags from the HTML used in editor.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ // Look for closed and unclosed (malformed) script attacks.
+ html = html.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig, "");
+ html = html.replace(/<\s*script\b([^<>]|\s)*>?/ig, "");
+ html = html.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig, "");
+ }
+ return html;
+ },
+
+ _stripComments: function(html){
+ // summary:
+ // Strips out comments from the HTML used in editor.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ html = html.replace(/<!--(.|\s){1,}?-->/g, "");
+ }
+ return html;
+ },
+
+ _stripIFrames: function(html){
+ // summary:
+ // Strips out iframe tags from the content, to avoid iframe script
+ // style injection attacks.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ html = html.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig, "");
+ }
+ return html;
+ },
+
+ _filter: function(html){
+ // summary:
+ // Internal function to perform some filtering on the HTML.
+ // html: String
+ // The HTML to filter
+ // tags:
+ // private
+ if(html){
+ if(this.stripScripts){
+ html = this._stripScripts(html);
+ }
+ if(this.stripComments){
+ html = this._stripComments(html);
+ }
+ if(this.stripIFrames){
+ html = this._stripIFrames(html);
+ }
+ }
+ return html;
+ },
+
+ setSourceAreaCaret: function(){
+ // summary:
+ // Internal function to set the caret in the sourceArea
+ // to 0x0
+ var global = win.global;
+ var elem = this.sourceArea;
+ focus.focus(elem);
+ if(this._sourceShown && !this.readOnly){
+ if(has("ie")){
+ if(this.sourceArea.createTextRange){
+ var range = elem.createTextRange();
+ range.collapse(true);
+ range.moveStart("character", -99999); // move to 0
+ range.moveStart("character", 0); // delta from 0 is the correct position
+ range.moveEnd("character", 0);
+ range.select();
+ }
+ }else if(global.getSelection){
+ if(elem.setSelectionRange){
+ elem.setSelectionRange(0,0);
+ }
+ }
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Over-ride to remove the node used to correct for IE's
+ // zoom bug.
+ if(this._ieFixNode){
+ domConstruct.destroy(this._ieFixNode);
+ }
+ if(this._resizer){
+ clearTimeout(this._resizer);
+ delete this._resizer;
+ }
+ if(this._resizeHandle){
+ this._resizeHandle.remove();
+ delete this._resizeHandle;
+ }
+ if(this._setListener){
+ this._setListener.remove();
+ delete this._setListener;
+ }
+ this.inherited(arguments);
+ }
+});
+
+// Register this plugin.
+// For back-compat accept "viewsource" (all lowercase) too, remove in 2.0
+_Plugin.registry["viewSource"] = _Plugin.registry["viewsource"] = function(args){
+ return new ViewSource({
+ readOnly: ("readOnly" in args)?args.readOnly:false,
+ stripComments: ("stripComments" in args)?args.stripComments:true,
+ stripScripts: ("stripScripts" in args)?args.stripScripts:true,
+ stripIFrames: ("stripIFrames" in args)?args.stripIFrames:true
+ });
+};
+
+
+
+
+return ViewSource;
+});
diff --git a/lib/dijit/_editor/range.js b/lib/dijit/_editor/range.js
index 3c92de470..403d8968d 100644
--- a/lib/dijit/_editor/range.js
+++ b/lib/dijit/_editor/range.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/range",["dojo/_base/array","dojo/_base/declare","dojo/_base/lang","dojo/_base/window",".."],function(_1,_2,_3,_4,_5){_5.range={};_5.range.getIndex=function(_6,_7){var _8=[],_9=[];var _a=_6;var _b,n;while(_6!=_7){var i=0;_b=_6.parentNode;while((n=_b.childNodes[i++])){if(n===_6){--i;break;}}_8.unshift(i);_9.unshift(i-_b.childNodes.length);_6=_b;}if(_8.length>0&&_a.nodeType==3){n=_a.previousSibling;while(n&&n.nodeType==3){_8[_8.length-1]--;n=n.previousSibling;}n=_a.nextSibling;while(n&&n.nodeType==3){_9[_9.length-1]++;n=n.nextSibling;}}return {o:_8,r:_9};};_5.range.getNode=function(_c,_d){if(!_3.isArray(_c)||_c.length==0){return _d;}var _e=_d;_1.every(_c,function(i){if(i>=0&&i<_e.childNodes.length){_e=_e.childNodes[i];}else{_e=null;return false;}return true;});return _e;};_5.range.getCommonAncestor=function(n1,n2,_f){_f=_f||n1.ownerDocument.body;var _10=function(n){var as=[];while(n){as.unshift(n);if(n!==_f){n=n.parentNode;}else{break;}}return as;};var _11=_10(n1);var _12=_10(n2);var m=Math.min(_11.length,_12.length);var com=_11[0];for(var i=1;i<m;i++){if(_11[i]===_12[i]){com=_11[i];}else{break;}}return com;};_5.range.getAncestor=function(_13,_14,_15){_15=_15||_13.ownerDocument.body;while(_13&&_13!==_15){var _16=_13.nodeName.toUpperCase();if(_14.test(_16)){return _13;}_13=_13.parentNode;}return null;};_5.range.BlockTagNames=/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;_5.range.getBlockAncestor=function(_17,_18,_19){_19=_19||_17.ownerDocument.body;_18=_18||_5.range.BlockTagNames;var _1a=null,_1b;while(_17&&_17!==_19){var _1c=_17.nodeName.toUpperCase();if(!_1a&&_18.test(_1c)){_1a=_17;}if(!_1b&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_1c)){_1b=_17;}_17=_17.parentNode;}return {blockNode:_1a,blockContainer:_1b||_17.ownerDocument.body};};_5.range.atBeginningOfContainer=function(_1d,_1e,_1f){var _20=false;var _21=(_1f==0);if(!_21&&_1e.nodeType==3){if(/^[\s\xA0]+$/.test(_1e.nodeValue.substr(0,_1f))){_21=true;}}if(_21){var _22=_1e;_20=true;while(_22&&_22!==_1d){if(_22.previousSibling){_20=false;break;}_22=_22.parentNode;}}return _20;};_5.range.atEndOfContainer=function(_23,_24,_25){var _26=false;var _27=(_25==(_24.length||_24.childNodes.length));if(!_27&&_24.nodeType==3){if(/^[\s\xA0]+$/.test(_24.nodeValue.substr(_25))){_27=true;}}if(_27){var _28=_24;_26=true;while(_28&&_28!==_23){if(_28.nextSibling){_26=false;break;}_28=_28.parentNode;}}return _26;};_5.range.adjacentNoneTextNode=function(_29,_2a){var _2b=_29;var len=(0-_29.length)||0;var _2c=_2a?"nextSibling":"previousSibling";while(_2b){if(_2b.nodeType!=3){break;}len+=_2b.length;_2b=_2b[_2c];}return [_2b,len];};_5.range._w3c=Boolean(window["getSelection"]);_5.range.create=function(_2d){if(_5.range._w3c){return (_2d||_4.global).document.createRange();}else{return new _5.range.W3CRange;}};_5.range.getSelection=function(win,_2e){if(_5.range._w3c){return win.getSelection();}else{var s=new _5.range.ie.selection(win);if(!_2e){s._getCurrentSelection();}return s;}};if(!_5.range._w3c){_5.range.ie={cachedSelection:{},selection:function(win){this._ranges=[];this.addRange=function(r,_2f){this._ranges.push(r);if(!_2f){r._select();}this.rangeCount=this._ranges.length;};this.removeAllRanges=function(){this._ranges=[];this.rangeCount=0;};var _30=function(){var r=win.document.selection.createRange();var _31=win.document.selection.type.toUpperCase();if(_31=="CONTROL"){return new _5.range.W3CRange(_5.range.ie.decomposeControlRange(r));}else{return new _5.range.W3CRange(_5.range.ie.decomposeTextRange(r));}};this.getRangeAt=function(i){return this._ranges[i];};this._getCurrentSelection=function(){this.removeAllRanges();var r=_30();if(r){this.addRange(r,true);this.isCollapsed=r.collapsed;}else{this.isCollapsed=true;}};},decomposeControlRange:function(_32){var _33=_32.item(0),_34=_32.item(_32.length-1);var _35=_33.parentNode,_36=_34.parentNode;var _37=_5.range.getIndex(_33,_35).o[0];var _38=_5.range.getIndex(_34,_36).o[0]+1;return [_35,_37,_36,_38];},getEndPoint:function(_39,end){var _3a=_39.duplicate();_3a.collapse(!end);var _3b="EndTo"+(end?"End":"Start");var _3c=_3a.parentElement();var _3d,_3e,_3f;if(_3c.childNodes.length>0){_1.every(_3c.childNodes,function(_40,i){var _41;if(_40.nodeType!=3){_3a.moveToElementText(_40);if(_3a.compareEndPoints(_3b,_39)>0){if(_3f&&_3f.nodeType==3){_3d=_3f;_41=true;}else{_3d=_3c;_3e=i;return false;}}else{if(i==_3c.childNodes.length-1){_3d=_3c;_3e=_3c.childNodes.length;return false;}}}else{if(i==_3c.childNodes.length-1){_3d=_40;_41=true;}}if(_41&&_3d){var _42=_5.range.adjacentNoneTextNode(_3d)[0];if(_42){_3d=_42.nextSibling;}else{_3d=_3c.firstChild;}var _43=_5.range.adjacentNoneTextNode(_3d);_42=_43[0];var _44=_43[1];if(_42){_3a.moveToElementText(_42);_3a.collapse(false);}else{_3a.moveToElementText(_3c);}_3a.setEndPoint(_3b,_39);_3e=_3a.text.length-_44;return false;}_3f=_40;return true;});}else{_3d=_3c;_3e=0;}if(!end&&_3d.nodeType==1&&_3e==_3d.childNodes.length){var _45=_3d.nextSibling;if(_45&&_45.nodeType==3){_3d=_45;_3e=0;}}return [_3d,_3e];},setEndPoint:function(_46,_47,_48){var _49=_46.duplicate(),_4a,len;if(_47.nodeType!=3){if(_48>0){_4a=_47.childNodes[_48-1];if(_4a){if(_4a.nodeType==3){_47=_4a;_48=_4a.length;}else{if(_4a.nextSibling&&_4a.nextSibling.nodeType==3){_47=_4a.nextSibling;_48=0;}else{_49.moveToElementText(_4a.nextSibling?_4a:_47);var _4b=_4a.parentNode;var _4c=_4b.insertBefore(_4a.ownerDocument.createTextNode(" "),_4a.nextSibling);_49.collapse(false);_4b.removeChild(_4c);}}}}else{_49.moveToElementText(_47);_49.collapse(true);}}if(_47.nodeType==3){var _4d=_5.range.adjacentNoneTextNode(_47);var _4e=_4d[0];len=_4d[1];if(_4e){_49.moveToElementText(_4e);_49.collapse(false);if(_4e.contentEditable!="inherit"){len++;}}else{_49.moveToElementText(_47.parentNode);_49.collapse(true);}_48+=len;if(_48>0){if(_49.move("character",_48)!=_48){console.error("Error when moving!");}}}return _49;},decomposeTextRange:function(_4f){var _50=_5.range.ie.getEndPoint(_4f);var _51=_50[0],_52=_50[1];var _53=_50[0],_54=_50[1];if(_4f.htmlText.length){if(_4f.htmlText==_4f.text){_54=_52+_4f.text.length;}else{_50=_5.range.ie.getEndPoint(_4f,true);_53=_50[0],_54=_50[1];}}return [_51,_52,_53,_54];},setRange:function(_55,_56,_57,_58,_59,_5a){var _5b=_5.range.ie.setEndPoint(_55,_56,_57);_55.setEndPoint("StartToStart",_5b);if(!_5a){var end=_5.range.ie.setEndPoint(_55,_58,_59);}_55.setEndPoint("EndToEnd",end||_5b);return _55;}};_2("dijit.range.W3CRange",null,{constructor:function(){if(arguments.length>0){this.setStart(arguments[0][0],arguments[0][1]);this.setEnd(arguments[0][2],arguments[0][3]);}else{this.commonAncestorContainer=null;this.startContainer=null;this.startOffset=0;this.endContainer=null;this.endOffset=0;this.collapsed=true;}},_updateInternal:function(){if(this.startContainer!==this.endContainer){this.commonAncestorContainer=_5.range.getCommonAncestor(this.startContainer,this.endContainer);}else{this.commonAncestorContainer=this.startContainer;}this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset);},setStart:function(_5c,_5d){_5d=parseInt(_5d);if(this.startContainer===_5c&&this.startOffset==_5d){return;}delete this._cachedBookmark;this.startContainer=_5c;this.startOffset=_5d;if(!this.endContainer){this.setEnd(_5c,_5d);}else{this._updateInternal();}},setEnd:function(_5e,_5f){_5f=parseInt(_5f);if(this.endContainer===_5e&&this.endOffset==_5f){return;}delete this._cachedBookmark;this.endContainer=_5e;this.endOffset=_5f;if(!this.startContainer){this.setStart(_5e,_5f);}else{this._updateInternal();}},setStartAfter:function(_60,_61){this._setPoint("setStart",_60,_61,1);},setStartBefore:function(_62,_63){this._setPoint("setStart",_62,_63,0);},setEndAfter:function(_64,_65){this._setPoint("setEnd",_64,_65,1);},setEndBefore:function(_66,_67){this._setPoint("setEnd",_66,_67,0);},_setPoint:function(_68,_69,_6a,ext){var _6b=_5.range.getIndex(_69,_69.parentNode).o;this[_68](_69.parentNode,_6b.pop()+ext);},_getIERange:function(){var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();_5.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed);return r;},getBookmark:function(){this._getIERange();return this._cachedBookmark;},_select:function(){var r=this._getIERange();r.select();},deleteContents:function(){var s=this.startContainer,r=this._getIERange();if(s.nodeType===3&&!this.startOffset){this.setStartBefore(s);}r.pasteHTML("");this.endContainer=this.startContainer;this.endOffset=this.startOffset;this.collapsed=true;},cloneRange:function(){var r=new _5.range.W3CRange([this.startContainer,this.startOffset,this.endContainer,this.endOffset]);r._body=this._body;return r;},detach:function(){this._body=null;this.commonAncestorContainer=null;this.startContainer=null;this.startOffset=0;this.endContainer=null;this.endOffset=0;this.collapsed=true;}});}return _5.range;}); \ No newline at end of file
+define("dijit/_editor/range",["dojo/_base/array","dojo/_base/declare","dojo/_base/lang","dojo/_base/window","../main"],function(_1,_2,_3,_4,_5){_5.range={};_5.range.getIndex=function(_6,_7){var _8=[],_9=[];var _a=_6;var _b,n;while(_6!=_7){var i=0;_b=_6.parentNode;while((n=_b.childNodes[i++])){if(n===_6){--i;break;}}_8.unshift(i);_9.unshift(i-_b.childNodes.length);_6=_b;}if(_8.length>0&&_a.nodeType==3){n=_a.previousSibling;while(n&&n.nodeType==3){_8[_8.length-1]--;n=n.previousSibling;}n=_a.nextSibling;while(n&&n.nodeType==3){_9[_9.length-1]++;n=n.nextSibling;}}return {o:_8,r:_9};};_5.range.getNode=function(_c,_d){if(!_3.isArray(_c)||_c.length==0){return _d;}var _e=_d;_1.every(_c,function(i){if(i>=0&&i<_e.childNodes.length){_e=_e.childNodes[i];}else{_e=null;return false;}return true;});return _e;};_5.range.getCommonAncestor=function(n1,n2,_f){_f=_f||n1.ownerDocument.body;var _10=function(n){var as=[];while(n){as.unshift(n);if(n!==_f){n=n.parentNode;}else{break;}}return as;};var _11=_10(n1);var _12=_10(n2);var m=Math.min(_11.length,_12.length);var com=_11[0];for(var i=1;i<m;i++){if(_11[i]===_12[i]){com=_11[i];}else{break;}}return com;};_5.range.getAncestor=function(_13,_14,_15){_15=_15||_13.ownerDocument.body;while(_13&&_13!==_15){var _16=_13.nodeName.toUpperCase();if(_14.test(_16)){return _13;}_13=_13.parentNode;}return null;};_5.range.BlockTagNames=/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;_5.range.getBlockAncestor=function(_17,_18,_19){_19=_19||_17.ownerDocument.body;_18=_18||_5.range.BlockTagNames;var _1a=null,_1b;while(_17&&_17!==_19){var _1c=_17.nodeName.toUpperCase();if(!_1a&&_18.test(_1c)){_1a=_17;}if(!_1b&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_1c)){_1b=_17;}_17=_17.parentNode;}return {blockNode:_1a,blockContainer:_1b||_17.ownerDocument.body};};_5.range.atBeginningOfContainer=function(_1d,_1e,_1f){var _20=false;var _21=(_1f==0);if(!_21&&_1e.nodeType==3){if(/^[\s\xA0]+$/.test(_1e.nodeValue.substr(0,_1f))){_21=true;}}if(_21){var _22=_1e;_20=true;while(_22&&_22!==_1d){if(_22.previousSibling){_20=false;break;}_22=_22.parentNode;}}return _20;};_5.range.atEndOfContainer=function(_23,_24,_25){var _26=false;var _27=(_25==(_24.length||_24.childNodes.length));if(!_27&&_24.nodeType==3){if(/^[\s\xA0]+$/.test(_24.nodeValue.substr(_25))){_27=true;}}if(_27){var _28=_24;_26=true;while(_28&&_28!==_23){if(_28.nextSibling){_26=false;break;}_28=_28.parentNode;}}return _26;};_5.range.adjacentNoneTextNode=function(_29,_2a){var _2b=_29;var len=(0-_29.length)||0;var _2c=_2a?"nextSibling":"previousSibling";while(_2b){if(_2b.nodeType!=3){break;}len+=_2b.length;_2b=_2b[_2c];}return [_2b,len];};_5.range.create=function(win){win=win||window;if(win.getSelection){return win.document.createRange();}else{return new _5.range.W3CRange();}};_5.range.getSelection=function(_2d,_2e){if(_2d.getSelection){return _2d.getSelection();}else{var s=new _5.range.ie.selection(_2d);if(!_2e){s._getCurrentSelection();}return s;}};if(!window.getSelection){_5.range.ie={cachedSelection:{},selection:function(_2f){this._ranges=[];this.addRange=function(r,_30){this._ranges.push(r);if(!_30){r._select();}this.rangeCount=this._ranges.length;};this.removeAllRanges=function(){this._ranges=[];this.rangeCount=0;};var _31=function(){var r=_2f.document.selection.createRange();var _32=_2f.document.selection.type.toUpperCase();if(_32=="CONTROL"){return new _5.range.W3CRange(_5.range.ie.decomposeControlRange(r));}else{return new _5.range.W3CRange(_5.range.ie.decomposeTextRange(r));}};this.getRangeAt=function(i){return this._ranges[i];};this._getCurrentSelection=function(){this.removeAllRanges();var r=_31();if(r){this.addRange(r,true);this.isCollapsed=r.collapsed;}else{this.isCollapsed=true;}};},decomposeControlRange:function(_33){var _34=_33.item(0),_35=_33.item(_33.length-1);var _36=_34.parentNode,_37=_35.parentNode;var _38=_5.range.getIndex(_34,_36).o[0];var _39=_5.range.getIndex(_35,_37).o[0]+1;return [_36,_38,_37,_39];},getEndPoint:function(_3a,end){var _3b=_3a.duplicate();_3b.collapse(!end);var _3c="EndTo"+(end?"End":"Start");var _3d=_3b.parentElement();var _3e,_3f,_40;if(_3d.childNodes.length>0){_1.every(_3d.childNodes,function(_41,i){var _42;if(_41.nodeType!=3){_3b.moveToElementText(_41);if(_3b.compareEndPoints(_3c,_3a)>0){if(_40&&_40.nodeType==3){_3e=_40;_42=true;}else{_3e=_3d;_3f=i;return false;}}else{if(i==_3d.childNodes.length-1){_3e=_3d;_3f=_3d.childNodes.length;return false;}}}else{if(i==_3d.childNodes.length-1){_3e=_41;_42=true;}}if(_42&&_3e){var _43=_5.range.adjacentNoneTextNode(_3e)[0];if(_43){_3e=_43.nextSibling;}else{_3e=_3d.firstChild;}var _44=_5.range.adjacentNoneTextNode(_3e);_43=_44[0];var _45=_44[1];if(_43){_3b.moveToElementText(_43);_3b.collapse(false);}else{_3b.moveToElementText(_3d);}_3b.setEndPoint(_3c,_3a);_3f=_3b.text.length-_45;return false;}_40=_41;return true;});}else{_3e=_3d;_3f=0;}if(!end&&_3e.nodeType==1&&_3f==_3e.childNodes.length){var _46=_3e.nextSibling;if(_46&&_46.nodeType==3){_3e=_46;_3f=0;}}return [_3e,_3f];},setEndPoint:function(_47,_48,_49){var _4a=_47.duplicate(),_4b,len;if(_48.nodeType!=3){if(_49>0){_4b=_48.childNodes[_49-1];if(_4b){if(_4b.nodeType==3){_48=_4b;_49=_4b.length;}else{if(_4b.nextSibling&&_4b.nextSibling.nodeType==3){_48=_4b.nextSibling;_49=0;}else{_4a.moveToElementText(_4b.nextSibling?_4b:_48);var _4c=_4b.parentNode;var _4d=_4c.insertBefore(_4b.ownerDocument.createTextNode(" "),_4b.nextSibling);_4a.collapse(false);_4c.removeChild(_4d);}}}}else{_4a.moveToElementText(_48);_4a.collapse(true);}}if(_48.nodeType==3){var _4e=_5.range.adjacentNoneTextNode(_48);var _4f=_4e[0];len=_4e[1];if(_4f){_4a.moveToElementText(_4f);_4a.collapse(false);if(_4f.contentEditable!="inherit"){len++;}}else{_4a.moveToElementText(_48.parentNode);_4a.collapse(true);_4a.move("character",1);_4a.move("character",-1);}_49+=len;if(_49>0){if(_4a.move("character",_49)!=_49){console.error("Error when moving!");}}}return _4a;},decomposeTextRange:function(_50){var _51=_5.range.ie.getEndPoint(_50);var _52=_51[0],_53=_51[1];var _54=_51[0],_55=_51[1];if(_50.htmlText.length){if(_50.htmlText==_50.text){_55=_53+_50.text.length;}else{_51=_5.range.ie.getEndPoint(_50,true);_54=_51[0],_55=_51[1];}}return [_52,_53,_54,_55];},setRange:function(_56,_57,_58,_59,_5a,_5b){var _5c=_5.range.ie.setEndPoint(_56,_57,_58);_56.setEndPoint("StartToStart",_5c);if(!_5b){var end=_5.range.ie.setEndPoint(_56,_59,_5a);}_56.setEndPoint("EndToEnd",end||_5c);return _56;}};_2("dijit.range.W3CRange",null,{constructor:function(){if(arguments.length>0){this.setStart(arguments[0][0],arguments[0][1]);this.setEnd(arguments[0][2],arguments[0][3]);}else{this.commonAncestorContainer=null;this.startContainer=null;this.startOffset=0;this.endContainer=null;this.endOffset=0;this.collapsed=true;}},_updateInternal:function(){if(this.startContainer!==this.endContainer){this.commonAncestorContainer=_5.range.getCommonAncestor(this.startContainer,this.endContainer);}else{this.commonAncestorContainer=this.startContainer;}this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset);},setStart:function(_5d,_5e){_5e=parseInt(_5e);if(this.startContainer===_5d&&this.startOffset==_5e){return;}delete this._cachedBookmark;this.startContainer=_5d;this.startOffset=_5e;if(!this.endContainer){this.setEnd(_5d,_5e);}else{this._updateInternal();}},setEnd:function(_5f,_60){_60=parseInt(_60);if(this.endContainer===_5f&&this.endOffset==_60){return;}delete this._cachedBookmark;this.endContainer=_5f;this.endOffset=_60;if(!this.startContainer){this.setStart(_5f,_60);}else{this._updateInternal();}},setStartAfter:function(_61,_62){this._setPoint("setStart",_61,_62,1);},setStartBefore:function(_63,_64){this._setPoint("setStart",_63,_64,0);},setEndAfter:function(_65,_66){this._setPoint("setEnd",_65,_66,1);},setEndBefore:function(_67,_68){this._setPoint("setEnd",_67,_68,0);},_setPoint:function(_69,_6a,_6b,ext){var _6c=_5.range.getIndex(_6a,_6a.parentNode).o;this[_69](_6a.parentNode,_6c.pop()+ext);},_getIERange:function(){var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();_5.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed);return r;},getBookmark:function(){this._getIERange();return this._cachedBookmark;},_select:function(){var r=this._getIERange();r.select();},deleteContents:function(){var s=this.startContainer,r=this._getIERange();if(s.nodeType===3&&!this.startOffset){this.setStartBefore(s);}r.pasteHTML("");this.endContainer=this.startContainer;this.endOffset=this.startOffset;this.collapsed=true;},cloneRange:function(){var r=new _5.range.W3CRange([this.startContainer,this.startOffset,this.endContainer,this.endOffset]);r._body=this._body;return r;},detach:function(){this._body=null;this.commonAncestorContainer=null;this.startContainer=null;this.startOffset=0;this.endContainer=null;this.endOffset=0;this.collapsed=true;}});}return _5.range;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/range.js.uncompressed.js b/lib/dijit/_editor/range.js.uncompressed.js
new file mode 100644
index 000000000..b1f55e1ce
--- /dev/null
+++ b/lib/dijit/_editor/range.js.uncompressed.js
@@ -0,0 +1,559 @@
+define("dijit/_editor/range", [
+ "dojo/_base/array", // array.every
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.isArray
+ "dojo/_base/window", // win.doc TODO: remove in 2.0
+ "../main" // for exporting symbols to dijit, TODO: remove in 2.0
+], function(array, declare, lang, win, dijit){
+
+// module:
+// dijit/_editor/range
+// summary:
+// W3C range API
+
+
+dijit.range={};
+
+dijit.range.getIndex = function(/*DomNode*/node, /*DomNode*/parent){
+// dojo.profile.start("dijit.range.getIndex");
+ var ret = [], retR = [];
+ var onode = node;
+
+ var pnode, n;
+ while(node != parent){
+ var i = 0;
+ pnode = node.parentNode;
+ while((n = pnode.childNodes[i++])){
+ if(n === node){
+ --i;
+ break;
+ }
+ }
+ //if(i>=pnode.childNodes.length){
+ //dojo.debug("Error finding index of a node in dijit/range.getIndex()");
+ //}
+ ret.unshift(i);
+ retR.unshift(i - pnode.childNodes.length);
+ node = pnode;
+ }
+
+ //normalized() can not be called so often to prevent
+ //invalidating selection/range, so we have to detect
+ //here that any text nodes in a row
+ if(ret.length > 0 && onode.nodeType == 3){
+ n = onode.previousSibling;
+ while(n && n.nodeType == 3){
+ ret[ret.length - 1]--;
+ n = n.previousSibling;
+ }
+ n = onode.nextSibling;
+ while(n && n.nodeType == 3){
+ retR[retR.length - 1]++;
+ n = n.nextSibling;
+ }
+ }
+// dojo.profile.end("dijit/range.getIndex()");
+ return {o: ret, r:retR};
+};
+
+dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){
+ if(!lang.isArray(index) || index.length == 0){
+ return parent;
+ }
+ var node = parent;
+// if(!node)debugger
+ array.every(index, function(i){
+ if(i >= 0 && i < node.childNodes.length){
+ node = node.childNodes[i];
+ }else{
+ node = null;
+ //console.debug('Error: can not find node with index',index,'under parent node',parent );
+ return false; //terminate array.every
+ }
+ return true; //carry on the every loop
+ });
+
+ return node;
+};
+
+dijit.range.getCommonAncestor = function(n1, n2, root){
+ root = root || n1.ownerDocument.body;
+ var getAncestors = function(n){
+ var as = [];
+ while(n){
+ as.unshift(n);
+ if(n !== root){
+ n = n.parentNode;
+ }else{
+ break;
+ }
+ }
+ return as;
+ };
+ var n1as = getAncestors(n1);
+ var n2as = getAncestors(n2);
+
+ var m = Math.min(n1as.length, n2as.length);
+ var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default)
+ for(var i = 1; i < m; i++){
+ if(n1as[i] === n2as[i]){
+ com = n1as[i]
+ }else{
+ break;
+ }
+ }
+ return com;
+};
+
+dijit.range.getAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){
+ root = root || node.ownerDocument.body;
+ while(node && node !== root){
+ var name = node.nodeName.toUpperCase();
+ if(regex.test(name)){
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+ return null;
+};
+
+dijit.range.BlockTagNames = /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;
+dijit.range.getBlockAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){
+ root = root || node.ownerDocument.body;
+ regex = regex || dijit.range.BlockTagNames;
+ var block = null, blockContainer;
+ while(node && node !== root){
+ var name = node.nodeName.toUpperCase();
+ if(!block && regex.test(name)){
+ block = node;
+ }
+ if(!blockContainer && (/^(?:BODY|TD|TH|CAPTION)$/).test(name)){
+ blockContainer = node;
+ }
+
+ node = node.parentNode;
+ }
+ return {blockNode:block, blockContainer:blockContainer || node.ownerDocument.body};
+};
+
+dijit.range.atBeginningOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){
+ var atBeginning = false;
+ var offsetAtBeginning = (offset == 0);
+ if(!offsetAtBeginning && node.nodeType == 3){ //if this is a text node, check whether the left part is all space
+ if(/^[\s\xA0]+$/.test(node.nodeValue.substr(0, offset))){
+ offsetAtBeginning = true;
+ }
+ }
+ if(offsetAtBeginning){
+ var cnode = node;
+ atBeginning = true;
+ while(cnode && cnode !== container){
+ if(cnode.previousSibling){
+ atBeginning = false;
+ break;
+ }
+ cnode = cnode.parentNode;
+ }
+ }
+ return atBeginning;
+};
+
+dijit.range.atEndOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){
+ var atEnd = false;
+ var offsetAtEnd = (offset == (node.length || node.childNodes.length));
+ if(!offsetAtEnd && node.nodeType == 3){ //if this is a text node, check whether the right part is all space
+ if(/^[\s\xA0]+$/.test(node.nodeValue.substr(offset))){
+ offsetAtEnd = true;
+ }
+ }
+ if(offsetAtEnd){
+ var cnode = node;
+ atEnd = true;
+ while(cnode && cnode !== container){
+ if(cnode.nextSibling){
+ atEnd = false;
+ break;
+ }
+ cnode = cnode.parentNode;
+ }
+ }
+ return atEnd;
+};
+
+dijit.range.adjacentNoneTextNode = function(startnode, next){
+ var node = startnode;
+ var len = (0 - startnode.length) || 0;
+ var prop = next ? 'nextSibling' : 'previousSibling';
+ while(node){
+ if(node.nodeType != 3){
+ break;
+ }
+ len += node.length;
+ node = node[prop];
+ }
+ return [node,len];
+};
+
+dijit.range.create = function(/*Window?*/ win){ // TODO: for 2.0, replace optional window param w/mandatory window or document param
+ win = win || window;
+ if(win.getSelection){
+ return win.document.createRange();
+ }else{//IE
+ return new dijit.range.W3CRange();
+ }
+};
+
+dijit.range.getSelection = function(/*Window*/ window, /*Boolean?*/ ignoreUpdate){
+ if(window.getSelection){
+ return window.getSelection();
+ }else{//IE
+ var s = new dijit.range.ie.selection(window);
+ if(!ignoreUpdate){
+ s._getCurrentSelection();
+ }
+ return s;
+ }
+};
+
+// TODO: convert to has() test? But remember IE9 issues with quirks vs. standards in main frame vs. iframe.
+if(!window.getSelection){
+ dijit.range.ie = {
+ cachedSelection: {},
+ selection: function(window){
+ this._ranges = [];
+ this.addRange = function(r, /*boolean*/ internal){
+ this._ranges.push(r);
+ if(!internal){
+ r._select();
+ }
+ this.rangeCount = this._ranges.length;
+ };
+ this.removeAllRanges = function(){
+ //don't detach, the range may be used later
+// for(var i=0;i<this._ranges.length;i++){
+// this._ranges[i].detach();
+// }
+ this._ranges = [];
+ this.rangeCount = 0;
+ };
+ var _initCurrentRange = function(){
+ var r = window.document.selection.createRange();
+ var type = window.document.selection.type.toUpperCase();
+ if(type == "CONTROL"){
+ //TODO: multiple range selection(?)
+ return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));
+ }else{
+ return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));
+ }
+ };
+ this.getRangeAt = function(i){
+ return this._ranges[i];
+ };
+ this._getCurrentSelection = function(){
+ this.removeAllRanges();
+ var r = _initCurrentRange();
+ if(r){
+ this.addRange(r, true);
+ this.isCollapsed = r.collapsed;
+ }else{
+ this.isCollapsed = true;
+ }
+ };
+ },
+ decomposeControlRange: function(range){
+ var firstnode = range.item(0), lastnode = range.item(range.length - 1);
+ var startContainer = firstnode.parentNode, endContainer = lastnode.parentNode;
+ var startOffset = dijit.range.getIndex(firstnode, startContainer).o[0];
+ var endOffset = dijit.range.getIndex(lastnode, endContainer).o[0] + 1;
+ return [startContainer, startOffset,endContainer, endOffset];
+ },
+ getEndPoint: function(range, end){
+ var atmrange = range.duplicate();
+ atmrange.collapse(!end);
+ var cmpstr = 'EndTo' + (end ? 'End' : 'Start');
+ var parentNode = atmrange.parentElement();
+
+ var startnode, startOffset, lastNode;
+ if(parentNode.childNodes.length > 0){
+ array.every(parentNode.childNodes, function(node, i){
+ var calOffset;
+ if(node.nodeType != 3){
+ atmrange.moveToElementText(node);
+
+ if(atmrange.compareEndPoints(cmpstr, range) > 0){
+ //startnode = node.previousSibling;
+ if(lastNode && lastNode.nodeType == 3){
+ //where shall we put the start? in the text node or after?
+ startnode = lastNode;
+ calOffset = true;
+ }else{
+ startnode = parentNode;
+ startOffset = i;
+ return false;
+ }
+ }else{
+ if(i == parentNode.childNodes.length - 1){
+ startnode = parentNode;
+ startOffset = parentNode.childNodes.length;
+ return false;
+ }
+ }
+ }else{
+ if(i == parentNode.childNodes.length - 1){//at the end of this node
+ startnode = node;
+ calOffset = true;
+ }
+ }
+ // try{
+ if(calOffset && startnode){
+ var prevnode = dijit.range.adjacentNoneTextNode(startnode)[0];
+ if(prevnode){
+ startnode = prevnode.nextSibling;
+ }else{
+ startnode = parentNode.firstChild; //firstChild must be a text node
+ }
+ var prevnodeobj = dijit.range.adjacentNoneTextNode(startnode);
+ prevnode = prevnodeobj[0];
+ var lenoffset = prevnodeobj[1];
+ if(prevnode){
+ atmrange.moveToElementText(prevnode);
+ atmrange.collapse(false);
+ }else{
+ atmrange.moveToElementText(parentNode);
+ }
+ atmrange.setEndPoint(cmpstr, range);
+ startOffset = atmrange.text.length - lenoffset;
+
+ return false;
+ }
+ // }catch(e){ debugger }
+ lastNode = node;
+ return true;
+ });
+ }else{
+ startnode = parentNode;
+ startOffset = 0;
+ }
+
+ //if at the end of startnode and we are dealing with start container, then
+ //move the startnode to nextSibling if it is a text node
+ //TODO: do this for end container?
+ if(!end && startnode.nodeType == 1 && startOffset == startnode.childNodes.length){
+ var nextnode = startnode.nextSibling;
+ if(nextnode && nextnode.nodeType == 3){
+ startnode = nextnode;
+ startOffset = 0;
+ }
+ }
+ return [startnode, startOffset];
+ },
+ setEndPoint: function(range, container, offset){
+ //text node
+ var atmrange = range.duplicate(), node, len;
+ if(container.nodeType != 3){ //normal node
+ if(offset > 0){
+ node = container.childNodes[offset - 1];
+ if(node){
+ if(node.nodeType == 3){
+ container = node;
+ offset = node.length;
+ //pass through
+ }else{
+ if(node.nextSibling && node.nextSibling.nodeType == 3){
+ container = node.nextSibling;
+ offset = 0;
+ //pass through
+ }else{
+ atmrange.moveToElementText(node.nextSibling ? node : container);
+ var parent = node.parentNode;
+ var tempNode = parent.insertBefore(node.ownerDocument.createTextNode(' '), node.nextSibling);
+ atmrange.collapse(false);
+ parent.removeChild(tempNode);
+ }
+ }
+ }
+ }else{
+ atmrange.moveToElementText(container);
+ atmrange.collapse(true);
+ }
+ }
+ if(container.nodeType == 3){
+ var prevnodeobj = dijit.range.adjacentNoneTextNode(container);
+ var prevnode = prevnodeobj[0];
+ len = prevnodeobj[1];
+ if(prevnode){
+ atmrange.moveToElementText(prevnode);
+ atmrange.collapse(false);
+ //if contentEditable is not inherit, the above collapse won't make the end point
+ //in the correctly position: it always has a -1 offset, so compensate it
+ if(prevnode.contentEditable != 'inherit'){
+ len++;
+ }
+ }else{
+ atmrange.moveToElementText(container.parentNode);
+ atmrange.collapse(true);
+
+ // Correct internal cursor position
+ // http://bugs.dojotoolkit.org/ticket/15578
+ atmrange.move('character', 1);
+ atmrange.move('character', -1);
+ }
+
+ offset += len;
+ if(offset > 0){
+ if(atmrange.move('character', offset) != offset){
+ console.error('Error when moving!');
+ }
+ }
+ }
+
+ return atmrange;
+ },
+ decomposeTextRange: function(range){
+ var tmpary = dijit.range.ie.getEndPoint(range);
+ var startContainer = tmpary[0], startOffset = tmpary[1];
+ var endContainer = tmpary[0], endOffset = tmpary[1];
+
+ if(range.htmlText.length){
+ if(range.htmlText == range.text){ //in the same text node
+ endOffset = startOffset + range.text.length;
+ }else{
+ tmpary = dijit.range.ie.getEndPoint(range, true);
+ endContainer = tmpary[0],endOffset = tmpary[1];
+// if(startContainer.tagName == "BODY"){
+// startContainer = startContainer.firstChild;
+// }
+ }
+ }
+ return [startContainer, startOffset, endContainer, endOffset];
+ },
+ setRange: function(range, startContainer, startOffset, endContainer, endOffset, collapsed){
+ var start = dijit.range.ie.setEndPoint(range, startContainer, startOffset);
+
+ range.setEndPoint('StartToStart', start);
+ if(!collapsed){
+ var end = dijit.range.ie.setEndPoint(range, endContainer, endOffset);
+ }
+ range.setEndPoint('EndToEnd', end || start);
+
+ return range;
+ }
+ };
+
+declare("dijit.range.W3CRange",null, {
+ constructor: function(){
+ if(arguments.length>0){
+ this.setStart(arguments[0][0],arguments[0][1]);
+ this.setEnd(arguments[0][2],arguments[0][3]);
+ }else{
+ this.commonAncestorContainer = null;
+ this.startContainer = null;
+ this.startOffset = 0;
+ this.endContainer = null;
+ this.endOffset = 0;
+ this.collapsed = true;
+ }
+ },
+ _updateInternal: function(){
+ if(this.startContainer !== this.endContainer){
+ this.commonAncestorContainer = dijit.range.getCommonAncestor(this.startContainer, this.endContainer);
+ }else{
+ this.commonAncestorContainer = this.startContainer;
+ }
+ this.collapsed = (this.startContainer === this.endContainer) && (this.startOffset == this.endOffset);
+ },
+ setStart: function(node, offset){
+ offset=parseInt(offset);
+ if(this.startContainer === node && this.startOffset == offset){
+ return;
+ }
+ delete this._cachedBookmark;
+
+ this.startContainer = node;
+ this.startOffset = offset;
+ if(!this.endContainer){
+ this.setEnd(node, offset);
+ }else{
+ this._updateInternal();
+ }
+ },
+ setEnd: function(node, offset){
+ offset=parseInt(offset);
+ if(this.endContainer === node && this.endOffset == offset){
+ return;
+ }
+ delete this._cachedBookmark;
+
+ this.endContainer = node;
+ this.endOffset = offset;
+ if(!this.startContainer){
+ this.setStart(node, offset);
+ }else{
+ this._updateInternal();
+ }
+ },
+ setStartAfter: function(node, offset){
+ this._setPoint('setStart', node, offset, 1);
+ },
+ setStartBefore: function(node, offset){
+ this._setPoint('setStart', node, offset, 0);
+ },
+ setEndAfter: function(node, offset){
+ this._setPoint('setEnd', node, offset, 1);
+ },
+ setEndBefore: function(node, offset){
+ this._setPoint('setEnd', node, offset, 0);
+ },
+ _setPoint: function(what, node, offset, ext){
+ var index = dijit.range.getIndex(node, node.parentNode).o;
+ this[what](node.parentNode, index.pop()+ext);
+ },
+ _getIERange: function(){
+ var r = (this._body || this.endContainer.ownerDocument.body).createTextRange();
+ dijit.range.ie.setRange(r, this.startContainer, this.startOffset, this.endContainer, this.endOffset, this.collapsed);
+ return r;
+ },
+ getBookmark: function(){
+ this._getIERange();
+ return this._cachedBookmark;
+ },
+ _select: function(){
+ var r = this._getIERange();
+ r.select();
+ },
+ deleteContents: function(){
+ var s = this.startContainer, r = this._getIERange();
+ if(s.nodeType === 3 && !this.startOffset){
+ //if the range starts at the beginning of a
+ //text node, move it to before the textnode
+ //to make sure the range is still valid
+ //after deleteContents() finishes
+ this.setStartBefore(s);
+ }
+ r.pasteHTML('');
+ this.endContainer = this.startContainer;
+ this.endOffset = this.startOffset;
+ this.collapsed = true;
+ },
+ cloneRange: function(){
+ var r = new dijit.range.W3CRange([this.startContainer,this.startOffset,
+ this.endContainer,this.endOffset]);
+ r._body = this._body;
+ return r;
+ },
+ detach: function(){
+ this._body = null;
+ this.commonAncestorContainer = null;
+ this.startContainer = null;
+ this.startOffset = 0;
+ this.endContainer = null;
+ this.endOffset = 0;
+ this.collapsed = true;
+}
+});
+} //if(!window.getSelection)
+
+
+return dijit.range;
+});
diff --git a/lib/dijit/_editor/selection.js b/lib/dijit/_editor/selection.js
index 55d8ee23b..c19c340af 100644
--- a/lib/dijit/_editor/selection.js
+++ b/lib/dijit/_editor/selection.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/_editor/selection",["dojo/dom","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window",".."],function(_1,_2,_3,_4,_5){_2.getObject("_editor.selection",true,_5);_2.mixin(_5._editor.selection,{getType:function(){if(_3("ie")<9){return _4.doc.selection.type.toLowerCase();}else{var _6="text";var _7;try{_7=_4.global.getSelection();}catch(e){}if(_7&&_7.rangeCount==1){var _8=_7.getRangeAt(0);if((_8.startContainer==_8.endContainer)&&((_8.endOffset-_8.startOffset)==1)&&(_8.startContainer.nodeType!=3)){_6="control";}}return _6;}},getSelectedText:function(){if(_3("ie")<9){if(_5._editor.selection.getType()=="control"){return null;}return _4.doc.selection.createRange().text;}else{var _9=_4.global.getSelection();if(_9){return _9.toString();}}return "";},getSelectedHtml:function(){if(_3("ie")<9){if(_5._editor.selection.getType()=="control"){return null;}return _4.doc.selection.createRange().htmlText;}else{var _a=_4.global.getSelection();if(_a&&_a.rangeCount){var i;var _b="";for(i=0;i<_a.rangeCount;i++){var _c=_a.getRangeAt(i).cloneContents();var _d=_4.doc.createElement("div");_d.appendChild(_c);_b+=_d.innerHTML;}return _b;}return null;}},getSelectedElement:function(){if(_5._editor.selection.getType()=="control"){if(_3("ie")<9){var _e=_4.doc.selection.createRange();if(_e&&_e.item){return _4.doc.selection.createRange().item(0);}}else{var _f=_4.global.getSelection();return _f.anchorNode.childNodes[_f.anchorOffset];}}return null;},getParentElement:function(){if(_5._editor.selection.getType()=="control"){var p=this.getSelectedElement();if(p){return p.parentNode;}}else{if(_3("ie")<9){var r=_4.doc.selection.createRange();r.collapse(true);return r.parentElement();}else{var _10=_4.global.getSelection();if(_10){var _11=_10.anchorNode;while(_11&&(_11.nodeType!=1)){_11=_11.parentNode;}return _11;}}}return null;},hasAncestorElement:function(_12){return this.getAncestorElement.apply(this,arguments)!=null;},getAncestorElement:function(_13){var _14=this.getSelectedElement()||this.getParentElement();return this.getParentOfType(_14,arguments);},isTag:function(_15,_16){if(_15&&_15.tagName){var _17=_15.tagName.toLowerCase();for(var i=0;i<_16.length;i++){var _18=String(_16[i]).toLowerCase();if(_17==_18){return _18;}}}return "";},getParentOfType:function(_19,_1a){while(_19){if(this.isTag(_19,_1a).length){return _19;}_19=_19.parentNode;}return null;},collapse:function(_1b){if(window.getSelection){var _1c=_4.global.getSelection();if(_1c.removeAllRanges){if(_1b){_1c.collapseToStart();}else{_1c.collapseToEnd();}}else{_1c.collapse(_1b);}}else{if(_3("ie")){var _1d=_4.doc.selection.createRange();_1d.collapse(_1b);_1d.select();}}},remove:function(){var sel=_4.doc.selection;if(_3("ie")<9){if(sel.type.toLowerCase()!="none"){sel.clear();}return sel;}else{sel=_4.global.getSelection();sel.deleteFromDocument();return sel;}},selectElementChildren:function(_1e,_1f){var _20=_4.global;var doc=_4.doc;var _21;_1e=_1.byId(_1e);if(doc.selection&&_3("ie")<9&&_4.body().createTextRange){_21=_1e.ownerDocument.body.createTextRange();_21.moveToElementText(_1e);if(!_1f){try{_21.select();}catch(e){}}}else{if(_20.getSelection){var _22=_4.global.getSelection();if(_3("opera")){if(_22.rangeCount){_21=_22.getRangeAt(0);}else{_21=doc.createRange();}_21.setStart(_1e,0);_21.setEnd(_1e,(_1e.nodeType==3)?_1e.length:_1e.childNodes.length);_22.addRange(_21);}else{_22.selectAllChildren(_1e);}}}},selectElement:function(_23,_24){var _25;var doc=_4.doc;var _26=_4.global;_23=_1.byId(_23);if(_3("ie")<9&&_4.body().createTextRange){try{var tg=_23.tagName?_23.tagName.toLowerCase():"";if(tg==="img"||tg==="table"){_25=_4.body().createControlRange();}else{_25=_4.body().createRange();}_25.addElement(_23);if(!_24){_25.select();}}catch(e){this.selectElementChildren(_23,_24);}}else{if(_26.getSelection){var _27=_26.getSelection();_25=doc.createRange();if(_27.removeAllRanges){if(_3("opera")){if(_27.getRangeAt(0)){_25=_27.getRangeAt(0);}}_25.selectNode(_23);_27.removeAllRanges();_27.addRange(_25);}}}},inSelection:function(_28){if(_28){var _29;var doc=_4.doc;var _2a;if(_4.global.getSelection){var sel=_4.global.getSelection();if(sel&&sel.rangeCount>0){_2a=sel.getRangeAt(0);}if(_2a&&_2a.compareBoundaryPoints&&doc.createRange){try{_29=doc.createRange();_29.setStart(_28,0);if(_2a.compareBoundaryPoints(_2a.START_TO_END,_29)===1){return true;}}catch(e){}}}else{if(doc.selection){_2a=doc.selection.createRange();try{_29=_28.ownerDocument.body.createControlRange();if(_29){_29.addElement(_28);}}catch(e1){try{_29=_28.ownerDocument.body.createTextRange();_29.moveToElementText(_28);}catch(e2){}}if(_2a&&_29){if(_2a.compareEndPoints("EndToStart",_29)===1){return true;}}}}}return false;}});return _5._editor.selection;}); \ No newline at end of file
+define("dijit/_editor/selection",["dojo/dom","dojo/_base/lang","dojo/sniff","dojo/_base/window","../main"],function(_1,_2,_3,_4,_5){var _6={getType:function(){if(_4.doc.getSelection){var _7="text";var _8;try{_8=_4.global.getSelection();}catch(e){}if(_8&&_8.rangeCount==1){var _9=_8.getRangeAt(0);if((_9.startContainer==_9.endContainer)&&((_9.endOffset-_9.startOffset)==1)&&(_9.startContainer.nodeType!=3)){_7="control";}}return _7;}else{return _4.doc.selection.type.toLowerCase();}},getSelectedText:function(){if(_4.doc.getSelection){var _a=_4.global.getSelection();return _a?_a.toString():"";}else{if(_5._editor.selection.getType()=="control"){return null;}return _4.doc.selection.createRange().text;}},getSelectedHtml:function(){if(_4.doc.getSelection){var _b=_4.global.getSelection();if(_b&&_b.rangeCount){var i;var _c="";for(i=0;i<_b.rangeCount;i++){var _d=_b.getRangeAt(i).cloneContents();var _e=_4.doc.createElement("div");_e.appendChild(_d);_c+=_e.innerHTML;}return _c;}return null;}else{if(_5._editor.selection.getType()=="control"){return null;}return _4.doc.selection.createRange().htmlText;}},getSelectedElement:function(){if(_5._editor.selection.getType()=="control"){if(_4.doc.getSelection){var _f=_4.global.getSelection();return _f.anchorNode.childNodes[_f.anchorOffset];}else{var _10=_4.doc.selection.createRange();if(_10&&_10.item){return _4.doc.selection.createRange().item(0);}}}return null;},getParentElement:function(){if(_5._editor.selection.getType()=="control"){var p=this.getSelectedElement();if(p){return p.parentNode;}}else{if(_4.doc.getSelection){var _11=_4.global.getSelection();if(_11){var _12=_11.anchorNode;while(_12&&(_12.nodeType!=1)){_12=_12.parentNode;}return _12;}}else{var r=_4.doc.selection.createRange();r.collapse(true);return r.parentElement();}}return null;},hasAncestorElement:function(_13){return this.getAncestorElement.apply(this,arguments)!=null;},getAncestorElement:function(_14){var _15=this.getSelectedElement()||this.getParentElement();return this.getParentOfType(_15,arguments);},isTag:function(_16,_17){if(_16&&_16.tagName){var _18=_16.tagName.toLowerCase();for(var i=0;i<_17.length;i++){var _19=String(_17[i]).toLowerCase();if(_18==_19){return _19;}}}return "";},getParentOfType:function(_1a,_1b){while(_1a){if(this.isTag(_1a,_1b).length){return _1a;}_1a=_1a.parentNode;}return null;},collapse:function(_1c){if(_4.doc.getSelection){var _1d=_4.global.getSelection();if(_1d.removeAllRanges){if(_1c){_1d.collapseToStart();}else{_1d.collapseToEnd();}}else{_1d.collapse(_1c);}}else{var _1e=_4.doc.selection.createRange();_1e.collapse(_1c);_1e.select();}},remove:function(){var sel=_4.doc.selection;if(_4.doc.getSelection){sel=_4.global.getSelection();sel.deleteFromDocument();return sel;}else{if(sel.type.toLowerCase()!="none"){sel.clear();}return sel;}},selectElementChildren:function(_1f,_20){var doc=_4.doc;var _21;_1f=_1.byId(_1f);if(_4.doc.getSelection){var _22=_4.global.getSelection();if(_3("opera")){if(_22.rangeCount){_21=_22.getRangeAt(0);}else{_21=doc.createRange();}_21.setStart(_1f,0);_21.setEnd(_1f,(_1f.nodeType==3)?_1f.length:_1f.childNodes.length);_22.addRange(_21);}else{_22.selectAllChildren(_1f);}}else{_21=_1f.ownerDocument.body.createTextRange();_21.moveToElementText(_1f);if(!_20){try{_21.select();}catch(e){}}}},selectElement:function(_23,_24){var _25;_23=_1.byId(_23);var doc=_23.ownerDocument;var _26=_4.global;if(doc.getSelection){var _27=_26.getSelection();_25=doc.createRange();if(_27.removeAllRanges){if(_3("opera")){if(_27.getRangeAt(0)){_25=_27.getRangeAt(0);}}_25.selectNode(_23);_27.removeAllRanges();_27.addRange(_25);}}else{try{var tg=_23.tagName?_23.tagName.toLowerCase():"";if(tg==="img"||tg==="table"){_25=_4.body(doc).createControlRange();}else{_25=_4.body(doc).createRange();}_25.addElement(_23);if(!_24){_25.select();}}catch(e){this.selectElementChildren(_23,_24);}}},inSelection:function(_28){if(_28){var _29;var doc=_4.doc;var _2a;if(_4.doc.getSelection){var sel=_4.global.getSelection();if(sel&&sel.rangeCount>0){_2a=sel.getRangeAt(0);}if(_2a&&_2a.compareBoundaryPoints&&doc.createRange){try{_29=doc.createRange();_29.setStart(_28,0);if(_2a.compareBoundaryPoints(_2a.START_TO_END,_29)===1){return true;}}catch(e){}}}else{_2a=doc.selection.createRange();try{_29=_28.ownerDocument.body.createControlRange();if(_29){_29.addElement(_28);}}catch(e1){try{_29=_28.ownerDocument.body.createTextRange();_29.moveToElementText(_28);}catch(e2){}}if(_2a&&_29){if(_2a.compareEndPoints("EndToStart",_29)===1){return true;}}}}return false;}};_2.setObject("dijit._editor.selection",_6);return _6;}); \ No newline at end of file
diff --git a/lib/dijit/_editor/selection.js.uncompressed.js b/lib/dijit/_editor/selection.js.uncompressed.js
new file mode 100644
index 000000000..272ac7787
--- /dev/null
+++ b/lib/dijit/_editor/selection.js.uncompressed.js
@@ -0,0 +1,383 @@
+define("dijit/_editor/selection", [
+ "dojo/dom", // dom.byId
+ "dojo/_base/lang",
+ "dojo/sniff", // has("ie") has("opera")
+ "dojo/_base/window", // win.body win.doc win.doc.createElement win.doc.selection win.doc.selection.createRange win.doc.selection.type.toLowerCase win.global win.global.getSelection
+ "../main" // for exporting symbols to dijit._editor.selection (TODO: remove in 2.0)
+], function(dom, lang, has, win, dijit){
+
+// module:
+// dijit/_editor/selection
+// summary:
+// Text selection API
+
+// FIXME:
+// all of these methods branch internally for IE. This is probably
+// sub-optimal in terms of runtime performance. We should investigate the
+// size difference for differentiating at definition time.
+
+var selection = {
+ getType: function(){
+ // summary:
+ // Get the selection type (like win.doc.select.type in IE).
+ if(win.doc.getSelection){
+ // W3C path
+ var stype = "text";
+
+ // Check if the actual selection is a CONTROL (IMG, TABLE, HR, etc...).
+ var oSel;
+ try{
+ oSel = win.global.getSelection();
+ }catch(e){ /*squelch*/ }
+
+ if(oSel && oSel.rangeCount == 1){
+ var oRange = oSel.getRangeAt(0);
+ if( (oRange.startContainer == oRange.endContainer) &&
+ ((oRange.endOffset - oRange.startOffset) == 1) &&
+ (oRange.startContainer.nodeType != 3 /* text node*/)
+ ){
+ stype = "control";
+ }
+ }
+ return stype; //String
+ }else{
+ // IE6-8
+ return win.doc.selection.type.toLowerCase();
+ }
+ },
+
+ getSelectedText: function(){
+ // summary:
+ // Return the text (no html tags) included in the current selection or null if no text is selected
+ if(win.doc.getSelection){
+ // W3C path
+ var selection = win.global.getSelection();
+ return selection ? selection.toString() : ""; //String
+ }else{
+ // IE6-8
+ if(dijit._editor.selection.getType() == 'control'){
+ return null;
+ }
+ return win.doc.selection.createRange().text;
+ }
+ },
+
+ getSelectedHtml: function(){
+ // summary:
+ // Return the html text of the current selection or null if unavailable
+ if(win.doc.getSelection){
+ // W3C path
+ var selection = win.global.getSelection();
+ if(selection && selection.rangeCount){
+ var i;
+ var html = "";
+ for(i = 0; i < selection.rangeCount; i++){
+ //Handle selections spanning ranges, such as Opera
+ var frag = selection.getRangeAt(i).cloneContents();
+ var div = win.doc.createElement("div");
+ div.appendChild(frag);
+ html += div.innerHTML;
+ }
+ return html; //String
+ }
+ return null;
+ }else{
+ // IE6-8
+ if(dijit._editor.selection.getType() == 'control'){
+ return null;
+ }
+ return win.doc.selection.createRange().htmlText;
+ }
+ },
+
+ getSelectedElement: function(){
+ // summary:
+ // Retrieves the selected element (if any), just in the case that
+ // a single element (object like and image or a table) is
+ // selected.
+ if(dijit._editor.selection.getType() == "control"){
+ if(win.doc.getSelection){
+ // W3C path
+ var selection = win.global.getSelection();
+ return selection.anchorNode.childNodes[ selection.anchorOffset ];
+ }else{
+ // IE6-8
+ var range = win.doc.selection.createRange();
+ if(range && range.item){
+ return win.doc.selection.createRange().item(0);
+ }
+ }
+ }
+ return null;
+ },
+
+ getParentElement: function(){
+ // summary:
+ // Get the parent element of the current selection
+ if(dijit._editor.selection.getType() == "control"){
+ var p = this.getSelectedElement();
+ if(p){ return p.parentNode; }
+ }else{
+ if(win.doc.getSelection){
+ var selection = win.global.getSelection();
+ if(selection){
+ var node = selection.anchorNode;
+ while(node && (node.nodeType != 1)){ // not an element
+ node = node.parentNode;
+ }
+ return node;
+ }
+ }else{
+ var r = win.doc.selection.createRange();
+ r.collapse(true);
+ return r.parentElement();
+ }
+ }
+ return null;
+ },
+
+ hasAncestorElement: function(/*String*/ tagName /* ... */){
+ // summary:
+ // Check whether current selection has a parent element which is
+ // of type tagName (or one of the other specified tagName)
+ // tagName: String
+ // The tag name to determine if it has an ancestor of.
+ return this.getAncestorElement.apply(this, arguments) != null; //Boolean
+ },
+
+ getAncestorElement: function(/*String*/ tagName /* ... */){
+ // summary:
+ // Return the parent element of the current selection which is of
+ // type tagName (or one of the other specified tagName)
+ // tagName: String
+ // The tag name to determine if it has an ancestor of.
+ var node = this.getSelectedElement() || this.getParentElement();
+ return this.getParentOfType(node, arguments); //DOMNode
+ },
+
+ isTag: function(/*DomNode*/ node, /*String[]*/ tags){
+ // summary:
+ // Function to determine if a node is one of an array of tags.
+ // node:
+ // The node to inspect.
+ // tags:
+ // An array of tag name strings to check to see if the node matches.
+ if(node && node.tagName){
+ var _nlc = node.tagName.toLowerCase();
+ for(var i=0; i<tags.length; i++){
+ var _tlc = String(tags[i]).toLowerCase();
+ if(_nlc == _tlc){
+ return _tlc; // String
+ }
+ }
+ }
+ return "";
+ },
+
+ getParentOfType: function(/*DomNode*/ node, /*String[]*/ tags){
+ // summary:
+ // Function to locate a parent node that matches one of a set of tags
+ // node:
+ // The node to inspect.
+ // tags:
+ // An array of tag name strings to check to see if the node matches.
+ while(node){
+ if(this.isTag(node, tags).length){
+ return node; // DOMNode
+ }
+ node = node.parentNode;
+ }
+ return null;
+ },
+
+ collapse: function(/*Boolean*/ beginning){
+ // summary:
+ // Function to collapse (clear), the current selection
+ // beginning: Boolean
+ // Indicates whether to collapse the cursor to the beginning of the selection or end.
+ if(win.doc.getSelection){
+ // W3C path
+ var selection = win.global.getSelection();
+ if(selection.removeAllRanges){ // Mozilla
+ if(beginning){
+ selection.collapseToStart();
+ }else{
+ selection.collapseToEnd();
+ }
+ }else{ // Safari
+ // pulled from WebCore/ecma/kjs_window.cpp, line 2536
+ selection.collapse(beginning);
+ }
+ }else{
+ // IE6-8
+ var range = win.doc.selection.createRange();
+ range.collapse(beginning);
+ range.select();
+ }
+ },
+
+ remove: function(){
+ // summary:
+ // Function to delete the currently selected content from the document.
+ var sel = win.doc.selection;
+ if(win.doc.getSelection){
+ // W3C path
+ sel = win.global.getSelection();
+ sel.deleteFromDocument();
+ return sel; //Selection
+ }else{
+ // IE6-8
+ if(sel.type.toLowerCase() != "none"){
+ sel.clear();
+ }
+ return sel; //Selection
+ }
+ },
+
+ selectElementChildren: function(/*DomNode*/ element, /*Boolean?*/ nochangefocus){
+ // summary:
+ // clear previous selection and select the content of the node
+ // (excluding the node itself)
+ // element: DOMNode
+ // The element you wish to select the children content of.
+ // nochangefocus: Boolean
+ // Indicates if the focus should change or not.
+ var doc = win.doc;
+ var range;
+ element = dom.byId(element);
+ if(win.doc.getSelection){
+ // W3C
+ var selection = win.global.getSelection();
+ if(has("opera")){
+ //Opera's selectAllChildren doesn't seem to work right
+ //against <body> nodes and possibly others ... so
+ //we use the W3C range API
+ if(selection.rangeCount){
+ range = selection.getRangeAt(0);
+ }else{
+ range = doc.createRange();
+ }
+ range.setStart(element, 0);
+ range.setEnd(element,(element.nodeType == 3) ? element.length : element.childNodes.length);
+ selection.addRange(range);
+ }else{
+ selection.selectAllChildren(element);
+ }
+ }else{
+ // IE6-8
+ range = element.ownerDocument.body.createTextRange();
+ range.moveToElementText(element);
+ if(!nochangefocus){
+ try{
+ range.select(); // IE throws an exception here if the widget is hidden. See #5439
+ }catch(e){ /* squelch */}
+ }
+ }
+ },
+
+ selectElement: function(/*DomNode*/ element, /*Boolean?*/ nochangefocus){
+ // summary:
+ // clear previous selection and select element (including all its children)
+ // element: DOMNode
+ // The element to select.
+ // nochangefocus: Boolean
+ // Boolean indicating if the focus should be changed. IE only.
+ var range;
+ element = dom.byId(element); // TODO: remove for 2.0 or sooner, spec listed above doesn't allow for string
+ var doc = element.ownerDocument;
+ var global = win.global; // TODO: use winUtils.get(doc)?
+ if(doc.getSelection){
+ // W3C path
+ var selection = global.getSelection();
+ range = doc.createRange();
+ if(selection.removeAllRanges){ // Mozilla
+ // FIXME: does this work on Safari?
+ if(has("opera")){
+ //Opera works if you use the current range on
+ //the selection if present.
+ if(selection.getRangeAt(0)){
+ range = selection.getRangeAt(0);
+ }
+ }
+ range.selectNode(element);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ }else{
+ // IE6-8
+ try{
+ var tg = element.tagName ? element.tagName.toLowerCase() : "";
+ if(tg === "img" || tg === "table"){
+ range = win.body(doc).createControlRange();
+ }else{
+ range = win.body(doc).createRange();
+ }
+ range.addElement(element);
+ if(!nochangefocus){
+ range.select();
+ }
+ }catch(e){
+ this.selectElementChildren(element, nochangefocus);
+ }
+ }
+ },
+
+ inSelection: function(node){
+ // summary:
+ // This function determines if 'node' is
+ // in the current selection.
+ // tags:
+ // public
+ if(node){
+ var newRange;
+ var doc = win.doc;
+ var range;
+
+ if(win.doc.getSelection){
+ // WC3
+ var sel = win.global.getSelection();
+ if(sel && sel.rangeCount > 0){
+ range = sel.getRangeAt(0);
+ }
+ if(range && range.compareBoundaryPoints && doc.createRange){
+ try{
+ newRange = doc.createRange();
+ newRange.setStart(node, 0);
+ if(range.compareBoundaryPoints(range.START_TO_END, newRange) === 1){
+ return true;
+ }
+ }catch(e){ /* squelch */}
+ }
+ }else{
+ // IE6-8, so we can't use the range object as the pseudo
+ // range doesn't implement the boundary checking, we have to
+ // use IE specific crud.
+ range = doc.selection.createRange();
+ try{
+ newRange = node.ownerDocument.body.createControlRange();
+ if(newRange){
+ newRange.addElement(node);
+ }
+ }catch(e1){
+ try{
+ newRange = node.ownerDocument.body.createTextRange();
+ newRange.moveToElementText(node);
+ }catch(e2){/* squelch */}
+ }
+ if(range && newRange){
+ // We can finally compare similar to W3C
+ if(range.compareEndPoints("EndToStart", newRange) === 1){
+ return true;
+ }
+ }
+ }
+ }
+ return false; // Boolean
+ }
+};
+
+
+lang.setObject("dijit._editor.selection", selection);
+
+return selection;
+});
diff --git a/lib/dijit/_tree/dndSource.js.uncompressed.js b/lib/dijit/_tree/dndSource.js.uncompressed.js
new file mode 100644
index 000000000..155e3ff38
--- /dev/null
+++ b/lib/dijit/_tree/dndSource.js.uncompressed.js
@@ -0,0 +1,20 @@
+define("dijit/_tree/dndSource", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.setObject
+ "../tree/dndSource"
+], function(kernel, lang, dndSource){
+ // module:
+ // dijit/_tree/dndSource
+
+ /*=====
+ return {
+ // summary:
+ // Deprecated module, use dijit/tree/dndSource instead.
+ };
+ =====*/
+
+ // TODO: remove this file in 2.0
+ kernel.deprecated("dijit._tree.dndSource has been moved to dijit.tree.dndSource, use that instead", "", "2.0");
+
+ lang.setObject("dijit._tree.dndSource", dndSource);
+});
diff --git a/lib/dijit/a11y.js b/lib/dijit/a11y.js
index 082e1b75e..ff7064900 100644
--- a/lib/dijit/a11y.js
+++ b/lib/dijit/a11y.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/a11y",["dojo/_base/array","dojo/_base/config","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-style","dojo/_base/sniff","./_base/manager","."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){var _a=(_9._isElementShown=function(_b){var s=_6.get(_b);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_5.get(_b,"type")!="hidden");});_9.hasDefaultTabStop=function(_c){switch(_c.nodeName.toLowerCase()){case "a":return _5.has(_c,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var _d;try{var _e=_c.contentDocument;if("designMode" in _e&&_e.designMode=="on"){return true;}_d=_e.body;}catch(e1){try{_d=_c.contentWindow.document.body;}catch(e2){return false;}}return _d&&(_d.contentEditable=="true"||(_d.firstChild&&_d.firstChild.contentEditable=="true"));default:return _c.contentEditable=="true";}};var _f=(_9.isTabNavigable=function(_10){if(_5.get(_10,"disabled")){return false;}else{if(_5.has(_10,"tabIndex")){return _5.get(_10,"tabIndex")>=0;}else{return _9.hasDefaultTabStop(_10);}}});_9._getTabNavigable=function(_11){var _12,_13,_14,_15,_16,_17,_18={};function _19(_1a){return _1a&&_1a.tagName.toLowerCase()=="input"&&_1a.type&&_1a.type.toLowerCase()=="radio"&&_1a.name&&_1a.name.toLowerCase();};var _1b=function(_1c){for(var _1d=_1c.firstChild;_1d;_1d=_1d.nextSibling){if(_1d.nodeType!=1||(_7("ie")&&_1d.scopeName!=="HTML")||!_a(_1d)){continue;}if(_f(_1d)){var _1e=_5.get(_1d,"tabIndex");if(!_5.has(_1d,"tabIndex")||_1e==0){if(!_12){_12=_1d;}_13=_1d;}else{if(_1e>0){if(!_14||_1e<_15){_15=_1e;_14=_1d;}if(!_16||_1e>=_17){_17=_1e;_16=_1d;}}}var rn=_19(_1d);if(_5.get(_1d,"checked")&&rn){_18[rn]=_1d;}}if(_1d.nodeName.toUpperCase()!="SELECT"){_1b(_1d);}}};if(_a(_11)){_1b(_11);}function rs(_1f){return _18[_19(_1f)]||_1f;};return {first:rs(_12),last:rs(_13),lowest:rs(_14),highest:rs(_16)};};_9.getFirstInTabbingOrder=function(_20){var _21=_9._getTabNavigable(_4.byId(_20));return _21.lowest?_21.lowest:_21.first;};_9.getLastInTabbingOrder=function(_22){var _23=_9._getTabNavigable(_4.byId(_22));return _23.last?_23.last:_23.highest;};return {hasDefaultTabStop:_9.hasDefaultTabStop,isTabNavigable:_9.isTabNavigable,_getTabNavigable:_9._getTabNavigable,getFirstInTabbingOrder:_9.getFirstInTabbingOrder,getLastInTabbingOrder:_9.getLastInTabbingOrder};}); \ No newline at end of file
+define("dijit/a11y",["dojo/_base/array","dojo/_base/config","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-style","dojo/sniff","./main"],function(_1,_2,_3,_4,_5,_6,_7,_8){var _9=(_8._isElementShown=function(_a){var s=_6.get(_a);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_5.get(_a,"type")!="hidden");});_8.hasDefaultTabStop=function(_b){switch(_b.nodeName.toLowerCase()){case "a":return _5.has(_b,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var _c;try{var _d=_b.contentDocument;if("designMode" in _d&&_d.designMode=="on"){return true;}_c=_d.body;}catch(e1){try{_c=_b.contentWindow.document.body;}catch(e2){return false;}}return _c&&(_c.contentEditable=="true"||(_c.firstChild&&_c.firstChild.contentEditable=="true"));default:return _b.contentEditable=="true";}};var _e=(_8.isTabNavigable=function(_f){if(_5.get(_f,"disabled")){return false;}else{if(_5.has(_f,"tabIndex")){return _5.get(_f,"tabIndex")>=0;}else{return _8.hasDefaultTabStop(_f);}}});_8._getTabNavigable=function(_10){var _11,_12,_13,_14,_15,_16,_17={};function _18(_19){return _19&&_19.tagName.toLowerCase()=="input"&&_19.type&&_19.type.toLowerCase()=="radio"&&_19.name&&_19.name.toLowerCase();};var _1a=function(_1b){for(var _1c=_1b.firstChild;_1c;_1c=_1c.nextSibling){if(_1c.nodeType!=1||(_7("ie")<=9&&_1c.scopeName!=="HTML")||!_9(_1c)){continue;}if(_e(_1c)){var _1d=+_5.get(_1c,"tabIndex");if(!_5.has(_1c,"tabIndex")||_1d==0){if(!_11){_11=_1c;}_12=_1c;}else{if(_1d>0){if(!_13||_1d<_14){_14=_1d;_13=_1c;}if(!_15||_1d>=_16){_16=_1d;_15=_1c;}}}var rn=_18(_1c);if(_5.get(_1c,"checked")&&rn){_17[rn]=_1c;}}if(_1c.nodeName.toUpperCase()!="SELECT"){_1a(_1c);}}};if(_9(_10)){_1a(_10);}function rs(_1e){return _17[_18(_1e)]||_1e;};return {first:rs(_11),last:rs(_12),lowest:rs(_13),highest:rs(_15)};};_8.getFirstInTabbingOrder=function(_1f,doc){var _20=_8._getTabNavigable(_4.byId(_1f,doc));return _20.lowest?_20.lowest:_20.first;};_8.getLastInTabbingOrder=function(_21,doc){var _22=_8._getTabNavigable(_4.byId(_21,doc));return _22.last?_22.last:_22.highest;};return {hasDefaultTabStop:_8.hasDefaultTabStop,isTabNavigable:_8.isTabNavigable,_getTabNavigable:_8._getTabNavigable,getFirstInTabbingOrder:_8.getFirstInTabbingOrder,getLastInTabbingOrder:_8.getLastInTabbingOrder};}); \ No newline at end of file
diff --git a/lib/dijit/a11y.js.uncompressed.js b/lib/dijit/a11y.js.uncompressed.js
new file mode 100644
index 000000000..91a57d2ca
--- /dev/null
+++ b/lib/dijit/a11y.js.uncompressed.js
@@ -0,0 +1,177 @@
+define("dijit/a11y", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/config", // defaultDuration
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.byId
+ "dojo/dom-attr", // domAttr.attr domAttr.has
+ "dojo/dom-style", // style.style
+ "dojo/sniff", // has("ie")
+ "./main" // for exporting methods to dijit namespace
+], function(array, config, declare, dom, domAttr, domStyle, has, dijit){
+
+ // module:
+ // dijit/a11y
+
+ var shown = (dijit._isElementShown = function(/*Element*/ elem){
+ var s = domStyle.get(elem);
+ return (s.visibility != "hidden")
+ && (s.visibility != "collapsed")
+ && (s.display != "none")
+ && (domAttr.get(elem, "type") != "hidden");
+ });
+
+ dijit.hasDefaultTabStop = function(/*Element*/ elem){
+ // summary:
+ // Tests if element is tab-navigable even without an explicit tabIndex setting
+
+ // No explicit tabIndex setting, need to investigate node type
+ switch(elem.nodeName.toLowerCase()){
+ case "a":
+ // An <a> w/out a tabindex is only navigable if it has an href
+ return domAttr.has(elem, "href");
+ case "area":
+ case "button":
+ case "input":
+ case "object":
+ case "select":
+ case "textarea":
+ // These are navigable by default
+ return true;
+ case "iframe":
+ // If it's an editor <iframe> then it's tab navigable.
+ var body;
+ try{
+ // non-IE
+ var contentDocument = elem.contentDocument;
+ if("designMode" in contentDocument && contentDocument.designMode == "on"){
+ return true;
+ }
+ body = contentDocument.body;
+ }catch(e1){
+ // contentWindow.document isn't accessible within IE7/8
+ // if the iframe.src points to a foreign url and this
+ // page contains an element, that could get focus
+ try{
+ body = elem.contentWindow.document.body;
+ }catch(e2){
+ return false;
+ }
+ }
+ return body && (body.contentEditable == 'true' ||
+ (body.firstChild && body.firstChild.contentEditable == 'true'));
+ default:
+ return elem.contentEditable == 'true';
+ }
+ };
+
+ var isTabNavigable = (dijit.isTabNavigable = function(/*Element*/ elem){
+ // summary:
+ // Tests if an element is tab-navigable
+
+ // TODO: convert (and rename method) to return effective tabIndex; will save time in _getTabNavigable()
+ if(domAttr.get(elem, "disabled")){
+ return false;
+ }else if(domAttr.has(elem, "tabIndex")){
+ // Explicit tab index setting
+ return domAttr.get(elem, "tabIndex") >= 0; // boolean
+ }else{
+ // No explicit tabIndex setting, so depends on node type
+ return dijit.hasDefaultTabStop(elem);
+ }
+ });
+
+ dijit._getTabNavigable = function(/*DOMNode*/ root){
+ // summary:
+ // Finds descendants of the specified root node.
+ // description:
+ // Finds the following descendants of the specified root node:
+ //
+ // - the first tab-navigable element in document order
+ // without a tabIndex or with tabIndex="0"
+ // - the last tab-navigable element in document order
+ // without a tabIndex or with tabIndex="0"
+ // - the first element in document order with the lowest
+ // positive tabIndex value
+ // - the last element in document order with the highest
+ // positive tabIndex value
+ var first, last, lowest, lowestTabindex, highest, highestTabindex, radioSelected = {};
+
+ function radioName(node){
+ // If this element is part of a radio button group, return the name for that group.
+ return node && node.tagName.toLowerCase() == "input" &&
+ node.type && node.type.toLowerCase() == "radio" &&
+ node.name && node.name.toLowerCase();
+ }
+
+ var walkTree = function(/*DOMNode*/ parent){
+ for(var child = parent.firstChild; child; child = child.nextSibling){
+ // Skip text elements, hidden elements, and also non-HTML elements (those in custom namespaces) in IE,
+ // since show() invokes getAttribute("type"), which crash on VML nodes in IE.
+ if(child.nodeType != 1 || (has("ie") <= 9 && child.scopeName !== "HTML") || !shown(child)){
+ continue;
+ }
+
+ if(isTabNavigable(child)){
+ var tabindex = +domAttr.get(child, "tabIndex"); // + to convert string --> number
+ if(!domAttr.has(child, "tabIndex") || tabindex == 0){
+ if(!first){
+ first = child;
+ }
+ last = child;
+ }else if(tabindex > 0){
+ if(!lowest || tabindex < lowestTabindex){
+ lowestTabindex = tabindex;
+ lowest = child;
+ }
+ if(!highest || tabindex >= highestTabindex){
+ highestTabindex = tabindex;
+ highest = child;
+ }
+ }
+ var rn = radioName(child);
+ if(domAttr.get(child, "checked") && rn){
+ radioSelected[rn] = child;
+ }
+ }
+ if(child.nodeName.toUpperCase() != 'SELECT'){
+ walkTree(child);
+ }
+ }
+ };
+ if(shown(root)){
+ walkTree(root);
+ }
+ function rs(node){
+ // substitute checked radio button for unchecked one, if there is a checked one with the same name.
+ return radioSelected[radioName(node)] || node;
+ }
+
+ return { first: rs(first), last: rs(last), lowest: rs(lowest), highest: rs(highest) };
+ };
+ dijit.getFirstInTabbingOrder = function(/*String|DOMNode*/ root, /*Document?*/ doc){
+ // summary:
+ // Finds the descendant of the specified root node
+ // that is first in the tabbing order
+ var elems = dijit._getTabNavigable(dom.byId(root, doc));
+ return elems.lowest ? elems.lowest : elems.first; // DomNode
+ };
+
+ dijit.getLastInTabbingOrder = function(/*String|DOMNode*/ root, /*Document?*/ doc){
+ // summary:
+ // Finds the descendant of the specified root node
+ // that is last in the tabbing order
+ var elems = dijit._getTabNavigable(dom.byId(root, doc));
+ return elems.last ? elems.last : elems.highest; // DomNode
+ };
+
+ return {
+ // summary:
+ // Accessibility utility functions (keyboard, tab stops, etc.)
+
+ hasDefaultTabStop: dijit.hasDefaultTabStop,
+ isTabNavigable: dijit.isTabNavigable,
+ _getTabNavigable: dijit._getTabNavigable,
+ getFirstInTabbingOrder: dijit.getFirstInTabbingOrder,
+ getLastInTabbingOrder: dijit.getLastInTabbingOrder
+ };
+});
diff --git a/lib/dijit/a11yclick.js b/lib/dijit/a11yclick.js
new file mode 100644
index 000000000..c5fe33c2a
--- /dev/null
+++ b/lib/dijit/a11yclick.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/a11yclick",["dojo/on","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/has","dojo/_base/unload","dojo/_base/window"],function(on,_1,_2,_3,_4,_5,_6){var _7=null;if(_4("dom-addeventlistener")){_6.doc.addEventListener("keydown",function(_8){_7=_8.target;},true);}else{(function(){var _9=function(_a){_7=_a.srcElement;};_6.doc.attachEvent("onkeydown",_9);_5.addOnWindowUnload(function(){_6.doc.detachEvent("onkeydown",_9);});})();}function _b(e){return (e.keyCode===_2.ENTER||e.keyCode===_2.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey;};return function(_c,_d){if(/input|button/i.test(_c.nodeName)){return on(_c,"click",_d);}else{var _e=[on(_c,"keydown",function(e){if(_b(e)){_7=e.target;e.preventDefault();}}),on(_c,"keyup",function(e){if(_b(e)&&e.target==_7){_7=null;on.emit(e.target,"click",{cancelable:true,bubbles:true});}}),on(_c,"click",function(e){_d.call(this,e);})];if(_4("touch")){var _f;_e.push(on(_c,"touchend",function(e){var _10=e.target;_f=setTimeout(function(){_f=null;on.emit(_10,"click",{cancelable:true,bubbles:true});},600);}),on(_c,"click",function(e){if(_f){clearTimeout(_f);}}));}return {remove:function(){_1.forEach(_e,function(h){h.remove();});if(_f){clearTimeout(_f);_f=null;}}};}};return ret;}); \ No newline at end of file
diff --git a/lib/dijit/a11yclick.js.uncompressed.js b/lib/dijit/a11yclick.js.uncompressed.js
new file mode 100644
index 000000000..ed92308dd
--- /dev/null
+++ b/lib/dijit/a11yclick.js.uncompressed.js
@@ -0,0 +1,131 @@
+define("dijit/a11yclick", [
+ "dojo/on",
+ "dojo/_base/array", // array.forEach
+ "dojo/keys", // keys.ENTER keys.SPACE
+ "dojo/_base/declare", // declare
+ "dojo/has", // has("dom-addeventlistener")
+ "dojo/_base/unload", // unload.addOnWindowUnload
+ "dojo/_base/window" // win.doc.addEventListener win.doc.attachEvent win.doc.detachEvent
+], function(on, array, keys, declare, has, unload, win){
+
+ // module:
+ // dijit/a11yclick
+
+ // Keep track of where the last keydown event was, to help avoid generating
+ // spurious ondijitclick events when:
+ // 1. focus is on a <button> or <a>
+ // 2. user presses then releases the ENTER key
+ // 3. onclick handler fires and shifts focus to another node, with an ondijitclick handler
+ // 4. onkeyup event fires, causing the ondijitclick handler to fire
+ var lastKeyDownNode = null;
+ if(has("dom-addeventlistener")){
+ win.doc.addEventListener('keydown', function(evt){
+ lastKeyDownNode = evt.target;
+ }, true);
+ }else{
+ // Fallback path for IE6-8
+ (function(){
+ var keydownCallback = function(evt){
+ lastKeyDownNode = evt.srcElement;
+ };
+ win.doc.attachEvent('onkeydown', keydownCallback);
+ unload.addOnWindowUnload(function(){
+ win.doc.detachEvent('onkeydown', keydownCallback);
+ });
+ })();
+ }
+
+ function clickKey(/*Event*/ e){
+ return (e.keyCode === keys.ENTER || e.keyCode === keys.SPACE) &&
+ !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey;
+ }
+
+ return function(node, listener){
+ // summary:
+ // Custom a11yclick (a.k.a. ondijitclick) event
+ // which triggers on a mouse click, touch, or space/enter keyup.
+
+ if(/input|button/i.test(node.nodeName)){
+ // pass through, the browser already generates click event on SPACE/ENTER key
+ return on(node, "click", listener);
+ }else{
+ // Don't fire the click event unless both the keydown and keyup occur on this node.
+ // Avoids problems where focus shifted to this node or away from the node on keydown,
+ // either causing this node to process a stray keyup event, or causing another node
+ // to get a stray keyup event.
+
+ var handles = [
+ on(node, "keydown", function(e){
+ //console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", lastKeyDownNode, ", equality is ", (e.target === lastKeyDownNode));
+ if(clickKey(e)){
+ // needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work
+ lastKeyDownNode = e.target;
+
+ // Prevent viewport scrolling on space key in IE<9.
+ // (Reproducible on test_Button.html on any of the first dijit/form/Button examples)
+ e.preventDefault();
+ }
+ }),
+
+ on(node, "keyup", function(e){
+ //console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", lastKeyDownNode, ", equality is ", (e.target === lastKeyDownNode));
+ if(clickKey(e) && e.target == lastKeyDownNode){ // === breaks greasemonkey
+ //need reset here or have problems in FF when focus returns to trigger element after closing popup/alert
+ lastKeyDownNode = null;
+ on.emit(e.target, "click", {
+ cancelable: true,
+ bubbles: true
+ });
+ }
+ }),
+
+ on(node, "click", function(e){
+ // catch mouse clicks, plus the on.emit() calls from above and below
+ listener.call(this, e);
+ })
+ ];
+
+ if(has("touch")){
+ // touchstart-->touchend will automatically generate a click event, but there are problems
+ // on iOS after focus has been programatically shifted (#14604, #14918), so setup a failsafe
+ // if click doesn't fire naturally.
+
+ var clickTimer;
+ handles.push(
+ on(node, "touchend", function(e){
+ var target = e.target;
+ clickTimer = setTimeout(function(){
+ clickTimer = null;
+ on.emit(target, "click", {
+ cancelable: true,
+ bubbles: true
+ });
+ }, 600);
+ }),
+ on(node, "click", function(e){
+ // If browser generates a click naturally, clear the timer to fire a synthetic click event
+ if(clickTimer){
+ clearTimeout(clickTimer);
+ }
+ })
+ // TODO: if the touchstart and touchend were <100ms apart, and then there's another touchstart
+ // event <300ms after the touchend event, then clear the synthetic click timer, because user
+ // is doing a zoom. Alternately monitor screen.deviceXDPI (or something similar) to see if
+ // zoom level has changed.
+ );
+ }
+
+ return {
+ remove: function(){
+ array.forEach(handles, function(h){ h.remove(); });
+ if(clickTimer){
+ clearTimeout(clickTimer);
+ clickTimer = null;
+ }
+ }
+ };
+ }
+ };
+
+ return ret;
+});
diff --git a/lib/dijit/dijit-all.js b/lib/dijit/dijit-all.js
index 658b1acfe..26d631f67 100644
--- a/lib/dijit/dijit-all.js
+++ b/lib/dijit/dijit-all.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/dijit-all",[".","./dijit","./ColorPalette","./Declaration","./Dialog","./DialogUnderlay","./TooltipDialog","./Editor","./_editor/plugins/FontChoice","./_editor/plugins/LinkDialog","./Menu","./MenuItem","./PopupMenuItem","./CheckedMenuItem","./MenuBar","./MenuBarItem","./PopupMenuBarItem","./MenuSeparator","./ProgressBar","./TitlePane","./Toolbar","./Tooltip","./Tree","./InlineEditBox","./form/Form","./form/Button","./form/DropDownButton","./form/ComboButton","./form/ToggleButton","./form/CheckBox","./form/RadioButton","./form/TextBox","./form/ValidationTextBox","./form/CurrencyTextBox","./form/DateTextBox","./form/TimeTextBox","./form/NumberSpinner","./form/NumberTextBox","./form/ComboBox","./form/FilteringSelect","./form/MultiSelect","./form/Select","./form/HorizontalSlider","./form/VerticalSlider","./form/HorizontalRule","./form/VerticalRule","./form/HorizontalRuleLabels","./form/VerticalRuleLabels","./form/SimpleTextarea","./form/Textarea","./layout/AccordionContainer","./layout/ContentPane","./layout/BorderContainer","./layout/LayoutContainer","./layout/LinkPane","./layout/SplitContainer","./layout/StackContainer","./layout/TabContainer"],function(_1){console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool");return _1;}); \ No newline at end of file
+define("dijit/dijit-all",["./main","./dijit","./ColorPalette","./Declaration","./Dialog","./DialogUnderlay","./TooltipDialog","./Editor","./_editor/plugins/FontChoice","./_editor/plugins/LinkDialog","./Menu","./MenuItem","./PopupMenuItem","./CheckedMenuItem","./MenuBar","./MenuBarItem","./PopupMenuBarItem","./MenuSeparator","./ProgressBar","./TitlePane","./Toolbar","./Tooltip","./Tree","./InlineEditBox","./form/Form","./form/Button","./form/DropDownButton","./form/ComboButton","./form/ToggleButton","./form/CheckBox","./form/RadioButton","./form/TextBox","./form/ValidationTextBox","./form/CurrencyTextBox","./form/DateTextBox","./form/TimeTextBox","./form/NumberSpinner","./form/NumberTextBox","./form/ComboBox","./form/FilteringSelect","./form/MultiSelect","./form/Select","./form/HorizontalSlider","./form/VerticalSlider","./form/HorizontalRule","./form/VerticalRule","./form/HorizontalRuleLabels","./form/VerticalRuleLabels","./form/SimpleTextarea","./form/Textarea","./layout/AccordionContainer","./layout/ContentPane","./layout/BorderContainer","./layout/LayoutContainer","./layout/LinkPane","./layout/SplitContainer","./layout/StackContainer","./layout/TabContainer"],function(_1){console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool");return _1;}); \ No newline at end of file
diff --git a/lib/dijit/dijit-all.js.uncompressed.js b/lib/dijit/dijit-all.js.uncompressed.js
new file mode 100644
index 000000000..6aaf97636
--- /dev/null
+++ b/lib/dijit/dijit-all.js.uncompressed.js
@@ -0,0 +1,75 @@
+define("dijit/dijit-all", [
+ "./main",
+ "./dijit",
+ "./ColorPalette",
+ "./Declaration",
+ "./Dialog",
+ "./DialogUnderlay",
+ "./TooltipDialog",
+ "./Editor",
+ "./_editor/plugins/FontChoice",
+ "./_editor/plugins/LinkDialog",
+ "./Menu",
+ "./MenuItem",
+ "./PopupMenuItem",
+ "./CheckedMenuItem",
+ "./MenuBar",
+ "./MenuBarItem",
+ "./PopupMenuBarItem",
+ "./MenuSeparator",
+ "./ProgressBar",
+ "./TitlePane",
+ "./Toolbar",
+ "./Tooltip",
+ "./Tree",
+ "./InlineEditBox",
+ "./form/Form",
+ "./form/Button",
+ "./form/DropDownButton",
+ "./form/ComboButton",
+ "./form/ToggleButton",
+ "./form/CheckBox",
+ "./form/RadioButton",
+ "./form/TextBox",
+ "./form/ValidationTextBox",
+ "./form/CurrencyTextBox",
+ "./form/DateTextBox",
+ "./form/TimeTextBox",
+ "./form/NumberSpinner",
+ "./form/NumberTextBox",
+ "./form/ComboBox",
+ "./form/FilteringSelect",
+ "./form/MultiSelect",
+ "./form/Select",
+ "./form/HorizontalSlider",
+ "./form/VerticalSlider",
+ "./form/HorizontalRule",
+ "./form/VerticalRule",
+ "./form/HorizontalRuleLabels",
+ "./form/VerticalRuleLabels",
+ "./form/SimpleTextarea",
+ "./form/Textarea",
+ "./layout/AccordionContainer",
+ "./layout/ContentPane",
+ "./layout/BorderContainer",
+ "./layout/LayoutContainer",
+ "./layout/LinkPane",
+ "./layout/SplitContainer",
+ "./layout/StackContainer",
+ "./layout/TabContainer"
+], function(dijit){
+
+ // module:
+ // dijit/dijit-all
+
+ /*=====
+ return {
+ // summary:
+ // A rollup that includes every dijit. You probably don't need this.
+ };
+ =====*/
+
+ console.warn("dijit-all may include much more code than your application actually requires. We strongly recommend that you investigate a custom build or the web build tool");
+
+ return dijit;
+});
diff --git a/lib/dijit/dijit.js b/lib/dijit/dijit.js
index 58fc8c8af..efad67a0c 100644
--- a/lib/dijit/dijit.js
+++ b/lib/dijit/dijit.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/dijit",[".","./_base","dojo/parser","./_Widget","./_TemplatedMixin","./_Container","./layout/_LayoutWidget","./form/_FormWidget","./form/_FormValueWidget"],function(_1){return _1;}); \ No newline at end of file
+define("dijit/dijit",["./main","./_base","dojo/parser","./_Widget","./_TemplatedMixin","./_Container","./layout/_LayoutWidget","./form/_FormWidget","./form/_FormValueWidget"],function(_1){return _1;}); \ No newline at end of file
diff --git a/lib/dijit/dijit.js.uncompressed.js b/lib/dijit/dijit.js.uncompressed.js
new file mode 100644
index 000000000..f4204b94a
--- /dev/null
+++ b/lib/dijit/dijit.js.uncompressed.js
@@ -0,0 +1,26 @@
+define("dijit/dijit", [
+ "./main",
+ "./_base",
+ "dojo/parser",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_Container",
+ "./layout/_LayoutWidget",
+ "./form/_FormWidget",
+ "./form/_FormValueWidget"
+], function(dijit){
+
+ // module:
+ // dijit/dijit
+
+ /*=====
+ return {
+ // summary:
+ // A roll-up for common dijit methods
+ // All the stuff in _base (these are the function that are guaranteed available without an explicit dojo.require)
+ // And some other stuff that we tend to pull in all the time anyway
+ };
+ =====*/
+
+ return dijit;
+});
diff --git a/lib/dijit/dijit.profile.js b/lib/dijit/dijit.profile.js
index dffbfa056..5a75a6aca 100644
--- a/lib/dijit/dijit.profile.js
+++ b/lib/dijit/dijit.profile.js
@@ -27,11 +27,7 @@ var profile = (function(){
miniExclude: function(filename, mid){
return /^dijit\/bench\//.test(mid) || /^dijit\/themes\/themeTest/.test(mid);
}
- },
-
- trees:[
- [".", ".", /(\/\.)|(~$)/]
- ]
+ }
};
})();
diff --git a/lib/dijit/focus.js b/lib/dijit/focus.js
index c52073b65..25f9bfa54 100644
--- a/lib/dijit/focus.js
+++ b/lib/dijit/focus.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/focus",["dojo/aspect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/Evented","dojo/_base/lang","dojo/on","dojo/ready","dojo/_base/sniff","dojo/Stateful","dojo/_base/unload","dojo/_base/window","dojo/window","./a11y","./registry","."],function(_1,_2,_3,_4,_5,_6,_7,on,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2([_a,_6],{curNode:null,activeStack:[],constructor:function(){var _12=_7.hitch(this,function(_13){if(_3.isDescendant(this.curNode,_13)){this.set("curNode",null);}if(_3.isDescendant(this.prevNode,_13)){this.set("prevNode",null);}});_1.before(_5,"empty",_12);_1.before(_5,"destroy",_12);},registerIframe:function(_14){return this.registerWin(_14.contentWindow,_14);},registerWin:function(_15,_16){var _17=this;var _18=function(evt){_17._justMouseDowned=true;setTimeout(function(){_17._justMouseDowned=false;},0);if(_9("ie")&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}_17._onTouchNode(_16||evt.target||evt.srcElement,"mouse");};var doc=_9("ie")?_15.document.documentElement:_15.document;if(doc){if(_9("ie")){_15.document.body.attachEvent("onmousedown",_18);var _19=function(evt){var tag=evt.srcElement.tagName.toLowerCase();if(tag=="#document"||tag=="body"){return;}if(_e.isTabNavigable(evt.srcElement)){_17._onFocusNode(_16||evt.srcElement);}else{_17._onTouchNode(_16||evt.srcElement);}};doc.attachEvent("onactivate",_19);var _1a=function(evt){_17._onBlurNode(_16||evt.srcElement);};doc.attachEvent("ondeactivate",_1a);return {remove:function(){_15.document.detachEvent("onmousedown",_18);doc.detachEvent("onactivate",_19);doc.detachEvent("ondeactivate",_1a);doc=null;}};}else{doc.body.addEventListener("mousedown",_18,true);doc.body.addEventListener("touchstart",_18,true);var _1b=function(evt){_17._onFocusNode(_16||evt.target);};doc.addEventListener("focus",_1b,true);var _1c=function(evt){_17._onBlurNode(_16||evt.target);};doc.addEventListener("blur",_1c,true);return {remove:function(){doc.body.removeEventListener("mousedown",_18,true);doc.body.removeEventListener("touchstart",_18,true);doc.removeEventListener("focus",_1b,true);doc.removeEventListener("blur",_1c,true);doc=null;}};}}},_onBlurNode:function(){this.set("prevNode",this.curNode);this.set("curNode",null);if(this._justMouseDowned){return;}if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);}this._clearActiveWidgetsTimer=setTimeout(_7.hitch(this,function(){delete this._clearActiveWidgetsTimer;this._setStack([]);this.prevNode=null;}),100);},_onTouchNode:function(_1d,by){if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);delete this._clearActiveWidgetsTimer;}var _1e=[];try{while(_1d){var _1f=_4.get(_1d,"dijitPopupParent");if(_1f){_1d=_f.byId(_1f).domNode;}else{if(_1d.tagName&&_1d.tagName.toLowerCase()=="body"){if(_1d===_c.body()){break;}_1d=_d.get(_1d.ownerDocument).frameElement;}else{var id=_1d.getAttribute&&_1d.getAttribute("widgetId"),_20=id&&_f.byId(id);if(_20&&!(by=="mouse"&&_20.get("disabled"))){_1e.unshift(id);}_1d=_1d.parentNode;}}}}catch(e){}this._setStack(_1e,by);},_onFocusNode:function(_21){if(!_21){return;}if(_21.nodeType==9){return;}this._onTouchNode(_21);if(_21==this.curNode){return;}this.set("curNode",_21);},_setStack:function(_22,by){var _23=this.activeStack;this.set("activeStack",_22);for(var _24=0;_24<Math.min(_23.length,_22.length);_24++){if(_23[_24]!=_22[_24]){break;}}var _25;for(var i=_23.length-1;i>=_24;i--){_25=_f.byId(_23[i]);if(_25){_25._hasBeenBlurred=true;_25.set("focused",false);if(_25._focusManager==this){_25._onBlur(by);}this.emit("widget-blur",_25,by);}}for(i=_24;i<_22.length;i++){_25=_f.byId(_22[i]);if(_25){_25.set("focused",true);if(_25._focusManager==this){_25._onFocus(by);}this.emit("widget-focus",_25,by);}}},focus:function(_26){if(_26){try{_26.focus();}catch(e){}}}});var _27=new _11();_8(function(){var _28=_27.registerWin(_c.doc.parentWindow||_c.doc.defaultView);if(_9("ie")){_b.addOnWindowUnload(function(){_28.remove();_28=null;});}});_10.focus=function(_29){_27.focus(_29);};for(var _2a in _27){if(!/^_/.test(_2a)){_10.focus[_2a]=typeof _27[_2a]=="function"?_7.hitch(_27,_2a):_27[_2a];}}_27.watch(function(_2b,_2c,_2d){_10.focus[_2b]=_2d;});return _27;}); \ No newline at end of file
+define("dijit/focus",["dojo/aspect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/Evented","dojo/_base/lang","dojo/on","dojo/ready","dojo/sniff","dojo/Stateful","dojo/_base/unload","dojo/_base/window","dojo/window","./a11y","./registry","./main"],function(_1,_2,_3,_4,_5,_6,_7,on,_8,_9,_a,_b,_c,_d,_e,_f,_10){var _11=_2([_a,_6],{curNode:null,activeStack:[],constructor:function(){var _12=_7.hitch(this,function(_13){if(_3.isDescendant(this.curNode,_13)){this.set("curNode",null);}if(_3.isDescendant(this.prevNode,_13)){this.set("prevNode",null);}});_1.before(_5,"empty",_12);_1.before(_5,"destroy",_12);},registerIframe:function(_14){return this.registerWin(_14.contentWindow,_14);},registerWin:function(_15,_16){var _17=this;var _18=function(evt){_17._justMouseDowned=true;setTimeout(function(){_17._justMouseDowned=false;},0);if(_9("ie")&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}_17._onTouchNode(_16||evt.target||evt.srcElement,"mouse");};var doc=_9("ie")?_15.document.documentElement:_15.document;if(doc){if(_9("ie")){_15.document.body.attachEvent("onmousedown",_18);var _19=function(evt){var tag=evt.srcElement.tagName.toLowerCase();if(tag=="#document"||tag=="body"){return;}if(_e.isTabNavigable(evt.srcElement)){_17._onFocusNode(_16||evt.srcElement);}else{_17._onTouchNode(_16||evt.srcElement);}};doc.attachEvent("onfocusin",_19);var _1a=function(evt){_17._onBlurNode(_16||evt.srcElement);};doc.attachEvent("onfocusout",_1a);return {remove:function(){_15.document.detachEvent("onmousedown",_18);doc.detachEvent("onfocusin",_19);doc.detachEvent("onfocusout",_1a);doc=null;}};}else{doc.body.addEventListener("mousedown",_18,true);doc.body.addEventListener("touchstart",_18,true);var _1b=function(evt){_17._onFocusNode(_16||evt.target);};doc.addEventListener("focus",_1b,true);var _1c=function(evt){_17._onBlurNode(_16||evt.target);};doc.addEventListener("blur",_1c,true);return {remove:function(){doc.body.removeEventListener("mousedown",_18,true);doc.body.removeEventListener("touchstart",_18,true);doc.removeEventListener("focus",_1b,true);doc.removeEventListener("blur",_1c,true);doc=null;}};}}},_onBlurNode:function(_1d){if(this._clearFocusTimer){clearTimeout(this._clearFocusTimer);}this._clearFocusTimer=setTimeout(_7.hitch(this,function(){this.set("prevNode",this.curNode);this.set("curNode",null);}),0);if(this._justMouseDowned){return;}if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);}this._clearActiveWidgetsTimer=setTimeout(_7.hitch(this,function(){delete this._clearActiveWidgetsTimer;this._setStack([]);}),0);},_onTouchNode:function(_1e,by){if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);delete this._clearActiveWidgetsTimer;}var _1f=[];try{while(_1e){var _20=_4.get(_1e,"dijitPopupParent");if(_20){_1e=_f.byId(_20).domNode;}else{if(_1e.tagName&&_1e.tagName.toLowerCase()=="body"){if(_1e===_c.body()){break;}_1e=_d.get(_1e.ownerDocument).frameElement;}else{var id=_1e.getAttribute&&_1e.getAttribute("widgetId"),_21=id&&_f.byId(id);if(_21&&!(by=="mouse"&&_21.get("disabled"))){_1f.unshift(id);}_1e=_1e.parentNode;}}}}catch(e){}this._setStack(_1f,by);},_onFocusNode:function(_22){if(!_22){return;}if(_22.nodeType==9){return;}if(this._clearFocusTimer){clearTimeout(this._clearFocusTimer);delete this._clearFocusTimer;}this._onTouchNode(_22);if(_22==this.curNode){return;}this.set("prevNode",this.curNode);this.set("curNode",_22);},_setStack:function(_23,by){var _24=this.activeStack;this.set("activeStack",_23);for(var _25=0;_25<Math.min(_24.length,_23.length);_25++){if(_24[_25]!=_23[_25]){break;}}var _26;for(var i=_24.length-1;i>=_25;i--){_26=_f.byId(_24[i]);if(_26){_26._hasBeenBlurred=true;_26.set("focused",false);if(_26._focusManager==this){_26._onBlur(by);}this.emit("widget-blur",_26,by);}}for(i=_25;i<_23.length;i++){_26=_f.byId(_23[i]);if(_26){_26.set("focused",true);if(_26._focusManager==this){_26._onFocus(by);}this.emit("widget-focus",_26,by);}}},focus:function(_27){if(_27){try{_27.focus();}catch(e){}}}});var _28=new _11();_8(function(){var _29=_28.registerWin(_d.get(_c.doc));if(_9("ie")){_b.addOnWindowUnload(function(){if(_29){_29.remove();_29=null;}});}});_10.focus=function(_2a){_28.focus(_2a);};for(var _2b in _28){if(!/^_/.test(_2b)){_10.focus[_2b]=typeof _28[_2b]=="function"?_7.hitch(_28,_2b):_28[_2b];}}_28.watch(function(_2c,_2d,_2e){_10.focus[_2c]=_2e;});return _28;}); \ No newline at end of file
diff --git a/lib/dijit/focus.js.uncompressed.js b/lib/dijit/focus.js.uncompressed.js
new file mode 100644
index 000000000..3bf92b36a
--- /dev/null
+++ b/lib/dijit/focus.js.uncompressed.js
@@ -0,0 +1,364 @@
+define("dijit/focus", [
+ "dojo/aspect",
+ "dojo/_base/declare", // declare
+ "dojo/dom", // domAttr.get dom.isDescendant
+ "dojo/dom-attr", // domAttr.get dom.isDescendant
+ "dojo/dom-construct", // connect to domConstruct.empty, domConstruct.destroy
+ "dojo/Evented",
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/ready",
+ "dojo/sniff", // has("ie")
+ "dojo/Stateful",
+ "dojo/_base/unload", // unload.addOnWindowUnload
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.get
+ "./a11y", // a11y.isTabNavigable
+ "./registry", // registry.byId
+ "./main" // to set dijit.focus
+], function(aspect, declare, dom, domAttr, domConstruct, Evented, lang, on, ready, has, Stateful, unload, win, winUtils,
+ a11y, registry, dijit){
+
+ // module:
+ // dijit/focus
+
+ var FocusManager = declare([Stateful, Evented], {
+ // summary:
+ // Tracks the currently focused node, and which widgets are currently "active".
+ // Access via require(["dijit/focus"], function(focus){ ... }).
+ //
+ // A widget is considered active if it or a descendant widget has focus,
+ // or if a non-focusable node of this widget or a descendant was recently clicked.
+ //
+ // Call focus.watch("curNode", callback) to track the current focused DOMNode,
+ // or focus.watch("activeStack", callback) to track the currently focused stack of widgets.
+ //
+ // Call focus.on("widget-blur", func) or focus.on("widget-focus", ...) to monitor when
+ // when widgets become active/inactive
+ //
+ // Finally, focus(node) will focus a node, suppressing errors if the node doesn't exist.
+
+ // curNode: DomNode
+ // Currently focused item on screen
+ curNode: null,
+
+ // activeStack: dijit/_WidgetBase[]
+ // List of currently active widgets (focused widget and it's ancestors)
+ activeStack: [],
+
+ constructor: function(){
+ // Don't leave curNode/prevNode pointing to bogus elements
+ var check = lang.hitch(this, function(node){
+ if(dom.isDescendant(this.curNode, node)){
+ this.set("curNode", null);
+ }
+ if(dom.isDescendant(this.prevNode, node)){
+ this.set("prevNode", null);
+ }
+ });
+ aspect.before(domConstruct, "empty", check);
+ aspect.before(domConstruct, "destroy", check);
+ },
+
+ registerIframe: function(/*DomNode*/ iframe){
+ // summary:
+ // Registers listeners on the specified iframe so that any click
+ // or focus event on that iframe (or anything in it) is reported
+ // as a focus/click event on the `<iframe>` itself.
+ // description:
+ // Currently only used by editor.
+ // returns:
+ // Handle with remove() method to deregister.
+ return this.registerWin(iframe.contentWindow, iframe);
+ },
+
+ registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){
+ // summary:
+ // Registers listeners on the specified window (either the main
+ // window or an iframe's window) to detect when the user has clicked somewhere
+ // or focused somewhere.
+ // description:
+ // Users should call registerIframe() instead of this method.
+ // targetWindow:
+ // If specified this is the window associated with the iframe,
+ // i.e. iframe.contentWindow.
+ // effectiveNode:
+ // If specified, report any focus events inside targetWindow as
+ // an event on effectiveNode, rather than on evt.target.
+ // returns:
+ // Handle with remove() method to deregister.
+
+ // TODO: make this function private in 2.0; Editor/users should call registerIframe(),
+
+ var _this = this;
+ var mousedownListener = function(evt){
+ _this._justMouseDowned = true;
+ setTimeout(function(){ _this._justMouseDowned = false; }, 0);
+
+ // workaround weird IE bug where the click is on an orphaned node
+ // (first time clicking a Select/DropDownButton inside a TooltipDialog)
+ if(has("ie") && evt && evt.srcElement && evt.srcElement.parentNode == null){
+ return;
+ }
+
+ _this._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse");
+ };
+
+ // Listen for blur and focus events on targetWindow's document.
+ // Using attachEvent()/addEventListener() rather than on() to try to catch mouseDown events even
+ // if other code calls evt.stopPropagation(). But rethink for 2.0 since that doesn't work for attachEvent(),
+ // which watches events at the bubbling phase rather than capturing phase, like addEventListener(..., false).
+ // Connect to <html> (rather than document) on IE to avoid memory leaks, but document on other browsers because
+ // (at least for FF) the focus event doesn't fire on <html> or <body>.
+ var doc = has("ie") ? targetWindow.document.documentElement : targetWindow.document;
+ if(doc){
+ if(has("ie")){
+ targetWindow.document.body.attachEvent('onmousedown', mousedownListener);
+ var focusinListener = function(evt){
+ // IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,
+ // ignore those events
+ var tag = evt.srcElement.tagName.toLowerCase();
+ if(tag == "#document" || tag == "body"){ return; }
+
+ // Previous code called _onTouchNode() for any activate event on a non-focusable node. Can
+ // probably just ignore such an event as it will be handled by onmousedown handler above, but
+ // leaving the code for now.
+ if(a11y.isTabNavigable(evt.srcElement)){
+ _this._onFocusNode(effectiveNode || evt.srcElement);
+ }else{
+ _this._onTouchNode(effectiveNode || evt.srcElement);
+ }
+ };
+ doc.attachEvent('onfocusin', focusinListener);
+ var focusoutListener = function(evt){
+ _this._onBlurNode(effectiveNode || evt.srcElement);
+ };
+ doc.attachEvent('onfocusout', focusoutListener);
+
+ return {
+ remove: function(){
+ targetWindow.document.detachEvent('onmousedown', mousedownListener);
+ doc.detachEvent('onfocusin', focusinListener);
+ doc.detachEvent('onfocusout', focusoutListener);
+ doc = null; // prevent memory leak (apparent circular reference via closure)
+ }
+ };
+ }else{
+ doc.body.addEventListener('mousedown', mousedownListener, true);
+ doc.body.addEventListener('touchstart', mousedownListener, true);
+ var focusListener = function(evt){
+ _this._onFocusNode(effectiveNode || evt.target);
+ };
+ doc.addEventListener('focus', focusListener, true);
+ var blurListener = function(evt){
+ _this._onBlurNode(effectiveNode || evt.target);
+ };
+ doc.addEventListener('blur', blurListener, true);
+
+ return {
+ remove: function(){
+ doc.body.removeEventListener('mousedown', mousedownListener, true);
+ doc.body.removeEventListener('touchstart', mousedownListener, true);
+ doc.removeEventListener('focus', focusListener, true);
+ doc.removeEventListener('blur', blurListener, true);
+ doc = null; // prevent memory leak (apparent circular reference via closure)
+ }
+ };
+ }
+ }
+ },
+
+ _onBlurNode: function(/*DomNode*/ node){
+ // summary:
+ // Called when focus leaves a node.
+ // Usually ignored, _unless_ it *isn't* followed by touching another node,
+ // which indicates that we tabbed off the last field on the page,
+ // in which case every widget is marked inactive
+
+ // If the blur event isn't followed by a focus event, it means the user clicked on something unfocusable,
+ // so clear focus.
+ if(this._clearFocusTimer){
+ clearTimeout(this._clearFocusTimer);
+ }
+ this._clearFocusTimer = setTimeout(lang.hitch(this, function(){
+ this.set("prevNode", this.curNode);
+ this.set("curNode", null);
+ }), 0);
+
+ if(this._justMouseDowned){
+ // the mouse down caused a new widget to be marked as active; this blur event
+ // is coming late, so ignore it.
+ return;
+ }
+
+ // If the blur event isn't followed by a focus or touch event then mark all widgets as inactive.
+ if(this._clearActiveWidgetsTimer){
+ clearTimeout(this._clearActiveWidgetsTimer);
+ }
+ this._clearActiveWidgetsTimer = setTimeout(lang.hitch(this, function(){
+ delete this._clearActiveWidgetsTimer;
+ this._setStack([]);
+ }), 0);
+ },
+
+ _onTouchNode: function(/*DomNode*/ node, /*String*/ by){
+ // summary:
+ // Callback when node is focused or mouse-downed
+ // node:
+ // The node that was touched.
+ // by:
+ // "mouse" if the focus/touch was caused by a mouse down event
+
+ // ignore the recent blurNode event
+ if(this._clearActiveWidgetsTimer){
+ clearTimeout(this._clearActiveWidgetsTimer);
+ delete this._clearActiveWidgetsTimer;
+ }
+
+ // compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)
+ var newStack=[];
+ try{
+ while(node){
+ var popupParent = domAttr.get(node, "dijitPopupParent");
+ if(popupParent){
+ node=registry.byId(popupParent).domNode;
+ }else if(node.tagName && node.tagName.toLowerCase() == "body"){
+ // is this the root of the document or just the root of an iframe?
+ if(node === win.body()){
+ // node is the root of the main document
+ break;
+ }
+ // otherwise, find the iframe this node refers to (can't access it via parentNode,
+ // need to do this trick instead). window.frameElement is supported in IE/FF/Webkit
+ node=winUtils.get(node.ownerDocument).frameElement;
+ }else{
+ // if this node is the root node of a widget, then add widget id to stack,
+ // except ignore clicks on disabled widgets (actually focusing a disabled widget still works,
+ // to support MenuItem)
+ var id = node.getAttribute && node.getAttribute("widgetId"),
+ widget = id && registry.byId(id);
+ if(widget && !(by == "mouse" && widget.get("disabled"))){
+ newStack.unshift(id);
+ }
+ node=node.parentNode;
+ }
+ }
+ }catch(e){ /* squelch */ }
+
+ this._setStack(newStack, by);
+ },
+
+ _onFocusNode: function(/*DomNode*/ node){
+ // summary:
+ // Callback when node is focused
+
+ if(!node){
+ return;
+ }
+
+ if(node.nodeType == 9){
+ // Ignore focus events on the document itself. This is here so that
+ // (for example) clicking the up/down arrows of a spinner
+ // (which don't get focus) won't cause that widget to blur. (FF issue)
+ return;
+ }
+
+ // There was probably a blur event right before this event, but since we have a new focus, don't
+ // do anything with the blur
+ if(this._clearFocusTimer){
+ clearTimeout(this._clearFocusTimer);
+ delete this._clearFocusTimer;
+ }
+
+ this._onTouchNode(node);
+
+ if(node == this.curNode){ return; }
+ this.set("prevNode", this.curNode);
+ this.set("curNode", node);
+ },
+
+ _setStack: function(/*String[]*/ newStack, /*String*/ by){
+ // summary:
+ // The stack of active widgets has changed. Send out appropriate events and records new stack.
+ // newStack:
+ // array of widget id's, starting from the top (outermost) widget
+ // by:
+ // "mouse" if the focus/touch was caused by a mouse down event
+
+ var oldStack = this.activeStack;
+ this.set("activeStack", newStack);
+
+ // compare old stack to new stack to see how many elements they have in common
+ for(var nCommon=0; nCommon<Math.min(oldStack.length, newStack.length); nCommon++){
+ if(oldStack[nCommon] != newStack[nCommon]){
+ break;
+ }
+ }
+
+ var widget;
+ // for all elements that have gone out of focus, set focused=false
+ for(var i=oldStack.length-1; i>=nCommon; i--){
+ widget = registry.byId(oldStack[i]);
+ if(widget){
+ widget._hasBeenBlurred = true; // TODO: used by form widgets, should be moved there
+ widget.set("focused", false);
+ if(widget._focusManager == this){
+ widget._onBlur(by);
+ }
+ this.emit("widget-blur", widget, by);
+ }
+ }
+
+ // for all element that have come into focus, set focused=true
+ for(i=nCommon; i<newStack.length; i++){
+ widget = registry.byId(newStack[i]);
+ if(widget){
+ widget.set("focused", true);
+ if(widget._focusManager == this){
+ widget._onFocus(by);
+ }
+ this.emit("widget-focus", widget, by);
+ }
+ }
+ },
+
+ focus: function(node){
+ // summary:
+ // Focus the specified node, suppressing errors if they occur
+ if(node){
+ try{ node.focus(); }catch(e){/*quiet*/}
+ }
+ }
+ });
+
+ var singleton = new FocusManager();
+
+ // register top window and all the iframes it contains
+ ready(function(){
+ var handle = singleton.registerWin(winUtils.get(win.doc));
+ if(has("ie")){
+ unload.addOnWindowUnload(function(){
+ if(handle){ // because this gets called twice when doh.robot is running
+ handle.remove();
+ handle = null;
+ }
+ });
+ }
+ });
+
+ // Setup dijit.focus as a pointer to the singleton but also (for backwards compatibility)
+ // as a function to set focus. Remove for 2.0.
+ dijit.focus = function(node){
+ singleton.focus(node); // indirection here allows dijit/_base/focus.js to override behavior
+ };
+ for(var attr in singleton){
+ if(!/^_/.test(attr)){
+ dijit.focus[attr] = typeof singleton[attr] == "function" ? lang.hitch(singleton, attr) : singleton[attr];
+ }
+ }
+ singleton.watch(function(attr, oldVal, newVal){
+ dijit.focus[attr] = newVal;
+ });
+
+ return singleton;
+});
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
diff --git a/lib/dijit/hccss.js b/lib/dijit/hccss.js
index 162ea1c3a..547f3075d 100644
--- a/lib/dijit/hccss.js
+++ b/lib/dijit/hccss.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/hccss",["require","dojo/_base/config","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/ready","dojo/_base/sniff","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6,_7,_8){if(_7("ie")||_7("mozilla")){_6(90,function(){var _9=_4.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(_2.blankGif||_1.toUrl("dojo/resources/blank.gif"))+"\");"}},_8.body());var cs=_5.getComputedStyle(_9);if(cs){var _a=cs.backgroundImage;var _b=(cs.borderTopColor==cs.borderRightColor)||(_a!=null&&(_a=="none"||_a=="url(invalid-url:)"));if(_b){_3.add(_8.body(),"dijit_a11y");}if(_7("ie")){_9.outerHTML="";}else{_8.body().removeChild(_9);}}});}}); \ No newline at end of file
+define("dijit/hccss",["dojo/dom-class","dojo/hccss","dojo/ready","dojo/_base/window"],function(_1,_2,_3,_4){_3(90,function(){if(_2("highcontrast")){_1.add(_4.body(),"dijit_a11y");}});return _2;}); \ No newline at end of file
diff --git a/lib/dijit/hccss.js.uncompressed.js b/lib/dijit/hccss.js.uncompressed.js
new file mode 100644
index 000000000..9e0ac88e8
--- /dev/null
+++ b/lib/dijit/hccss.js.uncompressed.js
@@ -0,0 +1,23 @@
+define("dijit/hccss", ["dojo/dom-class", "dojo/hccss", "dojo/ready", "dojo/_base/window"], function(domClass, has, ready, win){
+
+ // module:
+ // dijit/hccss
+
+ /*=====
+ return function(){
+ // summary:
+ // Test if computer is in high contrast mode, and sets `dijit_a11y` flag on `<body>` if it is.
+ // Deprecated, use ``dojo/hccss`` instead.
+ };
+ =====*/
+
+ // Priority is 90 to run ahead of parser priority of 100. For 2.0, remove the ready() call and instead
+ // change this module to depend on dojo/domReady!
+ ready(90, function(){
+ if(has("highcontrast")){
+ domClass.add(win.body(), "dijit_a11y");
+ }
+ });
+
+ return has;
+});
diff --git a/lib/dijit/icons/commonIcons.css b/lib/dijit/icons/commonIcons.css
index 8d0060e85..3fde8c267 100644
--- a/lib/dijit/icons/commonIcons.css
+++ b/lib/dijit/icons/commonIcons.css
@@ -133,7 +133,7 @@ The 16 x 16px icons in these sprites are action and object type images which can
.dijitIconEdit { background-position: -112px; }
.dijitIconNewTask { background-position: -128px; }
.dijitIconEditTask { background-position: -144px; }
-.dijitIconEditProperty { background-position: -166px; }
+.dijitIconEditProperty { background-position: -160px; }
.dijitIconTask { background-position: -176px; }
.dijitIconFilter { background-position: -192px; }
.dijitIconConfigure { background-position: -208px; }
diff --git a/lib/dijit/layout/AccordionContainer.js b/lib/dijit/layout/AccordionContainer.js
index 3470e5426..8efb761f6 100644
--- a/lib/dijit/layout/AccordionContainer.js
+++ b/lib/dijit/layout/AccordionContainer.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/layout/templates/AccordionButton.html":"<div data-dojo-attach-event='onclick:_onTitleClick' class='dijitAccordionTitle' role=\"presentation\">\n\t<div data-dojo-attach-point='titleNode,focusNode' data-dojo-attach-event='onkeypress:_onTitleKeyPress'\n\t\t\tclass='dijitAccordionTitleFocus' role=\"tab\" aria-expanded=\"false\"\n\t\t><span class='dijitInline dijitAccordionArrow' role=\"presentation\"></span\n\t\t><span class='arrowTextUp' role=\"presentation\">+</span\n\t\t><span class='arrowTextDown' role=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" data-dojo-attach-point='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" data-dojo-attach-point='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"}});define("dijit/layout/AccordionContainer",["require","dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/_base/fx","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/topic","../focus","../_base/manager","dojo/ready","../_Widget","../_Container","../_TemplatedMixin","../_CssStateMixin","./StackContainer","./ContentPane","dojo/text!./templates/AccordionButton.html"],function(_1,_2,_3,_4,fx,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14,_15,_16,_17,_18){var _19=_3("dijit.layout._AccordionButton",[_12,_14,_15],{templateString:_18,label:"",_setLabelAttr:{node:"titleTextNode",type:"innerHTML"},title:"",_setTitleAttr:{node:"titleTextNode",type:"attribute",attribute:"title"},iconClassAttr:"",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitAccordionTitle",getParent:function(){return this.parent;},buildRendering:function(){this.inherited(arguments);var _1a=this.id.replace(" ","_");_6.set(this.titleTextNode,"id",_1a+"_title");this.focusNode.setAttribute("aria-labelledby",_6.get(this.titleTextNode,"id"));_5.setSelectable(this.domNode,false);},getTitleHeight:function(){return _9.getMarginSize(this.domNode).h;},_onTitleClick:function(){var _1b=this.getParent();_1b.selectChild(this.contentWidget,true);_f.focus(this.focusNode);},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_1c){this._set("selected",_1c);this.focusNode.setAttribute("aria-expanded",_1c);this.focusNode.setAttribute("aria-selected",_1c);this.focusNode.setAttribute("tabIndex",_1c?"0":"-1");}});var _1d=_3("dijit.layout._AccordionInnerContainer",[_12,_15],{baseClass:"dijitAccordionInnerContainer",isLayoutContainer:true,buildRendering:function(){this.domNode=_8.place("<div class='"+this.baseClass+"' role='presentation'>",this.contentWidget.domNode,"after");var _1e=this.contentWidget,cls=_c.isString(this.buttonWidget)?_c.getObject(this.buttonWidget):this.buttonWidget;this.button=_1e._buttonWidget=(new cls({contentWidget:_1e,label:_1e.title,title:_1e.tooltip,dir:_1e.dir,lang:_1e.lang,textDir:_1e.textDir,iconClass:_1e.iconClass,id:_1e.id+"_button",parent:this.parent})).placeAt(this.domNode);this.containerNode=_8.place("<div class='dijitAccordionChildWrapper' style='display:none'>",this.domNode);_8.place(this.contentWidget.domNode,this.containerNode);},postCreate:function(){this.inherited(arguments);var _1f=this.button;this._contentWidgetWatches=[this.contentWidget.watch("title",_c.hitch(this,function(_20,_21,_22){_1f.set("label",_22);})),this.contentWidget.watch("tooltip",_c.hitch(this,function(_23,_24,_25){_1f.set("title",_25);})),this.contentWidget.watch("iconClass",_c.hitch(this,function(_26,_27,_28){_1f.set("iconClass",_28);}))];},_setSelectedAttr:function(_29){this._set("selected",_29);this.button.set("selected",_29);if(_29){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();_2.forEach(this._contentWidgetWatches||[],function(w){w.unwatch();});delete this.contentWidget._buttonWidget;delete this.contentWidget._wrapperWidget;this.inherited(arguments);},destroyDescendants:function(_2a){this.contentWidget.destroyRecursive(_2a);}});var _2b=_3("dijit.layout.AccordionContainer",_16,{duration:_10.defaultDuration,buttonWidget:_19,baseClass:"dijitAccordionContainer",buildRendering:function(){this.inherited(arguments);this.domNode.style.overflow="hidden";this.domNode.setAttribute("role","tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _2c=this.selectedChildWidget.containerNode.style;_2c.display="";_2c.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},layout:function(){var _2d=this.selectedChildWidget;if(!_2d){return;}var _2e=_2d._wrapperWidget.domNode,_2f=_9.getMarginExtents(_2e),_30=_9.getPadBorderExtents(_2e),_31=_2d._wrapperWidget.containerNode,_32=_9.getMarginExtents(_31),_33=_9.getPadBorderExtents(_31),_34=this._contentBox;var _35=0;_2.forEach(this.getChildren(),function(_36){if(_36!=_2d){_35+=_9.getMarginSize(_36._wrapperWidget.domNode).h;}});this._verticalSpace=_34.h-_35-_2f.h-_30.h-_32.h-_33.h-_2d._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_2f.w-_30.w-_32.w-_33.w};if(_2d){_2d.resize(this._containerContentBox);}},_setupChild:function(_37){_37._wrapperWidget=_1d({contentWidget:_37,buttonWidget:this.buttonWidget,id:_37.id+"_wrapper",dir:_37.dir,lang:_37.lang,textDir:_37.textDir,parent:this});this.inherited(arguments);},addChild:function(_38,_39){if(this._started){var _3a=this.containerNode;if(_39&&typeof _39=="number"){var _3b=_12.prototype.getChildren.call(this);if(_3b&&_3b.length>=_39){_3a=_3b[_39-1].domNode;_39="after";}}_8.place(_38.domNode,_3a,_39);if(!_38._started){_38.startup();}this._setupChild(_38);_e.publish(this.id+"-addChild",_38,_39);this.layout();if(!this.selectedChildWidget){this.selectChild(_38);}}else{this.inherited(arguments);}},removeChild:function(_3c){if(_3c._wrapperWidget){_8.place(_3c.domNode,_3c._wrapperWidget.domNode,"after");_3c._wrapperWidget.destroy();delete _3c._wrapperWidget;}_7.remove(_3c.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return _2.map(this.inherited(arguments),function(_3d){return _3d.declaredClass=="dijit.layout._AccordionInnerContainer"?_3d.contentWidget:_3d;},this);},destroy:function(){if(this._animation){this._animation.stop();}_2.forEach(this.getChildren(),function(_3e){if(_3e._wrapperWidget){_3e._wrapperWidget.destroy();}else{_3e.destroyRecursive();}});this.inherited(arguments);},_showChild:function(_3f){_3f._wrapperWidget.containerNode.style.display="block";return this.inherited(arguments);},_hideChild:function(_40){_40._wrapperWidget.containerNode.style.display="none";this.inherited(arguments);},_transition:function(_41,_42,_43){if(_d("ie")<8){_43=false;}if(this._animation){this._animation.stop(true);delete this._animation;}var _44=this;if(_41){_41._wrapperWidget.set("selected",true);var d=this._showChild(_41);if(this.doLayout&&_41.resize){_41.resize(this._containerContentBox);}}if(_42){_42._wrapperWidget.set("selected",false);if(!_43){this._hideChild(_42);}}if(_43){var _45=_41._wrapperWidget.containerNode,_46=_42._wrapperWidget.containerNode;var _47=_41._wrapperWidget.containerNode,_48=_9.getMarginExtents(_47),_49=_9.getPadBorderExtents(_47),_4a=_48.h+_49.h;_46.style.height=(_44._verticalSpace-_4a)+"px";this._animation=new fx.Animation({node:_45,duration:this.duration,curve:[1,this._verticalSpace-_4a-1],onAnimate:function(_4b){_4b=Math.floor(_4b);_45.style.height=_4b+"px";_46.style.height=(_44._verticalSpace-_4a-_4b)+"px";},onEnd:function(){delete _44._animation;_45.style.height="auto";_42._wrapperWidget.containerNode.style.display="none";_46.style.height="auto";_44._hideChild(_42);}});this._animation.onStop=this._animation.onEnd;this._animation.play();}return d;},_onKeyPress:function(e,_4c){if(this.disabled||e.altKey||!(_4c||e.ctrlKey)){return;}var c=e.charOrCode;if((_4c&&(c==_b.LEFT_ARROW||c==_b.UP_ARROW))||(e.ctrlKey&&c==_b.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();_4.stop(e);}else{if((_4c&&(c==_b.RIGHT_ARROW||c==_b.DOWN_ARROW))||(e.ctrlKey&&(c==_b.PAGE_DOWN||c==_b.TAB))){this._adjacent(true)._buttonWidget._onTitleClick();_4.stop(e);}}}});if(!_a.isAsync){_11(0,function(){var _4d=["dijit/layout/AccordionPane"];_1(_4d);});}_2b._InnerContainer=_1d;_2b._Button=_19;return _2b;}); \ No newline at end of file
+require({cache:{"url:dijit/layout/templates/AccordionButton.html":"<div data-dojo-attach-event='onclick:_onTitleClick' class='dijitAccordionTitle' role=\"presentation\">\n\t<div data-dojo-attach-point='titleNode,focusNode' data-dojo-attach-event='onkeypress:_onTitleKeyPress'\n\t\t\tclass='dijitAccordionTitleFocus' role=\"tab\" aria-expanded=\"false\"\n\t\t><span class='dijitInline dijitAccordionArrow' role=\"presentation\"></span\n\t\t><span class='arrowTextUp' role=\"presentation\">+</span\n\t\t><span class='arrowTextDown' role=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" data-dojo-attach-point='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" data-dojo-attach-point='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"}});define("dijit/layout/AccordionContainer",["require","dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/_base/fx","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/keys","dojo/_base/lang","dojo/sniff","dojo/topic","../focus","../_base/manager","dojo/ready","../_Widget","../_Container","../_TemplatedMixin","../_CssStateMixin","./StackContainer","./ContentPane","dojo/text!./templates/AccordionButton.html"],function(_1,_2,_3,_4,fx,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12,_13,_14,_15,_16,_17){var _18=_3("dijit.layout._AccordionButton",[_11,_13,_14],{templateString:_17,label:"",_setLabelAttr:{node:"titleTextNode",type:"innerHTML"},title:"",_setTitleAttr:{node:"titleTextNode",type:"attribute",attribute:"title"},iconClassAttr:"",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitAccordionTitle",getParent:function(){return this.parent;},buildRendering:function(){this.inherited(arguments);var _19=this.id.replace(" ","_");_6.set(this.titleTextNode,"id",_19+"_title");this.focusNode.setAttribute("aria-labelledby",_6.get(this.titleTextNode,"id"));_5.setSelectable(this.domNode,false);},getTitleHeight:function(){return _9.getMarginSize(this.domNode).h;},_onTitleClick:function(){var _1a=this.getParent();_1a.selectChild(this.contentWidget,true);_e.focus(this.focusNode);},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_1b){this._set("selected",_1b);this.focusNode.setAttribute("aria-expanded",_1b?"true":"false");this.focusNode.setAttribute("aria-selected",_1b?"true":"false");this.focusNode.setAttribute("tabIndex",_1b?"0":"-1");}});var _1c=_3("dijit.layout._AccordionInnerContainer",[_11,_14],{baseClass:"dijitAccordionInnerContainer",isLayoutContainer:true,buildRendering:function(){this.domNode=_8.place("<div class='"+this.baseClass+"' role='presentation'>",this.contentWidget.domNode,"after");var _1d=this.contentWidget,cls=_b.isString(this.buttonWidget)?_b.getObject(this.buttonWidget):this.buttonWidget;this.button=_1d._buttonWidget=(new cls({contentWidget:_1d,label:_1d.title,title:_1d.tooltip,dir:_1d.dir,lang:_1d.lang,textDir:_1d.textDir,iconClass:_1d.iconClass,id:_1d.id+"_button",parent:this.parent})).placeAt(this.domNode);this.containerNode=_8.place("<div class='dijitAccordionChildWrapper' style='display:none'>",this.domNode);_8.place(this.contentWidget.domNode,this.containerNode);},postCreate:function(){this.inherited(arguments);var _1e=this.button;this._contentWidgetWatches=[this.contentWidget.watch("title",_b.hitch(this,function(_1f,_20,_21){_1e.set("label",_21);})),this.contentWidget.watch("tooltip",_b.hitch(this,function(_22,_23,_24){_1e.set("title",_24);})),this.contentWidget.watch("iconClass",_b.hitch(this,function(_25,_26,_27){_1e.set("iconClass",_27);}))];},_setSelectedAttr:function(_28){this._set("selected",_28);this.button.set("selected",_28);if(_28){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();_2.forEach(this._contentWidgetWatches||[],function(w){w.unwatch();});delete this.contentWidget._buttonWidget;delete this.contentWidget._wrapperWidget;this.inherited(arguments);},destroyDescendants:function(_29){this.contentWidget.destroyRecursive(_29);}});var _2a=_3("dijit.layout.AccordionContainer",_15,{duration:_f.defaultDuration,buttonWidget:_18,baseClass:"dijitAccordionContainer",buildRendering:function(){this.inherited(arguments);this.domNode.style.overflow="hidden";this.domNode.setAttribute("role","tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){this.selectedChildWidget._wrapperWidget.set("selected",true);}},layout:function(){var _2b=this.selectedChildWidget;if(!_2b){return;}var _2c=_2b._wrapperWidget.domNode,_2d=_9.getMarginExtents(_2c),_2e=_9.getPadBorderExtents(_2c),_2f=_2b._wrapperWidget.containerNode,_30=_9.getMarginExtents(_2f),_31=_9.getPadBorderExtents(_2f),_32=this._contentBox;var _33=0;_2.forEach(this.getChildren(),function(_34){if(_34!=_2b){_33+=_9.getMarginSize(_34._wrapperWidget.domNode).h;}});this._verticalSpace=_32.h-_33-_2d.h-_2e.h-_30.h-_31.h-_2b._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_2d.w-_2e.w-_30.w-_31.w};if(_2b){_2b.resize(this._containerContentBox);}},_setupChild:function(_35){_35._wrapperWidget=_1c({contentWidget:_35,buttonWidget:this.buttonWidget,id:_35.id+"_wrapper",dir:_35.dir,lang:_35.lang,textDir:_35.textDir,parent:this});this.inherited(arguments);},addChild:function(_36,_37){if(this._started){var _38=this.containerNode;if(_37&&typeof _37=="number"){var _39=_11.prototype.getChildren.call(this);if(_39&&_39.length>=_37){_38=_39[_37-1].domNode;_37="after";}}_8.place(_36.domNode,_38,_37);if(!_36._started){_36.startup();}this._setupChild(_36);_d.publish(this.id+"-addChild",_36,_37);this.layout();if(!this.selectedChildWidget){this.selectChild(_36);}}else{this.inherited(arguments);}},removeChild:function(_3a){if(_3a._wrapperWidget){_8.place(_3a.domNode,_3a._wrapperWidget.domNode,"after");_3a._wrapperWidget.destroy();delete _3a._wrapperWidget;}_7.remove(_3a.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return _2.map(this.inherited(arguments),function(_3b){return _3b.declaredClass=="dijit.layout._AccordionInnerContainer"?_3b.contentWidget:_3b;},this);},destroy:function(){if(this._animation){this._animation.stop();}_2.forEach(this.getChildren(),function(_3c){if(_3c._wrapperWidget){_3c._wrapperWidget.destroy();}else{_3c.destroyRecursive();}});this.inherited(arguments);},_showChild:function(_3d){_3d._wrapperWidget.containerNode.style.display="block";return this.inherited(arguments);},_hideChild:function(_3e){_3e._wrapperWidget.containerNode.style.display="none";this.inherited(arguments);},_transition:function(_3f,_40,_41){if(_c("ie")<8){_41=false;}if(this._animation){this._animation.stop(true);delete this._animation;}var _42=this;if(_3f){_3f._wrapperWidget.set("selected",true);var d=this._showChild(_3f);if(this.doLayout&&_3f.resize){_3f.resize(this._containerContentBox);}}if(_40){_40._wrapperWidget.set("selected",false);if(!_41){this._hideChild(_40);}}if(_41){var _43=_3f._wrapperWidget.containerNode,_44=_40._wrapperWidget.containerNode;var _45=_3f._wrapperWidget.containerNode,_46=_9.getMarginExtents(_45),_47=_9.getPadBorderExtents(_45),_48=_46.h+_47.h;_44.style.height=(_42._verticalSpace-_48)+"px";this._animation=new fx.Animation({node:_43,duration:this.duration,curve:[1,this._verticalSpace-_48-1],onAnimate:function(_49){_49=Math.floor(_49);_43.style.height=_49+"px";_44.style.height=(_42._verticalSpace-_48-_49)+"px";},onEnd:function(){delete _42._animation;_43.style.height="auto";_40._wrapperWidget.containerNode.style.display="none";_44.style.height="auto";_42._hideChild(_40);}});this._animation.onStop=this._animation.onEnd;this._animation.play();}return d;},_onKeyPress:function(e,_4a){if(this.disabled||e.altKey||!(_4a||e.ctrlKey)){return;}var c=e.charOrCode;if((_4a&&(c==_a.LEFT_ARROW||c==_a.UP_ARROW))||(e.ctrlKey&&c==_a.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();_4.stop(e);}else{if((_4a&&(c==_a.RIGHT_ARROW||c==_a.DOWN_ARROW))||(e.ctrlKey&&(c==_a.PAGE_DOWN||c==_a.TAB))){this._adjacent(true)._buttonWidget._onTitleClick();_4.stop(e);}}}});if(_c("dijit-legacy-requires")){_10(0,function(){var _4b=["dijit/layout/AccordionPane"];_1(_4b);});}_2a._InnerContainer=_1c;_2a._Button=_18;return _2a;}); \ No newline at end of file
diff --git a/lib/dijit/layout/AccordionContainer.js.uncompressed.js b/lib/dijit/layout/AccordionContainer.js.uncompressed.js
new file mode 100644
index 000000000..68f9856bf
--- /dev/null
+++ b/lib/dijit/layout/AccordionContainer.js.uncompressed.js
@@ -0,0 +1,540 @@
+require({cache:{
+'url:dijit/layout/templates/AccordionButton.html':"<div data-dojo-attach-event='onclick:_onTitleClick' class='dijitAccordionTitle' role=\"presentation\">\n\t<div data-dojo-attach-point='titleNode,focusNode' data-dojo-attach-event='onkeypress:_onTitleKeyPress'\n\t\t\tclass='dijitAccordionTitleFocus' role=\"tab\" aria-expanded=\"false\"\n\t\t><span class='dijitInline dijitAccordionArrow' role=\"presentation\"></span\n\t\t><span class='arrowTextUp' role=\"presentation\">+</span\n\t\t><span class='arrowTextDown' role=\"presentation\">-</span\n\t\t><img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon\" data-dojo-attach-point='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" data-dojo-attach-point='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"}});
+define("dijit/layout/AccordionContainer", [
+ "require",
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/_base/fx", // fx.Animation
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-attr", // domAttr.attr
+ "dojo/dom-class", // domClass.remove
+ "dojo/dom-construct", // domConstruct.place
+ "dojo/dom-geometry",
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.getObject lang.hitch
+ "dojo/sniff", // has("ie") has("dijit-legacy-requires")
+ "dojo/topic", // publish
+ "../focus", // focus.focus()
+ "../_base/manager", // manager.defaultDuration
+ "dojo/ready",
+ "../_Widget",
+ "../_Container",
+ "../_TemplatedMixin",
+ "../_CssStateMixin",
+ "./StackContainer",
+ "./ContentPane",
+ "dojo/text!./templates/AccordionButton.html"
+], function(require, array, declare, event, fx, dom, domAttr, domClass, domConstruct, domGeometry,
+ keys, lang, has, topic, focus, manager, ready,
+ _Widget, _Container, _TemplatedMixin, _CssStateMixin, StackContainer, ContentPane, template){
+
+ // module:
+ // dijit/layout/AccordionContainer
+
+
+ // Design notes:
+ //
+ // An AccordionContainer is a StackContainer, but each child (typically ContentPane)
+ // is wrapped in a _AccordionInnerContainer. This is hidden from the caller.
+ //
+ // The resulting markup will look like:
+ //
+ // <div class=dijitAccordionContainer>
+ // <div class=dijitAccordionInnerContainer> (one pane)
+ // <div class=dijitAccordionTitle> (title bar) ... </div>
+ // <div class=dijtAccordionChildWrapper> (content pane) </div>
+ // </div>
+ // </div>
+ //
+ // Normally the dijtAccordionChildWrapper is hidden for all but one child (the shown
+ // child), so the space for the content pane is all the title bars + the one dijtAccordionChildWrapper,
+ // which on claro has a 1px border plus a 2px bottom margin.
+ //
+ // During animation there are two dijtAccordionChildWrapper's shown, so we need
+ // to compensate for that.
+
+
+ var AccordionButton = declare("dijit.layout._AccordionButton", [_Widget, _TemplatedMixin, _CssStateMixin], {
+ // summary:
+ // The title bar to click to open up an accordion pane.
+ // Internal widget used by AccordionContainer.
+ // tags:
+ // private
+
+ templateString: template,
+
+ // label: String
+ // Title of the pane
+ label: "",
+ _setLabelAttr: {node: "titleTextNode", type: "innerHTML" },
+
+ // title: String
+ // Tooltip that appears on hover
+ title: "",
+ _setTitleAttr: {node: "titleTextNode", type: "attribute", attribute: "title"},
+
+ // iconClassAttr: String
+ // CSS class for icon to left of label
+ iconClassAttr: "",
+ _setIconClassAttr: { node: "iconNode", type: "class" },
+
+ baseClass: "dijitAccordionTitle",
+
+ getParent: function(){
+ // summary:
+ // Returns the AccordionContainer parent.
+ // tags:
+ // private
+ return this.parent;
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ var titleTextNodeId = this.id.replace(' ','_');
+ domAttr.set(this.titleTextNode, "id", titleTextNodeId+"_title");
+ this.focusNode.setAttribute("aria-labelledby", domAttr.get(this.titleTextNode, "id"));
+ dom.setSelectable(this.domNode, false);
+ },
+
+ getTitleHeight: function(){
+ // summary:
+ // Returns the height of the title dom node.
+ return domGeometry.getMarginSize(this.domNode).h; // Integer
+ },
+
+ // TODO: maybe the parent should set these methods directly rather than forcing the code
+ // into the button widget?
+ _onTitleClick: function(){
+ // summary:
+ // Callback when someone clicks my title.
+ var parent = this.getParent();
+ parent.selectChild(this.contentWidget, true);
+ focus.focus(this.focusNode);
+ },
+
+ _onTitleKeyPress: function(/*Event*/ evt){
+ return this.getParent()._onKeyPress(evt, this.contentWidget);
+ },
+
+ _setSelectedAttr: function(/*Boolean*/ isSelected){
+ this._set("selected", isSelected);
+ this.focusNode.setAttribute("aria-expanded", isSelected ? "true" : "false");
+ this.focusNode.setAttribute("aria-selected", isSelected ? "true" : "false");
+ this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
+ }
+ });
+
+ var AccordionInnerContainer = declare("dijit.layout._AccordionInnerContainer", [_Widget, _CssStateMixin], {
+ // summary:
+ // Internal widget placed as direct child of AccordionContainer.containerNode.
+ // When other widgets are added as children to an AccordionContainer they are wrapped in
+ // this widget.
+
+/*=====
+ // buttonWidget: Function|String
+ // Class to use to instantiate title
+ // (Wish we didn't have a separate widget for just the title but maintaining it
+ // for backwards compatibility, is it worth it?)
+ buttonWidget: null,
+=====*/
+
+/*=====
+ // contentWidget: dijit/_WidgetBase
+ // Pointer to the real child widget
+ contentWidget: null,
+=====*/
+
+ baseClass: "dijitAccordionInnerContainer",
+
+ // tell nested layout widget that we will take care of sizing
+ isLayoutContainer: true,
+
+ buildRendering: function(){
+ // Builds a template like:
+ // <div class=dijitAccordionInnerContainer>
+ // Button
+ // <div class=dijitAccordionChildWrapper>
+ // ContentPane
+ // </div>
+ // </div>
+
+ // Create wrapper div, placed where the child is now
+ this.domNode = domConstruct.place("<div class='" + this.baseClass +
+ "' role='presentation'>", this.contentWidget.domNode, "after");
+
+ // wrapper div's first child is the button widget (ie, the title bar)
+ var child = this.contentWidget,
+ cls = lang.isString(this.buttonWidget) ? lang.getObject(this.buttonWidget) : this.buttonWidget;
+ this.button = child._buttonWidget = (new cls({
+ contentWidget: child,
+ label: child.title,
+ title: child.tooltip,
+ dir: child.dir,
+ lang: child.lang,
+ textDir: child.textDir,
+ iconClass: child.iconClass,
+ id: child.id + "_button",
+ parent: this.parent
+ })).placeAt(this.domNode);
+
+ // and then the actual content widget (changing it from prior-sibling to last-child),
+ // wrapped by a <div class=dijitAccordionChildWrapper>
+ this.containerNode = domConstruct.place("<div class='dijitAccordionChildWrapper' style='display:none'>", this.domNode);
+ domConstruct.place(this.contentWidget.domNode, this.containerNode);
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Map changes in content widget's title etc. to changes in the button
+ var button = this.button;
+ this._contentWidgetWatches = [
+ this.contentWidget.watch('title', lang.hitch(this, function(name, oldValue, newValue){
+ button.set("label", newValue);
+ })),
+ this.contentWidget.watch('tooltip', lang.hitch(this, function(name, oldValue, newValue){
+ button.set("title", newValue);
+ })),
+ this.contentWidget.watch('iconClass', lang.hitch(this, function(name, oldValue, newValue){
+ button.set("iconClass", newValue);
+ }))
+ ];
+ },
+
+ _setSelectedAttr: function(/*Boolean*/ isSelected){
+ this._set("selected", isSelected);
+ this.button.set("selected", isSelected);
+ if(isSelected){
+ var cw = this.contentWidget;
+ if(cw.onSelected){ cw.onSelected(); }
+ }
+ },
+
+ startup: function(){
+ // Called by _Container.addChild()
+ this.contentWidget.startup();
+ },
+
+ destroy: function(){
+ this.button.destroyRecursive();
+
+ array.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); });
+
+ delete this.contentWidget._buttonWidget;
+ delete this.contentWidget._wrapperWidget;
+
+ this.inherited(arguments);
+ },
+
+ destroyDescendants: function(/*Boolean*/ preserveDom){
+ // since getChildren isn't working for me, have to code this manually
+ this.contentWidget.destroyRecursive(preserveDom);
+ }
+ });
+
+ var AccordionContainer = declare("dijit.layout.AccordionContainer", StackContainer, {
+ // summary:
+ // Holds a set of panes where every pane's title is visible, but only one pane's content is visible at a time,
+ // and switching between panes is visualized by sliding the other panes up/down.
+ // example:
+ // | <div data-dojo-type="dijit/layout/AccordionContainer">
+ // | <div data-dojo-type="dijit/layout/ContentPane" title="pane 1">
+ // | </div>
+ // | <div data-dojo-type="dijit/layout/ContentPane" title="pane 2">
+ // | <p>This is some text</p>
+ // | </div>
+ // | </div>
+
+ // duration: Integer
+ // Amount of time (in ms) it takes to slide panes
+ duration: manager.defaultDuration,
+
+ // buttonWidget: [const] String
+ // The name of the widget used to display the title of each pane
+ buttonWidget: AccordionButton,
+
+/*=====
+ // _verticalSpace: Number
+ // Pixels of space available for the open pane
+ // (my content box size minus the cumulative size of all the title bars)
+ _verticalSpace: 0,
+=====*/
+ baseClass: "dijitAccordionContainer",
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ this.domNode.style.overflow = "hidden"; // TODO: put this in dijit.css
+ this.domNode.setAttribute("role", "tablist"); // TODO: put this in template
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ this.inherited(arguments);
+ if(this.selectedChildWidget){
+ this.selectedChildWidget._wrapperWidget.set("selected", true);
+ }
+ },
+
+ layout: function(){
+ // Implement _LayoutWidget.layout() virtual method.
+ // Set the height of the open pane based on what room remains.
+
+ var openPane = this.selectedChildWidget;
+
+ if(!openPane){ return;}
+
+ // space taken up by title, plus wrapper div (with border/margin) for open pane
+ var wrapperDomNode = openPane._wrapperWidget.domNode,
+ wrapperDomNodeMargin = domGeometry.getMarginExtents(wrapperDomNode),
+ wrapperDomNodePadBorder = domGeometry.getPadBorderExtents(wrapperDomNode),
+ wrapperContainerNode = openPane._wrapperWidget.containerNode,
+ wrapperContainerNodeMargin = domGeometry.getMarginExtents(wrapperContainerNode),
+ wrapperContainerNodePadBorder = domGeometry.getPadBorderExtents(wrapperContainerNode),
+ mySize = this._contentBox;
+
+ // get cumulative height of all the unselected title bars
+ var totalCollapsedHeight = 0;
+ array.forEach(this.getChildren(), function(child){
+ if(child != openPane){
+ // Using domGeometry.getMarginSize() rather than domGeometry.position() since claro has 1px bottom margin
+ // to separate accordion panes. Not sure that works perfectly, it's probably putting a 1px
+ // margin below the bottom pane (even though we don't want one).
+ totalCollapsedHeight += domGeometry.getMarginSize(child._wrapperWidget.domNode).h;
+ }
+ });
+ this._verticalSpace = mySize.h - totalCollapsedHeight - wrapperDomNodeMargin.h
+ - wrapperDomNodePadBorder.h - wrapperContainerNodeMargin.h - wrapperContainerNodePadBorder.h
+ - openPane._buttonWidget.getTitleHeight();
+
+ // Memo size to make displayed child
+ this._containerContentBox = {
+ h: this._verticalSpace,
+ w: this._contentBox.w - wrapperDomNodeMargin.w - wrapperDomNodePadBorder.w
+ - wrapperContainerNodeMargin.w - wrapperContainerNodePadBorder.w
+ };
+
+ if(openPane){
+ openPane.resize(this._containerContentBox);
+ }
+ },
+
+ _setupChild: function(child){
+ // Overrides _LayoutWidget._setupChild().
+ // Put wrapper widget around the child widget, showing title
+
+ child._wrapperWidget = AccordionInnerContainer({
+ contentWidget: child,
+ buttonWidget: this.buttonWidget,
+ id: child.id + "_wrapper",
+ dir: child.dir,
+ lang: child.lang,
+ textDir: child.textDir,
+ parent: this
+ });
+
+ this.inherited(arguments);
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){
+ // Overrides _LayoutWidget.addChild().
+ if(this._started){
+ // Adding a child to a started Accordion is complicated because children have
+ // wrapper widgets. Default code path (calling this.inherited()) would add
+ // the new child inside another child's wrapper.
+
+ // First add in child as a direct child of this AccordionContainer
+ var refNode = this.containerNode;
+ if(insertIndex && typeof insertIndex == "number"){
+ var children = _Widget.prototype.getChildren.call(this); // get wrapper panes
+ if(children && children.length >= insertIndex){
+ refNode = children[insertIndex-1].domNode;
+ insertIndex = "after";
+ }
+ }
+ domConstruct.place(child.domNode, refNode, insertIndex);
+
+ if(!child._started){
+ child.startup();
+ }
+
+ // Then stick the wrapper widget around the child widget
+ this._setupChild(child);
+
+ // Code below copied from StackContainer
+ topic.publish(this.id+"-addChild", child, insertIndex); // publish
+ this.layout();
+ if(!this.selectedChildWidget){
+ this.selectChild(child);
+ }
+ }else{
+ // We haven't been started yet so just add in the child widget directly,
+ // and the wrapper will be created on startup()
+ this.inherited(arguments);
+ }
+ },
+
+ removeChild: function(child){
+ // Overrides _LayoutWidget.removeChild().
+
+ // Destroy wrapper widget first, before StackContainer.getChildren() call.
+ // Replace wrapper widget with true child widget (ContentPane etc.).
+ // This step only happens if the AccordionContainer has been started; otherwise there's no wrapper.
+ if(child._wrapperWidget){
+ domConstruct.place(child.domNode, child._wrapperWidget.domNode, "after");
+ child._wrapperWidget.destroy();
+ delete child._wrapperWidget;
+ }
+
+ domClass.remove(child.domNode, "dijitHidden");
+
+ this.inherited(arguments);
+ },
+
+ getChildren: function(){
+ // Overrides _Container.getChildren() to return content panes rather than internal AccordionInnerContainer panes
+ return array.map(this.inherited(arguments), function(child){
+ return child.declaredClass == "dijit.layout._AccordionInnerContainer" ? child.contentWidget : child;
+ }, this);
+ },
+
+ destroy: function(){
+ if(this._animation){
+ this._animation.stop();
+ }
+ array.forEach(this.getChildren(), function(child){
+ // If AccordionContainer has been started, then each child has a wrapper widget which
+ // also needs to be destroyed.
+ if(child._wrapperWidget){
+ child._wrapperWidget.destroy();
+ }else{
+ child.destroyRecursive();
+ }
+ });
+ this.inherited(arguments);
+ },
+
+ _showChild: function(child){
+ // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode
+ child._wrapperWidget.containerNode.style.display="block";
+ return this.inherited(arguments);
+ },
+
+ _hideChild: function(child){
+ // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode
+ child._wrapperWidget.containerNode.style.display="none";
+ this.inherited(arguments);
+ },
+
+ _transition: function(/*dijit/_WidgetBase?*/ newWidget, /*dijit/_WidgetBase?*/ oldWidget, /*Boolean*/ animate){
+ // Overrides StackContainer._transition() to provide sliding of title bars etc.
+
+ if(has("ie") < 8){
+ // workaround animation bugs by not animating; not worth supporting animation for IE6 & 7
+ animate = false;
+ }
+
+ if(this._animation){
+ // there's an in-progress animation. speedily end it so we can do the newly requested one
+ this._animation.stop(true);
+ delete this._animation;
+ }
+
+ var self = this;
+
+ if(newWidget){
+ newWidget._wrapperWidget.set("selected", true);
+
+ var d = this._showChild(newWidget); // prepare widget to be slid in
+
+ // Size the new widget, in case this is the first time it's being shown,
+ // or I have been resized since the last time it was shown.
+ // Note that page must be visible for resizing to work.
+ if(this.doLayout && newWidget.resize){
+ newWidget.resize(this._containerContentBox);
+ }
+ }
+
+ if(oldWidget){
+ oldWidget._wrapperWidget.set("selected", false);
+ if(!animate){
+ this._hideChild(oldWidget);
+ }
+ }
+
+ if(animate){
+ var newContents = newWidget._wrapperWidget.containerNode,
+ oldContents = oldWidget._wrapperWidget.containerNode;
+
+ // During the animation we will be showing two dijitAccordionChildWrapper nodes at once,
+ // which on claro takes up 4px extra space (compared to stable AccordionContainer).
+ // Have to compensate for that by immediately shrinking the pane being closed.
+ var wrapperContainerNode = newWidget._wrapperWidget.containerNode,
+ wrapperContainerNodeMargin = domGeometry.getMarginExtents(wrapperContainerNode),
+ wrapperContainerNodePadBorder = domGeometry.getPadBorderExtents(wrapperContainerNode),
+ animationHeightOverhead = wrapperContainerNodeMargin.h + wrapperContainerNodePadBorder.h;
+
+ oldContents.style.height = (self._verticalSpace - animationHeightOverhead) + "px";
+
+ this._animation = new fx.Animation({
+ node: newContents,
+ duration: this.duration,
+ curve: [1, this._verticalSpace - animationHeightOverhead - 1],
+ onAnimate: function(value){
+ value = Math.floor(value); // avoid fractional values
+ newContents.style.height = value + "px";
+ oldContents.style.height = (self._verticalSpace - animationHeightOverhead - value) + "px";
+ },
+ onEnd: function(){
+ delete self._animation;
+ newContents.style.height = "auto";
+ oldWidget._wrapperWidget.containerNode.style.display = "none";
+ oldContents.style.height = "auto";
+ self._hideChild(oldWidget);
+ }
+ });
+ this._animation.onStop = this._animation.onEnd;
+ this._animation.play();
+ }
+
+ return d; // If child has an href, promise that fires when the widget has finished loading
+ },
+
+ // note: we are treating the container as controller here
+ _onKeyPress: function(/*Event*/ e, /*dijit/_WidgetBase*/ fromTitle){
+ // summary:
+ // Handle keypress events
+ // description:
+ // This is called from a handler on AccordionContainer.domNode
+ // (setup in StackContainer), and is also called directly from
+ // the click handler for accordion labels
+ if(this.disabled || e.altKey || !(fromTitle || e.ctrlKey)){
+ return;
+ }
+ var c = e.charOrCode;
+ if((fromTitle && (c == keys.LEFT_ARROW || c == keys.UP_ARROW)) ||
+ (e.ctrlKey && c == keys.PAGE_UP)){
+ this._adjacent(false)._buttonWidget._onTitleClick();
+ event.stop(e);
+ }else if((fromTitle && (c == keys.RIGHT_ARROW || c == keys.DOWN_ARROW)) ||
+ (e.ctrlKey && (c == keys.PAGE_DOWN || c == keys.TAB))){
+ this._adjacent(true)._buttonWidget._onTitleClick();
+ event.stop(e);
+ }
+ }
+ });
+
+ // Back compat w/1.6, remove for 2.0
+ if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/layout/AccordionPane"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+ }
+
+ // For monkey patching
+ AccordionContainer._InnerContainer = AccordionInnerContainer;
+ AccordionContainer._Button = AccordionButton;
+
+ return AccordionContainer;
+});
diff --git a/lib/dijit/layout/AccordionPane.js.uncompressed.js b/lib/dijit/layout/AccordionPane.js.uncompressed.js
new file mode 100644
index 000000000..957f96daf
--- /dev/null
+++ b/lib/dijit/layout/AccordionPane.js.uncompressed.js
@@ -0,0 +1,25 @@
+define("dijit/layout/AccordionPane", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "./ContentPane"
+], function(declare, kernel, ContentPane){
+
+ // module:
+ // dijit/layout/AccordionPane
+
+ return declare("dijit.layout.AccordionPane", ContentPane, {
+ // summary:
+ // Deprecated widget. Use `dijit/layout/ContentPane` instead.
+ // tags:
+ // deprecated
+
+ constructor: function(){
+ kernel.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead", "", "2.0");
+ },
+
+ onSelected: function(){
+ // summary:
+ // called when this pane is selected
+ }
+ });
+});
diff --git a/lib/dijit/layout/BorderContainer.js b/lib/dijit/layout/BorderContainer.js
index db41c9cb6..a226aed02 100644
--- a/lib/dijit/layout/BorderContainer.js
+++ b/lib/dijit/layout/BorderContainer.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/BorderContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","dojo/touch","dojo/_base/window","../_WidgetBase","../_Widget","../_TemplatedMixin","./_LayoutWidget","./utils"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,on,_b,_c,_d,_e,_f,_10,_11){var _12=_3("dijit.layout._Splitter",[_e,_f],{live:true,templateString:"<div class=\"dijitSplitter\" data-dojo-attach-event=\"onkeypress:_onKeyPress,press:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse\" tabIndex=\"0\" role=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",constructor:function(){this._handlers=[];},postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);this._factor=/top|left/.test(this.region)?1:-1;this._cookieName=this.container.id+"_"+this.region;},buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));if(this.container.persist){var _13=_2(this._cookieName);if(_13){this.child.domNode.style[this.horizontal?"height":"width"]=_13;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_14=_6.getMarginBox(this.child.domNode)[dim],_15=_1.filter(this.container.getChildren(),function(_16){return _16.region=="center";})[0],_17=_6.getMarginBox(_15.domNode)[dim];return Math.min(this.child.maxSize,_14+_17);},_startDrag:function(e){if(!this.cover){this.cover=_c.doc.createElement("div");_4.add(this.cover,"dijitSplitterCover");_5.place(this.cover,this.child.domNode,"after");}_4.add(this.cover,"dijitSplitterCoverActive");if(this.fake){_5.destroy(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");_4.add(this.domNode,"dijitSplitterShadow");_5.place(this.fake,this.domNode,"after");}_4.add(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){_4.remove(this.fake,"dijitSplitterHover dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _18=this._factor,_19=this.horizontal,_1a=_19?"pageY":"pageX",_1b=e[_1a],_1c=this.domNode.style,dim=_19?"h":"w",_1d=_6.getMarginBox(this.child.domNode)[dim],max=this._computeMaxSize(),min=this.child.minSize||20,_1e=this.region,_1f=_1e=="top"||_1e=="bottom"?"top":"left",_20=parseInt(_1c[_1f],10),_21=this._resize,_22=_a.hitch(this.container,"_layoutChildren",this.child.id),de=_c.doc;this._handlers=this._handlers.concat([on(de,_b.move,this._drag=function(e,_23){var _24=e[_1a]-_1b,_25=_18*_24+_1d,_26=Math.max(Math.min(_25,max),min);if(_21||_23){_22(_26);}_1c[_1f]=_24+_20+_18*(_26-_25)+"px";}),on(de,"dragstart",_8.stop),on(_c.body(),"selectstart",_8.stop),on(de,_b.release,_a.hitch(this,"_stopDrag"))]);_8.stop(e);},_onMouse:function(e){var o=(e.type=="mouseover"||e.type=="mouseenter");_4.toggle(this.domNode,"dijitSplitterHover",o);_4.toggle(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);},_stopDrag:function(e){try{if(this.cover){_4.remove(this.cover,"dijitSplitterCoverActive");}if(this.fake){_5.destroy(this.fake);}_4.remove(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active dijitSplitterShadow");this._drag(e);this._drag(e,true);}finally{this._cleanupHandlers();delete this._drag;}if(this.container.persist){_2(this._cookieName,this.child.domNode.style[this.horizontal?"height":"width"],{expires:365});}},_cleanupHandlers:function(){var h;while(h=this._handlers.pop()){h.remove();}},_onKeyPress:function(e){this._resize=true;var _27=this.horizontal;var _28=1;switch(e.charOrCode){case _27?_9.UP_ARROW:_9.LEFT_ARROW:_28*=-1;case _27?_9.DOWN_ARROW:_9.RIGHT_ARROW:break;default:return;}var _29=_6.getMarginSize(this.child.domNode)[_27?"h":"w"]+this._factor*_28;this.container._layoutChildren(this.child.id,Math.max(Math.min(_29,this._computeMaxSize()),this.child.minSize));_8.stop(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.cover;delete this.fake;this.inherited(arguments);}});var _2a=_3("dijit.layout._Gutter",[_e,_f],{templateString:"<div class=\"dijitGutter\" role=\"presentation\"></div>",postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);},buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});var _2b=_3("dijit.layout.BorderContainer",_10,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:_12,postMixInProperties:function(){if(!this.gutters){this.baseClass+="NoGutter";}this.inherited(arguments);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_2c){var _2d=_2c.region;if(_2d){this.inherited(arguments);_4.add(_2c.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_2d=="leading"){_2d=ltr?"left":"right";}if(_2d=="trailing"){_2d=ltr?"right":"left";}if(_2d!="center"&&(_2c.splitter||this.gutters)&&!_2c._splitterWidget){var _2e=_2c.splitter?this._splitterClass:_2a;if(_a.isString(_2e)){_2e=_a.getObject(_2e);}var _2f=new _2e({id:_2c.id+"_splitter",container:this,child:_2c,region:_2d,live:this.liveSplitters});_2f.isSplitter=true;_2c._splitterWidget=_2f;_5.place(_2f.domNode,_2c.domNode,"after");_2f.startup();}_2c.region=_2d;}},layout:function(){this._layoutChildren();},addChild:function(_30,_31){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_32){var _33=_32.region;var _34=_32._splitterWidget;if(_34){_34.destroy();delete _32._splitterWidget;}this.inherited(arguments);if(this._started){this._layoutChildren();}_4.remove(_32.domNode,this.baseClass+"Pane");_7.set(_32.domNode,{top:"auto",bottom:"auto",left:"auto",right:"auto",position:"static"});_7.set(_32.domNode,_33=="top"||_33=="bottom"?"width":"height","auto");},getChildren:function(){return _1.filter(this.inherited(arguments),function(_35){return !_35.isSplitter;});},getSplitter:function(_36){return _1.filter(this.getChildren(),function(_37){return _37.region==_36;})[0]._splitterWidget;},resize:function(_38,_39){if(!this.cs||!this.pe){var _3a=this.domNode;this.cs=_7.getComputedStyle(_3a);this.pe=_6.getPadExtents(_3a,this.cs);this.pe.r=_7.toPixelValue(_3a,this.cs.paddingRight);this.pe.b=_7.toPixelValue(_3a,this.cs.paddingBottom);_7.set(_3a,"padding","0px");}this.inherited(arguments);},_layoutChildren:function(_3b,_3c){if(!this._borderBox||!this._borderBox.h){return;}var _3d=_1.map(this.getChildren(),function(_3e,idx){return {pane:_3e,weight:[_3e.region=="center"?Infinity:0,_3e.layoutPriority,(this.design=="sidebar"?1:-1)*(/top|bottom/.test(_3e.region)?1:-1),idx]};},this);_3d.sort(function(a,b){var aw=a.weight,bw=b.weight;for(var i=0;i<aw.length;i++){if(aw[i]!=bw[i]){return aw[i]-bw[i];}}return 0;});var _3f=[];_1.forEach(_3d,function(_40){var _41=_40.pane;_3f.push(_41);if(_41._splitterWidget){_3f.push(_41._splitterWidget);}});var dim={l:this.pe.l,t:this.pe.t,w:this._borderBox.w-this.pe.w,h:this._borderBox.h-this.pe.h};_11.layoutChildren(this.domNode,dim,_3f,_3b,_3c);},destroyRecursive:function(){_1.forEach(this.getChildren(),function(_42){var _43=_42._splitterWidget;if(_43){_43.destroy();}delete _42._splitterWidget;});this.inherited(arguments);}});_a.extend(_d,{region:"",layoutPriority:0,splitter:false,minSize:0,maxSize:Infinity});_2b._Splitter=_12;_2b._Gutter=_2a;return _2b;}); \ No newline at end of file
+define("dijit/layout/BorderContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","dojo/touch","../_WidgetBase","../_Widget","../_TemplatedMixin","./_LayoutWidget","./utils"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,on,_b,_c,_d,_e,_f,_10){var _11=_3("dijit.layout._Splitter",[_d,_e],{live:true,templateString:"<div class=\"dijitSplitter\" data-dojo-attach-event=\"onkeypress:_onKeyPress,press:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse\" tabIndex=\"0\" role=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",constructor:function(){this._handlers=[];},postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);this._factor=/top|left/.test(this.region)?1:-1;this._cookieName=this.container.id+"_"+this.region;},buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));if(this.container.persist){var _12=_2(this._cookieName);if(_12){this.child.domNode.style[this.horizontal?"height":"width"]=_12;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_13=_6.getMarginBox(this.child.domNode)[dim],_14=_1.filter(this.container.getChildren(),function(_15){return _15.region=="center";})[0],_16=_6.getMarginBox(_14.domNode)[dim];return Math.min(this.child.maxSize,_13+_16);},_startDrag:function(e){if(!this.cover){this.cover=_5.place("<div class=dijitSplitterCover></div>",this.child.domNode,"after");}_4.add(this.cover,"dijitSplitterCoverActive");if(this.fake){_5.destroy(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");_4.add(this.domNode,"dijitSplitterShadow");_5.place(this.fake,this.domNode,"after");}_4.add(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){_4.remove(this.fake,"dijitSplitterHover dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _17=this._factor,_18=this.horizontal,_19=_18?"pageY":"pageX",_1a=e[_19],_1b=this.domNode.style,dim=_18?"h":"w",_1c=_6.getMarginBox(this.child.domNode)[dim],max=this._computeMaxSize(),min=this.child.minSize||20,_1d=this.region,_1e=_1d=="top"||_1d=="bottom"?"top":"left",_1f=parseInt(_1b[_1e],10),_20=this._resize,_21=_a.hitch(this.container,"_layoutChildren",this.child.id),de=this.ownerDocument;this._handlers=this._handlers.concat([on(de,_b.move,this._drag=function(e,_22){var _23=e[_19]-_1a,_24=_17*_23+_1c,_25=Math.max(Math.min(_24,max),min);if(_20||_22){_21(_25);}_1b[_1e]=_23+_1f+_17*(_25-_24)+"px";}),on(de,"dragstart",_8.stop),on(this.ownerDocumentBody,"selectstart",_8.stop),on(de,_b.release,_a.hitch(this,"_stopDrag"))]);_8.stop(e);},_onMouse:function(e){var o=(e.type=="mouseover"||e.type=="mouseenter");_4.toggle(this.domNode,"dijitSplitterHover",o);_4.toggle(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);},_stopDrag:function(e){try{if(this.cover){_4.remove(this.cover,"dijitSplitterCoverActive");}if(this.fake){_5.destroy(this.fake);}_4.remove(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active dijitSplitterShadow");this._drag(e);this._drag(e,true);}finally{this._cleanupHandlers();delete this._drag;}if(this.container.persist){_2(this._cookieName,this.child.domNode.style[this.horizontal?"height":"width"],{expires:365});}},_cleanupHandlers:function(){var h;while(h=this._handlers.pop()){h.remove();}},_onKeyPress:function(e){this._resize=true;var _26=this.horizontal;var _27=1;switch(e.charOrCode){case _26?_9.UP_ARROW:_9.LEFT_ARROW:_27*=-1;case _26?_9.DOWN_ARROW:_9.RIGHT_ARROW:break;default:return;}var _28=_6.getMarginSize(this.child.domNode)[_26?"h":"w"]+this._factor*_27;this.container._layoutChildren(this.child.id,Math.max(Math.min(_28,this._computeMaxSize()),this.child.minSize));_8.stop(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.cover;delete this.fake;this.inherited(arguments);}});var _29=_3("dijit.layout._Gutter",[_d,_e],{templateString:"<div class=\"dijitGutter\" role=\"presentation\"></div>",postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);},buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});var _2a=_3("dijit.layout.BorderContainer",_f,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:_11,postMixInProperties:function(){if(!this.gutters){this.baseClass+="NoGutter";}this.inherited(arguments);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_2b){var _2c=_2b.region;if(_2c){this.inherited(arguments);_4.add(_2b.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_2c=="leading"){_2c=ltr?"left":"right";}if(_2c=="trailing"){_2c=ltr?"right":"left";}if(_2c!="center"&&(_2b.splitter||this.gutters)&&!_2b._splitterWidget){var _2d=_2b.splitter?this._splitterClass:_29;if(_a.isString(_2d)){_2d=_a.getObject(_2d);}var _2e=new _2d({id:_2b.id+"_splitter",container:this,child:_2b,region:_2c,live:this.liveSplitters});_2e.isSplitter=true;_2b._splitterWidget=_2e;_5.place(_2e.domNode,_2b.domNode,"after");_2e.startup();}_2b.region=_2c;}},layout:function(){this._layoutChildren();},addChild:function(_2f,_30){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_31){var _32=_31.region;var _33=_31._splitterWidget;if(_33){_33.destroy();delete _31._splitterWidget;}this.inherited(arguments);if(this._started){this._layoutChildren();}_4.remove(_31.domNode,this.baseClass+"Pane");_7.set(_31.domNode,{top:"auto",bottom:"auto",left:"auto",right:"auto",position:"static"});_7.set(_31.domNode,_32=="top"||_32=="bottom"?"width":"height","auto");},getChildren:function(){return _1.filter(this.inherited(arguments),function(_34){return !_34.isSplitter;});},getSplitter:function(_35){return _1.filter(this.getChildren(),function(_36){return _36.region==_35;})[0]._splitterWidget;},resize:function(_37,_38){if(!this.cs||!this.pe){var _39=this.domNode;this.cs=_7.getComputedStyle(_39);this.pe=_6.getPadExtents(_39,this.cs);this.pe.r=_7.toPixelValue(_39,this.cs.paddingRight);this.pe.b=_7.toPixelValue(_39,this.cs.paddingBottom);_7.set(_39,"padding","0px");}this.inherited(arguments);},_layoutChildren:function(_3a,_3b){if(!this._borderBox||!this._borderBox.h){return;}var _3c=_1.map(this.getChildren(),function(_3d,idx){return {pane:_3d,weight:[_3d.region=="center"?Infinity:0,_3d.layoutPriority,(this.design=="sidebar"?1:-1)*(/top|bottom/.test(_3d.region)?1:-1),idx]};},this);_3c.sort(function(a,b){var aw=a.weight,bw=b.weight;for(var i=0;i<aw.length;i++){if(aw[i]!=bw[i]){return aw[i]-bw[i];}}return 0;});var _3e=[];_1.forEach(_3c,function(_3f){var _40=_3f.pane;_3e.push(_40);if(_40._splitterWidget){_3e.push(_40._splitterWidget);}});var dim={l:this.pe.l,t:this.pe.t,w:this._borderBox.w-this.pe.w,h:this._borderBox.h-this.pe.h};_10.layoutChildren(this.domNode,dim,_3e,_3a,_3b);},destroyRecursive:function(){_1.forEach(this.getChildren(),function(_41){var _42=_41._splitterWidget;if(_42){_42.destroy();}delete _41._splitterWidget;});this.inherited(arguments);}});_2a.ChildWidgetProperties={region:"",layoutPriority:0,splitter:false,minSize:0,maxSize:Infinity};_a.extend(_c,_2a.ChildWidgetProperties);_2a._Splitter=_11;_2a._Gutter=_29;return _2a;}); \ No newline at end of file
diff --git a/lib/dijit/layout/BorderContainer.js.uncompressed.js b/lib/dijit/layout/BorderContainer.js.uncompressed.js
new file mode 100644
index 000000000..bcb0619a0
--- /dev/null
+++ b/lib/dijit/layout/BorderContainer.js.uncompressed.js
@@ -0,0 +1,547 @@
+define("dijit/layout/BorderContainer", [
+ "dojo/_base/array", // array.filter array.forEach array.map
+ "dojo/cookie", // cookie
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove domClass.toggle
+ "dojo/dom-construct", // domConstruct.destroy domConstruct.place
+ "dojo/dom-geometry", // domGeometry.marginBox
+ "dojo/dom-style", // domStyle.style
+ "dojo/_base/event", // event.stop
+ "dojo/keys",
+ "dojo/_base/lang", // lang.getObject lang.hitch
+ "dojo/on",
+ "dojo/touch",
+ "../_WidgetBase",
+ "../_Widget",
+ "../_TemplatedMixin",
+ "./_LayoutWidget",
+ "./utils" // layoutUtils.layoutChildren
+], function(array, cookie, declare, domClass, domConstruct, domGeometry, domStyle, event, keys, lang, on, touch,
+ _WidgetBase, _Widget, _TemplatedMixin, _LayoutWidget, layoutUtils){
+
+// module:
+// dijit/layout/BorderContainer
+
+var _Splitter = declare("dijit.layout._Splitter", [_Widget, _TemplatedMixin ],
+{
+ // summary:
+ // A draggable spacer between two items in a `dijit/layout/BorderContainer`.
+ // description:
+ // This is instantiated by `dijit/layout/BorderContainer`. Users should not
+ // create it directly.
+ // tags:
+ // private
+
+/*=====
+ // container: [const] dijit/layout/BorderContainer
+ // Pointer to the parent BorderContainer
+ container: null,
+
+ // child: [const] dijit/layout/_LayoutWidget
+ // Pointer to the pane associated with this splitter
+ child: null,
+
+ // region: [const] String
+ // Region of pane associated with this splitter.
+ // "top", "bottom", "left", "right".
+ region: null,
+=====*/
+
+ // live: [const] Boolean
+ // If true, the child's size changes and the child widget is redrawn as you drag the splitter;
+ // otherwise, the size doesn't change until you drop the splitter (by mouse-up)
+ live: true,
+
+ templateString: '<div class="dijitSplitter" data-dojo-attach-event="onkeypress:_onKeyPress,press:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" role="separator"><div class="dijitSplitterThumb"></div></div>',
+
+ constructor: function(){
+ this._handlers = [];
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+
+ this.horizontal = /top|bottom/.test(this.region);
+ this._factor = /top|left/.test(this.region) ? 1 : -1;
+ this._cookieName = this.container.id + "_" + this.region;
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ domClass.add(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
+
+ if(this.container.persist){
+ // restore old size
+ var persistSize = cookie(this._cookieName);
+ if(persistSize){
+ this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize;
+ }
+ }
+ },
+
+ _computeMaxSize: function(){
+ // summary:
+ // Return the maximum size that my corresponding pane can be set to
+
+ var dim = this.horizontal ? 'h' : 'w',
+ childSize = domGeometry.getMarginBox(this.child.domNode)[dim],
+ center = array.filter(this.container.getChildren(), function(child){ return child.region == "center";})[0],
+ spaceAvailable = domGeometry.getMarginBox(center.domNode)[dim]; // can expand until center is crushed to 0
+
+ return Math.min(this.child.maxSize, childSize + spaceAvailable);
+ },
+
+ _startDrag: function(e){
+ if(!this.cover){
+ this.cover = domConstruct.place("<div class=dijitSplitterCover></div>", this.child.domNode, "after");
+ }
+ domClass.add(this.cover, "dijitSplitterCoverActive");
+
+ // Safeguard in case the stop event was missed. Shouldn't be necessary if we always get the mouse up.
+ if(this.fake){ domConstruct.destroy(this.fake); }
+ if(!(this._resize = this.live)){ //TODO: disable live for IE6?
+ // create fake splitter to display at old position while we drag
+ (this.fake = this.domNode.cloneNode(true)).removeAttribute("id");
+ domClass.add(this.domNode, "dijitSplitterShadow");
+ domConstruct.place(this.fake, this.domNode, "after");
+ }
+ domClass.add(this.domNode, "dijitSplitterActive dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
+ if(this.fake){
+ domClass.remove(this.fake, "dijitSplitterHover dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover");
+ }
+
+ //Performance: load data info local vars for onmousevent function closure
+ var factor = this._factor,
+ isHorizontal = this.horizontal,
+ axis = isHorizontal ? "pageY" : "pageX",
+ pageStart = e[axis],
+ splitterStyle = this.domNode.style,
+ dim = isHorizontal ? 'h' : 'w',
+ childStart = domGeometry.getMarginBox(this.child.domNode)[dim],
+ max = this._computeMaxSize(),
+ min = this.child.minSize || 20,
+ region = this.region,
+ splitterAttr = region == "top" || region == "bottom" ? "top" : "left", // style attribute of splitter to adjust
+ splitterStart = parseInt(splitterStyle[splitterAttr], 10),
+ resize = this._resize,
+ layoutFunc = lang.hitch(this.container, "_layoutChildren", this.child.id),
+ de = this.ownerDocument;
+
+ this._handlers = this._handlers.concat([
+ on(de, touch.move, this._drag = function(e, forceResize){
+ var delta = e[axis] - pageStart,
+ childSize = factor * delta + childStart,
+ boundChildSize = Math.max(Math.min(childSize, max), min);
+
+ if(resize || forceResize){
+ layoutFunc(boundChildSize);
+ }
+ // TODO: setting style directly (usually) sets content box size, need to set margin box size
+ splitterStyle[splitterAttr] = delta + splitterStart + factor*(boundChildSize - childSize) + "px";
+ }),
+ on(de, "dragstart", event.stop),
+ on(this.ownerDocumentBody, "selectstart", event.stop),
+ on(de, touch.release, lang.hitch(this, "_stopDrag"))
+ ]);
+ event.stop(e);
+ },
+
+ _onMouse: function(e){
+ // summary:
+ // Handler for onmouseenter / onmouseleave events
+ var o = (e.type == "mouseover" || e.type == "mouseenter");
+ domClass.toggle(this.domNode, "dijitSplitterHover", o);
+ domClass.toggle(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover", o);
+ },
+
+ _stopDrag: function(e){
+ try{
+ if(this.cover){
+ domClass.remove(this.cover, "dijitSplitterCoverActive");
+ }
+ if(this.fake){ domConstruct.destroy(this.fake); }
+ domClass.remove(this.domNode, "dijitSplitterActive dijitSplitter"
+ + (this.horizontal ? "H" : "V") + "Active dijitSplitterShadow");
+ this._drag(e); //TODO: redundant with onmousemove?
+ this._drag(e, true);
+ }finally{
+ this._cleanupHandlers();
+ delete this._drag;
+ }
+
+ if(this.container.persist){
+ cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"], {expires:365});
+ }
+ },
+
+ _cleanupHandlers: function(){
+ var h;
+ while(h = this._handlers.pop()){ h.remove(); }
+ },
+
+ _onKeyPress: function(/*Event*/ e){
+ // should we apply typematic to this?
+ this._resize = true;
+ var horizontal = this.horizontal;
+ var tick = 1;
+ switch(e.charOrCode){
+ case horizontal ? keys.UP_ARROW : keys.LEFT_ARROW:
+ tick *= -1;
+// break;
+ case horizontal ? keys.DOWN_ARROW : keys.RIGHT_ARROW:
+ break;
+ default:
+// this.inherited(arguments);
+ return;
+ }
+ var childSize = domGeometry.getMarginSize(this.child.domNode)[ horizontal ? 'h' : 'w' ] + this._factor * tick;
+ this.container._layoutChildren(this.child.id, Math.max(Math.min(childSize, this._computeMaxSize()), this.child.minSize));
+ event.stop(e);
+ },
+
+ destroy: function(){
+ this._cleanupHandlers();
+ delete this.child;
+ delete this.container;
+ delete this.cover;
+ delete this.fake;
+ this.inherited(arguments);
+ }
+});
+
+var _Gutter = declare("dijit.layout._Gutter", [_Widget, _TemplatedMixin],
+{
+ // summary:
+ // Just a spacer div to separate side pane from center pane.
+ // Basically a trick to lookup the gutter/splitter width from the theme.
+ // description:
+ // Instantiated by `dijit/layout/BorderContainer`. Users should not
+ // create directly.
+ // tags:
+ // private
+
+ templateString: '<div class="dijitGutter" role="presentation"></div>',
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.horizontal = /top|bottom/.test(this.region);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ domClass.add(this.domNode, "dijitGutter" + (this.horizontal ? "H" : "V"));
+ }
+});
+
+var BorderContainer = declare("dijit.layout.BorderContainer", _LayoutWidget, {
+ // summary:
+ // Provides layout in up to 5 regions, a mandatory center with optional borders along its 4 sides.
+ // description:
+ // A BorderContainer is a box with a specified size, such as style="width: 500px; height: 500px;",
+ // that contains a child widget marked region="center" and optionally children widgets marked
+ // region equal to "top", "bottom", "leading", "trailing", "left" or "right".
+ // Children along the edges will be laid out according to width or height dimensions and may
+ // include optional splitters (splitter="true") to make them resizable by the user. The remaining
+ // space is designated for the center region.
+ //
+ // The outer size must be specified on the BorderContainer node. Width must be specified for the sides
+ // and height for the top and bottom, respectively. No dimensions should be specified on the center;
+ // it will fill the remaining space. Regions named "leading" and "trailing" may be used just like
+ // "left" and "right" except that they will be reversed in right-to-left environments.
+ //
+ // For complex layouts, multiple children can be specified for a single region. In this case, the
+ // layoutPriority flag on the children determines which child is closer to the edge (low layoutPriority)
+ // and which child is closer to the center (high layoutPriority). layoutPriority can also be used
+ // instead of the design attribute to control layout precedence of horizontal vs. vertical panes.
+ //
+ // See `BorderContainer.ChildWidgetProperties` for details on the properties that can be set on
+ // children of a `BorderContainer`.
+ // example:
+ // | <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="design: 'sidebar', gutters: false"
+ // | style="width: 400px; height: 300px;">
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'top'">header text</div>
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'right', splitter: true" style="width: 200px;">table of contents</div>
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region: 'center'">client area</div>
+ // | </div>
+
+ // design: String
+ // Which design is used for the layout:
+ //
+ // - "headline" (default) where the top and bottom extend the full width of the container
+ // - "sidebar" where the left and right sides extend from top to bottom.
+ design: "headline",
+
+ // gutters: [const] Boolean
+ // Give each pane a border and margin.
+ // Margin determined by domNode.paddingLeft.
+ // When false, only resizable panes have a gutter (i.e. draggable splitter) for resizing.
+ gutters: true,
+
+ // liveSplitters: [const] Boolean
+ // Specifies whether splitters resize as you drag (true) or only upon mouseup (false)
+ liveSplitters: true,
+
+ // persist: Boolean
+ // Save splitter positions in a cookie.
+ persist: false,
+
+ baseClass: "dijitBorderContainer",
+
+ // _splitterClass: Function||String
+ // Optional hook to override the default Splitter widget used by BorderContainer
+ _splitterClass: _Splitter,
+
+ postMixInProperties: function(){
+ // change class name to indicate that BorderContainer is being used purely for
+ // layout (like LayoutContainer) rather than for pretty formatting.
+ if(!this.gutters){
+ this.baseClass += "NoGutter";
+ }
+ this.inherited(arguments);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+ array.forEach(this.getChildren(), this._setupChild, this);
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*dijit/_WidgetBase*/ child){
+ // Override _LayoutWidget._setupChild().
+
+ var region = child.region;
+ if(region){
+ this.inherited(arguments);
+
+ domClass.add(child.domNode, this.baseClass+"Pane");
+
+ var ltr = this.isLeftToRight();
+ if(region == "leading"){ region = ltr ? "left" : "right"; }
+ if(region == "trailing"){ region = ltr ? "right" : "left"; }
+
+ // Create draggable splitter for resizing pane,
+ // or alternately if splitter=false but BorderContainer.gutters=true then
+ // insert dummy div just for spacing
+ if(region != "center" && (child.splitter || this.gutters) && !child._splitterWidget){
+ var _Splitter = child.splitter ? this._splitterClass : _Gutter;
+ if(lang.isString(_Splitter)){
+ _Splitter = lang.getObject(_Splitter); // for back-compat, remove in 2.0
+ }
+ var splitter = new _Splitter({
+ id: child.id + "_splitter",
+ container: this,
+ child: child,
+ region: region,
+ live: this.liveSplitters
+ });
+ splitter.isSplitter = true;
+ child._splitterWidget = splitter;
+
+ domConstruct.place(splitter.domNode, child.domNode, "after");
+
+ // Splitters aren't added as Contained children, so we need to call startup explicitly
+ splitter.startup();
+ }
+ child.region = region; // TODO: technically wrong since it overwrites "trailing" with "left" etc.
+ }
+ },
+
+ layout: function(){
+ // Implement _LayoutWidget.layout() virtual method.
+ this._layoutChildren();
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){
+ // Override _LayoutWidget.addChild().
+ this.inherited(arguments);
+ if(this._started){
+ this.layout(); //OPT
+ }
+ },
+
+ removeChild: function(/*dijit/_WidgetBase*/ child){
+ // Override _LayoutWidget.removeChild().
+
+ var region = child.region;
+ var splitter = child._splitterWidget;
+ if(splitter){
+ splitter.destroy();
+ delete child._splitterWidget;
+ }
+ this.inherited(arguments);
+
+ if(this._started){
+ this._layoutChildren();
+ }
+ // Clean up whatever style changes we made to the child pane.
+ // Unclear how height and width should be handled.
+ domClass.remove(child.domNode, this.baseClass+"Pane");
+ domStyle.set(child.domNode, {
+ top: "auto",
+ bottom: "auto",
+ left: "auto",
+ right: "auto",
+ position: "static"
+ });
+ domStyle.set(child.domNode, region == "top" || region == "bottom" ? "width" : "height", "auto");
+ },
+
+ getChildren: function(){
+ // Override _LayoutWidget.getChildren() to only return real children, not the splitters.
+ return array.filter(this.inherited(arguments), function(widget){
+ return !widget.isSplitter;
+ });
+ },
+
+ // TODO: remove in 2.0
+ getSplitter: function(/*String*/region){
+ // summary:
+ // Returns the widget responsible for rendering the splitter associated with region
+ // tags:
+ // deprecated
+ return array.filter(this.getChildren(), function(child){
+ return child.region == region;
+ })[0]._splitterWidget;
+ },
+
+ resize: function(newSize, currentSize){
+ // Overrides _LayoutWidget.resize().
+
+ // resetting potential padding to 0px to provide support for 100% width/height + padding
+ // TODO: this hack doesn't respect the box model and is a temporary fix
+ if(!this.cs || !this.pe){
+ var node = this.domNode;
+ this.cs = domStyle.getComputedStyle(node);
+ this.pe = domGeometry.getPadExtents(node, this.cs);
+ this.pe.r = domStyle.toPixelValue(node, this.cs.paddingRight);
+ this.pe.b = domStyle.toPixelValue(node, this.cs.paddingBottom);
+
+ domStyle.set(node, "padding", "0px");
+ }
+
+ this.inherited(arguments);
+ },
+
+ _layoutChildren: function(/*String?*/ changedChildId, /*Number?*/ changedChildSize){
+ // summary:
+ // This is the main routine for setting size/position of each child.
+ // description:
+ // With no arguments, measures the height of top/bottom panes, the width
+ // of left/right panes, and then sizes all panes accordingly.
+ //
+ // With changedRegion specified (as "left", "top", "bottom", or "right"),
+ // it changes that region's width/height to changedRegionSize and
+ // then resizes other regions that were affected.
+ // changedChildId:
+ // Id of the child which should be resized because splitter was dragged.
+ // changedChildSize:
+ // The new width/height (in pixels) to make specified child
+
+ if(!this._borderBox || !this._borderBox.h){
+ // We are currently hidden, or we haven't been sized by our parent yet.
+ // Abort. Someone will resize us later.
+ return;
+ }
+
+ // Generate list of wrappers of my children in the order that I want layoutChildren()
+ // to process them (i.e. from the outside to the inside)
+ var wrappers = array.map(this.getChildren(), function(child, idx){
+ return {
+ pane: child,
+ weight: [
+ child.region == "center" ? Infinity : 0,
+ child.layoutPriority,
+ (this.design == "sidebar" ? 1 : -1) * (/top|bottom/.test(child.region) ? 1 : -1),
+ idx
+ ]
+ };
+ }, this);
+ wrappers.sort(function(a, b){
+ var aw = a.weight, bw = b.weight;
+ for(var i=0; i<aw.length; i++){
+ if(aw[i] != bw[i]){
+ return aw[i] - bw[i];
+ }
+ }
+ return 0;
+ });
+
+ // Make new list, combining the externally specified children with splitters and gutters
+ var childrenAndSplitters = [];
+ array.forEach(wrappers, function(wrapper){
+ var pane = wrapper.pane;
+ childrenAndSplitters.push(pane);
+ if(pane._splitterWidget){
+ childrenAndSplitters.push(pane._splitterWidget);
+ }
+ });
+
+ // Compute the box in which to lay out my children
+ var dim = {
+ l: this.pe.l,
+ t: this.pe.t,
+ w: this._borderBox.w - this.pe.w,
+ h: this._borderBox.h - this.pe.h
+ };
+
+ // Layout the children, possibly changing size due to a splitter drag
+ layoutUtils.layoutChildren(this.domNode, dim, childrenAndSplitters,
+ changedChildId, changedChildSize);
+ },
+
+ destroyRecursive: function(){
+ // Destroy splitters first, while getChildren() still works
+ array.forEach(this.getChildren(), function(child){
+ var splitter = child._splitterWidget;
+ if(splitter){
+ splitter.destroy();
+ }
+ delete child._splitterWidget;
+ });
+
+ // Then destroy the real children, and myself
+ this.inherited(arguments);
+ }
+});
+
+BorderContainer.ChildWidgetProperties = {
+ // summary:
+ // These properties can be specified for the children of a BorderContainer.
+
+ // region: [const] String
+ // Values: "top", "bottom", "leading", "trailing", "left", "right", "center".
+ // See the `dijit/layout/BorderContainer` description for details.
+ region: '',
+
+ // layoutPriority: [const] Number
+ // Children with a higher layoutPriority will be placed closer to the BorderContainer center,
+ // between children with a lower layoutPriority.
+ layoutPriority: 0,
+
+ // splitter: [const] Boolean
+ // Parameter for children where region != "center".
+ // If true, enables user to resize the widget by putting a draggable splitter between
+ // this widget and the region=center widget.
+ splitter: false,
+
+ // minSize: [const] Number
+ // Specifies a minimum size (in pixels) for this widget when resized by a splitter.
+ minSize: 0,
+
+ // maxSize: [const] Number
+ // Specifies a maximum size (in pixels) for this widget when resized by a splitter.
+ maxSize: Infinity
+};
+
+// Since any widget can be specified as a LayoutContainer child, mix it
+// into the base widget class. (This is a hack, but it's effective.)
+// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer.
+lang.extend(_WidgetBase, /*===== {} || =====*/ BorderContainer.ChildWidgetProperties);
+
+// For monkey patching
+BorderContainer._Splitter = _Splitter;
+BorderContainer._Gutter = _Gutter;
+
+return BorderContainer;
+});
diff --git a/lib/dijit/layout/ContentPane.js b/lib/dijit/layout/ContentPane.js
index 1e2a2036b..a5a58c5d2 100644
--- a/lib/dijit/layout/ContentPane.js
+++ b/lib/dijit/layout/ContentPane.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/ContentPane",["dojo/_base/kernel","dojo/_base/lang","../_Widget","./_ContentPaneResizeMixin","dojo/string","dojo/html","dojo/i18n!../nls/loading","dojo/_base/array","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-attr","dojo/_base/window","dojo/_base/xhr","dojo/i18n"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f){return _9("dijit.layout.ContentPane",[_3,_4],{href:"",content:"",extractContent:false,parseOnLoad:true,parserScope:_1._scopeName,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",ioArgs:{},onLoadDeferred:null,_setTitleAttr:null,stopParser:true,template:false,create:function(_10,_11){if((!_10||!_10.template)&&_11&&!("href" in _10)&&!("content" in _10)){var df=_d.doc.createDocumentFragment();_11=_b.byId(_11);while(_11.firstChild){df.appendChild(_11.firstChild);}_10=_2.delegate(_10,{content:df});}this.inherited(arguments,[_10,_11]);},postMixInProperties:function(){this.inherited(arguments);var _12=_f.getLocalization("dijit","loading",this.lang);this.loadingMessage=_5.substitute(this.loadingMessage,_12);this.errorMessage=_5.substitute(this.errorMessage,_12);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!_c.get(this.domNode,"role")){this.domNode.setAttribute("role","group");}},startup:function(){this.inherited(arguments);if(this._contentSetter){_8.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&_2.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},setHref:function(_13){_1.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",_13);},_setHrefAttr:function(_14){this.cancel();this.onLoadDeferred=new _a(_2.hitch(this,"cancel"));this.onLoadDeferred.addCallback(_2.hitch(this,"onLoad"));this._set("href",_14);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(_15){_1.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",_15);},_setContentAttr:function(_16){this._set("href","");this.cancel();this.onLoadDeferred=new _a(_2.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.addCallback(_2.hitch(this,"onLoad"));}this._setContent(_16||"");this._isDownloaded=false;return this.onLoadDeferred;},_getContentAttr:function(){return this.containerNode.innerHTML;},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;this.onLoadDeferred=null;},uninitialize:function(){if(this._beingDestroyed){this.cancel();}this.inherited(arguments);},destroyRecursive:function(_17){if(this._beingDestroyed){return;}this.inherited(arguments);},_onShow:function(){this.inherited(arguments);if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){return this.refresh();}}},refresh:function(){this.cancel();this.onLoadDeferred=new _a(_2.hitch(this,"cancel"));this.onLoadDeferred.addCallback(_2.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var _18=this;var _19={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(_2.isObject(this.ioArgs)){_2.mixin(_19,this.ioArgs);}var _1a=(this._xhrDfd=(this.ioMethod||_e.get)(_19));_1a.addCallback(function(_1b){try{_18._isDownloaded=true;_18._setContent(_1b,false);_18.onDownloadEnd();}catch(err){_18._onError("Content",err);}delete _18._xhrDfd;return _1b;});_1a.addErrback(function(err){if(!_1a.canceled){_18._onError("Download",err);}delete _18._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(_1c){this._set("isLoaded",true);try{this.onLoadDeferred.callback(_1c);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this._set("isLoaded",false);try{this.onUnload();}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message);}},destroyDescendants:function(_1d){if(this.isLoaded){this._onUnloadHandler();}var _1e=this._contentSetter;_8.forEach(this.getChildren(),function(_1f){if(_1f.destroyRecursive){_1f.destroyRecursive(_1d);}});if(_1e){_8.forEach(_1e.parseResults,function(_20){if(_20.destroyRecursive&&_20.domNode&&_20.domNode.parentNode==_d.body()){_20.destroyRecursive(_1d);}});delete _1e.parseResults;}if(!_1d){_6._emptyNode(this.containerNode);}delete this._singleChild;},_setContent:function(_21,_22){this.destroyDescendants();var _23=this._contentSetter;if(!(_23&&_23 instanceof _6._ContentSetter)){_23=this._contentSetter=new _6._ContentSetter({node:this.containerNode,_onError:_2.hitch(this,this._onError),onContentError:_2.hitch(this,function(e){var _24=this.onContentError(e);try{this.containerNode.innerHTML=_24;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _25=_2.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:!_21.domNode&&this.parseOnLoad,parserScope:this.parserScope,startup:false,dir:this.dir,lang:this.lang,textDir:this.textDir},this._contentSetterParams||{});_23.set((_2.isObject(_21)&&_21.domNode)?_21.domNode:_21,_25);delete this._contentSetterParams;if(this.doLayout){this._checkIfSingleChild();}if(!_22){if(this._started){delete this._started;this.startup();this._scheduleLayout();}this._onLoadHandler(_21);}},_onError:function(_26,err,_27){this.onLoadDeferred.errback(err);var _28=this["on"+_26+"Error"].call(this,err);if(_27){console.error(_27,err);}else{if(_28){this._setContent(_28,true);}}},onLoad:function(){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(){},onDownloadError:function(){return this.errorMessage;},onDownloadEnd:function(){}});}); \ No newline at end of file
+define("dijit/layout/ContentPane",["dojo/_base/kernel","dojo/_base/lang","../_Widget","../_Container","./_ContentPaneResizeMixin","dojo/string","dojo/html","dojo/i18n!../nls/loading","dojo/_base/array","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/_base/xhr","dojo/i18n","dojo/when"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11){return _a("dijit.layout.ContentPane",[_3,_4,_5],{href:"",content:"",extractContent:false,parseOnLoad:true,parserScope:_1._scopeName,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",ioArgs:{},onLoadDeferred:null,_setTitleAttr:null,stopParser:true,template:false,create:function(_12,_13){if((!_12||!_12.template)&&_13&&!("href" in _12)&&!("content" in _12)){_13=_c.byId(_13);var df=_13.ownerDocument.createDocumentFragment();while(_13.firstChild){df.appendChild(_13.firstChild);}_12=_2.delegate(_12,{content:df});}this.inherited(arguments,[_12,_13]);},postMixInProperties:function(){this.inherited(arguments);var _14=_10.getLocalization("dijit","loading",this.lang);this.loadingMessage=_6.substitute(this.loadingMessage,_14);this.errorMessage=_6.substitute(this.errorMessage,_14);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!_d.get(this.domNode,"role")){this.domNode.setAttribute("role","group");}},startup:function(){this.inherited(arguments);if(this._contentSetter){_9.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&_2.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},_startChildren:function(){_9.forEach(this.getChildren(),function(obj){if(!obj._started&&!obj._destroyed&&_2.isFunction(obj.startup)){obj.startup();obj._started=true;}});if(this._contentSetter){_9.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&_2.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},setHref:function(_15){_1.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",_15);},_setHrefAttr:function(_16){this.cancel();this.onLoadDeferred=new _b(_2.hitch(this,"cancel"));this.onLoadDeferred.then(_2.hitch(this,"onLoad"));this._set("href",_16);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(_17){_1.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",_17);},_setContentAttr:function(_18){this._set("href","");this.cancel();this.onLoadDeferred=new _b(_2.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.then(_2.hitch(this,"onLoad"));}this._setContent(_18||"");this._isDownloaded=false;return this.onLoadDeferred;},_getContentAttr:function(){return this.containerNode.innerHTML;},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;this.onLoadDeferred=null;},destroy:function(){this.cancel();this.inherited(arguments);},destroyRecursive:function(_19){if(this._beingDestroyed){return;}this.inherited(arguments);},_onShow:function(){this.inherited(arguments);if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){return this.refresh();}}},refresh:function(){this.cancel();this.onLoadDeferred=new _b(_2.hitch(this,"cancel"));this.onLoadDeferred.then(_2.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var _1a=this;var _1b={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(_2.isObject(this.ioArgs)){_2.mixin(_1b,this.ioArgs);}var _1c=(this._xhrDfd=(this.ioMethod||_f.get)(_1b)),_1d;_1c.then(function(_1e){_1d=_1e;try{_1a._isDownloaded=true;return _1a._setContent(_1e,false);}catch(err){_1a._onError("Content",err);}},function(err){if(!_1c.canceled){_1a._onError("Download",err);}delete _1a._xhrDfd;return err;}).then(function(){_1a.onDownloadEnd();delete _1a._xhrDfd;return _1d;});delete this._hrefChanged;},_onLoadHandler:function(_1f){this._set("isLoaded",true);try{this.onLoadDeferred.resolve(_1f);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this._set("isLoaded",false);try{this.onUnload();}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message);}},destroyDescendants:function(_20){if(this.isLoaded){this._onUnloadHandler();}var _21=this._contentSetter;_9.forEach(this.getChildren(),function(_22){if(_22.destroyRecursive){_22.destroyRecursive(_20);}else{if(_22.destroy){_22.destroy(_20);}}_22._destroyed=true;});if(_21){_9.forEach(_21.parseResults,function(_23){if(!_23._destroyed){if(_23.destroyRecursive){_23.destroyRecursive(_20);}else{if(_23.destroy){_23.destroy(_20);}}_23._destroyed=true;}});delete _21.parseResults;}if(!_20){_e.empty(this.containerNode);}delete this._singleChild;},_setContent:function(_24,_25){this.destroyDescendants();var _26=this._contentSetter;if(!(_26&&_26 instanceof _7._ContentSetter)){_26=this._contentSetter=new _7._ContentSetter({node:this.containerNode,_onError:_2.hitch(this,this._onError),onContentError:_2.hitch(this,function(e){var _27=this.onContentError(e);try{this.containerNode.innerHTML=_27;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _28=_2.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:!_24.domNode&&this.parseOnLoad,parserScope:this.parserScope,startup:false,dir:this.dir,lang:this.lang,textDir:this.textDir},this._contentSetterParams||{});var p=_26.set((_2.isObject(_24)&&_24.domNode)?_24.domNode:_24,_28);var _29=this;return _11(p&&p.then?p:_26.parseDeferred,function(){delete _29._contentSetterParams;if(!_25){if(_29._started){_29._startChildren();_29._scheduleLayout();}_29._onLoadHandler(_24);}});},_onError:function(_2a,err,_2b){this.onLoadDeferred.reject(err);var _2c=this["on"+_2a+"Error"].call(this,err);if(_2b){console.error(_2b,err);}else{if(_2c){this._setContent(_2c,true);}}},onLoad:function(){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(){},onDownloadError:function(){return this.errorMessage;},onDownloadEnd:function(){}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/ContentPane.js.uncompressed.js b/lib/dijit/layout/ContentPane.js.uncompressed.js
new file mode 100644
index 000000000..1b861aa29
--- /dev/null
+++ b/lib/dijit/layout/ContentPane.js.uncompressed.js
@@ -0,0 +1,646 @@
+define("dijit/layout/ContentPane", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.mixin lang.delegate lang.hitch lang.isFunction lang.isObject
+ "../_Widget",
+ "../_Container",
+ "./_ContentPaneResizeMixin",
+ "dojo/string", // string.substitute
+ "dojo/html", // html._ContentSetter
+ "dojo/i18n!../nls/loading",
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred
+ "dojo/dom", // dom.byId
+ "dojo/dom-attr", // domAttr.attr
+ "dojo/dom-construct", // empty()
+ "dojo/_base/xhr", // xhr.get
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/when"
+], function(kernel, lang, _Widget, _Container, _ContentPaneResizeMixin, string, html, nlsLoading,
+ array, declare, Deferred, dom, domAttr, domConstruct, xhr, i18n, when){
+
+// module:
+// dijit/layout/ContentPane
+
+
+return declare("dijit.layout.ContentPane", [_Widget, _Container, _ContentPaneResizeMixin], {
+ // summary:
+ // A widget containing an HTML fragment, specified inline
+ // or by uri. Fragment may include widgets.
+ //
+ // description:
+ // This widget embeds a document fragment in the page, specified
+ // either by uri, javascript generated markup or DOM reference.
+ // Any widgets within this content are instantiated and managed,
+ // but laid out according to the HTML structure. Unlike IFRAME,
+ // ContentPane embeds a document fragment as would be found
+ // inside the BODY tag of a full HTML document. It should not
+ // contain the HTML, HEAD, or BODY tags.
+ // For more advanced functionality with scripts and
+ // stylesheets, see dojox/layout/ContentPane. This widget may be
+ // used stand alone or as a base class for other widgets.
+ // ContentPane is useful as a child of other layout containers
+ // such as BorderContainer or TabContainer, but note that those
+ // widgets can contain any widget as a child.
+ //
+ // example:
+ // Some quick samples:
+ // To change the innerHTML:
+ // | cp.set('content', '<b>new content</b>')`
+ // Or you can send it a NodeList:
+ // | cp.set('content', dojo.query('div [class=selected]', userSelection))
+ // To do an ajax update:
+ // | cp.set('href', url)
+
+ // href: String
+ // The href of the content that displays now.
+ // Set this at construction if you want to load data externally when the
+ // pane is shown. (Set preload=true to load it immediately.)
+ // Changing href after creation doesn't have any effect; Use set('href', ...);
+ href: "",
+
+ // content: String|DomNode|NodeList|dijit/_Widget
+ // The innerHTML of the ContentPane.
+ // Note that the initialization parameter / argument to set("content", ...)
+ // can be a String, DomNode, Nodelist, or _Widget.
+ content: "",
+
+ // extractContent: Boolean
+ // Extract visible content from inside of `<body> .... </body>`.
+ // I.e., strip `<html>` and `<head>` (and it's contents) from the href
+ extractContent: false,
+
+ // parseOnLoad: Boolean
+ // Parse content and create the widgets, if any.
+ parseOnLoad: true,
+
+ // parserScope: String
+ // Flag passed to parser. Root for attribute names to search for. If scopeName is dojo,
+ // will search for data-dojo-type (or dojoType). For backwards compatibility
+ // reasons defaults to dojo._scopeName (which is "dojo" except when
+ // multi-version support is used, when it will be something like dojo16, dojo20, etc.)
+ parserScope: kernel._scopeName,
+
+ // preventCache: Boolean
+ // Prevent caching of data from href's by appending a timestamp to the href.
+ preventCache: false,
+
+ // preload: Boolean
+ // Force load of data on initialization even if pane is hidden.
+ preload: false,
+
+ // refreshOnShow: Boolean
+ // Refresh (re-download) content when pane goes from hidden to shown
+ refreshOnShow: false,
+
+ // loadingMessage: String
+ // Message that shows while downloading
+ loadingMessage: "<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>",
+
+ // errorMessage: String
+ // Message that shows if an error occurs
+ errorMessage: "<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>",
+
+ // isLoaded: [readonly] Boolean
+ // True if the ContentPane has data in it, either specified
+ // during initialization (via href or inline content), or set
+ // via set('content', ...) / set('href', ...)
+ //
+ // False if it doesn't have any content, or if ContentPane is
+ // still in the process of downloading href.
+ isLoaded: false,
+
+ baseClass: "dijitContentPane",
+
+ /*======
+ // ioMethod: dojo/_base/xhr.get|dojo._base/xhr.post
+ // Function that should grab the content specified via href.
+ ioMethod: dojo.xhrGet,
+ ======*/
+
+ // ioArgs: Object
+ // Parameters to pass to xhrGet() request, for example:
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="href: './bar', ioArgs: {timeout: 500}">
+ ioArgs: {},
+
+ // onLoadDeferred: [readonly] dojo.Deferred
+ // This is the `dojo.Deferred` returned by set('href', ...) and refresh().
+ // Calling onLoadDeferred.then() registers your
+ // callback to be called only once, when the prior set('href', ...) call or
+ // the initial href parameter to the constructor finishes loading.
+ //
+ // This is different than an onLoad() handler which gets called any time any href
+ // or content is loaded.
+ onLoadDeferred: null,
+
+ // Cancel _WidgetBase's _setTitleAttr because we don't want the title attribute (used to specify
+ // tab labels) to be copied to ContentPane.domNode... otherwise a tooltip shows up over the
+ // entire pane.
+ _setTitleAttr: null,
+
+ // Flag to parser that I'll parse my contents, so it shouldn't.
+ stopParser: true,
+
+ // template: [private] Boolean
+ // Flag from the parser that this ContentPane is inside a template
+ // so the contents are pre-parsed.
+ // TODO: this declaration can be commented out in 2.0
+ template: false,
+
+ create: function(params, srcNodeRef){
+ // Convert a srcNodeRef argument into a content parameter, so that the original contents are
+ // processed in the same way as contents set via set("content", ...), calling the parser etc.
+ // Avoid modifying original params object since that breaks NodeList instantiation, see #11906.
+ if((!params || !params.template) && srcNodeRef && !("href" in params) && !("content" in params)){
+ srcNodeRef = dom.byId(srcNodeRef);
+ var df = srcNodeRef.ownerDocument.createDocumentFragment();
+ while(srcNodeRef.firstChild){
+ df.appendChild(srcNodeRef.firstChild);
+ }
+ params = lang.delegate(params, {content: df});
+ }
+ this.inherited(arguments, [params, srcNodeRef]);
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ var messages = i18n.getLocalization("dijit", "loading", this.lang);
+ this.loadingMessage = string.substitute(this.loadingMessage, messages);
+ this.errorMessage = string.substitute(this.errorMessage, messages);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // Since we have no template we need to set this.containerNode ourselves, to make getChildren() work.
+ // For subclasses of ContentPane that do have a template, does nothing.
+ if(!this.containerNode){
+ this.containerNode = this.domNode;
+ }
+
+ // remove the title attribute so it doesn't show up when hovering
+ // over a node (TODO: remove in 2.0, no longer needed after #11490)
+ this.domNode.title = "";
+
+ if(!domAttr.get(this.domNode,"role")){
+ this.domNode.setAttribute("role", "group");
+ }
+ },
+
+ startup: function(){
+ // summary:
+ // Call startup() on all children including non _Widget ones like dojo/dnd/Source objects
+
+ // This starts all the widgets
+ this.inherited(arguments);
+
+ // And this catches stuff like dojo/dnd/Source
+ if(this._contentSetter){
+ array.forEach(this._contentSetter.parseResults, function(obj){
+ if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){
+ obj.startup();
+ obj._started = true;
+ }
+ }, this);
+ }
+ },
+
+ _startChildren: function(){
+ // summary:
+ // Called when content is loaded. Calls startup on each child widget. Similar to ContentPane.startup()
+ // itself, but avoids marking the ContentPane itself as "restarted" (see #15581).
+
+ // This starts all the widgets
+ array.forEach(this.getChildren(), function(obj){
+ if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){
+ obj.startup();
+ obj._started = true;
+ }
+ });
+
+ // And this catches stuff like dojo/dnd/Source
+ if(this._contentSetter){
+ array.forEach(this._contentSetter.parseResults, function(obj){
+ if(!obj._started && !obj._destroyed && lang.isFunction(obj.startup)){
+ obj.startup();
+ obj._started = true;
+ }
+ }, this);
+ }
+ },
+
+ setHref: function(/*String|Uri*/ href){
+ // summary:
+ // Deprecated. Use set('href', ...) instead.
+ kernel.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.", "", "2.0");
+ return this.set("href", href);
+ },
+ _setHrefAttr: function(/*String|Uri*/ href){
+ // summary:
+ // Hook so set("href", ...) works.
+ // description:
+ // Reset the (external defined) content of this pane and replace with new url
+ // Note: It delays the download until widget is shown if preload is false.
+ // href:
+ // url to the page you want to get, must be within the same domain as your mainpage
+
+ // Cancel any in-flight requests (a set('href', ...) will cancel any in-flight set('href', ...))
+ this.cancel();
+
+ this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel"));
+ this.onLoadDeferred.then(lang.hitch(this, "onLoad"));
+
+ this._set("href", href);
+
+ // _setHrefAttr() is called during creation and by the user, after creation.
+ // Assuming preload == false, only in the second case do we actually load the URL;
+ // otherwise it's done in startup(), and only if this widget is shown.
+ if(this.preload || (this._created && this._isShown())){
+ this._load();
+ }else{
+ // Set flag to indicate that href needs to be loaded the next time the
+ // ContentPane is made visible
+ this._hrefChanged = true;
+ }
+
+ return this.onLoadDeferred; // Deferred
+ },
+
+ setContent: function(/*String|DomNode|Nodelist*/data){
+ // summary:
+ // Deprecated. Use set('content', ...) instead.
+ kernel.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.", "", "2.0");
+ this.set("content", data);
+ },
+ _setContentAttr: function(/*String|DomNode|Nodelist*/data){
+ // summary:
+ // Hook to make set("content", ...) work.
+ // Replaces old content with data content, include style classes from old content
+ // data:
+ // the new Content may be String, DomNode or NodeList
+ //
+ // if data is a NodeList (or an array of nodes) nodes are copied
+ // so you can import nodes from another document implicitly
+
+ // clear href so we can't run refresh and clear content
+ // refresh should only work if we downloaded the content
+ this._set("href", "");
+
+ // Cancel any in-flight requests (a set('content', ...) will cancel any in-flight set('href', ...))
+ this.cancel();
+
+ // Even though user is just setting content directly, still need to define an onLoadDeferred
+ // because the _onLoadHandler() handler is still getting called from setContent()
+ this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel"));
+ if(this._created){
+ // For back-compat reasons, call onLoad() for set('content', ...)
+ // calls but not for content specified in srcNodeRef (ie: <div data-dojo-type=ContentPane>...</div>)
+ // or as initialization parameter (ie: new ContentPane({content: ...})
+ this.onLoadDeferred.then(lang.hitch(this, "onLoad"));
+ }
+
+ this._setContent(data || "");
+
+ this._isDownloaded = false; // mark that content is from a set('content') not a set('href')
+
+ return this.onLoadDeferred; // Deferred
+ },
+ _getContentAttr: function(){
+ // summary:
+ // Hook to make get("content") work
+ return this.containerNode.innerHTML;
+ },
+
+ cancel: function(){
+ // summary:
+ // Cancels an in-flight download of content
+ if(this._xhrDfd && (this._xhrDfd.fired == -1)){
+ this._xhrDfd.cancel();
+ }
+ delete this._xhrDfd; // garbage collect
+
+ this.onLoadDeferred = null;
+ },
+
+ destroy: function(){
+ this.cancel();
+ this.inherited(arguments);
+ },
+
+ destroyRecursive: function(/*Boolean*/ preserveDom){
+ // summary:
+ // Destroy the ContentPane and its contents
+
+ // if we have multiple controllers destroying us, bail after the first
+ if(this._beingDestroyed){
+ return;
+ }
+ this.inherited(arguments);
+ },
+
+ _onShow: function(){
+ // summary:
+ // Called when the ContentPane is made visible
+ // description:
+ // For a plain ContentPane, this is called on initialization, from startup().
+ // If the ContentPane is a hidden pane of a TabContainer etc., then it's
+ // called whenever the pane is made visible.
+ //
+ // Does necessary processing, including href download and layout/resize of
+ // child widget(s)
+
+ this.inherited(arguments);
+
+ if(this.href){
+ if(!this._xhrDfd && // if there's an href that isn't already being loaded
+ (!this.isLoaded || this._hrefChanged || this.refreshOnShow)
+ ){
+ return this.refresh(); // If child has an href, promise that fires when the load is complete
+ }
+ }
+ },
+
+ refresh: function(){
+ // summary:
+ // [Re]download contents of href and display
+ // description:
+ // 1. cancels any currently in-flight requests
+ // 2. posts "loading..." message
+ // 3. sends XHR to download new data
+
+ // Cancel possible prior in-flight request
+ this.cancel();
+
+ this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel"));
+ this.onLoadDeferred.then(lang.hitch(this, "onLoad"));
+ this._load();
+ return this.onLoadDeferred; // If child has an href, promise that fires when refresh is complete
+ },
+
+ _load: function(){
+ // summary:
+ // Load/reload the href specified in this.href
+
+ // display loading message
+ this._setContent(this.onDownloadStart(), true);
+
+ var self = this;
+ var getArgs = {
+ preventCache: (this.preventCache || this.refreshOnShow),
+ url: this.href,
+ handleAs: "text"
+ };
+ if(lang.isObject(this.ioArgs)){
+ lang.mixin(getArgs, this.ioArgs);
+ }
+
+ var hand = (this._xhrDfd = (this.ioMethod || xhr.get)(getArgs)),
+ returnedHtml;
+
+ hand.then(
+ function(html){
+ returnedHtml = html;
+ try{
+ self._isDownloaded = true;
+ return self._setContent(html, false);
+ }catch(err){
+ self._onError('Content', err); // onContentError
+ }
+ },
+ function(err){
+ if(!hand.canceled){
+ // show error message in the pane
+ self._onError('Download', err); // onDownloadError
+ }
+ delete self._xhrDfd;
+ return err;
+ }
+ ).then(function(){
+ self.onDownloadEnd();
+ delete self._xhrDfd;
+ return returnedHtml;
+ });
+
+ // Remove flag saying that a load is needed
+ delete this._hrefChanged;
+ },
+
+ _onLoadHandler: function(data){
+ // summary:
+ // This is called whenever new content is being loaded
+ this._set("isLoaded", true);
+ try{
+ this.onLoadDeferred.resolve(data);
+ }catch(e){
+ console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message);
+ }
+ },
+
+ _onUnloadHandler: function(){
+ // summary:
+ // This is called whenever the content is being unloaded
+ this._set("isLoaded", false);
+ try{
+ this.onUnload();
+ }catch(e){
+ console.error('Error '+this.widgetId+' running custom onUnload code: ' + e.message);
+ }
+ },
+
+ destroyDescendants: function(/*Boolean*/ preserveDom){
+ // summary:
+ // Destroy all the widgets inside the ContentPane and empty containerNode
+
+ // Make sure we call onUnload (but only when the ContentPane has real content)
+ if(this.isLoaded){
+ this._onUnloadHandler();
+ }
+
+ // Even if this.isLoaded == false there might still be a "Loading..." message
+ // to erase, so continue...
+
+ // For historical reasons we need to delete all widgets under this.containerNode,
+ // even ones that the user has created manually.
+ var setter = this._contentSetter;
+ array.forEach(this.getChildren(), function(widget){
+ if(widget.destroyRecursive){
+ // All widgets will hit this branch
+ widget.destroyRecursive(preserveDom);
+ }else if(widget.destroy){
+ // Things like dojo/dnd/Source have destroy(), not destroyRecursive()
+ widget.destroy(preserveDom);
+ }
+ widget._destroyed = true;
+ });
+ if(setter){
+ // Most of the widgets in setter.parseResults have already been destroyed, but
+ // things like Menu that have been moved to <body> haven't yet
+ array.forEach(setter.parseResults, function(widget){
+ if(!widget._destroyed){
+ if(widget.destroyRecursive){
+ // All widgets will hit this branch
+ widget.destroyRecursive(preserveDom);
+ }else if(widget.destroy){
+ // Things like dojo/dnd/Source have destroy(), not destroyRecursive()
+ widget.destroy(preserveDom);
+ }
+ widget._destroyed = true;
+ }
+ });
+ delete setter.parseResults;
+ }
+
+ // And then clear away all the DOM nodes
+ if(!preserveDom){
+ domConstruct.empty(this.containerNode);
+ }
+
+ // Delete any state information we have about current contents
+ delete this._singleChild;
+ },
+
+ _setContent: function(/*String|DocumentFragment*/ cont, /*Boolean*/ isFakeContent){
+ // summary:
+ // Insert the content into the container node
+ // returns:
+ // Returns a Deferred promise that is resolved when the content is parsed.
+
+ // first get rid of child widgets
+ this.destroyDescendants();
+
+ // html.set will take care of the rest of the details
+ // we provide an override for the error handling to ensure the widget gets the errors
+ // configure the setter instance with only the relevant widget instance properties
+ // NOTE: unless we hook into attr, or provide property setters for each property,
+ // we need to re-configure the ContentSetter with each use
+ var setter = this._contentSetter;
+ if(! (setter && setter instanceof html._ContentSetter)){
+ setter = this._contentSetter = new html._ContentSetter({
+ node: this.containerNode,
+ _onError: lang.hitch(this, this._onError),
+ onContentError: lang.hitch(this, function(e){
+ // fires if a domfault occurs when we are appending this.errorMessage
+ // like for instance if domNode is a UL and we try append a DIV
+ var errMess = this.onContentError(e);
+ try{
+ this.containerNode.innerHTML = errMess;
+ }catch(e){
+ console.error('Fatal '+this.id+' could not change content due to '+e.message, e);
+ }
+ })/*,
+ _onError */
+ });
+ }
+
+ var setterParams = lang.mixin({
+ cleanContent: this.cleanContent,
+ extractContent: this.extractContent,
+ parseContent: !cont.domNode && this.parseOnLoad,
+ parserScope: this.parserScope,
+ startup: false,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir
+ }, this._contentSetterParams || {});
+
+ var p = setter.set( (lang.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams );
+
+ // dojox/layout/html/_base::_ContentSetter.set() returns a Promise that indicates when everything is completed.
+ // dojo/html::_ContentSetter.set() currently returns the DOMNode, but that will be changed for 2.0.
+ // So, if set() returns a promise then use it, otherwise fallback to waiting on setter.parseDeferred
+ var self = this;
+ return when(p && p.then ? p : setter.parseDeferred, function(){
+ // setter params must be pulled afresh from the ContentPane each time
+ delete self._contentSetterParams;
+
+ if(!isFakeContent){
+ if(self._started){
+ // Startup each top level child widget (and they will start their children, recursively)
+ self._startChildren();
+
+ // Call resize() on each of my child layout widgets,
+ // or resize() on my single child layout widget...
+ // either now (if I'm currently visible) or when I become visible
+ self._scheduleLayout();
+ }
+ self._onLoadHandler(cont);
+ }
+ });
+ },
+
+ _onError: function(type, err, consoleText){
+ this.onLoadDeferred.reject(err);
+
+ // shows user the string that is returned by on[type]Error
+ // override on[type]Error and return your own string to customize
+ var errText = this['on' + type + 'Error'].call(this, err);
+ if(consoleText){
+ console.error(consoleText, err);
+ }else if(errText){// a empty string won't change current content
+ this._setContent(errText, true);
+ }
+ },
+
+ // EVENT's, should be overide-able
+ onLoad: function(/*===== data =====*/){
+ // summary:
+ // Event hook, is called after everything is loaded and widgetified
+ // tags:
+ // callback
+ },
+
+ onUnload: function(){
+ // summary:
+ // Event hook, is called before old content is cleared
+ // tags:
+ // callback
+ },
+
+ onDownloadStart: function(){
+ // summary:
+ // Called before download starts.
+ // description:
+ // The string returned by this function will be the html
+ // that tells the user we are loading something.
+ // Override with your own function if you want to change text.
+ // tags:
+ // extension
+ return this.loadingMessage;
+ },
+
+ onContentError: function(/*Error*/ /*===== error =====*/){
+ // summary:
+ // Called on DOM faults, require faults etc. in content.
+ //
+ // In order to display an error message in the pane, return
+ // the error message from this method, as an HTML string.
+ //
+ // By default (if this method is not overriden), it returns
+ // nothing, so the error message is just printed to the console.
+ // tags:
+ // extension
+ },
+
+ onDownloadError: function(/*Error*/ /*===== error =====*/){
+ // summary:
+ // Called when download error occurs.
+ //
+ // In order to display an error message in the pane, return
+ // the error message from this method, as an HTML string.
+ //
+ // Default behavior (if this method is not overriden) is to display
+ // the error message inside the pane.
+ // tags:
+ // extension
+ return this.errorMessage;
+ },
+
+ onDownloadEnd: function(){
+ // summary:
+ // Called when download is finished.
+ // tags:
+ // callback
+ }
+});
+
+});
diff --git a/lib/dijit/layout/LayoutContainer.js b/lib/dijit/layout/LayoutContainer.js
index bc4f3a618..12ea36775 100644
--- a/lib/dijit/layout/LayoutContainer.js
+++ b/lib/dijit/layout/LayoutContainer.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/LayoutContainer",["dojo/_base/kernel","dojo/_base/lang","dojo/_base/declare","../_WidgetBase","./_LayoutWidget","./utils"],function(_1,_2,_3,_4,_5,_6){_2.extend(_4,{layoutAlign:"none"});return _3("dijit.layout.LayoutContainer",_5,{baseClass:"dijitLayoutContainer",constructor:function(){_1.deprecated("dijit.layout.LayoutContainer is deprecated","use BorderContainer instead",2);},layout:function(){_6.layoutChildren(this.domNode,this._contentBox,this.getChildren());},addChild:function(_7,_8){this.inherited(arguments);if(this._started){_6.layoutChildren(this.domNode,this._contentBox,this.getChildren());}},removeChild:function(_9){this.inherited(arguments);if(this._started){_6.layoutChildren(this.domNode,this._contentBox,this.getChildren());}}});}); \ No newline at end of file
+define("dijit/layout/LayoutContainer",["dojo/_base/kernel","dojo/_base/lang","dojo/_base/declare","../_WidgetBase","./_LayoutWidget","./utils"],function(_1,_2,_3,_4,_5,_6){var _7=_3("dijit.layout.LayoutContainer",_5,{baseClass:"dijitLayoutContainer",constructor:function(){_1.deprecated("dijit.layout.LayoutContainer is deprecated","use BorderContainer instead",2);},layout:function(){_6.layoutChildren(this.domNode,this._contentBox,this.getChildren());},addChild:function(_8,_9){this.inherited(arguments);if(this._started){_6.layoutChildren(this.domNode,this._contentBox,this.getChildren());}},removeChild:function(_a){this.inherited(arguments);if(this._started){_6.layoutChildren(this.domNode,this._contentBox,this.getChildren());}}});_7.ChildWidgetProperties={layoutAlign:"none"};_2.extend(_4,_7.ChildWidgetProperties);return _7;}); \ No newline at end of file
diff --git a/lib/dijit/layout/LayoutContainer.js.uncompressed.js b/lib/dijit/layout/LayoutContainer.js.uncompressed.js
new file mode 100644
index 000000000..ce301d0d4
--- /dev/null
+++ b/lib/dijit/layout/LayoutContainer.js.uncompressed.js
@@ -0,0 +1,91 @@
+define("dijit/layout/LayoutContainer", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang",
+ "dojo/_base/declare", // declare
+ "../_WidgetBase",
+ "./_LayoutWidget",
+ "./utils" // layoutUtils.layoutChildren
+], function(kernel, lang, declare, _WidgetBase, _LayoutWidget, layoutUtils){
+
+// module:
+// dijit/layout/LayoutContainer
+
+var LayoutContainer = declare("dijit.layout.LayoutContainer", _LayoutWidget, {
+ // summary:
+ // Deprecated. Use `dijit/layout/BorderContainer` instead.
+ // description:
+ // Provides Delphi-style panel layout semantics.
+ //
+ // A LayoutContainer is a box with a specified size (like style="width: 500px; height: 500px;"),
+ // that contains children widgets marked with "layoutAlign" of "left", "right", "bottom", "top", and "client".
+ // It takes it's children marked as left/top/bottom/right, and lays them out along the edges of the box,
+ // and then it takes the child marked "client" and puts it into the remaining space in the middle.
+ //
+ // Left/right positioning is similar to CSS's "float: left" and "float: right",
+ // and top/bottom positioning would be similar to "float: top" and "float: bottom", if there were such
+ // CSS.
+ //
+ // Note that there can only be one client element, but there can be multiple left, right, top,
+ // or bottom elements.
+ //
+ // See `LayoutContainer.ChildWidgetProperties` for details on the properties that can be set on
+ // children of a `LayoutContainer`.
+ //
+ // example:
+ // | <style>
+ // | html, body{ height: 100%; width: 100%; }
+ // | </style>
+ // | <div data-dojo-type="dijit/layout/LayoutContainer" style="width: 100%; height: 100%">
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="layoutAlign: 'top'">header text</div>
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="layoutAlign: 'left'" style="width: 200px;">table of contents</div>
+ // | <div data-dojo-type="dijit/layout/ContentPane" data-dojo-props="layoutAlign: 'client'">client area</div>
+ // | </div>
+ //
+ // Lays out each child in the natural order the children occur in.
+ // Basically each child is laid out into the "remaining space", where "remaining space" is initially
+ // the content area of this widget, but is reduced to a smaller rectangle each time a child is added.
+ // tags:
+ // deprecated
+
+ baseClass: "dijitLayoutContainer",
+
+ constructor: function(){
+ kernel.deprecated("dijit.layout.LayoutContainer is deprecated", "use BorderContainer instead", 2.0);
+ },
+
+ layout: function(){
+ layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){
+ this.inherited(arguments);
+ if(this._started){
+ layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ }
+ },
+
+ removeChild: function(/*dijit/_WidgetBase*/ widget){
+ this.inherited(arguments);
+ if(this._started){
+ layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ }
+ }
+});
+
+LayoutContainer.ChildWidgetProperties = {
+ // summary:
+ // This property can be specified for the children of a LayoutContainer.
+
+ // layoutAlign: String
+ // "none", "left", "right", "bottom", "top", and "client".
+ // See the LayoutContainer description for details on this parameter.
+ layoutAlign: 'none'
+};
+
+// Since any widget can be specified as a LayoutContainer child, mix it
+// into the base widget class. (This is a hack, but it's effective.)
+// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer.
+lang.extend(_WidgetBase, /*===== {} || =====*/ LayoutContainer.ChildWidgetProperties);
+
+return LayoutContainer;
+});
diff --git a/lib/dijit/layout/LinkPane.js.uncompressed.js b/lib/dijit/layout/LinkPane.js.uncompressed.js
new file mode 100644
index 000000000..c8a77f7cf
--- /dev/null
+++ b/lib/dijit/layout/LinkPane.js.uncompressed.js
@@ -0,0 +1,44 @@
+define("dijit/layout/LinkPane", [
+ "./ContentPane",
+ "../_TemplatedMixin",
+ "dojo/_base/declare" // declare
+], function(ContentPane, _TemplatedMixin, declare){
+
+ // module:
+ // dijit/layout/LinkPane
+
+
+ return declare("dijit.layout.LinkPane", [ContentPane, _TemplatedMixin], {
+ // summary:
+ // A ContentPane with an href where (when declared in markup)
+ // the title is specified as innerHTML rather than as a title attribute.
+ // description:
+ // LinkPane is just a ContentPane that is declared in markup similarly
+ // to an anchor. The anchor's body (the words between `<a>` and `</a>`)
+ // become the title of the widget (used for TabContainer, AccordionContainer, etc.)
+ // example:
+ // | <a href="foo.html">my title</a>
+
+ // I'm using a template because the user may specify the input as
+ // <a href="foo.html">title</a>, in which case we need to get rid of the
+ // <a> because we don't want a link.
+ templateString: '<div class="dijitLinkPane" data-dojo-attach-point="containerNode"></div>',
+
+ postMixInProperties: function(){
+ // If user has specified node contents, they become the title
+ // (the link must be plain text)
+ if(this.srcNodeRef){
+ this.title += this.srcNodeRef.innerHTML;
+ }
+ this.inherited(arguments);
+ },
+
+ _fillContent: function(){
+ // Overrides _Templated._fillContent().
+
+ // _Templated._fillContent() relocates srcNodeRef innerHTML to templated container node,
+ // but in our case the srcNodeRef innerHTML is the title, so shouldn't be
+ // copied
+ }
+ });
+});
diff --git a/lib/dijit/layout/ScrollingTabController.js b/lib/dijit/layout/ScrollingTabController.js
index aa4bc7626..b199b41ab 100644
--- a/lib/dijit/layout/ScrollingTabController.js
+++ b/lib/dijit/layout/ScrollingTabController.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/layout/templates/ScrollingTabController.html":"<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\"\n\t\t\tdata-dojo-props=\"containerId: '${containerId}', iconClass: 'dijitTabStripMenuIcon',\n\t\t\t\t\tdropDownPosition: ['below-alt', 'above-alt']\"\n\t\t\tdata-dojo-attach-point=\"_menuBtn\" showLabel=\"false\" title=\"\">&#9660;</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideLeftIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_leftBtn\" data-dojo-attach-event=\"onClick: doSlideLeft\">&#9664;</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideRightIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_rightBtn\" data-dojo-attach-event=\"onClick: doSlideRight\">&#9654;</div>\n\t<div class='dijitTabListWrapper' data-dojo-attach-point='tablistWrapper'>\n\t\t<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'\n\t\t\t\tdata-dojo-attach-point='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>","url:dijit/layout/templates/_ScrollingTabControllerButton.html":"<div data-dojo-attach-event=\"onclick:_onClick\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" data-dojo-attach-point=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>"}});define("dijit/layout/ScrollingTabController",["dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/fx","dojo/_base/lang","dojo/query","dojo/_base/sniff","../registry","dojo/text!./templates/ScrollingTabController.html","dojo/text!./templates/_ScrollingTabControllerButton.html","./TabController","./utils","../_WidgetsInTemplateMixin","../Menu","../MenuItem","../form/Button","../_HasDropDown","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,fx,_6,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12){var _13=_2("dijit.layout.ScrollingTabController",[_c,_e],{baseClass:"dijitTabController dijitScrollingTabController",templateString:_a,useMenu:true,useSlider:true,tabStripClass:"",widgetsInTemplate:true,_minScroll:5,_setClassAttr:{node:"containerNode",type:"class"},buildRendering:function(){this.inherited(arguments);var n=this.domNode;this.scrollNode=this.tablistWrapper;this._initButtons();if(!this.tabStripClass){this.tabStripClass="dijitTabContainer"+this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"")+"None";_3.add(n,"tabStrip-disabled");}_3.add(this.tablistWrapper,this.tabStripClass);},onStartup:function(){this.inherited(arguments);_5.set(this.domNode,"visibility","");this._postStartup=true;},onAddChild:function(_14,_15){this.inherited(arguments);_1.forEach(["label","iconClass"],function(_16){this.pane2watches[_14.id].push(this.pane2button[_14.id].watch(_16,_6.hitch(this,function(){if(this._postStartup&&this._dim){this.resize(this._dim);}})));},this);_5.set(this.containerNode,"width",(_5.get(this.containerNode,"width")+200)+"px");},onRemoveChild:function(_17,_18){var _19=this.pane2button[_17.id];if(this._selectedTab===_19.domNode){this._selectedTab=null;}this.inherited(arguments);},_initButtons:function(){this._btnWidth=0;this._buttons=_7("> .tabStripButton",this.domNode).filter(function(btn){if((this.useMenu&&btn==this._menuBtn.domNode)||(this.useSlider&&(btn==this._rightBtn.domNode||btn==this._leftBtn.domNode))){this._btnWidth+=_4.getMarginSize(btn).w;return true;}else{_5.set(btn,"display","none");return false;}},this);},_getTabsWidth:function(){var _1a=this.getChildren();if(_1a.length){var _1b=_1a[this.isLeftToRight()?0:_1a.length-1].domNode,_1c=_1a[this.isLeftToRight()?_1a.length-1:0].domNode;return _1c.offsetLeft+_5.get(_1c,"width")-_1b.offsetLeft;}else{return 0;}},_enableBtn:function(_1d){var _1e=this._getTabsWidth();_1d=_1d||_5.get(this.scrollNode,"width");return _1e>0&&_1d<_1e;},resize:function(dim){this._dim=dim;this.scrollNode.style.height="auto";var cb=this._contentBox=_d.marginBox2contentBox(this.domNode,{h:0,w:dim.w});cb.h=this.scrollNode.offsetHeight;_4.setContentSize(this.domNode,cb);var _1f=this._enableBtn(this._contentBox.w);this._buttons.style("display",_1f?"":"none");this._leftBtn.layoutAlign="left";this._rightBtn.layoutAlign="right";this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";_d.layoutChildren(this.domNode,this._contentBox,[this._menuBtn,this._leftBtn,this._rightBtn,{domNode:this.scrollNode,layoutAlign:"client"}]);if(this._selectedTab){if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}this.scrollNode.scrollLeft=this._convertToScrollLeft(this._getScrollForSelectedTab());}this._setButtonClass(this._getScroll());this._postResize=true;return {h:this._contentBox.h,w:dim.w};},_getScroll:function(){return (this.isLeftToRight()||_8("ie")<8||(_8("ie")&&_8("quirks"))||_8("webkit"))?this.scrollNode.scrollLeft:_5.get(this.containerNode,"width")-_5.get(this.scrollNode,"width")+(_8("ie")==8?-1:1)*this.scrollNode.scrollLeft;},_convertToScrollLeft:function(val){if(this.isLeftToRight()||_8("ie")<8||(_8("ie")&&_8("quirks"))||_8("webkit")){return val;}else{var _20=_5.get(this.containerNode,"width")-_5.get(this.scrollNode,"width");return (_8("ie")==8?-1:1)*(val-_20);}},onSelectChild:function(_21){var tab=this.pane2button[_21.id];if(!tab||!_21){return;}var _22=tab.domNode;if(_22!=this._selectedTab){this._selectedTab=_22;if(this._postResize){var sl=this._getScroll();if(sl>_22.offsetLeft||sl+_5.get(this.scrollNode,"width")<_22.offsetLeft+_5.get(_22,"width")){this.createSmoothScroll().play();}}}this.inherited(arguments);},_getScrollBounds:function(){var _23=this.getChildren(),_24=_5.get(this.scrollNode,"width"),_25=_5.get(this.containerNode,"width"),_26=_25-_24,_27=this._getTabsWidth();if(_23.length&&_27>_24){return {min:this.isLeftToRight()?0:_23[_23.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_23[_23.length-1].domNode.offsetLeft+_5.get(_23[_23.length-1].domNode,"width"))-_24:_26};}else{var _28=this.isLeftToRight()?0:_26;return {min:_28,max:_28};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_29=_5.get(this.scrollNode,"width"),_2a=this._getScrollBounds();var pos=(n.offsetLeft+_5.get(n,"width")/2)-_29/2;pos=Math.min(Math.max(pos,_2a.min),_2a.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _2b=this._getScrollBounds();x=Math.min(Math.max(x,_2b.min),_2b.max);}else{x=this._getScrollForSelectedTab();}if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var _2c=this,w=this.scrollNode,_2d=new fx.Animation({beforeBegin:function(){if(this.curve){delete this.curve;}var _2e=w.scrollLeft,_2f=_2c._convertToScrollLeft(x);_2d.curve=new fx._Line(_2e,_2f);},onAnimate:function(val){w.scrollLeft=val;}});this._anim=_2d;this._setButtonClass(x);return _2d;},_getBtnNode:function(e){var n=e.target;while(n&&!_3.contains(n,"tabStripButton")){n=n.parentNode;}return n;},doSlideRight:function(e){this.doSlide(1,this._getBtnNode(e));},doSlideLeft:function(e){this.doSlide(-1,this._getBtnNode(e));},doSlide:function(_30,_31){if(_31&&_3.contains(_31,"dijitTabDisabled")){return;}var _32=_5.get(this.scrollNode,"width");var d=(_32*0.75)*_30;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_33){var _34=this._getScrollBounds();this._leftBtn.set("disabled",_33<=_34.min);this._rightBtn.set("disabled",_33>=_34.max);}});var _35=_2("dijit.layout._ScrollingTabControllerButtonMixin",null,{baseClass:"dijitTab tabStripButton",templateString:_b,tabIndex:"",isFocusable:function(){return false;}});_2("dijit.layout._ScrollingTabControllerButton",[_11,_35]);_2("dijit.layout._ScrollingTabControllerMenuButton",[_11,_12,_35],{containerId:"",tabIndex:"-1",isLoaded:function(){return false;},loadDropDown:function(_36){this.dropDown=new _f({id:this.containerId+"_menu",dir:this.dir,lang:this.lang,textDir:this.textDir});var _37=_9.byId(this.containerId);_1.forEach(_37.getChildren(),function(_38){var _39=new _10({id:_38.id+"_stcMi",label:_38.title,iconClass:_38.iconClass,dir:_38.dir,lang:_38.lang,textDir:_38.textDir,onClick:function(){_37.selectChild(_38);}});this.dropDown.addChild(_39);},this);_36();},closeDropDown:function(_3a){this.inherited(arguments);if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}}});return _13;}); \ No newline at end of file
+require({cache:{"url:dijit/layout/templates/ScrollingTabController.html":"<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\"\n\t\t\tdata-dojo-props=\"containerId: '${containerId}', iconClass: 'dijitTabStripMenuIcon',\n\t\t\t\t\tdropDownPosition: ['below-alt', 'above-alt']\"\n\t\t\tdata-dojo-attach-point=\"_menuBtn\" showLabel=\"false\" title=\"\">&#9660;</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideLeftIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_leftBtn\" data-dojo-attach-event=\"onClick: doSlideLeft\">&#9664;</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideRightIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_rightBtn\" data-dojo-attach-event=\"onClick: doSlideRight\">&#9654;</div>\n\t<div class='dijitTabListWrapper' data-dojo-attach-point='tablistWrapper'>\n\t\t<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'\n\t\t\t\tdata-dojo-attach-point='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>","url:dijit/layout/templates/_ScrollingTabControllerButton.html":"<div data-dojo-attach-event=\"onclick:_onClick\" class=\"dijitTabInnerDiv dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"focusNode\">\n\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n</div>"}});define("dijit/layout/ScrollingTabController",["dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/fx","dojo/_base/lang","dojo/on","dojo/query","dojo/sniff","../registry","dojo/text!./templates/ScrollingTabController.html","dojo/text!./templates/_ScrollingTabControllerButton.html","./TabController","./utils","../_WidgetsInTemplateMixin","../Menu","../MenuItem","../form/Button","../_HasDropDown","dojo/NodeList-dom"],function(_1,_2,_3,_4,_5,fx,_6,on,_7,_8,_9,_a,_b,_c,_d,_e,_f,_10,_11,_12){var _13=_2("dijit.layout.ScrollingTabController",[_c,_e],{baseClass:"dijitTabController dijitScrollingTabController",templateString:_a,useMenu:true,useSlider:true,tabStripClass:"",widgetsInTemplate:true,_minScroll:5,_setClassAttr:{node:"containerNode",type:"class"},buildRendering:function(){this.inherited(arguments);var n=this.domNode;this.scrollNode=this.tablistWrapper;this._initButtons();if(!this.tabStripClass){this.tabStripClass="dijitTabContainer"+this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"")+"None";_3.add(n,"tabStrip-disabled");}_3.add(this.tablistWrapper,this.tabStripClass);},onStartup:function(){this.inherited(arguments);_5.set(this.domNode,"visibility","");this._postStartup=true;this.own(on(this.containerNode,"attrmodified-label, attrmodified-iconclass",_6.hitch(this,function(evt){if(this._dim){this.resize(this._dim);}})));},onAddChild:function(_14,_15){this.inherited(arguments);_5.set(this.containerNode,"width",(_5.get(this.containerNode,"width")+200)+"px");},onRemoveChild:function(_16,_17){var _18=this.pane2button[_16.id];if(this._selectedTab===_18.domNode){this._selectedTab=null;}this.inherited(arguments);},_initButtons:function(){this._btnWidth=0;this._buttons=_7("> .tabStripButton",this.domNode).filter(function(btn){if((this.useMenu&&btn==this._menuBtn.domNode)||(this.useSlider&&(btn==this._rightBtn.domNode||btn==this._leftBtn.domNode))){this._btnWidth+=_4.getMarginSize(btn).w;return true;}else{_5.set(btn,"display","none");return false;}},this);},_getTabsWidth:function(){var _19=this.getChildren();if(_19.length){var _1a=_19[this.isLeftToRight()?0:_19.length-1].domNode,_1b=_19[this.isLeftToRight()?_19.length-1:0].domNode;return _1b.offsetLeft+_1b.offsetWidth-_1a.offsetLeft;}else{return 0;}},_enableBtn:function(_1c){var _1d=this._getTabsWidth();_1c=_1c||_5.get(this.scrollNode,"width");return _1d>0&&_1c<_1d;},resize:function(dim){this._dim=dim;this.scrollNode.style.height="auto";var cb=this._contentBox=_d.marginBox2contentBox(this.domNode,{h:0,w:dim.w});cb.h=this.scrollNode.offsetHeight;_4.setContentSize(this.domNode,cb);var _1e=this._enableBtn(this._contentBox.w);this._buttons.style("display",_1e?"":"none");this._leftBtn.layoutAlign="left";this._rightBtn.layoutAlign="right";this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";_d.layoutChildren(this.domNode,this._contentBox,[this._menuBtn,this._leftBtn,this._rightBtn,{domNode:this.scrollNode,layoutAlign:"client"}]);if(this._selectedTab){if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}this.scrollNode.scrollLeft=this._convertToScrollLeft(this._getScrollForSelectedTab());}this._setButtonClass(this._getScroll());this._postResize=true;return {h:this._contentBox.h,w:dim.w};},_getScroll:function(){return (this.isLeftToRight()||_8("ie")<8||(_8("ie")&&_8("quirks"))||_8("webkit"))?this.scrollNode.scrollLeft:_5.get(this.containerNode,"width")-_5.get(this.scrollNode,"width")+(_8("ie")>=8?-1:1)*this.scrollNode.scrollLeft;},_convertToScrollLeft:function(val){if(this.isLeftToRight()||_8("ie")<8||(_8("ie")&&_8("quirks"))||_8("webkit")){return val;}else{var _1f=_5.get(this.containerNode,"width")-_5.get(this.scrollNode,"width");return (_8("ie")>=8?-1:1)*(val-_1f);}},onSelectChild:function(_20){var tab=this.pane2button[_20.id];if(!tab||!_20){return;}var _21=tab.domNode;if(_21!=this._selectedTab){this._selectedTab=_21;if(this._postResize){var sl=this._getScroll();if(sl>_21.offsetLeft||sl+_5.get(this.scrollNode,"width")<_21.offsetLeft+_5.get(_21,"width")){this.createSmoothScroll().play();}}}this.inherited(arguments);},_getScrollBounds:function(){var _22=this.getChildren(),_23=_5.get(this.scrollNode,"width"),_24=_5.get(this.containerNode,"width"),_25=_24-_23,_26=this._getTabsWidth();if(_22.length&&_26>_23){return {min:this.isLeftToRight()?0:_22[_22.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_22[_22.length-1].domNode.offsetLeft+_22[_22.length-1].domNode.offsetWidth)-_23:_25};}else{var _27=this.isLeftToRight()?0:_25;return {min:_27,max:_27};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_28=_5.get(this.scrollNode,"width"),_29=this._getScrollBounds();var pos=(n.offsetLeft+_5.get(n,"width")/2)-_28/2;pos=Math.min(Math.max(pos,_29.min),_29.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _2a=this._getScrollBounds();x=Math.min(Math.max(x,_2a.min),_2a.max);}else{x=this._getScrollForSelectedTab();}if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var _2b=this,w=this.scrollNode,_2c=new fx.Animation({beforeBegin:function(){if(this.curve){delete this.curve;}var _2d=w.scrollLeft,_2e=_2b._convertToScrollLeft(x);_2c.curve=new fx._Line(_2d,_2e);},onAnimate:function(val){w.scrollLeft=val;}});this._anim=_2c;this._setButtonClass(x);return _2c;},_getBtnNode:function(e){var n=e.target;while(n&&!_3.contains(n,"tabStripButton")){n=n.parentNode;}return n;},doSlideRight:function(e){this.doSlide(1,this._getBtnNode(e));},doSlideLeft:function(e){this.doSlide(-1,this._getBtnNode(e));},doSlide:function(_2f,_30){if(_30&&_3.contains(_30,"dijitTabDisabled")){return;}var _31=_5.get(this.scrollNode,"width");var d=(_31*0.75)*_2f;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_32){var _33=this._getScrollBounds();this._leftBtn.set("disabled",_32<=_33.min);this._rightBtn.set("disabled",_32>=_33.max);}});var _34=_2("dijit.layout._ScrollingTabControllerButtonMixin",null,{baseClass:"dijitTab tabStripButton",templateString:_b,tabIndex:"",isFocusable:function(){return false;}});_2("dijit.layout._ScrollingTabControllerButton",[_11,_34]);_2("dijit.layout._ScrollingTabControllerMenuButton",[_11,_12,_34],{containerId:"",tabIndex:"-1",isLoaded:function(){return false;},loadDropDown:function(_35){this.dropDown=new _f({id:this.containerId+"_menu",ownerDocument:this.ownerDocument,dir:this.dir,lang:this.lang,textDir:this.textDir});var _36=_9.byId(this.containerId);_1.forEach(_36.getChildren(),function(_37){var _38=new _10({id:_37.id+"_stcMi",label:_37.title,iconClass:_37.iconClass,disabled:_37.disabled,ownerDocument:this.ownerDocument,dir:_37.dir,lang:_37.lang,textDir:_37.textDir,onClick:function(){_36.selectChild(_37);}});this.dropDown.addChild(_38);},this);_35();},closeDropDown:function(_39){this.inherited(arguments);if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}}});return _13;}); \ No newline at end of file
diff --git a/lib/dijit/layout/ScrollingTabController.js.uncompressed.js b/lib/dijit/layout/ScrollingTabController.js.uncompressed.js
new file mode 100644
index 000000000..63896d622
--- /dev/null
+++ b/lib/dijit/layout/ScrollingTabController.js.uncompressed.js
@@ -0,0 +1,500 @@
+require({cache:{
+'url:dijit/layout/templates/ScrollingTabController.html':"<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\"\n\t\t\tdata-dojo-props=\"containerId: '${containerId}', iconClass: 'dijitTabStripMenuIcon',\n\t\t\t\t\tdropDownPosition: ['below-alt', 'above-alt']\"\n\t\t\tdata-dojo-attach-point=\"_menuBtn\" showLabel=\"false\" title=\"\">&#9660;</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideLeftIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_leftBtn\" data-dojo-attach-event=\"onClick: doSlideLeft\">&#9664;</div>\n\t<div data-dojo-type=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\"\n\t\t\tdata-dojo-props=\"iconClass:'dijitTabStripSlideRightIcon', showLabel:false, title:''\"\n\t\t\tdata-dojo-attach-point=\"_rightBtn\" data-dojo-attach-event=\"onClick: doSlideRight\">&#9654;</div>\n\t<div class='dijitTabListWrapper' data-dojo-attach-point='tablistWrapper'>\n\t\t<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'\n\t\t\t\tdata-dojo-attach-point='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>",
+'url:dijit/layout/templates/_ScrollingTabControllerButton.html':"<div data-dojo-attach-event=\"onclick:_onClick\" class=\"dijitTabInnerDiv dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"focusNode\">\n\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n</div>"}});
+define("dijit/layout/ScrollingTabController", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.contains
+ "dojo/dom-geometry", // domGeometry.contentBox
+ "dojo/dom-style", // domStyle.style
+ "dojo/_base/fx", // Animation
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/query", // query
+ "dojo/sniff", // has("ie"), has("webkit"), has("quirks")
+ "../registry", // registry.byId()
+ "dojo/text!./templates/ScrollingTabController.html",
+ "dojo/text!./templates/_ScrollingTabControllerButton.html",
+ "./TabController",
+ "./utils", // marginBox2contextBox, layoutChildren
+ "../_WidgetsInTemplateMixin",
+ "../Menu",
+ "../MenuItem",
+ "../form/Button",
+ "../_HasDropDown",
+ "dojo/NodeList-dom" // NodeList.style
+], function(array, declare, domClass, domGeometry, domStyle, fx, lang, on, query, has,
+ registry, tabControllerTemplate, buttonTemplate, TabController, layoutUtils, _WidgetsInTemplateMixin,
+ Menu, MenuItem, Button, _HasDropDown){
+
+// module:
+// dijit/layout/ScrollingTabController
+
+
+var ScrollingTabController = declare("dijit.layout.ScrollingTabController", [TabController, _WidgetsInTemplateMixin], {
+ // summary:
+ // Set of tabs with left/right arrow keys and a menu to switch between tabs not
+ // all fitting on a single row.
+ // Works only for horizontal tabs (either above or below the content, not to the left
+ // or right).
+ // tags:
+ // private
+
+ baseClass: "dijitTabController dijitScrollingTabController",
+
+ templateString: tabControllerTemplate,
+
+ // useMenu: [const] Boolean
+ // True if a menu should be used to select tabs when they are too
+ // wide to fit the TabContainer, false otherwise.
+ useMenu: true,
+
+ // useSlider: [const] Boolean
+ // True if a slider should be used to select tabs when they are too
+ // wide to fit the TabContainer, false otherwise.
+ useSlider: true,
+
+ // tabStripClass: [const] String
+ // The css class to apply to the tab strip, if it is visible.
+ tabStripClass: "",
+
+ widgetsInTemplate: true,
+
+ // _minScroll: Number
+ // The distance in pixels from the edge of the tab strip which,
+ // if a scroll animation is less than, forces the scroll to
+ // go all the way to the left/right.
+ _minScroll: 5,
+
+ // Override default behavior mapping class to DOMNode
+ _setClassAttr: { node: "containerNode", type: "class" },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ var n = this.domNode;
+
+ this.scrollNode = this.tablistWrapper;
+ this._initButtons();
+
+ if(!this.tabStripClass){
+ this.tabStripClass = "dijitTabContainer" +
+ this.tabPosition.charAt(0).toUpperCase() +
+ this.tabPosition.substr(1).replace(/-.*/, "") +
+ "None";
+ domClass.add(n, "tabStrip-disabled")
+ }
+
+ domClass.add(this.tablistWrapper, this.tabStripClass);
+ },
+
+ onStartup: function(){
+ this.inherited(arguments);
+
+ // TabController is hidden until it finishes drawing, to give
+ // a less visually jumpy instantiation. When it's finished, set visibility to ""
+ // to that the tabs are hidden/shown depending on the container's visibility setting.
+ domStyle.set(this.domNode, "visibility", "");
+ this._postStartup = true;
+
+ // changes to the tab button label or iconClass will have changed the width of the
+ // buttons, so do a resize
+ this.own(on(this.containerNode, "attrmodified-label, attrmodified-iconclass", lang.hitch(this, function(evt){
+ if(this._dim){
+ this.resize(this._dim);
+ }
+ })));
+ },
+
+ onAddChild: function(page, insertIndex){
+ this.inherited(arguments);
+
+ // Increment the width of the wrapper when a tab is added
+ // This makes sure that the buttons never wrap.
+ // The value 200 is chosen as it should be bigger than most
+ // Tab button widths.
+ domStyle.set(this.containerNode, "width",
+ (domStyle.get(this.containerNode, "width") + 200) + "px");
+ },
+
+ onRemoveChild: function(page, insertIndex){
+ // null out _selectedTab because we are about to delete that dom node
+ var button = this.pane2button[page.id];
+ if(this._selectedTab === button.domNode){
+ this._selectedTab = null;
+ }
+
+ this.inherited(arguments);
+ },
+
+ _initButtons: function(){
+ // summary:
+ // Creates the buttons used to scroll to view tabs that
+ // may not be visible if the TabContainer is too narrow.
+
+ // Make a list of the buttons to display when the tab labels become
+ // wider than the TabContainer, and hide the other buttons.
+ // Also gets the total width of the displayed buttons.
+ this._btnWidth = 0;
+ this._buttons = query("> .tabStripButton", this.domNode).filter(function(btn){
+ if((this.useMenu && btn == this._menuBtn.domNode) ||
+ (this.useSlider && (btn == this._rightBtn.domNode || btn == this._leftBtn.domNode))){
+ this._btnWidth += domGeometry.getMarginSize(btn).w;
+ return true;
+ }else{
+ domStyle.set(btn, "display", "none");
+ return false;
+ }
+ }, this);
+ },
+
+ _getTabsWidth: function(){
+ var children = this.getChildren();
+ if(children.length){
+ var leftTab = children[this.isLeftToRight() ? 0 : children.length - 1].domNode,
+ rightTab = children[this.isLeftToRight() ? children.length - 1 : 0].domNode;
+ return rightTab.offsetLeft + rightTab.offsetWidth - leftTab.offsetLeft;
+ }else{
+ return 0;
+ }
+ },
+
+ _enableBtn: function(width){
+ // summary:
+ // Determines if the tabs are wider than the width of the TabContainer, and
+ // thus that we need to display left/right/menu navigation buttons.
+ var tabsWidth = this._getTabsWidth();
+ width = width || domStyle.get(this.scrollNode, "width");
+ return tabsWidth > 0 && width < tabsWidth;
+ },
+
+ resize: function(dim){
+ // summary:
+ // Hides or displays the buttons used to scroll the tab list and launch the menu
+ // that selects tabs.
+
+ // Save the dimensions to be used when a child is renamed.
+ this._dim = dim;
+
+ // Set my height to be my natural height (tall enough for one row of tab labels),
+ // and my content-box width based on margin-box width specified in dim parameter.
+ // But first reset scrollNode.height in case it was set by layoutChildren() call
+ // in a previous run of this method.
+ this.scrollNode.style.height = "auto";
+ var cb = this._contentBox = layoutUtils.marginBox2contentBox(this.domNode, {h: 0, w: dim.w});
+ cb.h = this.scrollNode.offsetHeight;
+ domGeometry.setContentSize(this.domNode, cb);
+
+ // Show/hide the left/right/menu navigation buttons depending on whether or not they
+ // are needed.
+ var enable = this._enableBtn(this._contentBox.w);
+ this._buttons.style("display", enable ? "" : "none");
+
+ // Position and size the navigation buttons and the tablist
+ this._leftBtn.layoutAlign = "left";
+ this._rightBtn.layoutAlign = "right";
+ this._menuBtn.layoutAlign = this.isLeftToRight() ? "right" : "left";
+ layoutUtils.layoutChildren(this.domNode, this._contentBox,
+ [this._menuBtn, this._leftBtn, this._rightBtn, {domNode: this.scrollNode, layoutAlign: "client"}]);
+
+ // set proper scroll so that selected tab is visible
+ if(this._selectedTab){
+ if(this._anim && this._anim.status() == "playing"){
+ this._anim.stop();
+ }
+ this.scrollNode.scrollLeft = this._convertToScrollLeft(this._getScrollForSelectedTab());
+ }
+
+ // Enable/disabled left right buttons depending on whether or not user can scroll to left or right
+ this._setButtonClass(this._getScroll());
+
+ this._postResize = true;
+
+ // Return my size so layoutChildren() can use it.
+ // Also avoids IE9 layout glitch on browser resize when scroll buttons present
+ return {h: this._contentBox.h, w: dim.w};
+ },
+
+ _getScroll: function(){
+ // summary:
+ // Returns the current scroll of the tabs where 0 means
+ // "scrolled all the way to the left" and some positive number, based on #
+ // of pixels of possible scroll (ex: 1000) means "scrolled all the way to the right"
+ return (this.isLeftToRight() || has("ie") < 8 || (has("ie") && has("quirks")) || has("webkit")) ? this.scrollNode.scrollLeft :
+ domStyle.get(this.containerNode, "width") - domStyle.get(this.scrollNode, "width")
+ + (has("ie") >= 8 ? -1 : 1) * this.scrollNode.scrollLeft;
+ },
+
+ _convertToScrollLeft: function(val){
+ // summary:
+ // Given a scroll value where 0 means "scrolled all the way to the left"
+ // and some positive number, based on # of pixels of possible scroll (ex: 1000)
+ // means "scrolled all the way to the right", return value to set this.scrollNode.scrollLeft
+ // to achieve that scroll.
+ //
+ // This method is to adjust for RTL funniness in various browsers and versions.
+ if(this.isLeftToRight() || has("ie") < 8 || (has("ie") && has("quirks")) || has("webkit")){
+ return val;
+ }else{
+ var maxScroll = domStyle.get(this.containerNode, "width") - domStyle.get(this.scrollNode, "width");
+ return (has("ie") >= 8 ? -1 : 1) * (val - maxScroll);
+ }
+ },
+
+ onSelectChild: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Smoothly scrolls to a tab when it is selected.
+
+ var tab = this.pane2button[page.id];
+ if(!tab || !page){return;}
+
+ var node = tab.domNode;
+
+ // Save the selection
+ if(node != this._selectedTab){
+ this._selectedTab = node;
+
+ // Scroll to the selected tab, except on startup, when scrolling is handled in resize()
+ if(this._postResize){
+ var sl = this._getScroll();
+
+ if(sl > node.offsetLeft ||
+ sl + domStyle.get(this.scrollNode, "width") <
+ node.offsetLeft + domStyle.get(node, "width")){
+ this.createSmoothScroll().play();
+ }
+ }
+ }
+
+ this.inherited(arguments);
+ },
+
+ _getScrollBounds: function(){
+ // summary:
+ // Returns the minimum and maximum scroll setting to show the leftmost and rightmost
+ // tabs (respectively)
+ var children = this.getChildren(),
+ scrollNodeWidth = domStyle.get(this.scrollNode, "width"), // about 500px
+ containerWidth = domStyle.get(this.containerNode, "width"), // 50,000px
+ maxPossibleScroll = containerWidth - scrollNodeWidth, // scrolling until right edge of containerNode visible
+ tabsWidth = this._getTabsWidth();
+
+ if(children.length && tabsWidth > scrollNodeWidth){
+ // Scrolling should happen
+ return {
+ min: this.isLeftToRight() ? 0 : children[children.length-1].domNode.offsetLeft,
+ max: this.isLeftToRight() ?
+ (children[children.length-1].domNode.offsetLeft + children[children.length-1].domNode.offsetWidth) - scrollNodeWidth :
+ maxPossibleScroll
+ };
+ }else{
+ // No scrolling needed, all tabs visible, we stay either scrolled to far left or far right (depending on dir)
+ var onlyScrollPosition = this.isLeftToRight() ? 0 : maxPossibleScroll;
+ return {
+ min: onlyScrollPosition,
+ max: onlyScrollPosition
+ };
+ }
+ },
+
+ _getScrollForSelectedTab: function(){
+ // summary:
+ // Returns the scroll value setting so that the selected tab
+ // will appear in the center
+ var w = this.scrollNode,
+ n = this._selectedTab,
+ scrollNodeWidth = domStyle.get(this.scrollNode, "width"),
+ scrollBounds = this._getScrollBounds();
+
+ // TODO: scroll minimal amount (to either right or left) so that
+ // selected tab is fully visible, and just return if it's already visible?
+ var pos = (n.offsetLeft + domStyle.get(n, "width")/2) - scrollNodeWidth/2;
+ pos = Math.min(Math.max(pos, scrollBounds.min), scrollBounds.max);
+
+ // TODO:
+ // If scrolling close to the left side or right side, scroll
+ // all the way to the left or right. See this._minScroll.
+ // (But need to make sure that doesn't scroll the tab out of view...)
+ return pos;
+ },
+
+ createSmoothScroll: function(x){
+ // summary:
+ // Creates a dojo._Animation object that smoothly scrolls the tab list
+ // either to a fixed horizontal pixel value, or to the selected tab.
+ // description:
+ // If an number argument is passed to the function, that horizontal
+ // pixel position is scrolled to. Otherwise the currently selected
+ // tab is scrolled to.
+ // x: Integer?
+ // An optional pixel value to scroll to, indicating distance from left.
+
+ // Calculate position to scroll to
+ if(arguments.length > 0){
+ // position specified by caller, just make sure it's within bounds
+ var scrollBounds = this._getScrollBounds();
+ x = Math.min(Math.max(x, scrollBounds.min), scrollBounds.max);
+ }else{
+ // scroll to center the current tab
+ x = this._getScrollForSelectedTab();
+ }
+
+ if(this._anim && this._anim.status() == "playing"){
+ this._anim.stop();
+ }
+
+ var self = this,
+ w = this.scrollNode,
+ anim = new fx.Animation({
+ beforeBegin: function(){
+ if(this.curve){ delete this.curve; }
+ var oldS = w.scrollLeft,
+ newS = self._convertToScrollLeft(x);
+ anim.curve = new fx._Line(oldS, newS);
+ },
+ onAnimate: function(val){
+ w.scrollLeft = val;
+ }
+ });
+ this._anim = anim;
+
+ // Disable/enable left/right buttons according to new scroll position
+ this._setButtonClass(x);
+
+ return anim; // dojo/_base/fx/Animation
+ },
+
+ _getBtnNode: function(/*Event*/ e){
+ // summary:
+ // Gets a button DOM node from a mouse click event.
+ // e:
+ // The mouse click event.
+ var n = e.target;
+ while(n && !domClass.contains(n, "tabStripButton")){
+ n = n.parentNode;
+ }
+ return n;
+ },
+
+ doSlideRight: function(/*Event*/ e){
+ // summary:
+ // Scrolls the menu to the right.
+ // e:
+ // The mouse click event.
+ this.doSlide(1, this._getBtnNode(e));
+ },
+
+ doSlideLeft: function(/*Event*/ e){
+ // summary:
+ // Scrolls the menu to the left.
+ // e:
+ // The mouse click event.
+ this.doSlide(-1,this._getBtnNode(e));
+ },
+
+ doSlide: function(/*Number*/ direction, /*DomNode*/ node){
+ // summary:
+ // Scrolls the tab list to the left or right by 75% of the widget width.
+ // direction:
+ // If the direction is 1, the widget scrolls to the right, if it is -1,
+ // it scrolls to the left.
+
+ if(node && domClass.contains(node, "dijitTabDisabled")){return;}
+
+ var sWidth = domStyle.get(this.scrollNode, "width");
+ var d = (sWidth * 0.75) * direction;
+
+ var to = this._getScroll() + d;
+
+ this._setButtonClass(to);
+
+ this.createSmoothScroll(to).play();
+ },
+
+ _setButtonClass: function(/*Number*/ scroll){
+ // summary:
+ // Disables the left scroll button if the tabs are scrolled all the way to the left,
+ // or the right scroll button in the opposite case.
+ // scroll: Integer
+ // amount of horizontal scroll
+
+ var scrollBounds = this._getScrollBounds();
+ this._leftBtn.set("disabled", scroll <= scrollBounds.min);
+ this._rightBtn.set("disabled", scroll >= scrollBounds.max);
+ }
+});
+
+
+var ScrollingTabControllerButtonMixin = declare("dijit.layout._ScrollingTabControllerButtonMixin", null, {
+ baseClass: "dijitTab tabStripButton",
+
+ templateString: buttonTemplate,
+
+ // Override inherited tabIndex: 0 from dijit/form/Button, because user shouldn't be
+ // able to tab to the left/right/menu buttons
+ tabIndex: "",
+
+ // Similarly, override FormWidget.isFocusable() because clicking a button shouldn't focus it
+ // either (this override avoids focus() call in FormWidget.js)
+ isFocusable: function(){ return false; }
+});
+
+// Class used in template
+declare("dijit.layout._ScrollingTabControllerButton",
+ [Button, ScrollingTabControllerButtonMixin]);
+
+// Class used in template
+declare(
+ "dijit.layout._ScrollingTabControllerMenuButton",
+ [Button, _HasDropDown, ScrollingTabControllerButtonMixin],
+{
+ // id of the TabContainer itself
+ containerId: "",
+
+ // -1 so user can't tab into the button, but so that button can still be focused programatically.
+ // Because need to move focus to the button (or somewhere) before the menu is hidden or IE6 will crash.
+ tabIndex: "-1",
+
+ isLoaded: function(){
+ // recreate menu every time, in case the TabContainer's list of children (or their icons/labels) have changed
+ return false;
+ },
+
+ loadDropDown: function(callback){
+ this.dropDown = new Menu({
+ id: this.containerId + "_menu",
+ ownerDocument: this.ownerDocument,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir
+ });
+ var container = registry.byId(this.containerId);
+ array.forEach(container.getChildren(), function(page){
+ var menuItem = new MenuItem({
+ id: page.id + "_stcMi",
+ label: page.title,
+ iconClass: page.iconClass,
+ disabled: page.disabled,
+ ownerDocument: this.ownerDocument,
+ dir: page.dir,
+ lang: page.lang,
+ textDir: page.textDir,
+ onClick: function(){
+ container.selectChild(page);
+ }
+ });
+ this.dropDown.addChild(menuItem);
+ }, this);
+ callback();
+ },
+
+ closeDropDown: function(/*Boolean*/ focus){
+ this.inherited(arguments);
+ if(this.dropDown){
+ this.dropDown.destroyRecursive();
+ delete this.dropDown;
+ }
+ }
+});
+
+return ScrollingTabController;
+});
diff --git a/lib/dijit/layout/SplitContainer.js b/lib/dijit/layout/SplitContainer.js
index 165ba9e2e..06560e1b9 100644
--- a/lib/dijit/layout/SplitContainer.js
+++ b/lib/dijit/layout/SplitContainer.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/SplitContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","../registry","../_WidgetBase","./_LayoutWidget"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,on,_c,_d,_e,_f,_10){_b.extend(_f,{sizeMin:10,sizeShare:10});return _3("dijit.layout.SplitContainer",_10,{constructor:function(){_a.deprecated("dijit.layout.SplitContainer is deprecated","use BorderContainer with splitter instead",2);},activeSizing:false,sizerWidth:7,orientation:"horizontal",persist:true,baseClass:"dijitSplitContainer",postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.isHorizontal=(this.orientation=="horizontal");},postCreate:function(){this.inherited(arguments);this.sizers=[];if(_c("mozilla")){this.domNode.style.overflow="-moz-scrollbars-none";}if(typeof this.sizerWidth=="object"){try{this.sizerWidth=parseInt(this.sizerWidth.toString());}catch(e){this.sizerWidth=7;}}var _11=_d.doc.createElement("div");this.virtualSizer=_11;_11.style.position="relative";_11.style.zIndex=10;_11.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";this.domNode.appendChild(_11);_4.setSelectable(_11,false);},destroy:function(){delete this.virtualSizer;if(this._ownconnects){var h;while(h=this._ownconnects.pop()){h.remove();}}this.inherited(arguments);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),function(_12,i,_13){this._setupChild(_12);if(i<_13.length-1){this._addSizer();}},this);if(this.persist){this._restoreState();}this.inherited(arguments);},_setupChild:function(_14){this.inherited(arguments);_14.domNode.style.position="absolute";_5.add(_14.domNode,"dijitSplitPane");},_onSizerMouseDown:function(e){if(e.target.id){for(var i=0;i<this.sizers.length;i++){if(this.sizers[i].id==e.target.id){break;}}if(i<this.sizers.length){this.beginSizing(e,i);}}},_addSizer:function(_15){_15=_15===undefined?this.sizers.length:_15;var _16=_d.doc.createElement("div");_16.id=_e.getUniqueId("dijit_layout_SplitterContainer_Splitter");this.sizers.splice(_15,0,_16);this.domNode.appendChild(_16);_16.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";var _17=_d.doc.createElement("div");_17.className="thumb";_16.appendChild(_17);this.connect(_16,"onmousedown","_onSizerMouseDown");_4.setSelectable(_16,false);},removeChild:function(_18){if(this.sizers.length){var i=_1.indexOf(this.getChildren(),_18);if(i!=-1){if(i==this.sizers.length){i--;}_6.destroy(this.sizers[i]);this.sizers.splice(i,1);}}this.inherited(arguments);if(this._started){this.layout();}},addChild:function(_19,_1a){this.inherited(arguments);if(this._started){var _1b=this.getChildren();if(_1b.length>1){this._addSizer(_1a);}this.layout();}},layout:function(){this.paneWidth=this._contentBox.w;this.paneHeight=this._contentBox.h;var _1c=this.getChildren();if(!_1c.length){return;}var _1d=this.isHorizontal?this.paneWidth:this.paneHeight;if(_1c.length>1){_1d-=this.sizerWidth*(_1c.length-1);}var _1e=0;_1.forEach(_1c,function(_1f){_1e+=_1f.sizeShare;});var _20=_1d/_1e;var _21=0;_1.forEach(_1c.slice(0,_1c.length-1),function(_22){var _23=Math.round(_20*_22.sizeShare);_22.sizeActual=_23;_21+=_23;});_1c[_1c.length-1].sizeActual=_1d-_21;this._checkSizes();var pos=0;var _24=_1c[0].sizeActual;this._movePanel(_1c[0],pos,_24);_1c[0].position=pos;pos+=_24;if(!this.sizers){return;}_1.some(_1c.slice(1),function(_25,i){if(!this.sizers[i]){return true;}this._moveSlider(this.sizers[i],pos,this.sizerWidth);this.sizers[i].position=pos;pos+=this.sizerWidth;_24=_25.sizeActual;this._movePanel(_25,pos,_24);_25.position=pos;pos+=_24;},this);},_movePanel:function(_26,pos,_27){var box;if(this.isHorizontal){_26.domNode.style.left=pos+"px";_26.domNode.style.top=0;box={w:_27,h:this.paneHeight};if(_26.resize){_26.resize(box);}else{_7.setMarginBox(_26.domNode,box);}}else{_26.domNode.style.left=0;_26.domNode.style.top=pos+"px";box={w:this.paneWidth,h:_27};if(_26.resize){_26.resize(box);}else{_7.setMarginBox(_26.domNode,box);}}},_moveSlider:function(_28,pos,_29){if(this.isHorizontal){_28.style.left=pos+"px";_28.style.top=0;_7.setMarginBox(_28,{w:_29,h:this.paneHeight});}else{_28.style.left=0;_28.style.top=pos+"px";_7.setMarginBox(_28,{w:this.paneWidth,h:_29});}},_growPane:function(_2a,_2b){if(_2a>0){if(_2b.sizeActual>_2b.sizeMin){if((_2b.sizeActual-_2b.sizeMin)>_2a){_2b.sizeActual=_2b.sizeActual-_2a;_2a=0;}else{_2a-=_2b.sizeActual-_2b.sizeMin;_2b.sizeActual=_2b.sizeMin;}}}return _2a;},_checkSizes:function(){var _2c=0;var _2d=0;var _2e=this.getChildren();_1.forEach(_2e,function(_2f){_2d+=_2f.sizeActual;_2c+=_2f.sizeMin;});if(_2c<=_2d){var _30=0;_1.forEach(_2e,function(_31){if(_31.sizeActual<_31.sizeMin){_30+=_31.sizeMin-_31.sizeActual;_31.sizeActual=_31.sizeMin;}});if(_30>0){var _32=this.isDraggingLeft?_2e.reverse():_2e;_1.forEach(_32,function(_33){_30=this._growPane(_30,_33);},this);}}else{_1.forEach(_2e,function(_34){_34.sizeActual=Math.round(_2d*(_34.sizeMin/_2c));});}},beginSizing:function(e,i){var _35=this.getChildren();this.paneBefore=_35[i];this.paneAfter=_35[i+1];this.isSizing=true;this.sizingSplitter=this.sizers[i];if(!this.cover){this.cover=_6.create("div",{style:{position:"absolute",zIndex:5,top:0,left:0,width:"100%",height:"100%"}},this.domNode);}else{this.cover.style.zIndex=5;}this.sizingSplitter.style.zIndex=6;this.originPos=_7.position(_35[0].domNode,true);var _36,_37;if(this.isHorizontal){_36=e.layerX||e.offsetX||0;_37=e.pageX;this.originPos=this.originPos.x;}else{_36=e.layerY||e.offsetY||0;_37=e.pageY;this.originPos=this.originPos.y;}this.startPoint=this.lastPoint=_37;this.screenToClientOffset=_37-_36;this.dragOffset=this.lastPoint-this.paneBefore.sizeActual-this.originPos-this.paneBefore.position;if(!this.activeSizing){this._showSizingLine();}this._ownconnects=[on(_d.doc.documentElement,"mousemove",_b.hitch(this,"changeSizing")),on(_d.doc.documentElement,"mouseup",_b.hitch(this,"endSizing"))];_9.stop(e);},changeSizing:function(e){if(!this.isSizing){return;}this.lastPoint=this.isHorizontal?e.pageX:e.pageY;this.movePoint();if(this.activeSizing){this._updateSize();}else{this._moveSizingLine();}_9.stop(e);},endSizing:function(){if(!this.isSizing){return;}if(this.cover){this.cover.style.zIndex=-1;}if(!this.activeSizing){this._hideSizingLine();}this._updateSize();this.isSizing=false;if(this.persist){this._saveState(this);}var h;while(h=this._ownconnects.pop()){h.remove();}},movePoint:function(){var p=this.lastPoint-this.screenToClientOffset;var a=p-this.dragOffset;a=this.legaliseSplitPoint(a);p=a+this.dragOffset;this.lastPoint=p+this.screenToClientOffset;},legaliseSplitPoint:function(a){a+=this.sizingSplitter.position;this.isDraggingLeft=!!(a>0);if(!this.activeSizing){var min=this.paneBefore.position+this.paneBefore.sizeMin;if(a<min){a=min;}var max=this.paneAfter.position+(this.paneAfter.sizeActual-(this.sizerWidth+this.paneAfter.sizeMin));if(a>max){a=max;}}a-=this.sizingSplitter.position;this._checkSizes();return a;},_updateSize:function(){var pos=this.lastPoint-this.dragOffset-this.originPos;var _38=this.paneBefore.position;var _39=this.paneAfter.position+this.paneAfter.sizeActual;this.paneBefore.sizeActual=pos-_38;this.paneAfter.position=pos+this.sizerWidth;this.paneAfter.sizeActual=_39-this.paneAfter.position;_1.forEach(this.getChildren(),function(_3a){_3a.sizeShare=_3a.sizeActual;});if(this._started){this.layout();}},_showSizingLine:function(){this._moveSizingLine();_7.setMarginBox(this.virtualSizer,this.isHorizontal?{w:this.sizerWidth,h:this.paneHeight}:{w:this.paneWidth,h:this.sizerWidth});this.virtualSizer.style.display="block";},_hideSizingLine:function(){this.virtualSizer.style.display="none";},_moveSizingLine:function(){var pos=(this.lastPoint-this.startPoint)+this.sizingSplitter.position;_8.set(this.virtualSizer,(this.isHorizontal?"left":"top"),pos+"px");},_getCookieName:function(i){return this.id+"_"+i;},_restoreState:function(){_1.forEach(this.getChildren(),function(_3b,i){var _3c=this._getCookieName(i);var _3d=_2(_3c);if(_3d){var pos=parseInt(_3d);if(typeof pos=="number"){_3b.sizeShare=pos;}}},this);},_saveState:function(){if(!this.persist){return;}_1.forEach(this.getChildren(),function(_3e,i){_2(this._getCookieName(i),_3e.sizeShare,{expires:365});},this);}});}); \ No newline at end of file
+define("dijit/layout/SplitContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/sniff","../registry","../_WidgetBase","./_LayoutWidget"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,on,_c,_d,_e,_f){var _10=_3("dijit.layout.SplitContainer",_f,{constructor:function(){_a.deprecated("dijit.layout.SplitContainer is deprecated","use BorderContainer with splitter instead",2);},activeSizing:false,sizerWidth:7,orientation:"horizontal",persist:true,baseClass:"dijitSplitContainer",postMixInProperties:function(){this.inherited("postMixInProperties",arguments);this.isHorizontal=(this.orientation=="horizontal");},postCreate:function(){this.inherited(arguments);this.sizers=[];if(_c("mozilla")){this.domNode.style.overflow="-moz-scrollbars-none";}if(typeof this.sizerWidth=="object"){try{this.sizerWidth=parseInt(this.sizerWidth.toString());}catch(e){this.sizerWidth=7;}}var _11=this.ownerDocument.createElement("div");this.virtualSizer=_11;_11.style.position="relative";_11.style.zIndex=10;_11.className=this.isHorizontal?"dijitSplitContainerVirtualSizerH":"dijitSplitContainerVirtualSizerV";this.domNode.appendChild(_11);_4.setSelectable(_11,false);},destroy:function(){delete this.virtualSizer;if(this._ownconnects){var h;while(h=this._ownconnects.pop()){h.remove();}}this.inherited(arguments);},startup:function(){if(this._started){return;}_1.forEach(this.getChildren(),function(_12,i,_13){this._setupChild(_12);if(i<_13.length-1){this._addSizer();}},this);if(this.persist){this._restoreState();}this.inherited(arguments);},_setupChild:function(_14){this.inherited(arguments);_14.domNode.style.position="absolute";_5.add(_14.domNode,"dijitSplitPane");},_onSizerMouseDown:function(e){if(e.target.id){for(var i=0;i<this.sizers.length;i++){if(this.sizers[i].id==e.target.id){break;}}if(i<this.sizers.length){this.beginSizing(e,i);}}},_addSizer:function(_15){_15=_15===undefined?this.sizers.length:_15;var _16=this.ownerDocument.createElement("div");_16.id=_d.getUniqueId("dijit_layout_SplitterContainer_Splitter");this.sizers.splice(_15,0,_16);this.domNode.appendChild(_16);_16.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";var _17=this.ownerDocument.createElement("div");_17.className="thumb";_16.appendChild(_17);this.connect(_16,"onmousedown","_onSizerMouseDown");_4.setSelectable(_16,false);},removeChild:function(_18){if(this.sizers.length){var i=_1.indexOf(this.getChildren(),_18);if(i!=-1){if(i==this.sizers.length){i--;}_6.destroy(this.sizers[i]);this.sizers.splice(i,1);}}this.inherited(arguments);if(this._started){this.layout();}},addChild:function(_19,_1a){this.inherited(arguments);if(this._started){var _1b=this.getChildren();if(_1b.length>1){this._addSizer(_1a);}this.layout();}},layout:function(){this.paneWidth=this._contentBox.w;this.paneHeight=this._contentBox.h;var _1c=this.getChildren();if(!_1c.length){return;}var _1d=this.isHorizontal?this.paneWidth:this.paneHeight;if(_1c.length>1){_1d-=this.sizerWidth*(_1c.length-1);}var _1e=0;_1.forEach(_1c,function(_1f){_1e+=_1f.sizeShare;});var _20=_1d/_1e;var _21=0;_1.forEach(_1c.slice(0,_1c.length-1),function(_22){var _23=Math.round(_20*_22.sizeShare);_22.sizeActual=_23;_21+=_23;});_1c[_1c.length-1].sizeActual=_1d-_21;this._checkSizes();var pos=0;var _24=_1c[0].sizeActual;this._movePanel(_1c[0],pos,_24);_1c[0].position=pos;pos+=_24;if(!this.sizers){return;}_1.some(_1c.slice(1),function(_25,i){if(!this.sizers[i]){return true;}this._moveSlider(this.sizers[i],pos,this.sizerWidth);this.sizers[i].position=pos;pos+=this.sizerWidth;_24=_25.sizeActual;this._movePanel(_25,pos,_24);_25.position=pos;pos+=_24;},this);},_movePanel:function(_26,pos,_27){var box;if(this.isHorizontal){_26.domNode.style.left=pos+"px";_26.domNode.style.top=0;box={w:_27,h:this.paneHeight};if(_26.resize){_26.resize(box);}else{_7.setMarginBox(_26.domNode,box);}}else{_26.domNode.style.left=0;_26.domNode.style.top=pos+"px";box={w:this.paneWidth,h:_27};if(_26.resize){_26.resize(box);}else{_7.setMarginBox(_26.domNode,box);}}},_moveSlider:function(_28,pos,_29){if(this.isHorizontal){_28.style.left=pos+"px";_28.style.top=0;_7.setMarginBox(_28,{w:_29,h:this.paneHeight});}else{_28.style.left=0;_28.style.top=pos+"px";_7.setMarginBox(_28,{w:this.paneWidth,h:_29});}},_growPane:function(_2a,_2b){if(_2a>0){if(_2b.sizeActual>_2b.sizeMin){if((_2b.sizeActual-_2b.sizeMin)>_2a){_2b.sizeActual=_2b.sizeActual-_2a;_2a=0;}else{_2a-=_2b.sizeActual-_2b.sizeMin;_2b.sizeActual=_2b.sizeMin;}}}return _2a;},_checkSizes:function(){var _2c=0;var _2d=0;var _2e=this.getChildren();_1.forEach(_2e,function(_2f){_2d+=_2f.sizeActual;_2c+=_2f.sizeMin;});if(_2c<=_2d){var _30=0;_1.forEach(_2e,function(_31){if(_31.sizeActual<_31.sizeMin){_30+=_31.sizeMin-_31.sizeActual;_31.sizeActual=_31.sizeMin;}});if(_30>0){var _32=this.isDraggingLeft?_2e.reverse():_2e;_1.forEach(_32,function(_33){_30=this._growPane(_30,_33);},this);}}else{_1.forEach(_2e,function(_34){_34.sizeActual=Math.round(_2d*(_34.sizeMin/_2c));});}},beginSizing:function(e,i){var _35=this.getChildren();this.paneBefore=_35[i];this.paneAfter=_35[i+1];this.paneBefore.sizeBeforeDrag=this.paneBefore.sizeActual;this.paneAfter.sizeBeforeDrag=this.paneAfter.sizeActual;this.paneAfter.positionBeforeDrag=this.paneAfter.position;this.isSizing=true;this.sizingSplitter=this.sizers[i];this.sizingSplitter.positionBeforeDrag=_8.get(this.sizingSplitter,(this.isHorizontal?"left":"top"));if(!this.cover){this.cover=_6.create("div",{style:{position:"absolute",zIndex:5,top:0,left:0,width:"100%",height:"100%"}},this.domNode);}else{this.cover.style.zIndex=5;}this.sizingSplitter.style.zIndex=6;this.startPoint=this.lastPoint=(this.isHorizontal?e.pageX:e.pageY);this.maxDelta=this.paneAfter.sizeActual-this.paneAfter.sizeMin;this.minDelta=-1*(this.paneBefore.sizeActual-this.paneBefore.sizeMin);if(!this.activeSizing){this._showSizingLine();}this._ownconnects=[on(this.ownerDocument.documentElement,"mousemove",_b.hitch(this,"changeSizing")),on(this.ownerDocument.documentElement,"mouseup",_b.hitch(this,"endSizing"))];_9.stop(e);},changeSizing:function(e){if(!this.isSizing){return;}this.lastPoint=this.isHorizontal?e.pageX:e.pageY;var _36=Math.max(Math.min(this.lastPoint-this.startPoint,this.maxDelta),this.minDelta);if(this.activeSizing){this._updateSize(_36);}else{this._moveSizingLine(_36);}_9.stop(e);},endSizing:function(){if(!this.isSizing){return;}if(this.cover){this.cover.style.zIndex=-1;}if(!this.activeSizing){this._hideSizingLine();}var _37=Math.max(Math.min(this.lastPoint-this.startPoint,this.maxDelta),this.minDelta);this._updateSize(_37);this.isSizing=false;if(this.persist){this._saveState(this);}var h;while(h=this._ownconnects.pop()){h.remove();}},_updateSize:function(_38){this.paneBefore.sizeActual=this.paneBefore.sizeBeforeDrag+_38;this.paneAfter.position=this.paneAfter.positionBeforeDrag+_38;this.paneAfter.sizeActual=this.paneAfter.sizeBeforeDrag-_38;_1.forEach(this.getChildren(),function(_39){_39.sizeShare=_39.sizeActual;});if(this._started){this.layout();}},_showSizingLine:function(){this._moveSizingLine(0);_7.setMarginBox(this.virtualSizer,this.isHorizontal?{w:this.sizerWidth,h:this.paneHeight}:{w:this.paneWidth,h:this.sizerWidth});this.virtualSizer.style.display="block";},_hideSizingLine:function(){this.virtualSizer.style.display="none";},_moveSizingLine:function(_3a){var pos=_3a+this.sizingSplitter.positionBeforeDrag;_8.set(this.virtualSizer,(this.isHorizontal?"left":"top"),pos+"px");},_getCookieName:function(i){return this.id+"_"+i;},_restoreState:function(){_1.forEach(this.getChildren(),function(_3b,i){var _3c=this._getCookieName(i);var _3d=_2(_3c);if(_3d){var pos=parseInt(_3d);if(typeof pos=="number"){_3b.sizeShare=pos;}}},this);},_saveState:function(){if(!this.persist){return;}_1.forEach(this.getChildren(),function(_3e,i){_2(this._getCookieName(i),_3e.sizeShare,{expires:365});},this);}});_10.ChildWidgetProperties={sizeMin:10,sizeShare:10};_b.extend(_e,_10.ChildWidgetProperties);return _10;}); \ No newline at end of file
diff --git a/lib/dijit/layout/SplitContainer.js.uncompressed.js b/lib/dijit/layout/SplitContainer.js.uncompressed.js
new file mode 100644
index 000000000..0b5d44500
--- /dev/null
+++ b/lib/dijit/layout/SplitContainer.js.uncompressed.js
@@ -0,0 +1,584 @@
+define("dijit/layout/SplitContainer", [
+ "dojo/_base/array", // array.forEach array.indexOf array.some
+ "dojo/cookie", // cookie
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-class", // domClass.add
+ "dojo/dom-construct", // domConstruct.create domConstruct.destroy
+ "dojo/dom-geometry", // domGeometry.marginBox domGeometry.position
+ "dojo/dom-style", // domStyle.style
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.extend lang.hitch
+ "dojo/on",
+ "dojo/sniff", // has("mozilla")
+ "../registry", // registry.getUniqueId()
+ "../_WidgetBase",
+ "./_LayoutWidget"
+], function(array, cookie, declare, dom, domClass, domConstruct, domGeometry, domStyle,
+ event, kernel, lang, on, has, registry, _WidgetBase, _LayoutWidget){
+
+// module:
+// dijit/layout/SplitContainer
+
+//
+// FIXME: make it prettier
+// FIXME: active dragging upwards doesn't always shift other bars (direction calculation is wrong in this case)
+// FIXME: sizeWidth should be a CSS attribute (at 7 because css wants it to be 7 until we fix to css)
+//
+
+var SplitContainer = declare("dijit.layout.SplitContainer", _LayoutWidget, {
+ // summary:
+ // Deprecated. Use `dijit/layout/BorderContainer` instead.
+ // description:
+ // A Container widget with sizing handles in-between each child.
+ // Contains multiple children widgets, all of which are displayed side by side
+ // (either horizontally or vertically); there's a bar between each of the children,
+ // and you can adjust the relative size of each child by dragging the bars.
+ //
+ // You must specify a size (width and height) for the SplitContainer.
+ //
+ // See `SplitContainer.ChildWidgetProperties` for details on the properties that can be set on
+ // children of a `SplitContainer`.
+ // tags:
+ // deprecated
+
+ constructor: function(){
+ kernel.deprecated("dijit.layout.SplitContainer is deprecated", "use BorderContainer with splitter instead", 2.0);
+ },
+
+ // activeSizing: Boolean
+ // If true, the children's size changes as you drag the bar;
+ // otherwise, the sizes don't change until you drop the bar (by mouse-up)
+ activeSizing: false,
+
+ // sizerWidth: Integer
+ // Size in pixels of the bar between each child
+ sizerWidth: 7,
+
+ // orientation: String
+ // either 'horizontal' or vertical; indicates whether the children are
+ // arranged side-by-side or up/down.
+ orientation: 'horizontal',
+
+ // persist: Boolean
+ // Save splitter positions in a cookie
+ persist: true,
+
+ baseClass: "dijitSplitContainer",
+
+ postMixInProperties: function(){
+ this.inherited("postMixInProperties",arguments);
+ this.isHorizontal = (this.orientation == 'horizontal');
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.sizers = [];
+
+ // overflow has to be explicitly hidden for splitContainers using gekko (trac #1435)
+ // to keep other combined css classes from inadvertantly making the overflow visible
+ if(has("mozilla")){
+ this.domNode.style.overflow = '-moz-scrollbars-none'; // hidden doesn't work
+ }
+
+ // create the fake dragger
+ if(typeof this.sizerWidth == "object"){
+ try{ //FIXME: do this without a try/catch
+ this.sizerWidth = parseInt(this.sizerWidth.toString());
+ }catch(e){ this.sizerWidth = 7; }
+ }
+ var sizer = this.ownerDocument.createElement('div');
+ this.virtualSizer = sizer;
+ sizer.style.position = 'relative';
+
+ // #1681: work around the dreaded 'quirky percentages in IE' layout bug
+ // If the splitcontainer's dimensions are specified in percentages, it
+ // will be resized when the virtualsizer is displayed in _showSizingLine
+ // (typically expanding its bounds unnecessarily). This happens because
+ // we use position: relative for .dijitSplitContainer.
+ // The workaround: instead of changing the display style attribute,
+ // switch to changing the zIndex (bring to front/move to back)
+
+ sizer.style.zIndex = 10;
+ sizer.className = this.isHorizontal ? 'dijitSplitContainerVirtualSizerH' : 'dijitSplitContainerVirtualSizerV';
+ this.domNode.appendChild(sizer);
+ dom.setSelectable(sizer, false);
+ },
+
+ destroy: function(){
+ delete this.virtualSizer;
+ if(this._ownconnects){
+ var h;
+ while(h = this._ownconnects.pop()){ h.remove(); }
+ }
+ this.inherited(arguments);
+ },
+ startup: function(){
+ if(this._started){ return; }
+
+ array.forEach(this.getChildren(), function(child, i, children){
+ // attach the children and create the draggers
+ this._setupChild(child);
+
+ if(i < children.length-1){
+ this._addSizer();
+ }
+ }, this);
+
+ if(this.persist){
+ this._restoreState();
+ }
+
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*dijit/_WidgetBase*/ child){
+ this.inherited(arguments);
+ child.domNode.style.position = "absolute";
+ domClass.add(child.domNode, "dijitSplitPane");
+ },
+
+ _onSizerMouseDown: function(e){
+ if(e.target.id){
+ for(var i=0;i<this.sizers.length;i++){
+ if(this.sizers[i].id == e.target.id){
+ break;
+ }
+ }
+ if(i<this.sizers.length){
+ this.beginSizing(e,i);
+ }
+ }
+ },
+ _addSizer: function(index){
+ index = index === undefined ? this.sizers.length : index;
+
+ // TODO: use a template for this!!!
+ var sizer = this.ownerDocument.createElement('div');
+ sizer.id=registry.getUniqueId('dijit_layout_SplitterContainer_Splitter');
+ this.sizers.splice(index,0,sizer);
+ this.domNode.appendChild(sizer);
+
+ sizer.className = this.isHorizontal ? 'dijitSplitContainerSizerH' : 'dijitSplitContainerSizerV';
+
+ // add the thumb div
+ var thumb = this.ownerDocument.createElement('div');
+ thumb.className = 'thumb';
+ sizer.appendChild(thumb);
+
+ // FIXME: are you serious? why aren't we using mover start/stop combo?
+ this.connect(sizer, "onmousedown", '_onSizerMouseDown');
+
+ dom.setSelectable(sizer, false);
+ },
+
+ removeChild: function(widget){
+ // summary:
+ // Remove sizer, but only if widget is really our child and
+ // we have at least one sizer to throw away
+ if(this.sizers.length){
+ var i = array.indexOf(this.getChildren(), widget);
+ if(i != -1){
+ if(i == this.sizers.length){
+ i--;
+ }
+ domConstruct.destroy(this.sizers[i]);
+ this.sizers.splice(i,1);
+ }
+ }
+
+ // Remove widget and repaint
+ this.inherited(arguments);
+ if(this._started){
+ this.layout();
+ }
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){
+ // summary:
+ // Add a child widget to the container
+ // child:
+ // a widget to add
+ // insertIndex:
+ // postion in the "stack" to add the child widget
+
+ this.inherited(arguments);
+
+ if(this._started){
+ // Do the stuff that startup() does for each widget
+ var children = this.getChildren();
+ if(children.length > 1){
+ this._addSizer(insertIndex);
+ }
+
+ // and then reposition (ie, shrink) every pane to make room for the new guy
+ this.layout();
+ }
+ },
+
+ layout: function(){
+ // summary:
+ // Do layout of panels
+
+ // base class defines this._contentBox on initial creation and also
+ // on resize
+ this.paneWidth = this._contentBox.w;
+ this.paneHeight = this._contentBox.h;
+
+ var children = this.getChildren();
+ if(!children.length){ return; }
+
+ //
+ // calculate space
+ //
+
+ var space = this.isHorizontal ? this.paneWidth : this.paneHeight;
+ if(children.length > 1){
+ space -= this.sizerWidth * (children.length - 1);
+ }
+
+ //
+ // calculate total of SizeShare values
+ //
+ var outOf = 0;
+ array.forEach(children, function(child){
+ outOf += child.sizeShare;
+ });
+
+ //
+ // work out actual pixels per sizeshare unit
+ //
+ var pixPerUnit = space / outOf;
+
+ //
+ // set the SizeActual member of each pane
+ //
+ var totalSize = 0;
+ array.forEach(children.slice(0, children.length - 1), function(child){
+ var size = Math.round(pixPerUnit * child.sizeShare);
+ child.sizeActual = size;
+ totalSize += size;
+ });
+
+ children[children.length-1].sizeActual = space - totalSize;
+
+ //
+ // make sure the sizes are ok
+ //
+ this._checkSizes();
+
+ //
+ // now loop, positioning each pane and letting children resize themselves
+ //
+
+ var pos = 0;
+ var size = children[0].sizeActual;
+ this._movePanel(children[0], pos, size);
+ children[0].position = pos;
+ pos += size;
+
+ // if we don't have any sizers, our layout method hasn't been called yet
+ // so bail until we are called..TODO: REVISIT: need to change the startup
+ // algorithm to guaranteed the ordering of calls to layout method
+ if(!this.sizers){
+ return;
+ }
+
+ array.some(children.slice(1), function(child, i){
+ // error-checking
+ if(!this.sizers[i]){
+ return true;
+ }
+ // first we position the sizing handle before this pane
+ this._moveSlider(this.sizers[i], pos, this.sizerWidth);
+ this.sizers[i].position = pos;
+ pos += this.sizerWidth;
+
+ size = child.sizeActual;
+ this._movePanel(child, pos, size);
+ child.position = pos;
+ pos += size;
+ }, this);
+ },
+
+ _movePanel: function(panel, pos, size){
+ var box;
+ if(this.isHorizontal){
+ panel.domNode.style.left = pos + 'px'; // TODO: resize() takes l and t parameters too, don't need to set manually
+ panel.domNode.style.top = 0;
+ box = {w: size, h: this.paneHeight};
+ if(panel.resize){
+ panel.resize(box);
+ }else{
+ domGeometry.setMarginBox(panel.domNode, box);
+ }
+ }else{
+ panel.domNode.style.left = 0; // TODO: resize() takes l and t parameters too, don't need to set manually
+ panel.domNode.style.top = pos + 'px';
+ box = {w: this.paneWidth, h: size};
+ if(panel.resize){
+ panel.resize(box);
+ }else{
+ domGeometry.setMarginBox(panel.domNode, box);
+ }
+ }
+ },
+
+ _moveSlider: function(slider, pos, size){
+ if(this.isHorizontal){
+ slider.style.left = pos + 'px';
+ slider.style.top = 0;
+ domGeometry.setMarginBox(slider, { w: size, h: this.paneHeight });
+ }else{
+ slider.style.left = 0;
+ slider.style.top = pos + 'px';
+ domGeometry.setMarginBox(slider, { w: this.paneWidth, h: size });
+ }
+ },
+
+ _growPane: function(growth, pane){
+ if(growth > 0){
+ if(pane.sizeActual > pane.sizeMin){
+ if((pane.sizeActual - pane.sizeMin) > growth){
+
+ // stick all the growth in this pane
+ pane.sizeActual = pane.sizeActual - growth;
+ growth = 0;
+ }else{
+ // put as much growth in here as we can
+ growth -= pane.sizeActual - pane.sizeMin;
+ pane.sizeActual = pane.sizeMin;
+ }
+ }
+ }
+ return growth;
+ },
+
+ _checkSizes: function(){
+
+ var totalMinSize = 0;
+ var totalSize = 0;
+ var children = this.getChildren();
+
+ array.forEach(children, function(child){
+ totalSize += child.sizeActual;
+ totalMinSize += child.sizeMin;
+ });
+
+ // only make adjustments if we have enough space for all the minimums
+
+ if(totalMinSize <= totalSize){
+
+ var growth = 0;
+
+ array.forEach(children, function(child){
+ if(child.sizeActual < child.sizeMin){
+ growth += child.sizeMin - child.sizeActual;
+ child.sizeActual = child.sizeMin;
+ }
+ });
+
+ if(growth > 0){
+ var list = this.isDraggingLeft ? children.reverse() : children;
+ array.forEach(list, function(child){
+ growth = this._growPane(growth, child);
+ }, this);
+ }
+ }else{
+ array.forEach(children, function(child){
+ child.sizeActual = Math.round(totalSize * (child.sizeMin / totalMinSize));
+ });
+ }
+ },
+
+ beginSizing: function(e, i){
+ // summary:
+ // Begin dragging the splitter between child[i] and child[i+1]
+
+ var children = this.getChildren();
+
+ this.paneBefore = children[i];
+ this.paneAfter = children[i+1];
+
+ this.paneBefore.sizeBeforeDrag = this.paneBefore.sizeActual;
+ this.paneAfter.sizeBeforeDrag = this.paneAfter.sizeActual;
+ this.paneAfter.positionBeforeDrag = this.paneAfter.position;
+
+ this.isSizing = true;
+ this.sizingSplitter = this.sizers[i];
+ this.sizingSplitter.positionBeforeDrag = domStyle.get(this.sizingSplitter,(this.isHorizontal ? "left" : "top"));
+
+ if(!this.cover){
+ this.cover = domConstruct.create('div', {
+ style: {
+ position:'absolute',
+ zIndex:5,
+ top: 0,
+ left: 0,
+ width: "100%",
+ height: "100%"
+ }
+ }, this.domNode);
+ }else{
+ this.cover.style.zIndex = 5;
+ }
+ this.sizingSplitter.style.zIndex = 6;
+
+ // startPoint is the e.pageX or e.pageY at start of drag
+ this.startPoint = this.lastPoint = (this.isHorizontal ? e.pageX : e.pageY);
+
+ // Calculate maximum to the left or right that splitter is allowed to be dragged
+ // minDelta is negative to indicate left/upward drag where end.pageX < start.pageX.
+ this.maxDelta = this.paneAfter.sizeActual - this.paneAfter.sizeMin;
+ this.minDelta = -1 * (this.paneBefore.sizeActual - this.paneBefore.sizeMin);
+
+ if(!this.activeSizing){
+ this._showSizingLine();
+ }
+
+ // attach mouse events
+ this._ownconnects = [
+ on(this.ownerDocument.documentElement, "mousemove", lang.hitch(this, "changeSizing")),
+ on(this.ownerDocument.documentElement, "mouseup", lang.hitch(this, "endSizing"))
+ ];
+
+ event.stop(e);
+ },
+
+ changeSizing: function(e){
+ // summary:
+ // Called on mousemove while dragging the splitter
+
+ if(!this.isSizing){ return; }
+
+ // lastPoint is the most recent e.pageX or e.pageY during the drag
+ this.lastPoint = this.isHorizontal ? e.pageX : e.pageY;
+ var delta = Math.max(Math.min(this.lastPoint - this.startPoint, this.maxDelta), this.minDelta);
+
+ if(this.activeSizing){
+ this._updateSize(delta);
+ }else{
+ this._moveSizingLine(delta);
+ }
+ event.stop(e);
+ },
+
+ endSizing: function(){
+ if(!this.isSizing){ return; }
+ if(this.cover){
+ this.cover.style.zIndex = -1;
+ }
+ if(!this.activeSizing){
+ this._hideSizingLine();
+ }
+
+ var delta = Math.max(Math.min(this.lastPoint - this.startPoint, this.maxDelta), this.minDelta);
+ this._updateSize(delta);
+
+ this.isSizing = false;
+
+ if(this.persist){
+ this._saveState(this);
+ }
+
+ var h;
+ while(h = this._ownconnects.pop()){ h.remove(); }
+ },
+
+ _updateSize: function(/*Number*/ delta){
+ // summary:
+ // Resets sizes of panes before and after splitter being dragged.
+ // Called during a drag, for active sizing, or at the end of a drag otherwise.
+ // delta: Number
+ // Change in slider position compared to start of drag. But note that
+ // this function may be called multiple times during drag.
+
+ this.paneBefore.sizeActual = this.paneBefore.sizeBeforeDrag + delta;
+ this.paneAfter.position = this.paneAfter.positionBeforeDrag + delta;
+ this.paneAfter.sizeActual = this.paneAfter.sizeBeforeDrag - delta;
+
+ array.forEach(this.getChildren(), function(child){
+ child.sizeShare = child.sizeActual;
+ });
+
+ if(this._started){
+ this.layout();
+ }
+ },
+
+ _showSizingLine: function(){
+ // summary:
+ // Show virtual splitter, for non-active resizing
+
+ this._moveSizingLine(0);
+
+ domGeometry.setMarginBox(this.virtualSizer,
+ this.isHorizontal ? { w: this.sizerWidth, h: this.paneHeight } : { w: this.paneWidth, h: this.sizerWidth });
+
+ this.virtualSizer.style.display = 'block';
+ },
+
+ _hideSizingLine: function(){
+ this.virtualSizer.style.display = 'none';
+ },
+
+ _moveSizingLine: function(/*Number*/ delta){
+ // summary:
+ // Called for non-active resizing, to move the virtual splitter without adjusting the size of the panes
+ var pos = delta + this.sizingSplitter.positionBeforeDrag;
+ domStyle.set(this.virtualSizer,(this.isHorizontal ? "left" : "top"),pos+"px");
+ },
+
+ _getCookieName: function(i){
+ return this.id + "_" + i;
+ },
+
+ _restoreState: function(){
+ array.forEach(this.getChildren(), function(child, i){
+ var cookieName = this._getCookieName(i);
+ var cookieValue = cookie(cookieName);
+ if(cookieValue){
+ var pos = parseInt(cookieValue);
+ if(typeof pos == "number"){
+ child.sizeShare = pos;
+ }
+ }
+ }, this);
+ },
+
+ _saveState: function(){
+ if(!this.persist){
+ return;
+ }
+ array.forEach(this.getChildren(), function(child, i){
+ cookie(this._getCookieName(i), child.sizeShare, {expires:365});
+ }, this);
+ }
+});
+
+SplitContainer.ChildWidgetProperties = {
+ // summary:
+ // These properties can be specified for the children of a SplitContainer.
+
+ // sizeMin: [deprecated] Integer
+ // Minimum size (width or height) of a child of a SplitContainer.
+ // The value is relative to other children's sizeShare properties.
+ sizeMin: 10,
+
+ // sizeShare: [deprecated] Integer
+ // Size (width or height) of a child of a SplitContainer.
+ // The value is relative to other children's sizeShare properties.
+ // For example, if there are two children and each has sizeShare=10, then
+ // each takes up 50% of the available space.
+ sizeShare: 10
+};
+
+// Since any widget can be specified as a SplitContainer child, mix them
+// into the base widget class. (This is a hack, but it's effective.)
+// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer.
+lang.extend(_WidgetBase, /*===== {} || =====*/ SplitContainer.ChildWidgetProperties);
+
+return SplitContainer;
+
+});
diff --git a/lib/dijit/layout/StackContainer.js b/lib/dijit/layout/StackContainer.js
index b3e5ac15c..0035b4911 100644
--- a/lib/dijit/layout/StackContainer.js
+++ b/lib/dijit/layout/StackContainer.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/StackContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/ready","dojo/topic","../registry","../_WidgetBase","./_LayoutWidget","dojo/i18n!../nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){if(!_5.isAsync){_7(0,function(){var _c=["dijit/layout/StackController"];require(_c);});}_6.extend(_a,{selected:false,closable:false,iconClass:"dijitNoIcon",showTitle:true});return _3("dijit.layout.StackContainer",_b,{doLayout:true,persist:false,baseClass:"dijitStackContainer",buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitLayoutContainer");this.containerNode.setAttribute("role","tabpanel");},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _d=this.getChildren();_1.forEach(_d,this._setupChild,this);if(this.persist){this.selectedChildWidget=_9.byId(_2(this.id+"_selectedChild"));}else{_1.some(_d,function(_e){if(_e.selected){this.selectedChildWidget=_e;}return _e.selected;},this);}var _f=this.selectedChildWidget;if(!_f&&_d[0]){_f=this.selectedChildWidget=_d[0];_f.selected=true;}_8.publish(this.id+"-startup",{children:_d,selected:_f});this.inherited(arguments);},resize:function(){if(!this._hasBeenShown){this._hasBeenShown=true;var _10=this.selectedChildWidget;if(_10){this._showChild(_10);}}this.inherited(arguments);},_setupChild:function(_11){this.inherited(arguments);_4.replace(_11.domNode,"dijitHidden","dijitVisible");_11.domNode.title="";},addChild:function(_12,_13){this.inherited(arguments);if(this._started){_8.publish(this.id+"-addChild",_12,_13);this.layout();if(!this.selectedChildWidget){this.selectChild(_12);}}},removeChild:function(_14){this.inherited(arguments);if(this._started){_8.publish(this.id+"-removeChild",_14);}if(this._descendantsBeingDestroyed){return;}if(this.selectedChildWidget===_14){this.selectedChildWidget=undefined;if(this._started){var _15=this.getChildren();if(_15.length){this.selectChild(_15[0]);}}}if(this._started){this.layout();}},selectChild:function(_16,_17){_16=_9.byId(_16);if(this.selectedChildWidget!=_16){var d=this._transition(_16,this.selectedChildWidget,_17);this._set("selectedChildWidget",_16);_8.publish(this.id+"-selectChild",_16);if(this.persist){_2(this.id+"_selectedChild",this.selectedChildWidget.id);}}return d;},_transition:function(_18,_19){if(_19){this._hideChild(_19);}var d=this._showChild(_18);if(_18.resize){if(this.doLayout){_18.resize(this._containerContentBox||this._contentBox);}else{_18.resize();}}return d;},_adjacent:function(_1a){var _1b=this.getChildren();var _1c=_1.indexOf(_1b,this.selectedChildWidget);_1c+=_1a?1:_1b.length-1;return _1b[_1c%_1b.length];},forward:function(){return this.selectChild(this._adjacent(true),true);},back:function(){return this.selectChild(this._adjacent(false),true);},_onKeyPress:function(e){_8.publish(this.id+"-containerKeyPress",{e:e,page:this});},layout:function(){var _1d=this.selectedChildWidget;if(_1d&&_1d.resize){if(this.doLayout){_1d.resize(this._containerContentBox||this._contentBox);}else{_1d.resize();}}},_showChild:function(_1e){var _1f=this.getChildren();_1e.isFirstChild=(_1e==_1f[0]);_1e.isLastChild=(_1e==_1f[_1f.length-1]);_1e._set("selected",true);_4.replace(_1e.domNode,"dijitVisible","dijitHidden");return (_1e._onShow&&_1e._onShow())||true;},_hideChild:function(_20){_20._set("selected",false);_4.replace(_20.domNode,"dijitHidden","dijitVisible");_20.onHide&&_20.onHide();},closeChild:function(_21){var _22=_21.onClose(this,_21);if(_22){this.removeChild(_21);_21.destroyRecursive();}},destroyDescendants:function(_23){this._descendantsBeingDestroyed=true;this.selectedChildWidget=undefined;_1.forEach(this.getChildren(),function(_24){if(!_23){this.removeChild(_24);}_24.destroyRecursive(_23);},this);this._descendantsBeingDestroyed=false;}});}); \ No newline at end of file
+define("dijit/layout/StackContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom-class","dojo/has","dojo/_base/lang","dojo/ready","dojo/topic","../registry","../_WidgetBase","./_LayoutWidget","dojo/i18n!../nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){if(_5("dijit-legacy-requires")){_7(0,function(){var _c=["dijit/layout/StackController"];require(_c);});}var _d=_3("dijit.layout.StackContainer",_b,{doLayout:true,persist:false,baseClass:"dijitStackContainer",buildRendering:function(){this.inherited(arguments);_4.add(this.domNode,"dijitLayoutContainer");this.containerNode.setAttribute("role","tabpanel");},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _e=this.getChildren();_1.forEach(_e,this._setupChild,this);if(this.persist){this.selectedChildWidget=_9.byId(_2(this.id+"_selectedChild"));}else{_1.some(_e,function(_f){if(_f.selected){this.selectedChildWidget=_f;}return _f.selected;},this);}var _10=this.selectedChildWidget;if(!_10&&_e[0]){_10=this.selectedChildWidget=_e[0];_10.selected=true;}_8.publish(this.id+"-startup",{children:_e,selected:_10});this.inherited(arguments);},resize:function(){if(!this._hasBeenShown){this._hasBeenShown=true;var _11=this.selectedChildWidget;if(_11){this._showChild(_11);}}this.inherited(arguments);},_setupChild:function(_12){this.inherited(arguments);_4.replace(_12.domNode,"dijitHidden","dijitVisible");_12.domNode.title="";},addChild:function(_13,_14){this.inherited(arguments);if(this._started){_8.publish(this.id+"-addChild",_13,_14);this.layout();if(!this.selectedChildWidget){this.selectChild(_13);}}},removeChild:function(_15){this.inherited(arguments);if(this._started){_8.publish(this.id+"-removeChild",_15);}if(this._descendantsBeingDestroyed){return;}if(this.selectedChildWidget===_15){this.selectedChildWidget=undefined;if(this._started){var _16=this.getChildren();if(_16.length){this.selectChild(_16[0]);}}}if(this._started){this.layout();}},selectChild:function(_17,_18){_17=_9.byId(_17);if(this.selectedChildWidget!=_17){var d=this._transition(_17,this.selectedChildWidget,_18);this._set("selectedChildWidget",_17);_8.publish(this.id+"-selectChild",_17);if(this.persist){_2(this.id+"_selectedChild",this.selectedChildWidget.id);}}return d;},_transition:function(_19,_1a){if(_1a){this._hideChild(_1a);}var d=this._showChild(_19);if(_19.resize){if(this.doLayout){_19.resize(this._containerContentBox||this._contentBox);}else{_19.resize();}}return d;},_adjacent:function(_1b){var _1c=this.getChildren();var _1d=_1.indexOf(_1c,this.selectedChildWidget);_1d+=_1b?1:_1c.length-1;return _1c[_1d%_1c.length];},forward:function(){return this.selectChild(this._adjacent(true),true);},back:function(){return this.selectChild(this._adjacent(false),true);},_onKeyPress:function(e){_8.publish(this.id+"-containerKeyPress",{e:e,page:this});},layout:function(){var _1e=this.selectedChildWidget;if(_1e&&_1e.resize){if(this.doLayout){_1e.resize(this._containerContentBox||this._contentBox);}else{_1e.resize();}}},_showChild:function(_1f){var _20=this.getChildren();_1f.isFirstChild=(_1f==_20[0]);_1f.isLastChild=(_1f==_20[_20.length-1]);_1f._set("selected",true);_4.replace(_1f.domNode,"dijitVisible","dijitHidden");return (_1f._onShow&&_1f._onShow())||true;},_hideChild:function(_21){_21._set("selected",false);_4.replace(_21.domNode,"dijitHidden","dijitVisible");_21.onHide&&_21.onHide();},closeChild:function(_22){var _23=_22.onClose(this,_22);if(_23){this.removeChild(_22);_22.destroyRecursive();}},destroyDescendants:function(_24){this._descendantsBeingDestroyed=true;this.selectedChildWidget=undefined;_1.forEach(this.getChildren(),function(_25){if(!_24){this.removeChild(_25);}_25.destroyRecursive(_24);},this);this._descendantsBeingDestroyed=false;}});_d.ChildWidgetProperties={selected:false,disabled:false,closable:false,iconClass:"dijitNoIcon",showTitle:true};_6.extend(_a,_d.ChildWidgetProperties);return _d;}); \ No newline at end of file
diff --git a/lib/dijit/layout/StackContainer.js.uncompressed.js b/lib/dijit/layout/StackContainer.js.uncompressed.js
new file mode 100644
index 000000000..864c4f478
--- /dev/null
+++ b/lib/dijit/layout/StackContainer.js.uncompressed.js
@@ -0,0 +1,374 @@
+define("dijit/layout/StackContainer", [
+ "dojo/_base/array", // array.forEach array.indexOf array.some
+ "dojo/cookie", // cookie
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.replace
+ "dojo/has", // has("dijit-legacy-requires")
+ "dojo/_base/lang", // lang.extend
+ "dojo/ready",
+ "dojo/topic", // publish
+ "../registry", // registry.byId
+ "../_WidgetBase",
+ "./_LayoutWidget",
+ "dojo/i18n!../nls/common"
+], function(array, cookie, declare, domClass, has, lang, ready, topic,
+ registry, _WidgetBase, _LayoutWidget){
+
+// module:
+// dijit/layout/StackContainer
+
+// Back compat w/1.6, remove for 2.0
+if(has("dijit-legacy-requires")){
+ ready(0, function(){
+ var requires = ["dijit/layout/StackController"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+var StackContainer = declare("dijit.layout.StackContainer", _LayoutWidget, {
+ // summary:
+ // A container that has multiple children, but shows only
+ // one child at a time
+ //
+ // description:
+ // A container for widgets (ContentPanes, for example) That displays
+ // only one Widget at a time.
+ //
+ // Publishes topics [widgetId]-addChild, [widgetId]-removeChild, and [widgetId]-selectChild
+ //
+ // Can be base class for container, Wizard, Show, etc.
+ //
+ // See `StackContainer.ChildWidgetProperties` for details on the properties that can be set on
+ // children of a `StackContainer`.
+
+ // doLayout: Boolean
+ // If true, change the size of my currently displayed child to match my size
+ doLayout: true,
+
+ // persist: Boolean
+ // Remembers the selected child across sessions
+ persist: false,
+
+ baseClass: "dijitStackContainer",
+
+/*=====
+ // selectedChildWidget: [readonly] dijit._Widget
+ // References the currently selected child widget, if any.
+ // Adjust selected child with selectChild() method.
+ selectedChildWidget: null,
+=====*/
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ domClass.add(this.domNode, "dijitLayoutContainer");
+ this.containerNode.setAttribute("role", "tabpanel");
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ this.connect(this.domNode, "onkeypress", this._onKeyPress);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ var children = this.getChildren();
+
+ // Setup each page panel to be initially hidden
+ array.forEach(children, this._setupChild, this);
+
+ // Figure out which child to initially display, defaulting to first one
+ if(this.persist){
+ this.selectedChildWidget = registry.byId(cookie(this.id + "_selectedChild"));
+ }else{
+ array.some(children, function(child){
+ if(child.selected){
+ this.selectedChildWidget = child;
+ }
+ return child.selected;
+ }, this);
+ }
+ var selected = this.selectedChildWidget;
+ if(!selected && children[0]){
+ selected = this.selectedChildWidget = children[0];
+ selected.selected = true;
+ }
+
+ // Publish information about myself so any StackControllers can initialize.
+ // This needs to happen before this.inherited(arguments) so that for
+ // TabContainer, this._contentBox doesn't include the space for the tab labels.
+ topic.publish(this.id+"-startup", {children: children, selected: selected});
+
+ // Startup each child widget, and do initial layout like setting this._contentBox,
+ // then calls this.resize() which does the initial sizing on the selected child.
+ this.inherited(arguments);
+ },
+
+ resize: function(){
+ // Overrides _LayoutWidget.resize()
+ // Resize is called when we are first made visible (it's called from startup()
+ // if we are initially visible). If this is the first time we've been made
+ // visible then show our first child.
+ if(!this._hasBeenShown){
+ this._hasBeenShown = true;
+ var selected = this.selectedChildWidget;
+ if(selected){
+ this._showChild(selected);
+ }
+ }
+ this.inherited(arguments);
+ },
+
+ _setupChild: function(/*dijit/_WidgetBase*/ child){
+ // Overrides _LayoutWidget._setupChild()
+
+ this.inherited(arguments);
+
+ domClass.replace(child.domNode, "dijitHidden", "dijitVisible");
+
+ // remove the title attribute so it doesn't show up when i hover
+ // over a node
+ child.domNode.title = "";
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){
+ // Overrides _Container.addChild() to do layout and publish events
+
+ this.inherited(arguments);
+
+ if(this._started){
+ topic.publish(this.id+"-addChild", child, insertIndex); // publish
+
+ // in case the tab titles have overflowed from one line to two lines
+ // (or, if this if first child, from zero lines to one line)
+ // TODO: w/ScrollingTabController this is no longer necessary, although
+ // ScrollTabController.resize() does need to get called to show/hide
+ // the navigation buttons as appropriate, but that's handled in ScrollingTabController.onAddChild().
+ // If this is updated to not layout [except for initial child added / last child removed], update
+ // "childless startup" test in StackContainer.html to check for no resize event after second addChild()
+ this.layout();
+
+ // if this is the first child, then select it
+ if(!this.selectedChildWidget){
+ this.selectChild(child);
+ }
+ }
+ },
+
+ removeChild: function(/*dijit/_WidgetBase*/ page){
+ // Overrides _Container.removeChild() to do layout and publish events
+
+ this.inherited(arguments);
+
+ if(this._started){
+ // this will notify any tablists to remove a button; do this first because it may affect sizing
+ topic.publish(this.id + "-removeChild", page); // publish
+ }
+
+ // If all our children are being destroyed than don't run the code below (to select another page),
+ // because we are deleting every page one by one
+ if(this._descendantsBeingDestroyed){ return; }
+
+ // Select new page to display, also updating TabController to show the respective tab.
+ // Do this before layout call because it can affect the height of the TabController.
+ if(this.selectedChildWidget === page){
+ this.selectedChildWidget = undefined;
+ if(this._started){
+ var children = this.getChildren();
+ if(children.length){
+ this.selectChild(children[0]);
+ }
+ }
+ }
+
+ if(this._started){
+ // In case the tab titles now take up one line instead of two lines
+ // (note though that ScrollingTabController never overflows to multiple lines),
+ // or the height has changed slightly because of addition/removal of tab which close icon
+ this.layout();
+ }
+ },
+
+ selectChild: function(/*dijit/_WidgetBase|String*/ page, /*Boolean*/ animate){
+ // summary:
+ // Show the given widget (which must be one of my children)
+ // page:
+ // Reference to child widget or id of child widget
+
+ page = registry.byId(page);
+
+ if(this.selectedChildWidget != page){
+ // Deselect old page and select new one
+ var d = this._transition(page, this.selectedChildWidget, animate);
+ this._set("selectedChildWidget", page);
+ topic.publish(this.id+"-selectChild", page); // publish
+
+ if(this.persist){
+ cookie(this.id + "_selectedChild", this.selectedChildWidget.id);
+ }
+ }
+
+ return d; // If child has an href, promise that fires when the child's href finishes loading
+ },
+
+ _transition: function(newWidget, oldWidget /*===== , animate =====*/){
+ // summary:
+ // Hide the old widget and display the new widget.
+ // Subclasses should override this.
+ // newWidget: dijit/_WidgetBase
+ // The newly selected widget.
+ // oldWidget: dijit/_WidgetBase
+ // The previously selected widget.
+ // animate: Boolean
+ // Used by AccordionContainer to turn on/off slide effect.
+ // tags:
+ // protected extension
+ if(oldWidget){
+ this._hideChild(oldWidget);
+ }
+ var d = this._showChild(newWidget);
+
+ // Size the new widget, in case this is the first time it's being shown,
+ // or I have been resized since the last time it was shown.
+ // Note that page must be visible for resizing to work.
+ if(newWidget.resize){
+ if(this.doLayout){
+ newWidget.resize(this._containerContentBox || this._contentBox);
+ }else{
+ // the child should pick it's own size but we still need to call resize()
+ // (with no arguments) to let the widget lay itself out
+ newWidget.resize();
+ }
+ }
+
+ return d; // If child has an href, promise that fires when the child's href finishes loading
+ },
+
+ _adjacent: function(/*Boolean*/ forward){
+ // summary:
+ // Gets the next/previous child widget in this container from the current selection.
+
+ // TODO: remove for 2.0 if this isn't being used. Otherwise, fix to skip disabled tabs.
+
+ var children = this.getChildren();
+ var index = array.indexOf(children, this.selectedChildWidget);
+ index += forward ? 1 : children.length - 1;
+ return children[ index % children.length ]; // dijit/_WidgetBase
+ },
+
+ forward: function(){
+ // summary:
+ // Advance to next page.
+ return this.selectChild(this._adjacent(true), true);
+ },
+
+ back: function(){
+ // summary:
+ // Go back to previous page.
+ return this.selectChild(this._adjacent(false), true);
+ },
+
+ _onKeyPress: function(e){
+ topic.publish(this.id+"-containerKeyPress", { e: e, page: this}); // publish
+ },
+
+ layout: function(){
+ // Implement _LayoutWidget.layout() virtual method.
+ var child = this.selectedChildWidget;
+ if(child && child.resize){
+ if(this.doLayout){
+ child.resize(this._containerContentBox || this._contentBox);
+ }else{
+ child.resize();
+ }
+ }
+ },
+
+ _showChild: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Show the specified child by changing it's CSS, and call _onShow()/onShow() so
+ // it can do any updates it needs regarding loading href's etc.
+ // returns:
+ // Promise that fires when page has finished showing, or true if there's no href
+ var children = this.getChildren();
+ page.isFirstChild = (page == children[0]);
+ page.isLastChild = (page == children[children.length-1]);
+ page._set("selected", true);
+
+ domClass.replace(page.domNode, "dijitVisible", "dijitHidden");
+
+ return (page._onShow && page._onShow()) || true;
+ },
+
+ _hideChild: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Hide the specified child by changing it's CSS, and call _onHide() so
+ // it's notified.
+ page._set("selected", false);
+ domClass.replace(page.domNode, "dijitHidden", "dijitVisible");
+
+ page.onHide && page.onHide();
+ },
+
+ closeChild: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Callback when user clicks the [X] to remove a page.
+ // If onClose() returns true then remove and destroy the child.
+ // tags:
+ // private
+ var remove = page.onClose(this, page);
+ if(remove){
+ this.removeChild(page);
+ // makes sure we can clean up executeScripts in ContentPane onUnLoad
+ page.destroyRecursive();
+ }
+ },
+
+ destroyDescendants: function(/*Boolean*/ preserveDom){
+ this._descendantsBeingDestroyed = true;
+ this.selectedChildWidget = undefined;
+ array.forEach(this.getChildren(), function(child){
+ if(!preserveDom){
+ this.removeChild(child);
+ }
+ child.destroyRecursive(preserveDom);
+ }, this);
+ this._descendantsBeingDestroyed = false;
+ }
+});
+
+StackContainer.ChildWidgetProperties = {
+ // summary:
+ // These properties can be specified for the children of a StackContainer.
+
+ // selected: Boolean
+ // Specifies that this widget should be the initially displayed pane.
+ // Note: to change the selected child use `dijit/layout/StackContainer.selectChild`
+ selected: false,
+
+ // disabled: Boolean
+ // Specifies that the button to select this pane should be disabled.
+ // Doesn't affect programmatic selection of the pane, nor does it deselect the pane if it is currently selected.
+ disabled: false,
+
+ // closable: Boolean
+ // True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
+ closable: false,
+
+ // iconClass: String
+ // CSS Class specifying icon to use in label associated with this pane.
+ iconClass: "dijitNoIcon",
+
+ // showTitle: Boolean
+ // When true, display title of this widget as tab label etc., rather than just using
+ // icon specified in iconClass
+ showTitle: true
+};
+
+// Since any widget can be specified as a StackContainer child, mix them
+// into the base widget class. (This is a hack, but it's effective.)
+// This is for the benefit of the parser. Remove for 2.0. Also, hide from doc viewer.
+lang.extend(_WidgetBase, /*===== {} || =====*/ StackContainer.ChildWidgetProperties);
+
+return StackContainer;
+});
diff --git a/lib/dijit/layout/StackController.js b/lib/dijit/layout/StackController.js
index 504a9d717..c5de7ca38 100644
--- a/lib/dijit/layout/StackController.js
+++ b/lib/dijit/layout/StackController.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/StackController",["dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/_base/sniff","../focus","../registry","../_Widget","../_TemplatedMixin","../_Container","../form/ToggleButton","dojo/i18n!../nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){var _d=_2("dijit.layout._StackButton",_c,{tabIndex:"-1",closeButton:false,_setCheckedAttr:function(_e,_f){this.inherited(arguments);this.focusNode.removeAttribute("aria-pressed");},buildRendering:function(evt){this.inherited(arguments);(this.focusNode||this.domNode).setAttribute("role","tab");},onClick:function(){_7.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});var _10=_2("dijit.layout.StackController",[_9,_a,_b],{baseClass:"dijitStackController",templateString:"<span role='tablist' data-dojo-attach-event='onkeypress'></span>",containerId:"",buttonWidget:_d,constructor:function(){this.pane2button={};this.pane2connects={};this.pane2watches={};},postCreate:function(){this.inherited(arguments);this.subscribe(this.containerId+"-startup","onStartup");this.subscribe(this.containerId+"-addChild","onAddChild");this.subscribe(this.containerId+"-removeChild","onRemoveChild");this.subscribe(this.containerId+"-selectChild","onSelectChild");this.subscribe(this.containerId+"-containerKeyPress","onContainerKeyPress");},onStartup:function(_11){_1.forEach(_11.children,this.onAddChild,this);if(_11.selected){this.onSelectChild(_11.selected);}},destroy:function(){for(var _12 in this.pane2button){this.onRemoveChild(_8.byId(_12));}this.inherited(arguments);},onAddChild:function(_13,_14){var cls=_5.isString(this.buttonWidget)?_5.getObject(this.buttonWidget):this.buttonWidget;var _15=new cls({id:this.id+"_"+_13.id,label:_13.title,dir:_13.dir,lang:_13.lang,textDir:_13.textDir,showLabel:_13.showTitle,iconClass:_13.iconClass,closeButton:_13.closable,title:_13.tooltip});_15.focusNode.setAttribute("aria-selected","false");var _16=["title","showTitle","iconClass","closable","tooltip"],_17=["label","showLabel","iconClass","closeButton","title"];this.pane2watches[_13.id]=_1.map(_16,function(_18,idx){return _13.watch(_18,function(_19,_1a,_1b){_15.set(_17[idx],_1b);});});this.pane2connects[_13.id]=[this.connect(_15,"onClick",_5.hitch(this,"onButtonClick",_13)),this.connect(_15,"onClickCloseButton",_5.hitch(this,"onCloseButtonClick",_13))];this.addChild(_15,_14);this.pane2button[_13.id]=_15;_13.controlButton=_15;if(!this._currentChild){_15.focusNode.setAttribute("tabIndex","0");_15.focusNode.setAttribute("aria-selected","true");this._currentChild=_13;}if(!this.isLeftToRight()&&_6("ie")&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(_1c){if(this._currentChild===_1c){this._currentChild=null;}_1.forEach(this.pane2connects[_1c.id],_5.hitch(this,"disconnect"));delete this.pane2connects[_1c.id];_1.forEach(this.pane2watches[_1c.id],function(w){w.unwatch();});delete this.pane2watches[_1c.id];var _1d=this.pane2button[_1c.id];if(_1d){this.removeChild(_1d);delete this.pane2button[_1c.id];_1d.destroy();}delete _1c.controlButton;},onSelectChild:function(_1e){if(!_1e){return;}if(this._currentChild){var _1f=this.pane2button[this._currentChild.id];_1f.set("checked",false);_1f.focusNode.setAttribute("aria-selected","false");_1f.focusNode.setAttribute("tabIndex","-1");}var _20=this.pane2button[_1e.id];_20.set("checked",true);_20.focusNode.setAttribute("aria-selected","true");this._currentChild=_1e;_20.focusNode.setAttribute("tabIndex","0");var _21=_8.byId(this.containerId);_21.containerNode.setAttribute("aria-labelledby",_20.id);},onButtonClick:function(_22){if(this._currentChild.id===_22.id){var _23=this.pane2button[_22.id];_23.set("checked",true);}var _24=_8.byId(this.containerId);_24.selectChild(_22);},onCloseButtonClick:function(_25){var _26=_8.byId(this.containerId);_26.closeChild(_25);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){_7.focus(b.focusNode||b.domNode);}}},adjacent:function(_27){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_27=!_27;}var _28=this.getChildren();var _29=_1.indexOf(_28,this.pane2button[this._currentChild.id]);var _2a=_27?1:_28.length-1;return _28[(_29+_2a)%_28.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _2b=null;if(e.ctrlKey||!e._djpage){switch(e.charOrCode){case _4.LEFT_ARROW:case _4.UP_ARROW:if(!e._djpage){_2b=false;}break;case _4.PAGE_UP:if(e.ctrlKey){_2b=false;}break;case _4.RIGHT_ARROW:case _4.DOWN_ARROW:if(!e._djpage){_2b=true;}break;case _4.PAGE_DOWN:if(e.ctrlKey){_2b=true;}break;case _4.HOME:case _4.END:var _2c=this.getChildren();if(_2c&&_2c.length){_2c[e.charOrCode==_4.HOME?0:_2c.length-1].onClick();}_3.stop(e);break;case _4.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_3.stop(e);break;default:if(e.ctrlKey){if(e.charOrCode===_4.TAB){this.adjacent(!e.shiftKey).onClick();_3.stop(e);}else{if(e.charOrCode=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_3.stop(e);}}}}if(_2b!==null){this.adjacent(_2b).onClick();_3.stop(e);}}},onContainerKeyPress:function(_2d){_2d.e._djpage=_2d.page;this.onkeypress(_2d.e);}});_10.StackButton=_d;return _10;}); \ No newline at end of file
+define("dijit/layout/StackController",["dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","../focus","../registry","../_Widget","../_TemplatedMixin","../_Container","../form/ToggleButton","dojo/i18n!../nls/common"],function(_1,_2,_3,_4,_5,_6,on,_7,_8,_9,_a,_b,_c){var _d=_2("dijit.layout._StackButton",_c,{tabIndex:"-1",closeButton:false,_aria_attr:"aria-selected",buildRendering:function(_e){this.inherited(arguments);(this.focusNode||this.domNode).setAttribute("role","tab");}});var _f=_2("dijit.layout.StackController",[_9,_a,_b],{baseClass:"dijitStackController",templateString:"<span role='tablist' data-dojo-attach-event='onkeypress'></span>",containerId:"",buttonWidget:_d,buttonWidgetCloseClass:"dijitStackCloseButton",constructor:function(_10){this.pane2button={};},postCreate:function(){this.inherited(arguments);this.subscribe(this.containerId+"-startup","onStartup");this.subscribe(this.containerId+"-addChild","onAddChild");this.subscribe(this.containerId+"-removeChild","onRemoveChild");this.subscribe(this.containerId+"-selectChild","onSelectChild");this.subscribe(this.containerId+"-containerKeyPress","onContainerKeyPress");this.connect(this.containerNode,"click",function(evt){var _11=_8.getEnclosingWidget(evt.target);if(_11!=this.containerNode&&!_11.disabled&&_11.page){for(var _12=evt.target;_12!==this.containerNode;_12=_12.parentNode){if(_3.contains(_12,this.buttonWidgetCloseClass)){this.onCloseButtonClick(_11.page);break;}else{if(_12==_11.domNode){this.onButtonClick(_11.page);break;}}}}});},onStartup:function(_13){_1.forEach(_13.children,this.onAddChild,this);if(_13.selected){this.onSelectChild(_13.selected);}var _14=_8.byId(this.containerId).containerNode,_15=this.pane2button,_16={"title":"label","showtitle":"showLabel","iconclass":"iconClass","closable":"closeButton","tooltip":"title","disabled":"disabled"},_17=function(_18,_19){return on(_14,"attrmodified-"+_18,function(evt){var _1a=_15[evt.detail&&evt.detail.widget&&evt.detail.widget.id];if(_1a){_1a.set(_19,evt.detail.newValue);}});};for(var _1b in _16){this.own(_17(_1b,_16[_1b]));}},destroy:function(){for(var _1c in this.pane2button){this.onRemoveChild(_8.byId(_1c));}this.inherited(arguments);},onAddChild:function(_1d,_1e){var Cls=_6.isString(this.buttonWidget)?_6.getObject(this.buttonWidget):this.buttonWidget;var _1f=new Cls({id:this.id+"_"+_1d.id,name:this.id+"_"+_1d.id,label:_1d.title,disabled:_1d.disabled,ownerDocument:this.ownerDocument,dir:_1d.dir,lang:_1d.lang,textDir:_1d.textDir,showLabel:_1d.showTitle,iconClass:_1d.iconClass,closeButton:_1d.closable,title:_1d.tooltip,page:_1d});this.addChild(_1f,_1e);this.pane2button[_1d.id]=_1f;_1d.controlButton=_1f;if(!this._currentChild){this.onSelectChild(_1d);}},onRemoveChild:function(_20){if(this._currentChild===_20){this._currentChild=null;}var _21=this.pane2button[_20.id];if(_21){this.removeChild(_21);delete this.pane2button[_20.id];_21.destroy();}delete _20.controlButton;},onSelectChild:function(_22){if(!_22){return;}if(this._currentChild){var _23=this.pane2button[this._currentChild.id];_23.set("checked",false);_23.focusNode.setAttribute("tabIndex","-1");}var _24=this.pane2button[_22.id];_24.set("checked",true);this._currentChild=_22;_24.focusNode.setAttribute("tabIndex","0");var _25=_8.byId(this.containerId);_25.containerNode.setAttribute("aria-labelledby",_24.id);},onButtonClick:function(_26){var _27=this.pane2button[_26.id];_7.focus(_27.focusNode);if(this._currentChild&&this._currentChild.id===_26.id){_27.set("checked",true);}var _28=_8.byId(this.containerId);_28.selectChild(_26);},onCloseButtonClick:function(_29){var _2a=_8.byId(this.containerId);_2a.closeChild(_29);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){_7.focus(b.focusNode||b.domNode);}}},adjacent:function(_2b){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_2b=!_2b;}var _2c=this.getChildren();var idx=_1.indexOf(_2c,this.pane2button[this._currentChild.id]),_2d=_2c[idx];var _2e;do{idx=(idx+(_2b?1:_2c.length-1))%_2c.length;_2e=_2c[idx];}while(_2e.disabled&&_2e!=_2d);return _2e;},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _2f=null;if(e.ctrlKey||!e._djpage){switch(e.charOrCode){case _5.LEFT_ARROW:case _5.UP_ARROW:if(!e._djpage){_2f=false;}break;case _5.PAGE_UP:if(e.ctrlKey){_2f=false;}break;case _5.RIGHT_ARROW:case _5.DOWN_ARROW:if(!e._djpage){_2f=true;}break;case _5.PAGE_DOWN:if(e.ctrlKey){_2f=true;}break;case _5.HOME:var _30=this.getChildren();for(var idx=0;idx<_30.length;idx++){var _31=_30[idx];if(!_31.disabled){this.onButtonClick(_31.page);break;}}_4.stop(e);break;case _5.END:var _30=this.getChildren();for(var idx=_30.length-1;idx>=0;idx--){var _31=_30[idx];if(!_31.disabled){this.onButtonClick(_31.page);break;}}_4.stop(e);break;case _5.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_4.stop(e);break;default:if(e.ctrlKey){if(e.charOrCode===_5.TAB){this.onButtonClick(this.adjacent(!e.shiftKey).page);_4.stop(e);}else{if(e.charOrCode=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_4.stop(e);}}}}if(_2f!==null){this.onButtonClick(this.adjacent(_2f).page);_4.stop(e);}}},onContainerKeyPress:function(_32){_32.e._djpage=_32.page;this.onkeypress(_32.e);}});_f.StackButton=_d;return _f;}); \ No newline at end of file
diff --git a/lib/dijit/layout/StackController.js.uncompressed.js b/lib/dijit/layout/StackController.js.uncompressed.js
new file mode 100644
index 000000000..47e09ed46
--- /dev/null
+++ b/lib/dijit/layout/StackController.js.uncompressed.js
@@ -0,0 +1,390 @@
+define("dijit/layout/StackController", [
+ "dojo/_base/array", // array.forEach array.indexOf array.map
+ "dojo/_base/declare", // declare
+ "dojo/dom-class",
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.getObject
+ "dojo/on",
+ "../focus", // focus.focus()
+ "../registry", // registry.byId
+ "../_Widget",
+ "../_TemplatedMixin",
+ "../_Container",
+ "../form/ToggleButton",
+ "dojo/i18n!../nls/common"
+], function(array, declare, domClass, event, keys, lang, on,
+ focus, registry, _Widget, _TemplatedMixin, _Container, ToggleButton){
+
+ // module:
+ // dijit/layout/StackController
+
+ var StackButton = declare("dijit.layout._StackButton", ToggleButton, {
+ // summary:
+ // Internal widget used by StackContainer.
+ // description:
+ // The button-like or tab-like object you click to select or delete a page
+ // tags:
+ // private
+
+ // Override _FormWidget.tabIndex.
+ // StackContainer buttons are not in the tab order by default.
+ // Probably we should be calling this.startupKeyNavChildren() instead.
+ tabIndex: "-1",
+
+ // closeButton: Boolean
+ // When true, display close button for this tab
+ closeButton: false,
+
+ _aria_attr: "aria-selected",
+
+ buildRendering: function(/*Event*/ evt){
+ this.inherited(arguments);
+ (this.focusNode || this.domNode).setAttribute("role", "tab");
+ }
+ });
+
+
+ var StackController = declare("dijit.layout.StackController", [_Widget, _TemplatedMixin, _Container], {
+ // summary:
+ // Set of buttons to select a page in a `dijit/layout/StackContainer`
+ // description:
+ // Monitors the specified StackContainer, and whenever a page is
+ // added, deleted, or selected, updates itself accordingly.
+
+ baseClass: "dijitStackController",
+
+ templateString: "<span role='tablist' data-dojo-attach-event='onkeypress'></span>",
+
+ // containerId: [const] String
+ // The id of the page container that I point to
+ containerId: "",
+
+ // buttonWidget: [const] Constructor
+ // The button widget to create to correspond to each page
+ buttonWidget: StackButton,
+
+ // buttonWidgetCloseClass: String
+ // CSS class of [x] close icon, used by event delegation code to tell when close button was clicked
+ buttonWidgetCloseClass: "dijitStackCloseButton",
+
+ 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.pane2button = {}; // mapping from pane id to buttons
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Listen to notifications from StackContainer.
+ // TODO: do this through bubbled events instead of topics
+ this.subscribe(this.containerId+"-startup", "onStartup");
+ this.subscribe(this.containerId+"-addChild", "onAddChild");
+ this.subscribe(this.containerId+"-removeChild", "onRemoveChild");
+ this.subscribe(this.containerId+"-selectChild", "onSelectChild");
+ this.subscribe(this.containerId+"-containerKeyPress", "onContainerKeyPress");
+
+ // Listen for click events to select or close tabs.
+ // No need to worry about ENTER/SPACE key handling: tabs are selected via left/right arrow keys,
+ // and closed via shift-F10 (to show the close menu).
+ this.connect(this.containerNode, 'click', function(evt){
+ var button = registry.getEnclosingWidget(evt.target);
+ if(button != this.containerNode && !button.disabled && button.page){
+ for(var target = evt.target; target !== this.containerNode; target = target.parentNode){
+ if(domClass.contains(target, this.buttonWidgetCloseClass)){
+ this.onCloseButtonClick(button.page);
+ break;
+ }else if(target == button.domNode){
+ this.onButtonClick(button.page);
+ break;
+ }
+ }
+ }
+ });
+ },
+
+ onStartup: function(/*Object*/ info){
+ // summary:
+ // Called after StackContainer has finished initializing
+ // tags:
+ // private
+ array.forEach(info.children, this.onAddChild, this);
+ if(info.selected){
+ // Show button corresponding to selected pane (unless selected
+ // is null because there are no panes)
+ this.onSelectChild(info.selected);
+ }
+
+ // Reflect events like page title changes to tab buttons
+ var containerNode = registry.byId(this.containerId).containerNode,
+ pane2button = this.pane2button,
+ paneToButtonAttr = {
+ "title": "label",
+ "showtitle": "showLabel",
+ "iconclass": "iconClass",
+ "closable": "closeButton",
+ "tooltip": "title",
+ "disabled": "disabled"
+ },
+ connectFunc = function(attr, buttonAttr){
+ return on(containerNode, "attrmodified-" + attr, function(evt){
+ var button = pane2button[evt.detail && evt.detail.widget && evt.detail.widget.id];
+ if(button){
+ button.set(buttonAttr, evt.detail.newValue);
+ }
+ });
+ };
+ for(var attr in paneToButtonAttr){
+ this.own(connectFunc(attr, paneToButtonAttr[attr]));
+ }
+ },
+
+ destroy: function(){
+ // Since the buttons are internal to the StackController widget, destroy() should remove them, which is
+ // done by calling onRemoveChild().
+ for(var pane in this.pane2button){
+ this.onRemoveChild(registry.byId(pane));
+ }
+
+ // TODO: destroyRecursive() will call destroy() on each child button twice. Once from the above code,
+ // and once because _WidgetBase.destroyDescendants() deletes anything inside of this.containerNode.
+ // Probably shouldn't attach that DOMNode as this.containerNode.
+
+ this.inherited(arguments);
+ },
+
+ onAddChild: function(/*dijit/_WidgetBase*/ page, /*Integer?*/ insertIndex){
+ // summary:
+ // Called whenever a page is added to the container.
+ // Create button corresponding to the page.
+ // tags:
+ // private
+
+ // create an instance of the button widget
+ // (remove typeof buttonWidget == string support in 2.0)
+ var Cls = lang.isString(this.buttonWidget) ? lang.getObject(this.buttonWidget) : this.buttonWidget;
+ var button = new Cls({
+ id: this.id + "_" + page.id,
+ name: this.id + "_" + page.id,
+ label: page.title,
+ disabled: page.disabled,
+ ownerDocument: this.ownerDocument,
+ dir: page.dir,
+ lang: page.lang,
+ textDir: page.textDir,
+ showLabel: page.showTitle,
+ iconClass: page.iconClass,
+ closeButton: page.closable,
+ title: page.tooltip,
+ page: page
+ });
+
+ this.addChild(button, insertIndex);
+ this.pane2button[page.id] = button;
+ page.controlButton = button; // this value might be overwritten if two tabs point to same container
+ if(!this._currentChild){
+ // If this is the first child then StackContainer will soon publish that it's selected,
+ // but before that StackContainer calls layout(), and before layout() is called the
+ // StackController needs to have the proper height... which means that the button needs
+ // to be marked as selected now. See test_TabContainer_CSS.html for test.
+ this.onSelectChild(page);
+ }
+ },
+
+ onRemoveChild: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Called whenever a page is removed from the container.
+ // Remove the button corresponding to the page.
+ // tags:
+ // private
+
+ if(this._currentChild === page){ this._currentChild = null; }
+
+ var button = this.pane2button[page.id];
+ if(button){
+ this.removeChild(button);
+ delete this.pane2button[page.id];
+ button.destroy();
+ }
+ delete page.controlButton;
+ },
+
+ onSelectChild: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Called when a page has been selected in the StackContainer, either by me or by another StackController
+ // tags:
+ // private
+
+ if(!page){ return; }
+
+ if(this._currentChild){
+ var oldButton=this.pane2button[this._currentChild.id];
+ oldButton.set('checked', false);
+ oldButton.focusNode.setAttribute("tabIndex", "-1");
+ }
+
+ var newButton=this.pane2button[page.id];
+ newButton.set('checked', true);
+ this._currentChild = page;
+ newButton.focusNode.setAttribute("tabIndex", "0");
+ var container = registry.byId(this.containerId);
+ container.containerNode.setAttribute("aria-labelledby", newButton.id);
+ },
+
+ onButtonClick: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Called whenever one of my child buttons is pressed in an attempt to select a page
+ // tags:
+ // private
+
+ var button = this.pane2button[page.id];
+
+ // For TabContainer where the tabs are <span>, need to set focus explicitly when left/right arrow
+ focus.focus(button.focusNode);
+
+ if(this._currentChild && this._currentChild.id === page.id) {
+ //In case the user clicked the checked button, keep it in the checked state because it remains to be the selected stack page.
+ button.set('checked', true);
+ }
+ var container = registry.byId(this.containerId);
+ container.selectChild(page);
+ },
+
+ onCloseButtonClick: function(/*dijit/_WidgetBase*/ page){
+ // summary:
+ // Called whenever one of my child buttons [X] is pressed in an attempt to close a page
+ // tags:
+ // private
+
+ var container = registry.byId(this.containerId);
+ container.closeChild(page);
+ if(this._currentChild){
+ var b = this.pane2button[this._currentChild.id];
+ if(b){
+ focus.focus(b.focusNode || b.domNode);
+ }
+ }
+ },
+
+ // TODO: this is a bit redundant with forward, back api in StackContainer
+ adjacent: function(/*Boolean*/ forward){
+ // summary:
+ // Helper for onkeypress to find next/previous button
+ // tags:
+ // private
+
+ if(!this.isLeftToRight() && (!this.tabPosition || /top|bottom/.test(this.tabPosition))){ forward = !forward; }
+ // find currently focused button in children array
+ var children = this.getChildren();
+ var idx = array.indexOf(children, this.pane2button[this._currentChild.id]),
+ current = children[idx];
+
+ // Pick next/previous non-disabled button to focus on. If we get back to the original button it means
+ // that all buttons must be disabled, so return current child to avoid an infinite loop.
+ var child;
+ do{
+ idx = (idx + (forward ? 1 : children.length - 1)) % children.length;
+ child = children[idx];
+ }while(child.disabled && child != current);
+
+ return child; // dijit/_WidgetBase
+ },
+
+ onkeypress: function(/*Event*/ e){
+ // summary:
+ // Handle keystrokes on the page list, for advancing to next/previous button
+ // and closing the current page if the page is closable.
+ // tags:
+ // private
+
+ if(this.disabled || e.altKey ){ return; }
+ var forward = null;
+ if(e.ctrlKey || !e._djpage){
+ switch(e.charOrCode){
+ case keys.LEFT_ARROW:
+ case keys.UP_ARROW:
+ if(!e._djpage){ forward = false; }
+ break;
+ case keys.PAGE_UP:
+ if(e.ctrlKey){ forward = false; }
+ break;
+ case keys.RIGHT_ARROW:
+ case keys.DOWN_ARROW:
+ if(!e._djpage){ forward = true; }
+ break;
+ case keys.PAGE_DOWN:
+ if(e.ctrlKey){ forward = true; }
+ break;
+ case keys.HOME:
+ // Navigate to first non-disabled child
+ var children = this.getChildren();
+ for(var idx = 0; idx < children.length; idx++){
+ var child = children[idx];
+ if(!child.disabled){
+ this.onButtonClick(child.page);
+ break;
+ }
+ }
+ event.stop(e);
+ break;
+ case keys.END:
+ // Navigate to last non-disabled child
+ var children = this.getChildren();
+ for(var idx = children.length-1; idx >= 0; idx--){
+ var child = children[idx];
+ if(!child.disabled){
+ this.onButtonClick(child.page);
+ break;
+ }
+ }
+ event.stop(e);
+ break;
+ case keys.DELETE:
+ if(this._currentChild.closable){
+ this.onCloseButtonClick(this._currentChild);
+ }
+ event.stop(e);
+ break;
+ default:
+ if(e.ctrlKey){
+ if(e.charOrCode === keys.TAB){
+ this.onButtonClick(this.adjacent(!e.shiftKey).page);
+ event.stop(e);
+ }else if(e.charOrCode == "w"){
+ if(this._currentChild.closable){
+ this.onCloseButtonClick(this._currentChild);
+ }
+ event.stop(e); // avoid browser tab closing.
+ }
+ }
+ }
+ // handle next/previous page navigation (left/right arrow, etc.)
+ if(forward !== null){
+ this.onButtonClick(this.adjacent(forward).page);
+ event.stop(e);
+ }
+ }
+ },
+
+ onContainerKeyPress: function(/*Object*/ info){
+ // summary:
+ // Called when there was a keypress on the container
+ // tags:
+ // private
+ info.e._djpage = info.page;
+ this.onkeypress(info.e);
+ }
+ });
+
+ StackController.StackButton = StackButton; // for monkey patching
+
+ return StackController;
+});
diff --git a/lib/dijit/layout/TabContainer.js b/lib/dijit/layout/TabContainer.js
index a78ec4422..13db58c5c 100644
--- a/lib/dijit/layout/TabContainer.js
+++ b/lib/dijit/layout/TabContainer.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/TabContainer",["dojo/_base/lang","dojo/_base/declare","./_TabContainerBase","./TabController","./ScrollingTabController"],function(_1,_2,_3,_4,_5){return _2("dijit.layout.TabContainer",_3,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_6){var _7=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_4=_1.getObject(this.controllerWidget);return new _4({id:this.id+"_tablist",dir:this.dir,lang:this.lang,textDir:this.textDir,tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id,"class":_7,nested:this.nested,useMenu:this.useMenu,useSlider:this.useSlider,tabStripClass:this.tabStrip?this.baseClass+(this.tabStrip?"":"No")+"Strip":null},_6);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";}}});}); \ No newline at end of file
+define("dijit/layout/TabContainer",["dojo/_base/lang","dojo/_base/declare","./_TabContainerBase","./TabController","./ScrollingTabController"],function(_1,_2,_3,_4,_5){return _2("dijit.layout.TabContainer",_3,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_6){var _7=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_4=typeof this.controllerWidget=="string"?_1.getObject(this.controllerWidget):this.controllerWidget;return new _4({id:this.id+"_tablist",ownerDocument:this.ownerDocument,dir:this.dir,lang:this.lang,textDir:this.textDir,tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id,"class":_7,nested:this.nested,useMenu:this.useMenu,useSlider:this.useSlider,tabStripClass:this.tabStrip?this.baseClass+(this.tabStrip?"":"No")+"Strip":null},_6);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?_5:_4;}}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/TabContainer.js.uncompressed.js b/lib/dijit/layout/TabContainer.js.uncompressed.js
new file mode 100644
index 000000000..929f9e21d
--- /dev/null
+++ b/lib/dijit/layout/TabContainer.js.uncompressed.js
@@ -0,0 +1,77 @@
+define("dijit/layout/TabContainer", [
+ "dojo/_base/lang", // lang.getObject
+ "dojo/_base/declare", // declare
+ "./_TabContainerBase",
+ "./TabController",
+ "./ScrollingTabController"
+], function(lang, declare, _TabContainerBase, TabController, ScrollingTabController){
+
+ // module:
+ // dijit/layout/TabContainer
+
+
+ return declare("dijit.layout.TabContainer", _TabContainerBase, {
+ // summary:
+ // A Container with tabs to select each child (only one of which is displayed at a time).
+ // description:
+ // A TabContainer is a container that has multiple panes, but shows only
+ // one pane at a time. There are a set of tabs corresponding to each pane,
+ // where each tab has the name (aka title) of the pane, and optionally a close button.
+ //
+ // See `StackContainer.ChildWidgetProperties` for details on the properties that can be set on
+ // children of a `TabContainer`.
+
+ // useMenu: [const] Boolean
+ // True if a menu should be used to select tabs when they are too
+ // wide to fit the TabContainer, false otherwise.
+ useMenu: true,
+
+ // useSlider: [const] Boolean
+ // True if a slider should be used to select tabs when they are too
+ // wide to fit the TabContainer, false otherwise.
+ useSlider: true,
+
+ // controllerWidget: Class
+ // An optional parameter to override the widget used to display the tab labels
+ controllerWidget: "",
+
+ _makeController: function(/*DomNode*/ srcNode){
+ // summary:
+ // Instantiate tablist controller widget and return reference to it.
+ // Callback from _TabContainerBase.postCreate().
+ // tags:
+ // protected extension
+
+ // "string" branch for back-compat, remove for 2.0
+ var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"),
+ TabController = typeof this.controllerWidget == "string" ? lang.getObject(this.controllerWidget) :
+ this.controllerWidget;
+
+ return new TabController({
+ id: this.id + "_tablist",
+ ownerDocument: this.ownerDocument,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir,
+ tabPosition: this.tabPosition,
+ doLayout: this.doLayout,
+ containerId: this.id,
+ "class": cls,
+ nested: this.nested,
+ useMenu: this.useMenu,
+ useSlider: this.useSlider,
+ tabStripClass: this.tabStrip ? this.baseClass + (this.tabStrip ? "":"No") + "Strip": null
+ }, srcNode);
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+
+ // Scrolling controller only works for horizontal non-nested tabs
+ if(!this.controllerWidget){
+ this.controllerWidget = (this.tabPosition == "top" || this.tabPosition == "bottom") && !this.nested ?
+ ScrollingTabController : TabController;
+ }
+ }
+ });
+});
diff --git a/lib/dijit/layout/TabController.js b/lib/dijit/layout/TabController.js
index 28c26d91e..64c430327 100644
--- a/lib/dijit/layout/TabController.js
+++ b/lib/dijit/layout/TabController.js
@@ -1,2 +1,2 @@
//>>built
-require({cache:{"url:dijit/layout/templates/_TabButton.html":"<div role=\"presentation\" data-dojo-attach-point=\"titleNode\" data-dojo-attach-event='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' data-dojo-attach-point='tabContent'>\n \t<div role=\"presentation\" data-dojo-attach-point='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode' />\n\t\t <span data-dojo-attach-point='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t \t\tdata-dojo-attach-event='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n"}});define("dijit/layout/TabController",["dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/i18n","dojo/_base/lang","./StackController","../Menu","../MenuItem","dojo/text!./templates/_TabButton.html","dojo/i18n!../nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){var _b=_1("dijit.layout._TabButton",_7.StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:_a,scrollOnFocus:false,buildRendering:function(){this.inherited(arguments);_2.setSelectable(this.containerNode,false);},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(_c){this._set("closeButton",_c);_4.toggle(this.innerDiv,"dijitClosable",_c);this.closeNode.style.display=_c?"":"none";if(_c){var _d=_5.getLocalization("dijit","common");if(this.closeNode){_3.set(this.closeNode,"title",_d.itemClose);}this._closeMenu=new _8({id:this.id+"_Menu",dir:this.dir,lang:this.lang,textDir:this.textDir,targetNodeIds:[this.domNode]});this._closeMenu.addChild(new _9({label:_d.itemClose,dir:this.dir,lang:this.lang,textDir:this.textDir,onClick:_6.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},_setLabelAttr:function(_e){this.inherited(arguments);if(!this.showLabel&&!this.params.title){this.iconNode.alt=_6.trim(this.containerNode.innerText||this.containerNode.textContent||"");}},destroy:function(){if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}this.inherited(arguments);}});var _f=_1("dijit.layout.TabController",_7,{baseClass:"dijitTabController",templateString:"<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:_b,_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _10=0;for(var _11 in this.pane2button){var ow=this.pane2button[_11].innerDiv.scrollWidth;_10=Math.max(_10,ow);}for(_11 in this.pane2button){this.pane2button[_11].innerDiv.style.width=_10+"px";}}});_f.TabButton=_b;return _f;}); \ No newline at end of file
+require({cache:{"url:dijit/layout/templates/_TabButton.html":"<div role=\"presentation\" data-dojo-attach-point=\"titleNode,innerDiv,tabContent\" class=\"dijitTabInner dijitTabContent\">\n\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode'/>\n\t<span data-dojo-attach-point='containerNode,focusNode' class='tabLabel'></span>\n\t<span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t role=\"presentation\">\n\t\t<span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t\t\t></span>\n</div>\n"}});define("dijit/layout/TabController",["dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/i18n","dojo/_base/lang","./StackController","../registry","../Menu","../MenuItem","dojo/text!./templates/_TabButton.html","dojo/i18n!../nls/common"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){var _c=_1("dijit.layout._TabButton",_7.StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:_b,scrollOnFocus:false,buildRendering:function(){this.inherited(arguments);_2.setSelectable(this.containerNode,false);},startup:function(){this.inherited(arguments);var n=this.domNode;this.defer(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(_d){this._set("closeButton",_d);_4.toggle(this.domNode,"dijitClosable",_d);this.closeNode.style.display=_d?"":"none";if(_d){var _e=_5.getLocalization("dijit","common");if(this.closeNode){_3.set(this.closeNode,"title",_e.itemClose);}}},_setDisabledAttr:function(_f){this.inherited(arguments);if(this.closeNode){if(_f){_3.remove(this.closeNode,"title");}else{var _10=_5.getLocalization("dijit","common");_3.set(this.closeNode,"title",_10.itemClose);}}},_setLabelAttr:function(_11){this.inherited(arguments);if(!this.showLabel&&!this.params.title){this.iconNode.alt=_6.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});var _12=_1("dijit.layout.TabController",_7,{baseClass:"dijitTabController",templateString:"<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:_c,buttonWidgetCloseClass:"dijitTabCloseButton",postCreate:function(){this.inherited(arguments);var _13=new _9({id:this.id+"_Menu",ownerDocument:this.ownerDocument,dir:this.dir,lang:this.lang,textDir:this.textDir,targetNodeIds:[this.domNode],selector:function(_14){return _4.contains(_14,"dijitClosable")&&!_4.contains(_14,"dijitTabDisabled");}});this.own(_13);var _15=_5.getLocalization("dijit","common"),_16=this;_13.addChild(new _a({label:_15.itemClose,ownerDocument:this.ownerDocument,dir:this.dir,lang:this.lang,textDir:this.textDir,onClick:function(evt){var _17=_8.byNode(this.getParent().currentTarget);_16.onCloseButtonClick(_17.page);}}));}});_12.TabButton=_c;return _12;}); \ No newline at end of file
diff --git a/lib/dijit/layout/TabController.js.uncompressed.js b/lib/dijit/layout/TabController.js.uncompressed.js
new file mode 100644
index 000000000..fd061540e
--- /dev/null
+++ b/lib/dijit/layout/TabController.js.uncompressed.js
@@ -0,0 +1,171 @@
+require({cache:{
+'url:dijit/layout/templates/_TabButton.html':"<div role=\"presentation\" data-dojo-attach-point=\"titleNode,innerDiv,tabContent\" class=\"dijitTabInner dijitTabContent\">\n\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode'/>\n\t<span data-dojo-attach-point='containerNode,focusNode' class='tabLabel'></span>\n\t<span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t role=\"presentation\">\n\t\t<span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t\t\t></span>\n</div>\n"}});
+define("dijit/layout/TabController", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-attr", // domAttr.attr
+ "dojo/dom-class", // domClass.toggle
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.hitch lang.trim
+ "./StackController",
+ "../registry",
+ "../Menu",
+ "../MenuItem",
+ "dojo/text!./templates/_TabButton.html",
+ "dojo/i18n!../nls/common"
+], function(declare, dom, domAttr, domClass, i18n, lang, StackController, registry, Menu, MenuItem, template){
+
+ // module:
+ // dijit/layout/TabController
+
+ var TabButton = declare("dijit.layout._TabButton", StackController.StackButton, {
+ // summary:
+ // A tab (the thing you click to select a pane).
+ // description:
+ // Contains the title of the pane, and optionally a close-button to destroy the pane.
+ // This is an internal widget and should not be instantiated directly.
+ // tags:
+ // private
+
+ // baseClass: String
+ // The CSS class applied to the domNode.
+ baseClass: "dijitTab",
+
+ // Apply dijitTabCloseButtonHover when close button is hovered
+ cssStateNodes: {
+ closeNode: "dijitTabCloseButton"
+ },
+
+ templateString: template,
+
+ // Override _FormWidget.scrollOnFocus.
+ // Don't scroll the whole tab container into view when the button is focused.
+ scrollOnFocus: false,
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ dom.setSelectable(this.containerNode, false);
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+ var n = this.domNode;
+
+ // Required to give IE6 a kick, as it initially hides the
+ // tabs until they are focused on.
+ this.defer(function(){
+ n.className = n.className;
+ }, 1);
+ },
+
+ _setCloseButtonAttr: function(/*Boolean*/ disp){
+ // summary:
+ // Hide/show close button
+ this._set("closeButton", disp);
+ domClass.toggle(this.domNode, "dijitClosable", disp);
+ this.closeNode.style.display = disp ? "" : "none";
+ if(disp){
+ var _nlsResources = i18n.getLocalization("dijit", "common");
+ if(this.closeNode){
+ domAttr.set(this.closeNode, "title", _nlsResources.itemClose);
+ }
+ }
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ disabled){
+ // summary:
+ // Make tab selected/unselectable
+
+ this.inherited(arguments);
+
+ // Don't show tooltip for close button when tab is disabled
+ if(this.closeNode){
+ if(disabled){
+ domAttr.remove(this.closeNode, "title");
+ }else{
+ var _nlsResources = i18n.getLocalization("dijit", "common");
+ domAttr.set(this.closeNode, "title", _nlsResources.itemClose);
+ }
+ }
+ },
+
+ _setLabelAttr: function(/*String*/ content){
+ // summary:
+ // Hook for set('label', ...) to work.
+ // description:
+ // takes an HTML string.
+ // Inherited ToggleButton implementation will Set the label (text) of the button;
+ // Need to set the alt attribute of icon on tab buttons if no label displayed
+ this.inherited(arguments);
+ if(!this.showLabel && !this.params.title){
+ this.iconNode.alt = lang.trim(this.containerNode.innerText || this.containerNode.textContent || '');
+ }
+ }
+ });
+
+ var TabController = declare("dijit.layout.TabController", StackController, {
+ // summary:
+ // Set of tabs (the things with titles and a close button, that you click to show a tab panel).
+ // Used internally by `dijit/layout/TabContainer`.
+ // description:
+ // Lets the user select the currently shown pane in a TabContainer or StackContainer.
+ // TabController also monitors the TabContainer, and whenever a pane is
+ // added or deleted updates itself accordingly.
+ // tags:
+ // private
+
+ baseClass: "dijitTabController",
+
+ templateString: "<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'></div>",
+
+ // tabPosition: String
+ // Defines where tabs go relative to the content.
+ // "top", "bottom", "left-h", "right-h"
+ tabPosition: "top",
+
+ // buttonWidget: Constructor
+ // The tab widget to create to correspond to each page
+ buttonWidget: TabButton,
+
+ // buttonWidgetCloseClass: String
+ // Class of [x] close icon, used by event delegation code to tell when close button was clicked
+ buttonWidgetCloseClass: "dijitTabCloseButton",
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Setup a close menu to be shared between all the closable tabs (excluding disabled tabs)
+ var closeMenu = new Menu({
+ id: this.id+"_Menu",
+ ownerDocument: this.ownerDocument,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir,
+ targetNodeIds: [this.domNode],
+ selector: function(node){
+ return domClass.contains(node, "dijitClosable") && !domClass.contains(node, "dijitTabDisabled");
+ }
+ });
+ this.own(closeMenu);
+
+ var _nlsResources = i18n.getLocalization("dijit", "common"),
+ controller = this;
+ closeMenu.addChild(new MenuItem({
+ label: _nlsResources.itemClose,
+ ownerDocument: this.ownerDocument,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir,
+ onClick: function(evt){
+ var button = registry.byNode(this.getParent().currentTarget);
+ controller.onCloseButtonClick(button.page);
+ }
+ }));
+ }
+ });
+
+ TabController.TabButton = TabButton; // for monkey patching
+
+ return TabController;
+});
diff --git a/lib/dijit/layout/_ContentPaneResizeMixin.js b/lib/dijit/layout/_ContentPaneResizeMixin.js
index e0dd49e96..2f214ade3 100644
--- a/lib/dijit/layout/_ContentPaneResizeMixin.js
+++ b/lib/dijit/layout/_ContentPaneResizeMixin.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/_ContentPaneResizeMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/_base/lang","dojo/query","dojo/_base/sniff","dojo/_base/window","../registry","./utils","../_Contained"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c){return _2("dijit.layout._ContentPaneResizeMixin",null,{doLayout:true,isLayoutContainer:true,startup:function(){if(this._started){return;}var _d=this.getParent();this._childOfLayoutWidget=_d&&_d.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;this.inherited(arguments);if(this._isShown()){this._onShow();}if(!this._childOfLayoutWidget){this.connect(_8("ie")?this.domNode:_9.global,"onresize",function(){this._needLayout=!this._childOfLayoutWidget;this.resize();});}},_checkIfSingleChild:function(){var _e=_7("> *",this.containerNode).filter(function(_f){return _f.tagName!=="SCRIPT";}),_10=_e.filter(function(_11){return _3.has(_11,"data-dojo-type")||_3.has(_11,"dojoType")||_3.has(_11,"widgetId");}),_12=_1.filter(_10.map(_a.byNode),function(_13){return _13&&_13.domNode&&_13.resize;});if(_e.length==_10.length&&_12.length==1){this._singleChild=_12[0];}else{delete this._singleChild;}_4.toggle(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},resize:function(_14,_15){if(!this._wasShown&&this.open!==false){this._onShow();}this._resizeCalled=true;this._scheduleLayout(_14,_15);},_scheduleLayout:function(_16,_17){if(this._isShown()){this._layout(_16,_17);}else{this._needLayout=true;this._changeSize=_16;this._resultSize=_17;}},_layout:function(_18,_19){if(_18){_5.setMarginBox(this.domNode,_18);}var cn=this.containerNode;if(cn===this.domNode){var mb=_19||{};_6.mixin(mb,_18||{});if(!("h" in mb)||!("w" in mb)){mb=_6.mixin(_5.getMarginBox(cn),mb);}this._contentBox=_b.marginBox2contentBox(cn,mb);}else{this._contentBox=_5.getContentBox(cn);}this._layoutChildren();delete this._needLayout;},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||_5.getContentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{_1.forEach(this.getChildren(),function(_1a){if(_1a.resize){_1a.resize();}});}},_isShown:function(){if(this._childOfLayoutWidget){if(this._resizeCalled&&"open" in this){return this.open;}return this._resizeCalled;}else{if("open" in this){return this.open;}else{var _1b=this.domNode,_1c=this.domNode.parentNode;return (_1b.style.display!="none")&&(_1b.style.visibility!="hidden")&&!_4.contains(_1b,"dijitHidden")&&_1c&&_1c.style&&(_1c.style.display!="none");}}},_onShow:function(){if(this._needLayout){this._layout(this._changeSize,this._resultSize);}this.inherited(arguments);this._wasShown=true;}});}); \ No newline at end of file
+define("dijit/layout/_ContentPaneResizeMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang","dojo/query","dojo/sniff","../registry","../Viewport","./utils"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){return _2("dijit.layout._ContentPaneResizeMixin",null,{doLayout:true,isLayoutContainer:true,startup:function(){if(this._started){return;}var _c=this.getParent();this._childOfLayoutWidget=_c&&_c.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;this.inherited(arguments);if(this._isShown()){this._onShow();}if(!this._childOfLayoutWidget){this.own(_a.on("resize",_6.hitch(this,"resize")));}},_checkIfSingleChild:function(){var _d=[],_e=false;_7("> *",this.containerNode).some(function(_f){var _10=_9.byNode(_f);if(_10&&_10.resize){_d.push(_10);}else{if(_f.offsetHeight){_e=true;}}});this._singleChild=_d.length==1&&!_e?_d[0]:null;_3.toggle(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},resize:function(_11,_12){this._resizeCalled=true;this._scheduleLayout(_11,_12);},_scheduleLayout:function(_13,_14){if(this._isShown()){this._layout(_13,_14);}else{this._needLayout=true;this._changeSize=_13;this._resultSize=_14;}},_layout:function(_15,_16){delete this._needLayout;if(!this._wasShown&&this.open!==false){this._onShow();}if(_15){_4.setMarginBox(this.domNode,_15);}var cn=this.containerNode;if(cn===this.domNode){var mb=_16||{};_6.mixin(mb,_15||{});if(!("h" in mb)||!("w" in mb)){mb=_6.mixin(_4.getMarginBox(cn),mb);}this._contentBox=_b.marginBox2contentBox(cn,mb);}else{this._contentBox=_4.getContentBox(cn);}this._layoutChildren();},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||_4.getContentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{_1.forEach(this.getChildren(),function(_17){if(_17.resize){_17.resize();}});}},_isShown:function(){if(this._childOfLayoutWidget){if(this._resizeCalled&&"open" in this){return this.open;}return this._resizeCalled;}else{if("open" in this){return this.open;}else{var _18=this.domNode,_19=this.domNode.parentNode;return (_18.style.display!="none")&&(_18.style.visibility!="hidden")&&!_3.contains(_18,"dijitHidden")&&_19&&_19.style&&(_19.style.display!="none");}}},_onShow:function(){this._wasShown=true;if(this._needLayout){this._layout(this._changeSize,this._resultSize);}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js b/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js
new file mode 100644
index 000000000..bb48aa562
--- /dev/null
+++ b/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js
@@ -0,0 +1,234 @@
+define("dijit/layout/_ContentPaneResizeMixin", [
+ "dojo/_base/array", // array.filter array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.contains domClass.toggle
+ "dojo/dom-geometry",// domGeometry.contentBox domGeometry.marginBox
+ "dojo/dom-style",
+ "dojo/_base/lang", // lang.mixin
+ "dojo/query", // query
+ "dojo/sniff", // has("ie")
+ "../registry", // registry.byId
+ "../Viewport",
+ "./utils" // marginBox2contextBox
+], function(array, declare, domClass, domGeometry, domStyle, lang, query, has,
+ registry, Viewport, layoutUtils){
+
+// module:
+// dijit/layout/_ContentPaneResizeMixin
+
+
+return declare("dijit.layout._ContentPaneResizeMixin", null, {
+ // summary:
+ // Resize() functionality of ContentPane. If there's a single layout widget
+ // child then it will call resize() with the same dimensions as the ContentPane.
+ // Otherwise just calls resize on each child.
+ //
+ // Also implements basic startup() functionality, where starting the parent
+ // will start the children
+
+ // doLayout: Boolean
+ // - false - don't adjust size of children
+ // - true - if there is a single visible child widget, set it's size to however big the ContentPane is
+ doLayout: true,
+
+ // isLayoutContainer: [protected] Boolean
+ // Indicates that this widget will call resize() on it's child widgets
+ // when they become visible.
+ isLayoutContainer: true,
+
+ startup: function(){
+ // summary:
+ // See `dijit/layout/_LayoutWidget.startup()` for description.
+ // Although ContentPane doesn't extend _LayoutWidget, it does implement
+ // the same API.
+
+ if(this._started){ return; }
+
+ var parent = this.getParent();
+ this._childOfLayoutWidget = parent && parent.isLayoutContainer;
+
+ // I need to call resize() on my child/children (when I become visible), unless
+ // I'm the child of a layout widget in which case my parent will call resize() on me and I'll do it then.
+ this._needLayout = !this._childOfLayoutWidget;
+
+ this.inherited(arguments);
+
+ if(this._isShown()){
+ this._onShow();
+ }
+
+ if(!this._childOfLayoutWidget){
+ // Since my parent isn't a layout container, and my style *may be* width=height=100%
+ // or something similar (either set directly or via a CSS class),
+ // monitor when viewport size changes so that I can re-layout.
+ // This is more for subclasses of ContentPane than ContentPane itself, although it
+ // could be useful for a ContentPane if it has a single child widget inheriting ContentPane's size.
+ this.own(Viewport.on("resize", lang.hitch(this, "resize")));
+ }
+ },
+
+ _checkIfSingleChild: function(){
+ // summary:
+ // Test if we have exactly one visible widget as a child,
+ // and if so assume that we are a container for that widget,
+ // and should propagate startup() and resize() calls to it.
+ // Skips over things like data stores since they aren't visible.
+
+ var candidateWidgets = [],
+ otherVisibleNodes = false;
+
+ query("> *", this.containerNode).some(function(node){
+ var widget = registry.byNode(node);
+ if(widget && widget.resize){
+ candidateWidgets.push(widget);
+ }else if(node.offsetHeight){
+ otherVisibleNodes = true;
+ }
+ });
+
+ this._singleChild = candidateWidgets.length == 1 && !otherVisibleNodes ?
+ candidateWidgets[0] : null;
+
+ // So we can set overflow: hidden to avoid a safari bug w/scrollbars showing up (#9449)
+ domClass.toggle(this.containerNode, this.baseClass + "SingleChild", !!this._singleChild);
+ },
+
+ resize: function(changeSize, resultSize){
+ // summary:
+ // See `dijit/layout/_LayoutWidget.resize()` for description.
+ // Although ContentPane doesn't extend _LayoutWidget, it does implement
+ // the same API.
+
+ this._resizeCalled = true;
+
+ this._scheduleLayout(changeSize, resultSize);
+ },
+
+ _scheduleLayout: function(changeSize, resultSize){
+ // summary:
+ // Resize myself, and call resize() on each of my child layout widgets, either now
+ // (if I'm currently visible) or when I become visible
+ if(this._isShown()){
+ this._layout(changeSize, resultSize);
+ }else{
+ this._needLayout = true;
+ this._changeSize = changeSize;
+ this._resultSize = resultSize;
+ }
+ },
+
+ _layout: function(changeSize, resultSize){
+ // summary:
+ // Resize myself according to optional changeSize/resultSize parameters, like a layout widget.
+ // Also, since I am an isLayoutContainer widget, each of my children expects me to
+ // call resize() or layout() on it.
+ //
+ // Should be called on initialization and also whenever we get new content
+ // (from an href, or from set('content', ...))... but deferred until
+ // the ContentPane is visible
+
+ delete this._needLayout;
+
+ // For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is
+ // never called directly, so resize() is our trigger to do the initial href download (see [20099]).
+ // However, don't load href for closed TitlePanes.
+ if(!this._wasShown && this.open !== false){
+ this._onShow();
+ }
+
+ // Set margin box size, unless it wasn't specified, in which case use current size.
+ if(changeSize){
+ domGeometry.setMarginBox(this.domNode, changeSize);
+ }
+
+ // Compute content box size of containerNode in case we [later] need to size our single child.
+ var cn = this.containerNode;
+ if(cn === this.domNode){
+ // If changeSize or resultSize was passed to this method and this.containerNode ==
+ // this.domNode then we can compute the content-box size without querying the node,
+ // which is more reliable (similar to LayoutWidget.resize) (see for example #9449).
+ var mb = resultSize || {};
+ lang.mixin(mb, changeSize || {}); // changeSize overrides resultSize
+ if(!("h" in mb) || !("w" in mb)){
+ mb = lang.mixin(domGeometry.getMarginBox(cn), mb); // just use domGeometry.setMarginBox() to fill in missing values
+ }
+ this._contentBox = layoutUtils.marginBox2contentBox(cn, mb);
+ }else{
+ this._contentBox = domGeometry.getContentBox(cn);
+ }
+
+ this._layoutChildren();
+ },
+
+ _layoutChildren: function(){
+ // Call _checkIfSingleChild() again in case app has manually mucked w/the content
+ // of the ContentPane (rather than changing it through the set("content", ...) API.
+ if(this.doLayout){
+ this._checkIfSingleChild();
+ }
+
+ if(this._singleChild && this._singleChild.resize){
+ var cb = this._contentBox || domGeometry.getContentBox(this.containerNode);
+
+ // note: if widget has padding this._contentBox will have l and t set,
+ // but don't pass them to resize() or it will doubly-offset the child
+ this._singleChild.resize({w: cb.w, h: cb.h});
+ }else{
+ // All my child widgets are independently sized (rather than matching my size),
+ // but I still need to call resize() on each child to make it layout.
+ array.forEach(this.getChildren(), function(widget){
+ if(widget.resize){
+ widget.resize();
+ }
+ });
+ }
+ },
+
+ _isShown: function(){
+ // summary:
+ // Returns true if the content is currently shown.
+ // description:
+ // If I am a child of a layout widget then it actually returns true if I've ever been visible,
+ // not whether I'm currently visible, since that's much faster than tracing up the DOM/widget
+ // tree every call, and at least solves the performance problem on page load by deferring loading
+ // hidden ContentPanes until they are first shown
+
+ if(this._childOfLayoutWidget){
+ // If we are TitlePane, etc - we return that only *IF* we've been resized
+ if(this._resizeCalled && "open" in this){
+ return this.open;
+ }
+ return this._resizeCalled;
+ }else if("open" in this){
+ return this.open; // for TitlePane, etc.
+ }else{
+ var node = this.domNode, parent = this.domNode.parentNode;
+ return (node.style.display != 'none') && (node.style.visibility != 'hidden') && !domClass.contains(node, "dijitHidden") &&
+ parent && parent.style && (parent.style.display != 'none');
+ }
+ },
+
+ _onShow: function(){
+ // summary:
+ // Called when the ContentPane is made visible
+ // description:
+ // For a plain ContentPane, this is called on initialization, from startup().
+ // If the ContentPane is a hidden pane of a TabContainer etc., then it's
+ // called whenever the pane is made visible.
+ //
+ // Does layout/resize of child widget(s)
+
+ // Need to keep track of whether ContentPane has been shown (which is different than
+ // whether or not it's currently visible).
+ this._wasShown = true;
+
+ if(this._needLayout){
+ // If a layout has been scheduled for when we become visible, do it now
+ this._layout(this._changeSize, this._resultSize);
+ }
+
+ this.inherited(arguments);
+ }
+});
+
+});
diff --git a/lib/dijit/layout/_LayoutWidget.js b/lib/dijit/layout/_LayoutWidget.js
index 7ac78de47..e6cba970e 100644
--- a/lib/dijit/layout/_LayoutWidget.js
+++ b/lib/dijit/layout/_LayoutWidget.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/_LayoutWidget",["dojo/_base/lang","../_Widget","../_Container","../_Contained","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/sniff","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a){return _5("dijit.layout._LayoutWidget",[_2,_3,_4],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,buildRendering:function(){this.inherited(arguments);_6.add(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}this.inherited(arguments);var _b=this.getParent&&this.getParent();if(!(_b&&_b.isLayoutContainer)){this.resize();this.connect(_a.global,"onresize",function(){this.resize();});}},resize:function(_c,_d){var _e=this.domNode;if(_c){_7.setMarginBox(_e,_c);}var mb=_d||{};_1.mixin(mb,_c||{});if(!("h" in mb)||!("w" in mb)){mb=_1.mixin(_7.getMarginBox(_e),mb);}var cs=_8.getComputedStyle(_e);var me=_7.getMarginExtents(_e,cs);var be=_7.getBorderExtents(_e,cs);var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});var pe=_7.getPadExtents(_e,cs);this._contentBox={l:_8.toPixelValue(_e,cs.paddingLeft),t:_8.toPixelValue(_e,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};this.layout();},layout:function(){},_setupChild:function(_f){var cls=this.baseClass+"-child "+(_f.baseClass?this.baseClass+"-"+_f.baseClass:"");_6.add(_f.domNode,cls);},addChild:function(_10,_11){this.inherited(arguments);if(this._started){this._setupChild(_10);}},removeChild:function(_12){var cls=this.baseClass+"-child"+(_12.baseClass?" "+this.baseClass+"-"+_12.baseClass:"");_6.remove(_12.domNode,cls);this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/layout/_LayoutWidget",["dojo/_base/lang","../_Widget","../_Container","../_Contained","../Viewport","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _6("dijit.layout._LayoutWidget",[_2,_3,_4],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,buildRendering:function(){this.inherited(arguments);_7.add(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}this.inherited(arguments);var _a=this.getParent&&this.getParent();if(!(_a&&_a.isLayoutContainer)){this.resize();this.own(_5.on("resize",_1.hitch(this,"resize")));}},resize:function(_b,_c){var _d=this.domNode;if(_b){_8.setMarginBox(_d,_b);}var mb=_c||{};_1.mixin(mb,_b||{});if(!("h" in mb)||!("w" in mb)){mb=_1.mixin(_8.getMarginBox(_d),mb);}var cs=_9.getComputedStyle(_d);var me=_8.getMarginExtents(_d,cs);var be=_8.getBorderExtents(_d,cs);var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});var pe=_8.getPadExtents(_d,cs);this._contentBox={l:_9.toPixelValue(_d,cs.paddingLeft),t:_9.toPixelValue(_d,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};this.layout();},layout:function(){},_setupChild:function(_e){var _f=this.baseClass+"-child "+(_e.baseClass?this.baseClass+"-"+_e.baseClass:"");_7.add(_e.domNode,_f);},addChild:function(_10,_11){this.inherited(arguments);if(this._started){this._setupChild(_10);}},removeChild:function(_12){var cls=this.baseClass+"-child"+(_12.baseClass?" "+this.baseClass+"-"+_12.baseClass:"");_7.remove(_12.domNode,cls);this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/_LayoutWidget.js.uncompressed.js b/lib/dijit/layout/_LayoutWidget.js.uncompressed.js
new file mode 100644
index 000000000..855d0d221
--- /dev/null
+++ b/lib/dijit/layout/_LayoutWidget.js.uncompressed.js
@@ -0,0 +1,185 @@
+define("dijit/layout/_LayoutWidget", [
+ "dojo/_base/lang", // lang.mixin
+ "../_Widget",
+ "../_Container",
+ "../_Contained",
+ "../Viewport",
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-geometry", // domGeometry.marginBox
+ "dojo/dom-style" // domStyle.getComputedStyle
+], function(lang, _Widget, _Container, _Contained, Viewport,
+ declare, domClass, domGeometry, domStyle){
+
+ // module:
+ // dijit/layout/_LayoutWidget
+
+
+ return declare("dijit.layout._LayoutWidget", [_Widget, _Container, _Contained], {
+ // summary:
+ // Base class for a _Container widget which is responsible for laying out its children.
+ // Widgets which mixin this code must define layout() to manage placement and sizing of the children.
+
+ // baseClass: [protected extension] String
+ // This class name is applied to the widget's domNode
+ // and also may be used to generate names for sub nodes,
+ // for example dijitTabContainer-content.
+ baseClass: "dijitLayoutContainer",
+
+ // isLayoutContainer: [protected] Boolean
+ // Indicates that this widget is going to call resize() on its
+ // children widgets, setting their size, when they become visible.
+ isLayoutContainer: true,
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ domClass.add(this.domNode, "dijitContainer");
+ },
+
+ startup: function(){
+ // summary:
+ // Called after all the widgets have been instantiated and their
+ // dom nodes have been inserted somewhere under win.doc.body.
+ //
+ // Widgets should override this method to do any initialization
+ // dependent on other widgets existing, and then call
+ // this superclass method to finish things off.
+ //
+ // startup() in subclasses shouldn't do anything
+ // size related because the size of the widget hasn't been set yet.
+
+ if(this._started){ return; }
+
+ // Need to call inherited first - so that child widgets get started
+ // up correctly
+ this.inherited(arguments);
+
+ // If I am a not being controlled by a parent layout widget...
+ var parent = this.getParent && this.getParent();
+ if(!(parent && parent.isLayoutContainer)){
+ // Do recursive sizing and layout of all my descendants
+ // (passing in no argument to resize means that it has to glean the size itself)
+ this.resize();
+
+ // Since my parent isn't a layout container, and my style *may be* width=height=100%
+ // or something similar (either set directly or via a CSS class),
+ // monitor when viewport size changes so that I can re-layout.
+ this.own(Viewport.on("resize", lang.hitch(this, "resize")));
+ }
+ },
+
+ resize: function(changeSize, resultSize){
+ // summary:
+ // Call this to resize a widget, or after its size has changed.
+ // description:
+ // ####Change size mode:
+ //
+ // When changeSize is specified, changes the marginBox of this widget
+ // and forces it to re-layout its contents accordingly.
+ // changeSize may specify height, width, or both.
+ //
+ // If resultSize is specified it indicates the size the widget will
+ // become after changeSize has been applied.
+ //
+ // ####Notification mode:
+ //
+ // When changeSize is null, indicates that the caller has already changed
+ // the size of the widget, or perhaps it changed because the browser
+ // window was resized. Tells widget to re-layout its contents accordingly.
+ //
+ // If resultSize is also specified it indicates the size the widget has
+ // become.
+ //
+ // In either mode, this method also:
+ //
+ // 1. Sets this._borderBox and this._contentBox to the new size of
+ // the widget. Queries the current domNode size if necessary.
+ // 2. Calls layout() to resize contents (and maybe adjust child widgets).
+ // changeSize: Object?
+ // Sets the widget to this margin-box size and position.
+ // May include any/all of the following properties:
+ // | {w: int, h: int, l: int, t: int}
+ // resultSize: Object?
+ // The margin-box size of this widget after applying changeSize (if
+ // changeSize is specified). If caller knows this size and
+ // passes it in, we don't need to query the browser to get the size.
+ // | {w: int, h: int}
+
+ var node = this.domNode;
+
+ // set margin box size, unless it wasn't specified, in which case use current size
+ if(changeSize){
+ domGeometry.setMarginBox(node, changeSize);
+ }
+
+ // If either height or width wasn't specified by the user, then query node for it.
+ // But note that setting the margin box and then immediately querying dimensions may return
+ // inaccurate results, so try not to depend on it.
+ var mb = resultSize || {};
+ lang.mixin(mb, changeSize || {}); // changeSize overrides resultSize
+ if( !("h" in mb) || !("w" in mb) ){
+ mb = lang.mixin(domGeometry.getMarginBox(node), mb); // just use domGeometry.marginBox() to fill in missing values
+ }
+
+ // Compute and save the size of my border box and content box
+ // (w/out calling domGeometry.getContentBox() since that may fail if size was recently set)
+ var cs = domStyle.getComputedStyle(node);
+ var me = domGeometry.getMarginExtents(node, cs);
+ var be = domGeometry.getBorderExtents(node, cs);
+ var bb = (this._borderBox = {
+ w: mb.w - (me.w + be.w),
+ h: mb.h - (me.h + be.h)
+ });
+ var pe = domGeometry.getPadExtents(node, cs);
+ this._contentBox = {
+ l: domStyle.toPixelValue(node, cs.paddingLeft),
+ t: domStyle.toPixelValue(node, cs.paddingTop),
+ w: bb.w - pe.w,
+ h: bb.h - pe.h
+ };
+
+ // Callback for widget to adjust size of its children
+ this.layout();
+ },
+
+ layout: function(){
+ // summary:
+ // Widgets override this method to size and position their contents/children.
+ // When this is called this._contentBox is guaranteed to be set (see resize()).
+ //
+ // This is called after startup(), and also when the widget's size has been
+ // changed.
+ // tags:
+ // protected extension
+ },
+
+ _setupChild: function(/*dijit/_WidgetBase*/child){
+ // summary:
+ // Common setup for initial children and children which are added after startup
+ // tags:
+ // protected extension
+
+ var cls = this.baseClass + "-child "
+ + (child.baseClass ? this.baseClass + "-" + child.baseClass : "");
+ domClass.add(child.domNode, cls);
+ },
+
+ addChild: function(/*dijit/_WidgetBase*/ child, /*Integer?*/ insertIndex){
+ // Overrides _Container.addChild() to call _setupChild()
+ this.inherited(arguments);
+ if(this._started){
+ this._setupChild(child);
+ }
+ },
+
+ removeChild: function(/*dijit/_WidgetBase*/ child){
+ // Overrides _Container.removeChild() to remove class added by _setupChild()
+ var cls = this.baseClass + "-child"
+ + (child.baseClass ?
+ " " + this.baseClass + "-" + child.baseClass : "");
+ domClass.remove(child.domNode, cls);
+
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/layout/_TabContainerBase.js.uncompressed.js b/lib/dijit/layout/_TabContainerBase.js.uncompressed.js
new file mode 100644
index 000000000..6080d32b0
--- /dev/null
+++ b/lib/dijit/layout/_TabContainerBase.js.uncompressed.js
@@ -0,0 +1,146 @@
+require({cache:{
+'url:dijit/layout/templates/TabContainer.html':"<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" data-dojo-attach-point=\"tablistNode\"></div>\n\t<div data-dojo-attach-point=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" data-dojo-attach-point=\"containerNode\"></div>\n</div>\n"}});
+define("dijit/layout/_TabContainerBase", [
+ "dojo/text!./templates/TabContainer.html",
+ "./StackContainer",
+ "./utils", // marginBox2contextBox, layoutChildren
+ "../_TemplatedMixin",
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add
+ "dojo/dom-geometry", // domGeometry.contentBox
+ "dojo/dom-style" // domStyle.style
+], function(template, StackContainer, layoutUtils, _TemplatedMixin, declare, domClass, domGeometry, domStyle){
+
+// module:
+// dijit/layout/_TabContainerBase
+
+
+return declare("dijit.layout._TabContainerBase", [StackContainer, _TemplatedMixin], {
+ // summary:
+ // Abstract base class for TabContainer. Must define _makeController() to instantiate
+ // and return the widget that displays the tab labels
+ // description:
+ // A TabContainer is a container that has multiple panes, but shows only
+ // one pane at a time. There are a set of tabs corresponding to each pane,
+ // where each tab has the name (aka title) of the pane, and optionally a close button.
+
+ // tabPosition: String
+ // Defines where tabs go relative to tab content.
+ // "top", "bottom", "left-h", "right-h"
+ tabPosition: "top",
+
+ baseClass: "dijitTabContainer",
+
+ // tabStrip: [const] Boolean
+ // Defines whether the tablist gets an extra class for layouting, putting a border/shading
+ // around the set of tabs. Not supported by claro theme.
+ tabStrip: false,
+
+ // nested: [const] Boolean
+ // If true, use styling for a TabContainer nested inside another TabContainer.
+ // For tundra etc., makes tabs look like links, and hides the outer
+ // border since the outer TabContainer already has a border.
+ nested: false,
+
+ templateString: template,
+
+ postMixInProperties: function(){
+ // set class name according to tab position, ex: dijitTabContainerTop
+ this.baseClass += this.tabPosition.charAt(0).toUpperCase() + this.tabPosition.substr(1).replace(/-.*/, "");
+
+ this.srcNodeRef && domStyle.set(this.srcNodeRef, "visibility", "hidden");
+
+ this.inherited(arguments);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // Create the tab list that will have a tab (a.k.a. tab button) for each tab panel
+ this.tablist = this._makeController(this.tablistNode);
+
+ if(!this.doLayout){ domClass.add(this.domNode, "dijitTabContainerNoLayout"); }
+
+ if(this.nested){
+ /* workaround IE's lack of support for "a > b" selectors by
+ * tagging each node in the template.
+ */
+ domClass.add(this.domNode, "dijitTabContainerNested");
+ domClass.add(this.tablist.containerNode, "dijitTabContainerTabListNested");
+ domClass.add(this.tablistSpacer, "dijitTabContainerSpacerNested");
+ domClass.add(this.containerNode, "dijitTabPaneWrapperNested");
+ }else{
+ domClass.add(this.domNode, "tabStrip-" + (this.tabStrip ? "enabled" : "disabled"));
+ }
+ },
+
+ _setupChild: function(/*dijit/_WidgetBase*/ tab){
+ // Overrides StackContainer._setupChild().
+ domClass.add(tab.domNode, "dijitTabPane");
+ this.inherited(arguments);
+ },
+
+ startup: function(){
+ if(this._started){ return; }
+
+ // wire up the tablist and its tabs
+ this.tablist.startup();
+
+ this.inherited(arguments);
+ },
+
+ layout: function(){
+ // Overrides StackContainer.layout().
+ // Configure the content pane to take up all the space except for where the tabs are
+
+ if(!this._contentBox || typeof(this._contentBox.l) == "undefined"){return;}
+
+ var sc = this.selectedChildWidget;
+
+ if(this.doLayout){
+ // position and size the titles and the container node
+ var titleAlign = this.tabPosition.replace(/-h/, "");
+ this.tablist.layoutAlign = titleAlign;
+ var children = [this.tablist, {
+ domNode: this.tablistSpacer,
+ layoutAlign: titleAlign
+ }, {
+ domNode: this.containerNode,
+ layoutAlign: "client"
+ }];
+ layoutUtils.layoutChildren(this.domNode, this._contentBox, children);
+
+ // Compute size to make each of my children.
+ // children[2] is the margin-box size of this.containerNode, set by layoutChildren() call above
+ this._containerContentBox = layoutUtils.marginBox2contentBox(this.containerNode, children[2]);
+
+ if(sc && sc.resize){
+ sc.resize(this._containerContentBox);
+ }
+ }else{
+ // just layout the tab controller, so it can position left/right buttons etc.
+ if(this.tablist.resize){
+ //make the tabs zero width so that they don't interfere with width calc, then reset
+ var s = this.tablist.domNode.style;
+ s.width="0";
+ var width = domGeometry.getContentBox(this.domNode).w;
+ s.width="";
+ this.tablist.resize({w: width});
+ }
+
+ // and call resize() on the selected pane just to tell it that it's been made visible
+ if(sc && sc.resize){
+ sc.resize();
+ }
+ }
+ },
+
+ destroy: function(){
+ if(this.tablist){
+ this.tablist.destroy();
+ }
+ this.inherited(arguments);
+ }
+});
+
+});
diff --git a/lib/dijit/layout/templates/_ScrollingTabControllerButton.html b/lib/dijit/layout/templates/_ScrollingTabControllerButton.html
index c7ef933a1..3e01ab099 100644
--- a/lib/dijit/layout/templates/_ScrollingTabControllerButton.html
+++ b/lib/dijit/layout/templates/_ScrollingTabControllerButton.html
@@ -1,8 +1,4 @@
-<div data-dojo-attach-event="onclick:_onClick">
- <div role="presentation" class="dijitTabInnerDiv" data-dojo-attach-point="innerDiv,focusNode">
- <div role="presentation" class="dijitTabContent dijitButtonContents" data-dojo-attach-point="tabContent">
- <img role="presentation" alt="" src="${_blankGif}" class="dijitTabStripIcon" data-dojo-attach-point="iconNode"/>
- <span data-dojo-attach-point="containerNode,titleNode" class="dijitButtonText"></span>
- </div>
- </div>
+<div data-dojo-attach-event="onclick:_onClick" class="dijitTabInnerDiv dijitTabContent dijitButtonContents" data-dojo-attach-point="focusNode">
+ <img role="presentation" alt="" src="${_blankGif}" class="dijitTabStripIcon" data-dojo-attach-point="iconNode"/>
+ <span data-dojo-attach-point="containerNode,titleNode" class="dijitButtonText"></span>
</div> \ No newline at end of file
diff --git a/lib/dijit/layout/templates/_TabButton.html b/lib/dijit/layout/templates/_TabButton.html
index 7d6570e73..99c76a9ac 100644
--- a/lib/dijit/layout/templates/_TabButton.html
+++ b/lib/dijit/layout/templates/_TabButton.html
@@ -1,14 +1,8 @@
-<div role="presentation" data-dojo-attach-point="titleNode" data-dojo-attach-event='onclick:onClick'>
- <div role="presentation" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>
- <div role="presentation" class='dijitTabContent' data-dojo-attach-point='tabContent'>
- <div role="presentation" data-dojo-attach-point='focusNode'>
- <img src="${_blankGif}" alt="" class="dijitIcon dijitTabButtonIcon" data-dojo-attach-point='iconNode' />
- <span data-dojo-attach-point='containerNode' class='tabLabel'></span>
- <span class="dijitInline dijitTabCloseButton dijitTabCloseIcon" data-dojo-attach-point='closeNode'
- data-dojo-attach-event='onclick: onClickCloseButton' role="presentation">
- <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span
- ></span>
- </div>
- </div>
- </div>
+<div role="presentation" data-dojo-attach-point="titleNode,innerDiv,tabContent" class="dijitTabInner dijitTabContent">
+ <img src="${_blankGif}" alt="" class="dijitIcon dijitTabButtonIcon" data-dojo-attach-point='iconNode'/>
+ <span data-dojo-attach-point='containerNode,focusNode' class='tabLabel'></span>
+ <span class="dijitInline dijitTabCloseButton dijitTabCloseIcon" data-dojo-attach-point='closeNode'
+ role="presentation">
+ <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span
+ ></span>
</div>
diff --git a/lib/dijit/layout/utils.js b/lib/dijit/layout/utils.js
index d0a4cd101..16ce2c719 100644
--- a/lib/dijit/layout/utils.js
+++ b/lib/dijit/layout/utils.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/layout/utils",["dojo/_base/array","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang",".."],function(_1,_2,_3,_4,_5,_6){var _7=_5.getObject("layout",true,_6);_7.marginBox2contentBox=function(_8,mb){var cs=_4.getComputedStyle(_8);var me=_3.getMarginExtents(_8,cs);var pb=_3.getPadBorderExtents(_8,cs);return {l:_4.toPixelValue(_8,cs.paddingLeft),t:_4.toPixelValue(_8,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};function _9(_a){return _a.substring(0,1).toUpperCase()+_a.substring(1);};function _b(_c,_d){var _e=_c.resize?_c.resize(_d):_3.setMarginBox(_c.domNode,_d);if(_e){_5.mixin(_c,_e);}else{_5.mixin(_c,_3.getMarginBox(_c.domNode));_5.mixin(_c,_d);}};_7.layoutChildren=function(_f,dim,_10,_11,_12){dim=_5.mixin({},dim);_2.add(_f,"dijitLayoutContainer");_10=_1.filter(_10,function(_13){return _13.region!="center"&&_13.layoutAlign!="client";}).concat(_1.filter(_10,function(_14){return _14.region=="center"||_14.layoutAlign=="client";}));_1.forEach(_10,function(_15){var elm=_15.domNode,pos=(_15.region||_15.layoutAlign);if(!pos){throw new Error("No region setting for "+_15.id);}var _16=elm.style;_16.left=dim.l+"px";_16.top=dim.t+"px";_16.position="absolute";_2.add(elm,"dijitAlign"+_9(pos));var _17={};if(_11&&_11==_15.id){_17[_15.region=="top"||_15.region=="bottom"?"h":"w"]=_12;}if(pos=="top"||pos=="bottom"){_17.w=dim.w;_b(_15,_17);dim.h-=_15.h;if(pos=="top"){dim.t+=_15.h;}else{_16.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){_17.h=dim.h;_b(_15,_17);dim.w-=_15.w;if(pos=="left"){dim.l+=_15.w;}else{_16.left=dim.l+dim.w+"px";}}else{if(pos=="client"||pos=="center"){_b(_15,dim);}}}});};return {marginBox2contentBox:_7.marginBox2contentBox,layoutChildren:_7.layoutChildren};}); \ No newline at end of file
+define("dijit/layout/utils",["dojo/_base/array","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang","../main"],function(_1,_2,_3,_4,_5,_6){var _7=_5.getObject("layout",true,_6);_7.marginBox2contentBox=function(_8,mb){var cs=_4.getComputedStyle(_8);var me=_3.getMarginExtents(_8,cs);var pb=_3.getPadBorderExtents(_8,cs);return {l:_4.toPixelValue(_8,cs.paddingLeft),t:_4.toPixelValue(_8,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};function _9(_a){return _a.substring(0,1).toUpperCase()+_a.substring(1);};function _b(_c,_d){var _e=_c.resize?_c.resize(_d):_3.setMarginBox(_c.domNode,_d);if(_e){_5.mixin(_c,_e);}else{_5.mixin(_c,_3.getMarginBox(_c.domNode));_5.mixin(_c,_d);}};_7.layoutChildren=function(_f,dim,_10,_11,_12){dim=_5.mixin({},dim);_2.add(_f,"dijitLayoutContainer");_10=_1.filter(_10,function(_13){return _13.region!="center"&&_13.layoutAlign!="client";}).concat(_1.filter(_10,function(_14){return _14.region=="center"||_14.layoutAlign=="client";}));_1.forEach(_10,function(_15){var elm=_15.domNode,pos=(_15.region||_15.layoutAlign);if(!pos){throw new Error("No region setting for "+_15.id);}var _16=elm.style;_16.left=dim.l+"px";_16.top=dim.t+"px";_16.position="absolute";_2.add(elm,"dijitAlign"+_9(pos));var _17={};if(_11&&_11==_15.id){_17[_15.region=="top"||_15.region=="bottom"?"h":"w"]=_12;}if(pos=="top"||pos=="bottom"){_17.w=dim.w;_b(_15,_17);dim.h-=_15.h;if(pos=="top"){dim.t+=_15.h;}else{_16.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){_17.h=dim.h;_b(_15,_17);dim.w-=_15.w;if(pos=="left"){dim.l+=_15.w;}else{_16.left=dim.l+dim.w+"px";}}else{if(pos=="client"||pos=="center"){_b(_15,dim);}}}});};return {marginBox2contentBox:_7.marginBox2contentBox,layoutChildren:_7.layoutChildren};}); \ No newline at end of file
diff --git a/lib/dijit/layout/utils.js.uncompressed.js b/lib/dijit/layout/utils.js.uncompressed.js
new file mode 100644
index 000000000..9c1786b0c
--- /dev/null
+++ b/lib/dijit/layout/utils.js.uncompressed.js
@@ -0,0 +1,145 @@
+define("dijit/layout/utils", [
+ "dojo/_base/array", // array.filter array.forEach
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-geometry", // domGeometry.marginBox
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/_base/lang", // lang.mixin
+ "../main" // for exporting symbols to dijit, remove in 2.0
+], function(array, domClass, domGeometry, domStyle, lang, dijit){
+
+ // module:
+ // dijit/layout/utils
+
+ var layout = lang.getObject("layout", true, dijit);
+ /*=====
+ layout = {
+ // summary:
+ // marginBox2contentBox() and layoutChildren()
+ };
+ =====*/
+
+ layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
+ // summary:
+ // Given the margin-box size of a node, return its content box size.
+ // Functions like domGeometry.contentBox() but is more reliable since it doesn't have
+ // to wait for the browser to compute sizes.
+ var cs = domStyle.getComputedStyle(node);
+ var me = domGeometry.getMarginExtents(node, cs);
+ var pb = domGeometry.getPadBorderExtents(node, cs);
+ return {
+ l: domStyle.toPixelValue(node, cs.paddingLeft),
+ t: domStyle.toPixelValue(node, cs.paddingTop),
+ w: mb.w - (me.w + pb.w),
+ h: mb.h - (me.h + pb.h)
+ };
+ };
+
+ function capitalize(word){
+ return word.substring(0,1).toUpperCase() + word.substring(1);
+ }
+
+ function size(widget, dim){
+ // size the child
+ var newSize = widget.resize ? widget.resize(dim) : domGeometry.setMarginBox(widget.domNode, dim);
+
+ // record child's size
+ if(newSize){
+ // if the child returned it's new size then use that
+ lang.mixin(widget, newSize);
+ }else{
+ // otherwise, call getMarginBox(), but favor our own numbers when we have them.
+ // the browser lies sometimes
+ lang.mixin(widget, domGeometry.getMarginBox(widget.domNode));
+ lang.mixin(widget, dim);
+ }
+ }
+
+ layout.layoutChildren = function(/*DomNode*/ container, /*Object*/ dim, /*Widget[]*/ children,
+ /*String?*/ changedRegionId, /*Number?*/ changedRegionSize){
+ // summary:
+ // Layout a bunch of child dom nodes within a parent dom node
+ // container:
+ // parent node
+ // dim:
+ // {l, t, w, h} object specifying dimensions of container into which to place children
+ // children:
+ // An array of Widgets or at least objects containing:
+ //
+ // - domNode: pointer to DOM node to position
+ // - region or layoutAlign: position to place DOM node
+ // - resize(): (optional) method to set size of node
+ // - id: (optional) Id of widgets, referenced from resize object, below.
+ // changedRegionId:
+ // If specified, the slider for the region with the specified id has been dragged, and thus
+ // the region's height or width should be adjusted according to changedRegionSize
+ // changedRegionSize:
+ // See changedRegionId.
+
+ // copy dim because we are going to modify it
+ dim = lang.mixin({}, dim);
+
+ domClass.add(container, "dijitLayoutContainer");
+
+ // Move "client" elements to the end of the array for layout. a11y dictates that the author
+ // needs to be able to put them in the document in tab-order, but this algorithm requires that
+ // client be last. TODO: move these lines to LayoutContainer? Unneeded other places I think.
+ children = array.filter(children, function(item){ return item.region != "center" && item.layoutAlign != "client"; })
+ .concat(array.filter(children, function(item){ return item.region == "center" || item.layoutAlign == "client"; }));
+
+ // set positions/sizes
+ array.forEach(children, function(child){
+ var elm = child.domNode,
+ pos = (child.region || child.layoutAlign);
+ if(!pos){
+ throw new Error("No region setting for " + child.id)
+ }
+
+ // set elem to upper left corner of unused space; may move it later
+ var elmStyle = elm.style;
+ elmStyle.left = dim.l+"px";
+ elmStyle.top = dim.t+"px";
+ elmStyle.position = "absolute";
+
+ domClass.add(elm, "dijitAlign" + capitalize(pos));
+
+ // Size adjustments to make to this child widget
+ var sizeSetting = {};
+
+ // Check for optional size adjustment due to splitter drag (height adjustment for top/bottom align
+ // panes and width adjustment for left/right align panes.
+ if(changedRegionId && changedRegionId == child.id){
+ sizeSetting[child.region == "top" || child.region == "bottom" ? "h" : "w"] = changedRegionSize;
+ }
+
+ // set size && adjust record of remaining space.
+ // note that setting the width of a <div> may affect its height.
+ if(pos == "top" || pos == "bottom"){
+ sizeSetting.w = dim.w;
+ size(child, sizeSetting);
+ dim.h -= child.h;
+ if(pos == "top"){
+ dim.t += child.h;
+ }else{
+ elmStyle.top = dim.t + dim.h + "px";
+ }
+ }else if(pos == "left" || pos == "right"){
+ sizeSetting.h = dim.h;
+ size(child, sizeSetting);
+ dim.w -= child.w;
+ if(pos == "left"){
+ dim.l += child.w;
+ }else{
+ elmStyle.left = dim.l + dim.w + "px";
+ }
+ }else if(pos == "client" || pos == "center"){
+ size(child, dim);
+ }
+ });
+ };
+
+
+ return {
+ marginBox2contentBox: layout.marginBox2contentBox,
+ layoutChildren: layout.layoutChildren
+ };
+});
diff --git a/lib/dijit/main.js.uncompressed.js b/lib/dijit/main.js.uncompressed.js
new file mode 100644
index 000000000..d64763516
--- /dev/null
+++ b/lib/dijit/main.js.uncompressed.js
@@ -0,0 +1,16 @@
+define("dijit/main", [
+ "dojo/_base/kernel"
+], function(dojo){
+ // module:
+ // dijit/main
+
+/*=====
+return {
+ // summary:
+ // The dijit package main module.
+ // Deprecated. Users should access individual modules (ex: dijit/registry) directly.
+};
+=====*/
+
+ return dojo.dijit;
+});
diff --git a/lib/dijit/nls/ar/common.js.uncompressed.js b/lib/dijit/nls/ar/common.js.uncompressed.js
new file mode 100644
index 000000000..d5cb387fb
--- /dev/null
+++ b/lib/dijit/nls/ar/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ar/common", ({
+ buttonOk: "حسنا",
+ buttonCancel: "الغاء",
+ buttonSave: "حفظ",
+ itemClose: "اغلاق"
+})
+);
diff --git a/lib/dijit/nls/ar/loading.js.uncompressed.js b/lib/dijit/nls/ar/loading.js.uncompressed.js
new file mode 100644
index 000000000..2c639825b
--- /dev/null
+++ b/lib/dijit/nls/ar/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/ar/loading", ({
+ loadingState: "جاري التحميل...",
+ errorState: "عفوا، حدث خطأ"
+})
+);
diff --git a/lib/dijit/nls/az/common.js.uncompressed.js b/lib/dijit/nls/az/common.js.uncompressed.js
new file mode 100644
index 000000000..ca676914f
--- /dev/null
+++ b/lib/dijit/nls/az/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/az/common", ({
+ "buttonOk" : "Ok",
+ "buttonCancel" : "Ləğv et",
+ "buttonSave" : "Saxla",
+ "itemClose" : "Bağla"
+})
+);
diff --git a/lib/dijit/nls/az/loading.js.uncompressed.js b/lib/dijit/nls/az/loading.js.uncompressed.js
new file mode 100644
index 000000000..31c98056a
--- /dev/null
+++ b/lib/dijit/nls/az/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/az/loading", ({
+ "loadingState" : "Yüklənir...",
+ "errorState" : "Problem yarandı"
+})
+);
diff --git a/lib/dijit/nls/ca/common.js.uncompressed.js b/lib/dijit/nls/ca/common.js.uncompressed.js
new file mode 100644
index 000000000..1cc649b9a
--- /dev/null
+++ b/lib/dijit/nls/ca/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ca/common", ({
+ buttonOk: "D'acord",
+ buttonCancel: "Cancel·la",
+ buttonSave: "Desa",
+ itemClose: "Tanca"
+})
+);
diff --git a/lib/dijit/nls/ca/loading.js.uncompressed.js b/lib/dijit/nls/ca/loading.js.uncompressed.js
new file mode 100644
index 000000000..8beed26da
--- /dev/null
+++ b/lib/dijit/nls/ca/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/ca/loading", ({
+ loadingState: "S'està carregant...",
+ errorState: "Ens sap greu. S'ha produït un error."
+})
+);
diff --git a/lib/dijit/nls/common.js.uncompressed.js b/lib/dijit/nls/common.js.uncompressed.js
new file mode 100644
index 000000000..f638be148
--- /dev/null
+++ b/lib/dijit/nls/common.js.uncompressed.js
@@ -0,0 +1,42 @@
+define("dijit/nls/common", { root:
+//begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Cancel",
+ buttonSave: "Save",
+ itemClose: "Close"
+})
+//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/nls/cs/common.js.uncompressed.js b/lib/dijit/nls/cs/common.js.uncompressed.js
new file mode 100644
index 000000000..14f49d6bd
--- /dev/null
+++ b/lib/dijit/nls/cs/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/cs/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Storno",
+ buttonSave: "Uložit",
+ itemClose: "Zavřít"
+})
+);
diff --git a/lib/dijit/nls/cs/loading.js.uncompressed.js b/lib/dijit/nls/cs/loading.js.uncompressed.js
new file mode 100644
index 000000000..2427fb005
--- /dev/null
+++ b/lib/dijit/nls/cs/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/cs/loading", ({
+ loadingState: "Probíhá načítání...",
+ errorState: "Omlouváme se, došlo k chybě"
+})
+);
diff --git a/lib/dijit/nls/da/common.js.uncompressed.js b/lib/dijit/nls/da/common.js.uncompressed.js
new file mode 100644
index 000000000..77ee211ef
--- /dev/null
+++ b/lib/dijit/nls/da/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/da/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Annullér",
+ buttonSave: "Gem",
+ itemClose: "Luk"
+})
+);
diff --git a/lib/dijit/nls/da/loading.js.uncompressed.js b/lib/dijit/nls/da/loading.js.uncompressed.js
new file mode 100644
index 000000000..e0424ee64
--- /dev/null
+++ b/lib/dijit/nls/da/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/da/loading", ({
+ loadingState: "Indlæser...",
+ errorState: "Der er opstået en fejl"
+})
+);
diff --git a/lib/dijit/nls/de/common.js.uncompressed.js b/lib/dijit/nls/de/common.js.uncompressed.js
new file mode 100644
index 000000000..9be3f0f9f
--- /dev/null
+++ b/lib/dijit/nls/de/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/de/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Abbrechen",
+ buttonSave: "Speichern",
+ itemClose: "Schließen"
+})
+);
diff --git a/lib/dijit/nls/de/loading.js.uncompressed.js b/lib/dijit/nls/de/loading.js.uncompressed.js
new file mode 100644
index 000000000..0655f3f57
--- /dev/null
+++ b/lib/dijit/nls/de/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/de/loading", ({
+ loadingState: "Wird geladen...",
+ errorState: "Es ist ein Fehler aufgetreten."
+})
+);
diff --git a/lib/dijit/nls/el/common.js.uncompressed.js b/lib/dijit/nls/el/common.js.uncompressed.js
new file mode 100644
index 000000000..efcb6175c
--- /dev/null
+++ b/lib/dijit/nls/el/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/el/common", ({
+ buttonOk: "ΟΚ",
+ buttonCancel: "Ακύρωση",
+ buttonSave: "Αποθήκευση",
+ itemClose: "Κλείσιμο"
+})
+);
diff --git a/lib/dijit/nls/el/loading.js.uncompressed.js b/lib/dijit/nls/el/loading.js.uncompressed.js
new file mode 100644
index 000000000..f19d8c644
--- /dev/null
+++ b/lib/dijit/nls/el/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/el/loading", ({
+ loadingState: "Φόρτωση...",
+ errorState: "Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"
+})
+);
diff --git a/lib/dijit/nls/es/common.js.uncompressed.js b/lib/dijit/nls/es/common.js.uncompressed.js
new file mode 100644
index 000000000..5b6be8098
--- /dev/null
+++ b/lib/dijit/nls/es/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/es/common", ({
+ buttonOk: "Aceptar",
+ buttonCancel: "Cancelar",
+ buttonSave: "Guardar",
+ itemClose: "Cerrar"
+})
+);
diff --git a/lib/dijit/nls/es/loading.js.uncompressed.js b/lib/dijit/nls/es/loading.js.uncompressed.js
new file mode 100644
index 000000000..2e0c84abb
--- /dev/null
+++ b/lib/dijit/nls/es/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/es/loading", ({
+ loadingState: "Cargando...",
+ errorState: "Lo siento, se ha producido un error"
+})
+);
diff --git a/lib/dijit/nls/fi/common.js.uncompressed.js b/lib/dijit/nls/fi/common.js.uncompressed.js
new file mode 100644
index 000000000..1e6a6f423
--- /dev/null
+++ b/lib/dijit/nls/fi/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/fi/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Peruuta",
+ buttonSave: "Tallenna",
+ itemClose: "Sulje"
+})
+);
diff --git a/lib/dijit/nls/fi/loading.js.uncompressed.js b/lib/dijit/nls/fi/loading.js.uncompressed.js
new file mode 100644
index 000000000..aa118100f
--- /dev/null
+++ b/lib/dijit/nls/fi/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/fi/loading", ({
+ loadingState: "Lataus on meneillään...",
+ errorState: "On ilmennyt virhe."
+})
+);
diff --git a/lib/dijit/nls/fr/common.js b/lib/dijit/nls/fr/common.js
index 3041351f7..352040574 100644
--- a/lib/dijit/nls/fr/common.js
+++ b/lib/dijit/nls/fr/common.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/fr/common",({buttonOk:"OK",buttonCancel:"Annuler",buttonSave:"Sauvegarder",itemClose:"Fermer"})); \ No newline at end of file
+define("dijit/nls/fr/common",({buttonOk:"OK",buttonCancel:"Annuler",buttonSave:"Enregistrer",itemClose:"Fermer"})); \ No newline at end of file
diff --git a/lib/dijit/nls/fr/common.js.uncompressed.js b/lib/dijit/nls/fr/common.js.uncompressed.js
new file mode 100644
index 000000000..177690ba2
--- /dev/null
+++ b/lib/dijit/nls/fr/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/fr/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Annuler",
+ buttonSave: "Enregistrer",
+ itemClose: "Fermer"
+})
+);
diff --git a/lib/dijit/nls/fr/loading.js.uncompressed.js b/lib/dijit/nls/fr/loading.js.uncompressed.js
new file mode 100644
index 000000000..12dee580a
--- /dev/null
+++ b/lib/dijit/nls/fr/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/fr/loading", ({
+ loadingState: "Chargement...",
+ errorState: "Une erreur est survenue"
+})
+);
diff --git a/lib/dijit/nls/he/common.js.uncompressed.js b/lib/dijit/nls/he/common.js.uncompressed.js
new file mode 100644
index 000000000..5a337ac67
--- /dev/null
+++ b/lib/dijit/nls/he/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/he/common", ({
+ buttonOk: "אישור",
+ buttonCancel: "ביטול",
+ buttonSave: "שמירה",
+ itemClose: "סגירה"
+})
+);
diff --git a/lib/dijit/nls/he/loading.js.uncompressed.js b/lib/dijit/nls/he/loading.js.uncompressed.js
new file mode 100644
index 000000000..6ee23ed69
--- /dev/null
+++ b/lib/dijit/nls/he/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/he/loading", ({
+ loadingState: "טעינה...‏",
+ errorState: "אירעה שגיאה"
+})
+);
diff --git a/lib/dijit/nls/hr/common.js.uncompressed.js b/lib/dijit/nls/hr/common.js.uncompressed.js
new file mode 100644
index 000000000..80f3e6185
--- /dev/null
+++ b/lib/dijit/nls/hr/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/hr/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Opoziv",
+ buttonSave: "Spremi",
+ itemClose: "Zatvori"
+})
+);
diff --git a/lib/dijit/nls/hr/loading.js b/lib/dijit/nls/hr/loading.js
index 2d3730e2d..5f46982c3 100644
--- a/lib/dijit/nls/hr/loading.js
+++ b/lib/dijit/nls/hr/loading.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/hr/loading",({loadingState:"Učitavanje...",errorState:"Žao nam je, došlo je do pogreške"})); \ No newline at end of file
+define("dijit/nls/hr/loading",({loadingState:"Učitavanje...",errorState:"Žao nam je, došlo je do greške"})); \ No newline at end of file
diff --git a/lib/dijit/nls/hr/loading.js.uncompressed.js b/lib/dijit/nls/hr/loading.js.uncompressed.js
new file mode 100644
index 000000000..75ef351aa
--- /dev/null
+++ b/lib/dijit/nls/hr/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/hr/loading", ({
+ loadingState: "Učitavanje...",
+ errorState: "Žao nam je, došlo je do greške"
+})
+);
diff --git a/lib/dijit/nls/hu/common.js.uncompressed.js b/lib/dijit/nls/hu/common.js.uncompressed.js
new file mode 100644
index 000000000..65803718a
--- /dev/null
+++ b/lib/dijit/nls/hu/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/hu/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Mégse",
+ buttonSave: "Mentés",
+ itemClose: "Bezárás"
+})
+);
diff --git a/lib/dijit/nls/hu/loading.js.uncompressed.js b/lib/dijit/nls/hu/loading.js.uncompressed.js
new file mode 100644
index 000000000..9aa36871c
--- /dev/null
+++ b/lib/dijit/nls/hu/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/hu/loading", ({
+ loadingState: "Betöltés...",
+ errorState: "Sajnálom, hiba történt"
+})
+);
diff --git a/lib/dijit/nls/it/common.js b/lib/dijit/nls/it/common.js
index 25d45843c..bbfb40c63 100644
--- a/lib/dijit/nls/it/common.js
+++ b/lib/dijit/nls/it/common.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/it/common",({buttonOk:"OK",buttonCancel:"Annulla",buttonSave:"Salva",itemClose:"Chiudi"})); \ No newline at end of file
+define("dijit/nls/it/common",({buttonOk:"Ok",buttonCancel:"Annulla",buttonSave:"Salva",itemClose:"Chiudi"})); \ No newline at end of file
diff --git a/lib/dijit/nls/it/common.js.uncompressed.js b/lib/dijit/nls/it/common.js.uncompressed.js
new file mode 100644
index 000000000..41d3fd34c
--- /dev/null
+++ b/lib/dijit/nls/it/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/it/common", ({
+ buttonOk: "Ok",
+ buttonCancel: "Annulla",
+ buttonSave: "Salva",
+ itemClose: "Chiudi"
+})
+);
diff --git a/lib/dijit/nls/it/loading.js.uncompressed.js b/lib/dijit/nls/it/loading.js.uncompressed.js
new file mode 100644
index 000000000..e2a4ea84c
--- /dev/null
+++ b/lib/dijit/nls/it/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/it/loading", ({
+ loadingState: "Caricamento in corso...",
+ errorState: "Si è verificato un errore"
+})
+);
diff --git a/lib/dijit/nls/ja/common.js.uncompressed.js b/lib/dijit/nls/ja/common.js.uncompressed.js
new file mode 100644
index 000000000..ae97a2491
--- /dev/null
+++ b/lib/dijit/nls/ja/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ja/common", ({
+ buttonOk: "OK",
+ buttonCancel: "キャンセル",
+ buttonSave: "保存",
+ itemClose: "閉じる"
+})
+);
diff --git a/lib/dijit/nls/ja/loading.js.uncompressed.js b/lib/dijit/nls/ja/loading.js.uncompressed.js
new file mode 100644
index 000000000..245a150cf
--- /dev/null
+++ b/lib/dijit/nls/ja/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/ja/loading", ({
+ loadingState: "ロード中...",
+ errorState: "エラーが発生しました。"
+})
+);
diff --git a/lib/dijit/nls/kk/common.js.uncompressed.js b/lib/dijit/nls/kk/common.js.uncompressed.js
new file mode 100644
index 000000000..41b8a2a4b
--- /dev/null
+++ b/lib/dijit/nls/kk/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/kk/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Болдырмау",
+ buttonSave: "Сақтау",
+ itemClose: "Жабу"
+})
+);
diff --git a/lib/dijit/nls/kk/loading.js b/lib/dijit/nls/kk/loading.js
index 80274cd1c..2aa77dddd 100644
--- a/lib/dijit/nls/kk/loading.js
+++ b/lib/dijit/nls/kk/loading.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/kk/loading",({loadingState:"Жүктелуде...",errorState:"Кешіріңіз, қате орын алды"})); \ No newline at end of file
+define("dijit/nls/kk/loading",({loadingState:"Қотарылуда...",errorState:"Кешіріңіз, қате орын алды"})); \ No newline at end of file
diff --git a/lib/dijit/nls/kk/loading.js.uncompressed.js b/lib/dijit/nls/kk/loading.js.uncompressed.js
new file mode 100644
index 000000000..2ca42618e
--- /dev/null
+++ b/lib/dijit/nls/kk/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/kk/loading", ({
+ loadingState: "Қотарылуда...",
+ errorState: "Кешіріңіз, қате орын алды"
+})
+);
diff --git a/lib/dijit/nls/ko/common.js.uncompressed.js b/lib/dijit/nls/ko/common.js.uncompressed.js
new file mode 100644
index 000000000..2fb94ce98
--- /dev/null
+++ b/lib/dijit/nls/ko/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ko/common", ({
+ buttonOk: "확인",
+ buttonCancel: "취소",
+ buttonSave: "저장",
+ itemClose: "닫기"
+})
+);
diff --git a/lib/dijit/nls/ko/loading.js.uncompressed.js b/lib/dijit/nls/ko/loading.js.uncompressed.js
new file mode 100644
index 000000000..1a1c019e0
--- /dev/null
+++ b/lib/dijit/nls/ko/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/ko/loading", ({
+ loadingState: "로드 중...",
+ errorState: "죄송합니다. 오류가 발생했습니다."
+})
+);
diff --git a/lib/dijit/nls/loading.js.uncompressed.js b/lib/dijit/nls/loading.js.uncompressed.js
new file mode 100644
index 000000000..6361c98a1
--- /dev/null
+++ b/lib/dijit/nls/loading.js.uncompressed.js
@@ -0,0 +1,40 @@
+define("dijit/nls/loading", { root:
+//begin v1.x content
+({
+ loadingState: "Loading...",
+ errorState: "Sorry, an error occurred"
+})
+//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/nls/nb/common.js.uncompressed.js b/lib/dijit/nls/nb/common.js.uncompressed.js
new file mode 100644
index 000000000..a4ba51c8a
--- /dev/null
+++ b/lib/dijit/nls/nb/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/nb/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Avbryt",
+ buttonSave: "Lagre",
+ itemClose: "Lukk"
+})
+);
diff --git a/lib/dijit/nls/nb/loading.js.uncompressed.js b/lib/dijit/nls/nb/loading.js.uncompressed.js
new file mode 100644
index 000000000..220b90494
--- /dev/null
+++ b/lib/dijit/nls/nb/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/nb/loading", ({
+ loadingState: "Laster inn...",
+ errorState: "Det oppsto en feil"
+})
+);
diff --git a/lib/dijit/nls/nl/common.js.uncompressed.js b/lib/dijit/nls/nl/common.js.uncompressed.js
new file mode 100644
index 000000000..6a1997d27
--- /dev/null
+++ b/lib/dijit/nls/nl/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/nl/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Annuleren",
+ buttonSave: "Opslaan",
+ itemClose: "Sluiten"
+})
+);
diff --git a/lib/dijit/nls/nl/loading.js.uncompressed.js b/lib/dijit/nls/nl/loading.js.uncompressed.js
new file mode 100644
index 000000000..3f2bd58d7
--- /dev/null
+++ b/lib/dijit/nls/nl/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/nl/loading", ({
+ loadingState: "Bezig met laden...",
+ errorState: "Er is een fout opgetreden"
+})
+);
diff --git a/lib/dijit/nls/pl/common.js.uncompressed.js b/lib/dijit/nls/pl/common.js.uncompressed.js
new file mode 100644
index 000000000..d02cbdd0e
--- /dev/null
+++ b/lib/dijit/nls/pl/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/pl/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Anuluj",
+ buttonSave: "Zapisz",
+ itemClose: "Zamknij"
+})
+);
diff --git a/lib/dijit/nls/pl/loading.js.uncompressed.js b/lib/dijit/nls/pl/loading.js.uncompressed.js
new file mode 100644
index 000000000..96bcbf72a
--- /dev/null
+++ b/lib/dijit/nls/pl/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/pl/loading", ({
+ loadingState: "Ładowanie...",
+ errorState: "Niestety, wystąpił błąd"
+})
+);
diff --git a/lib/dijit/nls/pt-pt/common.js.uncompressed.js b/lib/dijit/nls/pt-pt/common.js.uncompressed.js
new file mode 100644
index 000000000..1205cb286
--- /dev/null
+++ b/lib/dijit/nls/pt-pt/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/pt-pt/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Cancelar",
+ buttonSave: "Guardar",
+ itemClose: "Fechar"
+})
+);
diff --git a/lib/dijit/nls/pt-pt/loading.js.uncompressed.js b/lib/dijit/nls/pt-pt/loading.js.uncompressed.js
new file mode 100644
index 000000000..5409c5585
--- /dev/null
+++ b/lib/dijit/nls/pt-pt/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/pt-pt/loading", ({
+ loadingState: "A carregar...",
+ errorState: "Lamentamos, mas ocorreu um erro"
+})
+);
diff --git a/lib/dijit/nls/pt/common.js.uncompressed.js b/lib/dijit/nls/pt/common.js.uncompressed.js
new file mode 100644
index 000000000..e63ec18cd
--- /dev/null
+++ b/lib/dijit/nls/pt/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/pt/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Cancelar",
+ buttonSave: "Salvar",
+ itemClose: "Fechar"
+})
+);
diff --git a/lib/dijit/nls/pt/loading.js.uncompressed.js b/lib/dijit/nls/pt/loading.js.uncompressed.js
new file mode 100644
index 000000000..72e1f8d90
--- /dev/null
+++ b/lib/dijit/nls/pt/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/pt/loading", ({
+ loadingState: "Carregando...",
+ errorState: "Desculpe, ocorreu um erro"
+})
+);
diff --git a/lib/dijit/nls/ro/common.js.uncompressed.js b/lib/dijit/nls/ro/common.js.uncompressed.js
new file mode 100644
index 000000000..bd68178cb
--- /dev/null
+++ b/lib/dijit/nls/ro/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ro/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Anulare",
+ buttonSave: "Salvare",
+ itemClose: "Închidere"
+})
+);
diff --git a/lib/dijit/nls/ro/loading.js.uncompressed.js b/lib/dijit/nls/ro/loading.js.uncompressed.js
new file mode 100644
index 000000000..1fe120e47
--- /dev/null
+++ b/lib/dijit/nls/ro/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/ro/loading", ({
+ loadingState: "Încărcare...",
+ errorState: "Ne pare rău, a apărut o eroare "
+})
+);
diff --git a/lib/dijit/nls/ru/common.js b/lib/dijit/nls/ru/common.js
index f733d663c..58b6834cc 100644
--- a/lib/dijit/nls/ru/common.js
+++ b/lib/dijit/nls/ru/common.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/ru/common",({buttonOk:"ОК",buttonCancel:"Отмена",buttonSave:"Сохранить",itemClose:"Закрыть"})); \ No newline at end of file
+define("dijit/nls/ru/common",({buttonOk:"OK",buttonCancel:"Отмена",buttonSave:"Сохранить",itemClose:"Закрыть"})); \ No newline at end of file
diff --git a/lib/dijit/nls/ru/common.js.uncompressed.js b/lib/dijit/nls/ru/common.js.uncompressed.js
new file mode 100644
index 000000000..354a7c882
--- /dev/null
+++ b/lib/dijit/nls/ru/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ru/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Отмена",
+ buttonSave: "Сохранить",
+ itemClose: "Закрыть"
+})
+);
diff --git a/lib/dijit/nls/ru/loading.js.uncompressed.js b/lib/dijit/nls/ru/loading.js.uncompressed.js
new file mode 100644
index 000000000..8861e02aa
--- /dev/null
+++ b/lib/dijit/nls/ru/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/ru/loading", ({
+ loadingState: "Загрузка...",
+ errorState: "Извините, возникла ошибка"
+})
+);
diff --git a/lib/dijit/nls/sk/common.js.uncompressed.js b/lib/dijit/nls/sk/common.js.uncompressed.js
new file mode 100644
index 000000000..9b9398f6a
--- /dev/null
+++ b/lib/dijit/nls/sk/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/sk/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Zrušiť",
+ buttonSave: "Uložiť",
+ itemClose: "Zatvoriť"
+})
+);
diff --git a/lib/dijit/nls/sk/loading.js b/lib/dijit/nls/sk/loading.js
index 758716db6..cbdf317b0 100644
--- a/lib/dijit/nls/sk/loading.js
+++ b/lib/dijit/nls/sk/loading.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/sk/loading",({loadingState:"Zavádzanie...",errorState:"Nastala chyba"})); \ No newline at end of file
+define("dijit/nls/sk/loading",({loadingState:"Zavádza sa...",errorState:"Ľutujeme, ale vyskytla sa chyba"})); \ No newline at end of file
diff --git a/lib/dijit/nls/sk/loading.js.uncompressed.js b/lib/dijit/nls/sk/loading.js.uncompressed.js
new file mode 100644
index 000000000..cd633acf4
--- /dev/null
+++ b/lib/dijit/nls/sk/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/sk/loading", ({
+ loadingState: "Zavádza sa...",
+ errorState: "Ľutujeme, ale vyskytla sa chyba"
+})
+);
diff --git a/lib/dijit/nls/sl/common.js.uncompressed.js b/lib/dijit/nls/sl/common.js.uncompressed.js
new file mode 100644
index 000000000..d12fbbd4f
--- /dev/null
+++ b/lib/dijit/nls/sl/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/sl/common", ({
+ buttonOk: "V redu",
+ buttonCancel: "Prekliči",
+ buttonSave: "Shrani",
+ itemClose: "Zapri"
+})
+);
diff --git a/lib/dijit/nls/sl/loading.js.uncompressed.js b/lib/dijit/nls/sl/loading.js.uncompressed.js
new file mode 100644
index 000000000..bdd063c22
--- /dev/null
+++ b/lib/dijit/nls/sl/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/sl/loading", ({
+ loadingState: "Nalaganje ...",
+ errorState: "Oprostite, prišlo je do napake."
+})
+);
diff --git a/lib/dijit/nls/sv/common.js.uncompressed.js b/lib/dijit/nls/sv/common.js.uncompressed.js
new file mode 100644
index 000000000..beee35a07
--- /dev/null
+++ b/lib/dijit/nls/sv/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/sv/common", ({
+ buttonOk: "OK",
+ buttonCancel: "Avbryt",
+ buttonSave: "Spara",
+ itemClose: "Stäng"
+})
+);
diff --git a/lib/dijit/nls/sv/loading.js b/lib/dijit/nls/sv/loading.js
index 966ebd102..5da81bd5b 100644
--- a/lib/dijit/nls/sv/loading.js
+++ b/lib/dijit/nls/sv/loading.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/nls/sv/loading",({loadingState:"Läser in...",errorState:"Det uppstod ett fel."})); \ No newline at end of file
+define("dijit/nls/sv/loading",({loadingState:"Läser in...",errorState:"Det har inträffat ett fel."})); \ No newline at end of file
diff --git a/lib/dijit/nls/sv/loading.js.uncompressed.js b/lib/dijit/nls/sv/loading.js.uncompressed.js
new file mode 100644
index 000000000..c839060e0
--- /dev/null
+++ b/lib/dijit/nls/sv/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/sv/loading", ({
+ loadingState: "Läser in...",
+ errorState: "Det har inträffat ett fel."
+})
+);
diff --git a/lib/dijit/nls/th/common.js.uncompressed.js b/lib/dijit/nls/th/common.js.uncompressed.js
new file mode 100644
index 000000000..9c6337e4e
--- /dev/null
+++ b/lib/dijit/nls/th/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/th/common", ({
+ buttonOk: "ตกลง",
+ buttonCancel: "ยกเลิก",
+ buttonSave: "บันทึก",
+ itemClose: "ปิด"
+})
+);
diff --git a/lib/dijit/nls/th/loading.js.uncompressed.js b/lib/dijit/nls/th/loading.js.uncompressed.js
new file mode 100644
index 000000000..9391c9ad4
--- /dev/null
+++ b/lib/dijit/nls/th/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/th/loading", ({
+ loadingState: "กำลังโหลด...",
+ errorState: "ขออภัย เกิดข้อผิดพลาด"
+})
+);
diff --git a/lib/dijit/nls/tr/common.js.uncompressed.js b/lib/dijit/nls/tr/common.js.uncompressed.js
new file mode 100644
index 000000000..bbe5754e9
--- /dev/null
+++ b/lib/dijit/nls/tr/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/tr/common", ({
+ buttonOk: "Tamam",
+ buttonCancel: "İptal",
+ buttonSave: "Kaydet",
+ itemClose: "Kapat"
+})
+);
diff --git a/lib/dijit/nls/tr/loading.js.uncompressed.js b/lib/dijit/nls/tr/loading.js.uncompressed.js
new file mode 100644
index 000000000..39ce2e997
--- /dev/null
+++ b/lib/dijit/nls/tr/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/tr/loading", ({
+ loadingState: "Yükleniyor...",
+ errorState: "Üzgünüz, bir hata oluştu"
+})
+);
diff --git a/lib/dijit/nls/zh-tw/common.js.uncompressed.js b/lib/dijit/nls/zh-tw/common.js.uncompressed.js
new file mode 100644
index 000000000..856ff7250
--- /dev/null
+++ b/lib/dijit/nls/zh-tw/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/zh-tw/common", ({
+ buttonOk: "確定",
+ buttonCancel: "取消",
+ buttonSave: "儲存",
+ itemClose: "關閉"
+})
+);
diff --git a/lib/dijit/nls/zh-tw/loading.js.uncompressed.js b/lib/dijit/nls/zh-tw/loading.js.uncompressed.js
new file mode 100644
index 000000000..4c7240c11
--- /dev/null
+++ b/lib/dijit/nls/zh-tw/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/zh-tw/loading", ({
+ loadingState: "載入中...",
+ errorState: "抱歉,發生錯誤"
+})
+);
diff --git a/lib/dijit/nls/zh/common.js.uncompressed.js b/lib/dijit/nls/zh/common.js.uncompressed.js
new file mode 100644
index 000000000..77250ccd3
--- /dev/null
+++ b/lib/dijit/nls/zh/common.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/zh/common", ({
+ buttonOk: "确定",
+ buttonCancel: "取消",
+ buttonSave: "保存",
+ itemClose: "关闭"
+})
+);
diff --git a/lib/dijit/nls/zh/loading.js.uncompressed.js b/lib/dijit/nls/zh/loading.js.uncompressed.js
new file mode 100644
index 000000000..9c9c1d184
--- /dev/null
+++ b/lib/dijit/nls/zh/loading.js.uncompressed.js
@@ -0,0 +1,6 @@
+define(
+"dijit/nls/zh/loading", ({
+ loadingState: "正在加载...",
+ errorState: "对不起,发生了错误"
+})
+);
diff --git a/lib/dijit/package.json b/lib/dijit/package.json
index 70cf90e0e..86a78d11e 100644
--- a/lib/dijit/package.json
+++ b/lib/dijit/package.json
@@ -1,9 +1,12 @@
{
"name": "dijit",
- "version":"1.7.3",
+ "version":"1.8.3",
+ "directories": {
+ "lib": "."
+ },
"main":"main",
"dependencies": {
- "dojo": "current"
+ "dojo":"1.8.3"
},
"description": "Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible user experience.",
"licenses": [
diff --git a/lib/dijit/place.js b/lib/dijit/place.js
index 7808c6e05..e7a28647d 100644
--- a/lib/dijit/place.js
+++ b/lib/dijit/place.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/place",["dojo/_base/array","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/window","dojo/window","."],function(_1,_2,_3,_4,_5,_6,_7){function _8(_9,_a,_b,_c){var _d=_6.getBox();if(!_9.parentNode||String(_9.parentNode.tagName).toLowerCase()!="body"){_5.body().appendChild(_9);}var _e=null;_1.some(_a,function(_f){var _10=_f.corner;var pos=_f.pos;var _11=0;var _12={w:{"L":_d.l+_d.w-pos.x,"R":pos.x-_d.l,"M":_d.w}[_10.charAt(1)],h:{"T":_d.t+_d.h-pos.y,"B":pos.y-_d.t,"M":_d.h}[_10.charAt(0)]};if(_b){var res=_b(_9,_f.aroundCorner,_10,_12,_c);_11=typeof res=="undefined"?0:res;}var _13=_9.style;var _14=_13.display;var _15=_13.visibility;if(_13.display=="none"){_13.visibility="hidden";_13.display="";}var mb=_2.getMarginBox(_9);_13.display=_14;_13.visibility=_15;var _16={"L":pos.x,"R":pos.x-mb.w,"M":Math.max(_d.l,Math.min(_d.l+_d.w,pos.x+(mb.w>>1))-mb.w)}[_10.charAt(1)],_17={"T":pos.y,"B":pos.y-mb.h,"M":Math.max(_d.t,Math.min(_d.t+_d.h,pos.y+(mb.h>>1))-mb.h)}[_10.charAt(0)],_18=Math.max(_d.l,_16),_19=Math.max(_d.t,_17),_1a=Math.min(_d.l+_d.w,_16+mb.w),_1b=Math.min(_d.t+_d.h,_17+mb.h),_1c=_1a-_18,_1d=_1b-_19;_11+=(mb.w-_1c)+(mb.h-_1d);if(_e==null||_11<_e.overflow){_e={corner:_10,aroundCorner:_f.aroundCorner,x:_18,y:_19,w:_1c,h:_1d,overflow:_11,spaceAvailable:_12};}return !_11;});if(_e.overflow&&_b){_b(_9,_e.aroundCorner,_e.corner,_e.spaceAvailable,_c);}var l=_2.isBodyLtr(),s=_9.style;s.top=_e.y+"px";s[l?"left":"right"]=(l?_e.x:_d.w-_e.x-_e.w)+"px";s[l?"right":"left"]="auto";return _e;};return (_7.place={at:function(_1e,pos,_1f,_20){var _21=_1.map(_1f,function(_22){var c={corner:_22,pos:{x:pos.x,y:pos.y}};if(_20){c.pos.x+=_22.charAt(1)=="L"?_20.x:-_20.x;c.pos.y+=_22.charAt(0)=="T"?_20.y:-_20.y;}return c;});return _8(_1e,_21);},around:function(_23,_24,_25,_26,_27){var _28=(typeof _24=="string"||"offsetWidth" in _24)?_2.position(_24,true):_24;if(_24.parentNode){var _29=_24.parentNode;while(_29&&_29.nodeType==1&&_29.nodeName!="BODY"){var _2a=_2.position(_29,true);var _2b=_3.getComputedStyle(_29).overflow;if(_2b=="hidden"||_2b=="auto"||_2b=="scroll"){var _2c=Math.min(_28.y+_28.h,_2a.y+_2a.h);var _2d=Math.min(_28.x+_28.w,_2a.x+_2a.w);_28.x=Math.max(_28.x,_2a.x);_28.y=Math.max(_28.y,_2a.y);_28.h=_2c-_28.y;_28.w=_2d-_28.x;}_29=_29.parentNode;}}var x=_28.x,y=_28.y,_2e="w" in _28?_28.w:(_28.w=_28.width),_2f="h" in _28?_28.h:(_4.deprecated("place.around: dijit.place.__Rectangle: { x:"+x+", y:"+y+", height:"+_28.height+", width:"+_2e+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+_28.height+", w:"+_2e+" }","","2.0"),_28.h=_28.height);var _30=[];function _31(_32,_33){_30.push({aroundCorner:_32,corner:_33,pos:{x:{"L":x,"R":x+_2e,"M":x+(_2e>>1)}[_32.charAt(1)],y:{"T":y,"B":y+_2f,"M":y+(_2f>>1)}[_32.charAt(0)]}});};_1.forEach(_25,function(pos){var ltr=_26;switch(pos){case "above-centered":_31("TM","BM");break;case "below-centered":_31("BM","TM");break;case "after-centered":ltr=!ltr;case "before-centered":_31(ltr?"ML":"MR",ltr?"MR":"ML");break;case "after":ltr=!ltr;case "before":_31(ltr?"TL":"TR",ltr?"TR":"TL");_31(ltr?"BL":"BR",ltr?"BR":"BL");break;case "below-alt":ltr=!ltr;case "below":_31(ltr?"BL":"BR",ltr?"TL":"TR");_31(ltr?"BR":"BL",ltr?"TR":"TL");break;case "above-alt":ltr=!ltr;case "above":_31(ltr?"TL":"TR",ltr?"BL":"BR");_31(ltr?"TR":"TL",ltr?"BR":"BL");break;default:_31(pos.aroundCorner,pos.corner);}});var _34=_8(_23,_30,_27,{w:_2e,h:_2f});_34.aroundNodePos=_28;return _34;}});}); \ No newline at end of file
+define("dijit/place",["dojo/_base/array","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/window","dojo/window","./main"],function(_1,_2,_3,_4,_5,_6,_7){function _8(_9,_a,_b,_c){var _d=_6.getBox(_9.ownerDocument);if(!_9.parentNode||String(_9.parentNode.tagName).toLowerCase()!="body"){_5.body(_9.ownerDocument).appendChild(_9);}var _e=null;_1.some(_a,function(_f){var _10=_f.corner;var pos=_f.pos;var _11=0;var _12={w:{"L":_d.l+_d.w-pos.x,"R":pos.x-_d.l,"M":_d.w}[_10.charAt(1)],h:{"T":_d.t+_d.h-pos.y,"B":pos.y-_d.t,"M":_d.h}[_10.charAt(0)]};var s=_9.style;s.left=s.right="auto";if(_b){var res=_b(_9,_f.aroundCorner,_10,_12,_c);_11=typeof res=="undefined"?0:res;}var _13=_9.style;var _14=_13.display;var _15=_13.visibility;if(_13.display=="none"){_13.visibility="hidden";_13.display="";}var bb=_2.position(_9);_13.display=_14;_13.visibility=_15;var _16={"L":pos.x,"R":pos.x-bb.w,"M":Math.max(_d.l,Math.min(_d.l+_d.w,pos.x+(bb.w>>1))-bb.w)}[_10.charAt(1)],_17={"T":pos.y,"B":pos.y-bb.h,"M":Math.max(_d.t,Math.min(_d.t+_d.h,pos.y+(bb.h>>1))-bb.h)}[_10.charAt(0)],_18=Math.max(_d.l,_16),_19=Math.max(_d.t,_17),_1a=Math.min(_d.l+_d.w,_16+bb.w),_1b=Math.min(_d.t+_d.h,_17+bb.h),_1c=_1a-_18,_1d=_1b-_19;_11+=(bb.w-_1c)+(bb.h-_1d);if(_e==null||_11<_e.overflow){_e={corner:_10,aroundCorner:_f.aroundCorner,x:_18,y:_19,w:_1c,h:_1d,overflow:_11,spaceAvailable:_12};}return !_11;});if(_e.overflow&&_b){_b(_9,_e.aroundCorner,_e.corner,_e.spaceAvailable,_c);}var l=_2.isBodyLtr(_9.ownerDocument),s=_9.style;s.top=_e.y+"px";s[l?"left":"right"]=(l?_e.x:_d.w-_e.x-_e.w)+"px";s[l?"right":"left"]="auto";return _e;};var _1e={at:function(_1f,pos,_20,_21){var _22=_1.map(_20,function(_23){var c={corner:_23,pos:{x:pos.x,y:pos.y}};if(_21){c.pos.x+=_23.charAt(1)=="L"?_21.x:-_21.x;c.pos.y+=_23.charAt(0)=="T"?_21.y:-_21.y;}return c;});return _8(_1f,_22);},around:function(_24,_25,_26,_27,_28){var _29=(typeof _25=="string"||"offsetWidth" in _25)?_2.position(_25,true):_25;if(_25.parentNode){var _2a=_3.getComputedStyle(_25).position=="absolute";var _2b=_25.parentNode;while(_2b&&_2b.nodeType==1&&_2b.nodeName!="BODY"){var _2c=_2.position(_2b,true),pcs=_3.getComputedStyle(_2b);if(/relative|absolute/.test(pcs.position)){_2a=false;}if(!_2a&&/hidden|auto|scroll/.test(pcs.overflow)){var _2d=Math.min(_29.y+_29.h,_2c.y+_2c.h);var _2e=Math.min(_29.x+_29.w,_2c.x+_2c.w);_29.x=Math.max(_29.x,_2c.x);_29.y=Math.max(_29.y,_2c.y);_29.h=_2d-_29.y;_29.w=_2e-_29.x;}if(pcs.position=="absolute"){_2a=true;}_2b=_2b.parentNode;}}var x=_29.x,y=_29.y,_2f="w" in _29?_29.w:(_29.w=_29.width),_30="h" in _29?_29.h:(_4.deprecated("place.around: dijit/place.__Rectangle: { x:"+x+", y:"+y+", height:"+_29.height+", width:"+_2f+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+_29.height+", w:"+_2f+" }","","2.0"),_29.h=_29.height);var _31=[];function _32(_33,_34){_31.push({aroundCorner:_33,corner:_34,pos:{x:{"L":x,"R":x+_2f,"M":x+(_2f>>1)}[_33.charAt(1)],y:{"T":y,"B":y+_30,"M":y+(_30>>1)}[_33.charAt(0)]}});};_1.forEach(_26,function(pos){var ltr=_27;switch(pos){case "above-centered":_32("TM","BM");break;case "below-centered":_32("BM","TM");break;case "after-centered":ltr=!ltr;case "before-centered":_32(ltr?"ML":"MR",ltr?"MR":"ML");break;case "after":ltr=!ltr;case "before":_32(ltr?"TL":"TR",ltr?"TR":"TL");_32(ltr?"BL":"BR",ltr?"BR":"BL");break;case "below-alt":ltr=!ltr;case "below":_32(ltr?"BL":"BR",ltr?"TL":"TR");_32(ltr?"BR":"BL",ltr?"TR":"TL");break;case "above-alt":ltr=!ltr;case "above":_32(ltr?"TL":"TR",ltr?"BL":"BR");_32(ltr?"TR":"TL",ltr?"BR":"BL");break;default:_32(pos.aroundCorner,pos.corner);}});var _35=_8(_24,_31,_28,{w:_2f,h:_30});_35.aroundNodePos=_29;return _35;}};return _7.place=_1e;}); \ No newline at end of file
diff --git a/lib/dijit/place.js.uncompressed.js b/lib/dijit/place.js.uncompressed.js
new file mode 100644
index 000000000..7e10724df
--- /dev/null
+++ b/lib/dijit/place.js.uncompressed.js
@@ -0,0 +1,367 @@
+define("dijit/place", [
+ "dojo/_base/array", // array.forEach array.map array.some
+ "dojo/dom-geometry", // domGeometry.position
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.getBox
+ "./main" // dijit (defining dijit.place to match API doc)
+], function(array, domGeometry, domStyle, kernel, win, winUtils, dijit){
+
+ // module:
+ // dijit/place
+
+
+ function _place(/*DomNode*/ node, choices, layoutNode, aroundNodeCoords){
+ // summary:
+ // Given a list of spots to put node, put it at the first spot where it fits,
+ // of if it doesn't fit anywhere then the place with the least overflow
+ // choices: Array
+ // Array of elements like: {corner: 'TL', pos: {x: 10, y: 20} }
+ // Above example says to put the top-left corner of the node at (10,20)
+ // layoutNode: Function(node, aroundNodeCorner, nodeCorner, size)
+ // for things like tooltip, they are displayed differently (and have different dimensions)
+ // based on their orientation relative to the parent. This adjusts the popup based on orientation.
+ // It also passes in the available size for the popup, which is useful for tooltips to
+ // tell them that their width is limited to a certain amount. layoutNode() may return a value expressing
+ // how much the popup had to be modified to fit into the available space. This is used to determine
+ // what the best placement is.
+ // aroundNodeCoords: Object
+ // Size of aroundNode, ex: {w: 200, h: 50}
+
+ // get {x: 10, y: 10, w: 100, h:100} type obj representing position of
+ // viewport over document
+ var view = winUtils.getBox(node.ownerDocument);
+
+ // This won't work if the node is inside a <div style="position: relative">,
+ // so reattach it to win.doc.body. (Otherwise, the positioning will be wrong
+ // and also it might get cutoff)
+ if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){
+ win.body(node.ownerDocument).appendChild(node);
+ }
+
+ var best = null;
+ array.some(choices, function(choice){
+ var corner = choice.corner;
+ var pos = choice.pos;
+ var overflow = 0;
+
+ // calculate amount of space available given specified position of node
+ var spaceAvailable = {
+ w: {
+ 'L': view.l + view.w - pos.x,
+ 'R': pos.x - view.l,
+ 'M': view.w
+ }[corner.charAt(1)],
+ h: {
+ 'T': view.t + view.h - pos.y,
+ 'B': pos.y - view.t,
+ 'M': view.h
+ }[corner.charAt(0)]
+ };
+
+ // Clear left/right position settings set earlier so they don't interfere with calculations,
+ // specifically when layoutNode() (a.k.a. Tooltip.orient()) measures natural width of Tooltip
+ var s = node.style;
+ s.left = s.right = "auto";
+
+ // configure node to be displayed in given position relative to button
+ // (need to do this in order to get an accurate size for the node, because
+ // a tooltip's size changes based on position, due to triangle)
+ if(layoutNode){
+ var res = layoutNode(node, choice.aroundCorner, corner, spaceAvailable, aroundNodeCoords);
+ overflow = typeof res == "undefined" ? 0 : res;
+ }
+
+ // get node's size
+ var style = node.style;
+ var oldDisplay = style.display;
+ var oldVis = style.visibility;
+ if(style.display == "none"){
+ style.visibility = "hidden";
+ style.display = "";
+ }
+ var bb = domGeometry.position(node);
+ style.display = oldDisplay;
+ style.visibility = oldVis;
+
+ // coordinates and size of node with specified corner placed at pos,
+ // and clipped by viewport
+ var
+ startXpos = {
+ 'L': pos.x,
+ 'R': pos.x - bb.w,
+ 'M': Math.max(view.l, Math.min(view.l + view.w, pos.x + (bb.w >> 1)) - bb.w) // M orientation is more flexible
+ }[corner.charAt(1)],
+ startYpos = {
+ 'T': pos.y,
+ 'B': pos.y - bb.h,
+ 'M': Math.max(view.t, Math.min(view.t + view.h, pos.y + (bb.h >> 1)) - bb.h)
+ }[corner.charAt(0)],
+ startX = Math.max(view.l, startXpos),
+ startY = Math.max(view.t, startYpos),
+ endX = Math.min(view.l + view.w, startXpos + bb.w),
+ endY = Math.min(view.t + view.h, startYpos + bb.h),
+ width = endX - startX,
+ height = endY - startY;
+
+ overflow += (bb.w - width) + (bb.h - height);
+
+ if(best == null || overflow < best.overflow){
+ best = {
+ corner: corner,
+ aroundCorner: choice.aroundCorner,
+ x: startX,
+ y: startY,
+ w: width,
+ h: height,
+ overflow: overflow,
+ spaceAvailable: spaceAvailable
+ };
+ }
+
+ return !overflow;
+ });
+
+ // In case the best position is not the last one we checked, need to call
+ // layoutNode() again.
+ if(best.overflow && layoutNode){
+ layoutNode(node, best.aroundCorner, best.corner, best.spaceAvailable, aroundNodeCoords);
+ }
+
+ // And then position the node. Do this last, after the layoutNode() above
+ // has sized the node, due to browser quirks when the viewport is scrolled
+ // (specifically that a Tooltip will shrink to fit as though the window was
+ // scrolled to the left).
+ //
+ // In RTL mode, set style.right rather than style.left so in the common case,
+ // window resizes move the popup along with the aroundNode.
+ var l = domGeometry.isBodyLtr(node.ownerDocument),
+ s = node.style;
+ s.top = best.y + "px";
+ s[l ? "left" : "right"] = (l ? best.x : view.w - best.x - best.w) + "px";
+ s[l ? "right" : "left"] = "auto"; // needed for FF or else tooltip goes to far left
+
+ return best;
+ }
+
+ var place = {
+ // summary:
+ // Code to place a DOMNode relative to another DOMNode.
+ // Load using require(["dijit/place"], function(place){ ... }).
+
+ at: function(node, pos, corners, padding){
+ // summary:
+ // Positions one of the node's corners at specified position
+ // such that node is fully visible in viewport.
+ // description:
+ // NOTE: node is assumed to be absolutely or relatively positioned.
+ // node: DOMNode
+ // The node to position
+ // pos: dijit/place.__Position
+ // Object like {x: 10, y: 20}
+ // corners: String[]
+ // Array of Strings representing order to try corners in, like ["TR", "BL"].
+ // Possible values are:
+ //
+ // - "BL" - bottom left
+ // - "BR" - bottom right
+ // - "TL" - top left
+ // - "TR" - top right
+ // padding: dijit/place.__Position?
+ // optional param to set padding, to put some buffer around the element you want to position.
+ // example:
+ // Try to place node's top right corner at (10,20).
+ // If that makes node go (partially) off screen, then try placing
+ // bottom left corner at (10,20).
+ // | place(node, {x: 10, y: 20}, ["TR", "BL"])
+ var choices = array.map(corners, function(corner){
+ var c = { corner: corner, pos: {x:pos.x,y:pos.y} };
+ if(padding){
+ c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;
+ c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;
+ }
+ return c;
+ });
+
+ return _place(node, choices);
+ },
+
+ around: function(
+ /*DomNode*/ node,
+ /*DomNode|dijit/place.__Rectangle*/ anchor,
+ /*String[]*/ positions,
+ /*Boolean*/ leftToRight,
+ /*Function?*/ layoutNode){
+
+ // summary:
+ // Position node adjacent or kitty-corner to anchor
+ // such that it's fully visible in viewport.
+ // description:
+ // Place node such that corner of node touches a corner of
+ // aroundNode, and that node is fully visible.
+ // anchor:
+ // Either a DOMNode or a rectangle (object with x, y, width, height).
+ // positions:
+ // Ordered list of positions to try matching up.
+ //
+ // - before: places drop down to the left of the anchor node/widget, or to the right in the case
+ // of RTL scripts like Hebrew and Arabic; aligns either the top of the drop down
+ // with the top of the anchor, or the bottom of the drop down with bottom of the anchor.
+ // - after: places drop down to the right of the anchor node/widget, or to the left in the case
+ // of RTL scripts like Hebrew and Arabic; aligns either the top of the drop down
+ // with the top of the anchor, or the bottom of the drop down with bottom of the anchor.
+ // - before-centered: centers drop down to the left of the anchor node/widget, or to the right
+ // in the case of RTL scripts like Hebrew and Arabic
+ // - after-centered: centers drop down to the right of the anchor node/widget, or to the left
+ // in the case of RTL scripts like Hebrew and Arabic
+ // - above-centered: drop down is centered above anchor node
+ // - above: drop down goes above anchor node, left sides aligned
+ // - above-alt: drop down goes above anchor node, right sides aligned
+ // - below-centered: drop down is centered above anchor node
+ // - below: drop down goes below anchor node
+ // - below-alt: drop down goes below anchor node, right sides aligned
+ // layoutNode: Function(node, aroundNodeCorner, nodeCorner)
+ // For things like tooltip, they are displayed differently (and have different dimensions)
+ // based on their orientation relative to the parent. This adjusts the popup based on orientation.
+ // leftToRight:
+ // True if widget is LTR, false if widget is RTL. Affects the behavior of "above" and "below"
+ // positions slightly.
+ // example:
+ // | placeAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'});
+ // This will try to position node such that node's top-left corner is at the same position
+ // as the bottom left corner of the aroundNode (ie, put node below
+ // aroundNode, with left edges aligned). If that fails it will try to put
+ // the bottom-right corner of node where the top right corner of aroundNode is
+ // (ie, put node above aroundNode, with right edges aligned)
+ //
+
+ // if around is a DOMNode (or DOMNode id), convert to coordinates
+ var aroundNodePos = (typeof anchor == "string" || "offsetWidth" in anchor)
+ ? domGeometry.position(anchor, true)
+ : anchor;
+
+ // Compute position and size of visible part of anchor (it may be partially hidden by ancestor nodes w/scrollbars)
+ if(anchor.parentNode){
+ // ignore nodes between position:relative and position:absolute
+ var sawPosAbsolute = domStyle.getComputedStyle(anchor).position == "absolute";
+ var parent = anchor.parentNode;
+ while(parent && parent.nodeType == 1 && parent.nodeName != "BODY"){ //ignoring the body will help performance
+ var parentPos = domGeometry.position(parent, true),
+ pcs = domStyle.getComputedStyle(parent);
+ if(/relative|absolute/.test(pcs.position)){
+ sawPosAbsolute = false;
+ }
+ if(!sawPosAbsolute && /hidden|auto|scroll/.test(pcs.overflow)){
+ var bottomYCoord = Math.min(aroundNodePos.y + aroundNodePos.h, parentPos.y + parentPos.h);
+ var rightXCoord = Math.min(aroundNodePos.x + aroundNodePos.w, parentPos.x + parentPos.w);
+ aroundNodePos.x = Math.max(aroundNodePos.x, parentPos.x);
+ aroundNodePos.y = Math.max(aroundNodePos.y, parentPos.y);
+ aroundNodePos.h = bottomYCoord - aroundNodePos.y;
+ aroundNodePos.w = rightXCoord - aroundNodePos.x;
+ }
+ if(pcs.position == "absolute"){
+ sawPosAbsolute = true;
+ }
+ parent = parent.parentNode;
+ }
+ }
+
+ var x = aroundNodePos.x,
+ y = aroundNodePos.y,
+ width = "w" in aroundNodePos ? aroundNodePos.w : (aroundNodePos.w = aroundNodePos.width),
+ height = "h" in aroundNodePos ? aroundNodePos.h : (kernel.deprecated("place.around: dijit/place.__Rectangle: { x:"+x+", y:"+y+", height:"+aroundNodePos.height+", width:"+width+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+aroundNodePos.height+", w:"+width+" }", "", "2.0"), aroundNodePos.h = aroundNodePos.height);
+
+ // Convert positions arguments into choices argument for _place()
+ var choices = [];
+ function push(aroundCorner, corner){
+ choices.push({
+ aroundCorner: aroundCorner,
+ corner: corner,
+ pos: {
+ x: {
+ 'L': x,
+ 'R': x + width,
+ 'M': x + (width >> 1)
+ }[aroundCorner.charAt(1)],
+ y: {
+ 'T': y,
+ 'B': y + height,
+ 'M': y + (height >> 1)
+ }[aroundCorner.charAt(0)]
+ }
+ })
+ }
+ array.forEach(positions, function(pos){
+ var ltr = leftToRight;
+ switch(pos){
+ case "above-centered":
+ push("TM", "BM");
+ break;
+ case "below-centered":
+ push("BM", "TM");
+ break;
+ case "after-centered":
+ ltr = !ltr;
+ // fall through
+ case "before-centered":
+ push(ltr ? "ML" : "MR", ltr ? "MR" : "ML");
+ break;
+ case "after":
+ ltr = !ltr;
+ // fall through
+ case "before":
+ push(ltr ? "TL" : "TR", ltr ? "TR" : "TL");
+ push(ltr ? "BL" : "BR", ltr ? "BR" : "BL");
+ break;
+ case "below-alt":
+ ltr = !ltr;
+ // fall through
+ case "below":
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ push(ltr ? "BL" : "BR", ltr ? "TL" : "TR");
+ push(ltr ? "BR" : "BL", ltr ? "TR" : "TL");
+ break;
+ case "above-alt":
+ ltr = !ltr;
+ // fall through
+ case "above":
+ // first try to align left borders, next try to align right borders (or reverse for RTL mode)
+ push(ltr ? "TL" : "TR", ltr ? "BL" : "BR");
+ push(ltr ? "TR" : "TL", ltr ? "BR" : "BL");
+ break;
+ default:
+ // To assist dijit/_base/place, accept arguments of type {aroundCorner: "BL", corner: "TL"}.
+ // Not meant to be used directly.
+ push(pos.aroundCorner, pos.corner);
+ }
+ });
+
+ var position = _place(node, choices, layoutNode, {w: width, h: height});
+ position.aroundNodePos = aroundNodePos;
+
+ return position;
+ }
+ };
+
+ /*=====
+ place.__Position = {
+ // x: Integer
+ // horizontal coordinate in pixels, relative to document body
+ // y: Integer
+ // vertical coordinate in pixels, relative to document body
+ };
+ place.__Rectangle = {
+ // x: Integer
+ // horizontal offset in pixels, relative to document body
+ // y: Integer
+ // vertical offset in pixels, relative to document body
+ // w: Integer
+ // width in pixels. Can also be specified as "width" for backwards-compatibility.
+ // h: Integer
+ // height in pixels. Can also be specified as "height" for backwards-compatibility.
+ };
+ =====*/
+
+ return dijit.place = place; // setting dijit.place for back-compat, remove for 2.0
+});
diff --git a/lib/dijit/popup.js b/lib/dijit/popup.js
index 53dacbaf0..8aa6e4b2d 100644
--- a/lib/dijit/popup.js
+++ b/lib/dijit/popup.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/popup",["dojo/_base/array","dojo/aspect","dojo/_base/connect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","./place","./BackgroundIframe","."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,on,_d,_e,_f,_10,_11){var _12=_4(null,{_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_13){var _14=_13._popupWrapper,_15=_13.domNode;if(!_14){_14=_7.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},_e.body());_14.appendChild(_15);var s=_15.style;s.display="";s.visibility="";s.position="";s.top="0px";_13._popupWrapper=_14;_2.after(_13,"destroy",function(){_7.destroy(_14);delete _13._popupWrapper;});}return _14;},moveOffScreen:function(_16){var _17=this._createWrapper(_16);_9.set(_17,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_18){var _19=this._createWrapper(_18);_9.set(_19,"display","none");},getTopPopup:function(){var _1a=this._stack;for(var pi=_1a.length-1;pi>0&&_1a[pi].parent===_1a[pi-1].widget;pi--){}return _1a[pi];},open:function(_1b){var _1c=this._stack,_1d=_1b.popup,_1e=_1b.orient||["below","below-alt","above","above-alt"],ltr=_1b.parent?_1b.parent.isLeftToRight():_8.isBodyLtr(),_1f=_1b.around,id=(_1b.around&&_1b.around.id)?(_1b.around.id+"_dropdown"):("popup_"+this._idGen++);while(_1c.length&&(!_1b.parent||!_5.isDescendant(_1b.parent.domNode,_1c[_1c.length-1].widget.domNode))){this.close(_1c[_1c.length-1].widget);}var _20=this._createWrapper(_1d);_6.set(_20,{id:id,style:{zIndex:this._beginZIndex+_1c.length},"class":"dijitPopup "+(_1d.baseClass||_1d["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:_1b.parent?_1b.parent.id:""});if(_d("ie")||_d("mozilla")){if(!_1d.bgIframe){_1d.bgIframe=new _10(_20);}}var _21=_1f?_f.around(_20,_1f,_1e,ltr,_1d.orient?_c.hitch(_1d,"orient"):null):_f.at(_20,_1b,_1e=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_1b.padding);_20.style.display="";_20.style.visibility="visible";_1d.domNode.style.visibility="visible";var _22=[];_22.push(on(_20,_3._keypress,_c.hitch(this,function(evt){if(evt.charOrCode==_b.ESCAPE&&_1b.onCancel){_a.stop(evt);_1b.onCancel();}else{if(evt.charOrCode===_b.TAB){_a.stop(evt);var _23=this.getTopPopup();if(_23&&_23.onCancel){_23.onCancel();}}}})));if(_1d.onCancel&&_1b.onCancel){_22.push(_1d.on("cancel",_1b.onCancel));}_22.push(_1d.on(_1d.onExecute?"execute":"change",_c.hitch(this,function(){var _24=this.getTopPopup();if(_24&&_24.onExecute){_24.onExecute();}})));_1c.push({widget:_1d,parent:_1b.parent,onExecute:_1b.onExecute,onCancel:_1b.onCancel,onClose:_1b.onClose,handlers:_22});if(_1d.onOpen){_1d.onOpen(_21);}return _21;},close:function(_25){var _26=this._stack;while((_25&&_1.some(_26,function(_27){return _27.widget==_25;}))||(!_25&&_26.length)){var top=_26.pop(),_28=top.widget,_29=top.onClose;if(_28.onClose){_28.onClose();}var h;while(h=top.handlers.pop()){h.remove();}if(_28&&_28.domNode){this.hide(_28);}if(_29){_29();}}}});return (_11.popup=new _12());}); \ No newline at end of file
+define("dijit/popup",["dojo/_base/array","dojo/aspect","dojo/_base/connect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","dojo/sniff","./place","./BackgroundIframe","./main"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b,_c,on,_d,_e,_f,_10){function _11(){if(this._popupWrapper){_7.destroy(this._popupWrapper);delete this._popupWrapper;}};var _12=_4(null,{_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_13){var _14=_13._popupWrapper,_15=_13.domNode;if(!_14){_14=_7.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},_13.ownerDocumentBody);_14.appendChild(_15);var s=_15.style;s.display="";s.visibility="";s.position="";s.top="0px";_13._popupWrapper=_14;_2.after(_13,"destroy",_11,true);}return _14;},moveOffScreen:function(_16){var _17=this._createWrapper(_16);_9.set(_17,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_18){var _19=this._createWrapper(_18);_9.set(_19,"display","none");},getTopPopup:function(){var _1a=this._stack;for(var pi=_1a.length-1;pi>0&&_1a[pi].parent===_1a[pi-1].widget;pi--){}return _1a[pi];},open:function(_1b){var _1c=this._stack,_1d=_1b.popup,_1e=_1b.orient||["below","below-alt","above","above-alt"],ltr=_1b.parent?_1b.parent.isLeftToRight():_8.isBodyLtr(_1d.ownerDocument),_1f=_1b.around,id=(_1b.around&&_1b.around.id)?(_1b.around.id+"_dropdown"):("popup_"+this._idGen++);while(_1c.length&&(!_1b.parent||!_5.isDescendant(_1b.parent.domNode,_1c[_1c.length-1].widget.domNode))){this.close(_1c[_1c.length-1].widget);}var _20=this._createWrapper(_1d);_6.set(_20,{id:id,style:{zIndex:this._beginZIndex+_1c.length},"class":"dijitPopup "+(_1d.baseClass||_1d["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:_1b.parent?_1b.parent.id:""});if(_d("ie")||_d("mozilla")){if(!_1d.bgIframe){_1d.bgIframe=new _f(_20);}}var _21=_1f?_e.around(_20,_1f,_1e,ltr,_1d.orient?_c.hitch(_1d,"orient"):null):_e.at(_20,_1b,_1e=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_1b.padding);_20.style.display="";_20.style.visibility="visible";_1d.domNode.style.visibility="visible";var _22=[];_22.push(on(_20,_3._keypress,_c.hitch(this,function(evt){if(evt.charOrCode==_b.ESCAPE&&_1b.onCancel){_a.stop(evt);_1b.onCancel();}else{if(evt.charOrCode===_b.TAB){_a.stop(evt);var _23=this.getTopPopup();if(_23&&_23.onCancel){_23.onCancel();}}}})));if(_1d.onCancel&&_1b.onCancel){_22.push(_1d.on("cancel",_1b.onCancel));}_22.push(_1d.on(_1d.onExecute?"execute":"change",_c.hitch(this,function(){var _24=this.getTopPopup();if(_24&&_24.onExecute){_24.onExecute();}})));_1c.push({widget:_1d,parent:_1b.parent,onExecute:_1b.onExecute,onCancel:_1b.onCancel,onClose:_1b.onClose,handlers:_22});if(_1d.onOpen){_1d.onOpen(_21);}return _21;},close:function(_25){var _26=this._stack;while((_25&&_1.some(_26,function(_27){return _27.widget==_25;}))||(!_25&&_26.length)){var top=_26.pop(),_28=top.widget,_29=top.onClose;if(_28.onClose){_28.onClose();}var h;while(h=top.handlers.pop()){h.remove();}if(_28&&_28.domNode){this.hide(_28);}if(_29){_29();}}}});return (_10.popup=new _12());}); \ No newline at end of file
diff --git a/lib/dijit/popup.js.uncompressed.js b/lib/dijit/popup.js.uncompressed.js
new file mode 100644
index 000000000..58b35fd97
--- /dev/null
+++ b/lib/dijit/popup.js.uncompressed.js
@@ -0,0 +1,318 @@
+define("dijit/popup", [
+ "dojo/_base/array", // array.forEach array.some
+ "dojo/aspect",
+ "dojo/_base/connect", // connect._keypress
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.isDescendant
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-construct", // domConstruct.create domConstruct.destroy
+ "dojo/dom-geometry", // domGeometry.isBodyLtr
+ "dojo/dom-style", // domStyle.set
+ "dojo/_base/event", // event.stop
+ "dojo/keys",
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/sniff", // has("ie") has("mozilla")
+ "./place",
+ "./BackgroundIframe",
+ "./main" // dijit (defining dijit.popup to match API doc)
+], function(array, aspect, connect, declare, dom, domAttr, domConstruct, domGeometry, domStyle, event, keys, lang, on, has,
+ place, BackgroundIframe, dijit){
+
+ // module:
+ // dijit/popup
+
+ /*=====
+ var __OpenArgs = {
+ // popup: Widget
+ // widget to display
+ // parent: Widget
+ // the button etc. that is displaying this popup
+ // around: DomNode
+ // DOM node (typically a button); place popup relative to this node. (Specify this *or* "x" and "y" parameters.)
+ // x: Integer
+ // Absolute horizontal position (in pixels) to place node at. (Specify this *or* "around" parameter.)
+ // y: Integer
+ // Absolute vertical position (in pixels) to place node at. (Specify this *or* "around" parameter.)
+ // orient: Object|String
+ // When the around parameter is specified, orient should be a list of positions to try, ex:
+ // | [ "below", "above" ]
+ // For backwards compatibility it can also be an (ordered) hash of tuples of the form
+ // (around-node-corner, popup-node-corner), ex:
+ // | { "BL": "TL", "TL": "BL" }
+ // where BL means "bottom left" and "TL" means "top left", etc.
+ //
+ // dijit/popup.open() tries to position the popup according to each specified position, in order,
+ // until the popup appears fully within the viewport.
+ //
+ // The default value is ["below", "above"]
+ //
+ // When an (x,y) position is specified rather than an around node, orient is either
+ // "R" or "L". R (for right) means that it tries to put the popup to the right of the mouse,
+ // specifically positioning the popup's top-right corner at the mouse position, and if that doesn't
+ // fit in the viewport, then it tries, in order, the bottom-right corner, the top left corner,
+ // and the top-right corner.
+ // onCancel: Function
+ // callback when user has canceled the popup by:
+ //
+ // 1. hitting ESC or
+ // 2. by using the popup widget's proprietary cancel mechanism (like a cancel button in a dialog);
+ // i.e. whenever popupWidget.onCancel() is called, args.onCancel is called
+ // onClose: Function
+ // callback whenever this popup is closed
+ // onExecute: Function
+ // callback when user "executed" on the popup/sub-popup by selecting a menu choice, etc. (top menu only)
+ // padding: place.__Position
+ // adding a buffer around the opening position. This is only useful when around is not set.
+ };
+ =====*/
+
+ function destroyWrapper(){
+ // summary:
+ // Function to destroy wrapper when popup widget is destroyed.
+ // Left in this scope to avoid memory leak on IE8 on refresh page, see #15206.
+ if(this._popupWrapper){
+ domConstruct.destroy(this._popupWrapper);
+ delete this._popupWrapper;
+ }
+ }
+
+ var PopupManager = declare(null, {
+ // summary:
+ // Used to show drop downs (ex: the select list of a ComboBox)
+ // or popups (ex: right-click context menus).
+
+ // _stack: dijit/_WidgetBase[]
+ // Stack of currently popped up widgets.
+ // (someone opened _stack[0], and then it opened _stack[1], etc.)
+ _stack: [],
+
+ // _beginZIndex: Number
+ // Z-index of the first popup. (If first popup opens other
+ // popups they get a higher z-index.)
+ _beginZIndex: 1000,
+
+ _idGen: 1,
+
+ _createWrapper: function(/*Widget*/ widget){
+ // summary:
+ // Initialization for widgets that will be used as popups.
+ // Puts widget inside a wrapper DIV (if not already in one),
+ // and returns pointer to that wrapper DIV.
+
+ var wrapper = widget._popupWrapper,
+ node = widget.domNode;
+
+ if(!wrapper){
+ // Create wrapper <div> for when this widget [in the future] will be used as a popup.
+ // This is done early because of IE bugs where creating/moving DOM nodes causes focus
+ // to go wonky, see tests/robot/Toolbar.html to reproduce
+ wrapper = domConstruct.create("div", {
+ "class":"dijitPopup",
+ style:{ display: "none"},
+ role: "presentation"
+ }, widget.ownerDocumentBody);
+ wrapper.appendChild(node);
+
+ var s = node.style;
+ s.display = "";
+ s.visibility = "";
+ s.position = "";
+ s.top = "0px";
+
+ widget._popupWrapper = wrapper;
+ aspect.after(widget, "destroy", destroyWrapper, true);
+ }
+
+ return wrapper;
+ },
+
+ moveOffScreen: function(/*Widget*/ widget){
+ // summary:
+ // Moves the popup widget off-screen.
+ // Do not use this method to hide popups when not in use, because
+ // that will create an accessibility issue: the offscreen popup is
+ // still in the tabbing order.
+
+ // Create wrapper if not already there
+ var wrapper = this._createWrapper(widget);
+
+ domStyle.set(wrapper, {
+ visibility: "hidden",
+ top: "-9999px", // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
+ display: ""
+ });
+ },
+
+ hide: function(/*Widget*/ widget){
+ // summary:
+ // Hide this popup widget (until it is ready to be shown).
+ // Initialization for widgets that will be used as popups
+ //
+ // Also puts widget inside a wrapper DIV (if not already in one)
+ //
+ // If popup widget needs to layout it should
+ // do so when it is made visible, and popup._onShow() is called.
+
+ // Create wrapper if not already there
+ var wrapper = this._createWrapper(widget);
+
+ domStyle.set(wrapper, "display", "none");
+ },
+
+ getTopPopup: function(){
+ // summary:
+ // Compute the closest ancestor popup that's *not* a child of another popup.
+ // Ex: For a TooltipDialog with a button that spawns a tree of menus, find the popup of the button.
+ var stack = this._stack;
+ for(var pi=stack.length-1; pi > 0 && stack[pi].parent === stack[pi-1].widget; pi--){
+ /* do nothing, just trying to get right value for pi */
+ }
+ return stack[pi];
+ },
+
+ open: function(/*__OpenArgs*/ args){
+ // summary:
+ // Popup the widget at the specified position
+ //
+ // example:
+ // opening at the mouse position
+ // | popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
+ //
+ // example:
+ // opening the widget as a dropdown
+ // | popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}});
+ //
+ // Note that whatever widget called dijit/popup.open() should also listen to its own _onBlur callback
+ // (fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
+
+ var stack = this._stack,
+ widget = args.popup,
+ orient = args.orient || ["below", "below-alt", "above", "above-alt"],
+ ltr = args.parent ? args.parent.isLeftToRight() : domGeometry.isBodyLtr(widget.ownerDocument),
+ around = args.around,
+ id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+this._idGen++);
+
+ // If we are opening a new popup that isn't a child of a currently opened popup, then
+ // close currently opened popup(s). This should happen automatically when the old popups
+ // gets the _onBlur() event, except that the _onBlur() event isn't reliable on IE, see [22198].
+ while(stack.length && (!args.parent || !dom.isDescendant(args.parent.domNode, stack[stack.length-1].widget.domNode))){
+ this.close(stack[stack.length-1].widget);
+ }
+
+ // Get pointer to popup wrapper, and create wrapper if it doesn't exist
+ var wrapper = this._createWrapper(widget);
+
+
+ domAttr.set(wrapper, {
+ id: id,
+ style: {
+ zIndex: this._beginZIndex + stack.length
+ },
+ "class": "dijitPopup " + (widget.baseClass || widget["class"] || "").split(" ")[0] +"Popup",
+ dijitPopupParent: args.parent ? args.parent.id : ""
+ });
+
+ if(has("ie") || has("mozilla")){
+ if(!widget.bgIframe){
+ // setting widget.bgIframe triggers cleanup in _Widget.destroy()
+ widget.bgIframe = new BackgroundIframe(wrapper);
+ }
+ }
+
+ // position the wrapper node and make it visible
+ var best = around ?
+ place.around(wrapper, around, orient, ltr, widget.orient ? lang.hitch(widget, "orient") : null) :
+ place.at(wrapper, args, orient == 'R' ? ['TR','BR','TL','BL'] : ['TL','BL','TR','BR'], args.padding);
+
+ wrapper.style.display = "";
+ wrapper.style.visibility = "visible";
+ widget.domNode.style.visibility = "visible"; // counteract effects from _HasDropDown
+
+ var handlers = [];
+
+ // provide default escape and tab key handling
+ // (this will work for any widget, not just menu)
+ handlers.push(on(wrapper, connect._keypress, lang.hitch(this, function(evt){
+ if(evt.charOrCode == keys.ESCAPE && args.onCancel){
+ event.stop(evt);
+ args.onCancel();
+ }else if(evt.charOrCode === keys.TAB){
+ event.stop(evt);
+ var topPopup = this.getTopPopup();
+ if(topPopup && topPopup.onCancel){
+ topPopup.onCancel();
+ }
+ }
+ })));
+
+ // watch for cancel/execute events on the popup and notify the caller
+ // (for a menu, "execute" means clicking an item)
+ if(widget.onCancel && args.onCancel){
+ handlers.push(widget.on("cancel", args.onCancel));
+ }
+
+ handlers.push(widget.on(widget.onExecute ? "execute" : "change", lang.hitch(this, function(){
+ var topPopup = this.getTopPopup();
+ if(topPopup && topPopup.onExecute){
+ topPopup.onExecute();
+ }
+ })));
+
+ stack.push({
+ widget: widget,
+ parent: args.parent,
+ onExecute: args.onExecute,
+ onCancel: args.onCancel,
+ onClose: args.onClose,
+ handlers: handlers
+ });
+
+ if(widget.onOpen){
+ // TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here)
+ widget.onOpen(best);
+ }
+
+ return best;
+ },
+
+ close: function(/*Widget?*/ popup){
+ // summary:
+ // Close specified popup and any popups that it parented.
+ // If no popup is specified, closes all popups.
+
+ var stack = this._stack;
+
+ // Basically work backwards from the top of the stack closing popups
+ // until we hit the specified popup, but IIRC there was some issue where closing
+ // a popup would cause others to close too. Thus if we are trying to close B in [A,B,C]
+ // closing C might close B indirectly and then the while() condition will run where stack==[A]...
+ // so the while condition is constructed defensively.
+ while((popup && array.some(stack, function(elem){return elem.widget == popup;})) ||
+ (!popup && stack.length)){
+ var top = stack.pop(),
+ widget = top.widget,
+ onClose = top.onClose;
+
+ if(widget.onClose){
+ // TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here)
+ widget.onClose();
+ }
+
+ var h;
+ while(h = top.handlers.pop()){ h.remove(); }
+
+ // Hide the widget and it's wrapper unless it has already been destroyed in above onClose() etc.
+ if(widget && widget.domNode){
+ this.hide(widget);
+ }
+
+ if(onClose){
+ onClose();
+ }
+ }
+ }
+ });
+
+ return (dijit.popup = new PopupManager());
+});
diff --git a/lib/dijit/registry.js b/lib/dijit/registry.js
index 48d6f7238..aa79e5361 100644
--- a/lib/dijit/registry.js
+++ b/lib/dijit/registry.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/registry",["dojo/_base/array","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window","."],function(_1,_2,_3,_4,_5){var _6={},_7={};var _8={length:0,add:function(_9){if(_7[_9.id]){throw new Error("Tried to register widget with id=="+_9.id+" but that id is already registered");}_7[_9.id]=_9;this.length++;},remove:function(id){if(_7[id]){delete _7[id];this.length--;}},byId:function(id){return typeof id=="string"?_7[id]:id;},byNode:function(_a){return _7[_a.getAttribute("widgetId")];},toArray:function(){var ar=[];for(var id in _7){ar.push(_7[id]);}return ar;},getUniqueId:function(_b){var id;do{id=_b+"_"+(_b in _6?++_6[_b]:_6[_b]=0);}while(_7[id]);return _5._scopeName=="dijit"?id:_5._scopeName+"_"+id;},findWidgets:function(_c){var _d=[];function _e(_f){for(var _10=_f.firstChild;_10;_10=_10.nextSibling){if(_10.nodeType==1){var _11=_10.getAttribute("widgetId");if(_11){var _12=_7[_11];if(_12){_d.push(_12);}}else{_e(_10);}}}};_e(_c);return _d;},_destroyAll:function(){_5._curFocus=null;_5._prevFocus=null;_5._activeStack=[];_1.forEach(_8.findWidgets(_4.body()),function(_13){if(!_13._destroyed){if(_13.destroyRecursive){_13.destroyRecursive();}else{if(_13.destroy){_13.destroy();}}}});},getEnclosingWidget:function(_14){while(_14){var id=_14.getAttribute&&_14.getAttribute("widgetId");if(id){return _7[id];}_14=_14.parentNode;}return null;},_hash:_7};if(_2("ie")){_3.addOnWindowUnload(function(){_8._destroyAll();});}_5.registry=_8;return _8;}); \ No newline at end of file
+define("dijit/registry",["dojo/_base/array","dojo/sniff","dojo/_base/unload","dojo/_base/window","./main"],function(_1,_2,_3,_4,_5){var _6={},_7={};var _8={length:0,add:function(_9){if(_7[_9.id]){throw new Error("Tried to register widget with id=="+_9.id+" but that id is already registered");}_7[_9.id]=_9;this.length++;},remove:function(id){if(_7[id]){delete _7[id];this.length--;}},byId:function(id){return typeof id=="string"?_7[id]:id;},byNode:function(_a){return _7[_a.getAttribute("widgetId")];},toArray:function(){var ar=[];for(var id in _7){ar.push(_7[id]);}return ar;},getUniqueId:function(_b){var id;do{id=_b+"_"+(_b in _6?++_6[_b]:_6[_b]=0);}while(_7[id]);return _5._scopeName=="dijit"?id:_5._scopeName+"_"+id;},findWidgets:function(_c,_d){var _e=[];function _f(_10){for(var _11=_10.firstChild;_11;_11=_11.nextSibling){if(_11.nodeType==1){var _12=_11.getAttribute("widgetId");if(_12){var _13=_7[_12];if(_13){_e.push(_13);}}else{if(_11!==_d){_f(_11);}}}}};_f(_c);return _e;},_destroyAll:function(){_5._curFocus=null;_5._prevFocus=null;_5._activeStack=[];_1.forEach(_8.findWidgets(_4.body()),function(_14){if(!_14._destroyed){if(_14.destroyRecursive){_14.destroyRecursive();}else{if(_14.destroy){_14.destroy();}}}});},getEnclosingWidget:function(_15){while(_15){var id=_15.nodeType==1&&_15.getAttribute("widgetId");if(id){return _7[id];}_15=_15.parentNode;}return null;},_hash:_7};_5.registry=_8;return _8;}); \ No newline at end of file
diff --git a/lib/dijit/registry.js.uncompressed.js b/lib/dijit/registry.js.uncompressed.js
new file mode 100644
index 000000000..c19954aae
--- /dev/null
+++ b/lib/dijit/registry.js.uncompressed.js
@@ -0,0 +1,161 @@
+define("dijit/registry", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/sniff", // has("ie")
+ "dojo/_base/unload", // unload.addOnWindowUnload
+ "dojo/_base/window", // win.body
+ "./main" // dijit._scopeName
+], function(array, has, unload, win, dijit){
+
+ // module:
+ // dijit/registry
+
+ var _widgetTypeCtr = {}, hash = {};
+
+ var registry = {
+ // summary:
+ // Registry of existing widget on page, plus some utility methods.
+
+ // length: Number
+ // Number of registered widgets
+ length: 0,
+
+ add: function(widget){
+ // summary:
+ // Add a widget to the registry. If a duplicate ID is detected, a error is thrown.
+ // widget: dijit/_WidgetBase
+ // Any dijit/_WidgetBase subclass.
+ if(hash[widget.id]){
+ throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
+ }
+ hash[widget.id] = widget;
+ this.length++;
+ },
+
+ remove: function(/*String*/ id){
+ // summary:
+ // Remove a widget from the registry. Does not destroy the widget; simply
+ // removes the reference.
+ if(hash[id]){
+ delete hash[id];
+ this.length--;
+ }
+ },
+
+ byId: function(/*String|Widget*/ id){
+ // summary:
+ // Find a widget by it's id.
+ // If passed a widget then just returns the widget.
+ return typeof id == "string" ? hash[id] : id; // dijit/_WidgetBase
+ },
+
+ byNode: function(/*DOMNode*/ node){
+ // summary:
+ // Returns the widget corresponding to the given DOMNode
+ return hash[node.getAttribute("widgetId")]; // dijit/_WidgetBase
+ },
+
+ toArray: function(){
+ // summary:
+ // Convert registry into a true Array
+ //
+ // example:
+ // Work with the widget .domNodes in a real Array
+ // | array.map(registry.toArray(), function(w){ return w.domNode; });
+
+ var ar = [];
+ for(var id in hash){
+ ar.push(hash[id]);
+ }
+ return ar; // dijit/_WidgetBase[]
+ },
+
+ getUniqueId: function(/*String*/widgetType){
+ // summary:
+ // Generates a unique id for a given widgetType
+
+ var id;
+ do{
+ id = widgetType + "_" +
+ (widgetType in _widgetTypeCtr ?
+ ++_widgetTypeCtr[widgetType] : _widgetTypeCtr[widgetType] = 0);
+ }while(hash[id]);
+ return dijit._scopeName == "dijit" ? id : dijit._scopeName + "_" + id; // String
+ },
+
+ findWidgets: function(root, skipNode){
+ // summary:
+ // Search subtree under root returning widgets found.
+ // Doesn't search for nested widgets (ie, widgets inside other widgets).
+ // root: DOMNode
+ // Node to search under.
+ // skipNode: DOMNode
+ // If specified, don't search beneath this node (usually containerNode).
+
+ var outAry = [];
+
+ function getChildrenHelper(root){
+ for(var node = root.firstChild; node; node = node.nextSibling){
+ if(node.nodeType == 1){
+ var widgetId = node.getAttribute("widgetId");
+ if(widgetId){
+ var widget = hash[widgetId];
+ if(widget){ // may be null on page w/multiple dojo's loaded
+ outAry.push(widget);
+ }
+ }else if(node !== skipNode){
+ getChildrenHelper(node);
+ }
+ }
+ }
+ }
+
+ getChildrenHelper(root);
+ return outAry;
+ },
+
+ _destroyAll: function(){
+ // summary:
+ // Code to destroy all widgets and do other cleanup on page unload
+
+ // Clean up focus manager lingering references to widgets and nodes
+ dijit._curFocus = null;
+ dijit._prevFocus = null;
+ dijit._activeStack = [];
+
+ // Destroy all the widgets, top down
+ array.forEach(registry.findWidgets(win.body()), function(widget){
+ // Avoid double destroy of widgets like Menu that are attached to <body>
+ // even though they are logically children of other widgets.
+ if(!widget._destroyed){
+ if(widget.destroyRecursive){
+ widget.destroyRecursive();
+ }else if(widget.destroy){
+ widget.destroy();
+ }
+ }
+ });
+ },
+
+ getEnclosingWidget: function(/*DOMNode*/ node){
+ // summary:
+ // Returns the widget whose DOM tree contains the specified DOMNode, or null if
+ // the node is not contained within the DOM tree of any widget
+ while(node){
+ var id = node.nodeType == 1 && node.getAttribute("widgetId");
+ if(id){
+ return hash[id];
+ }
+ node = node.parentNode;
+ }
+ return null;
+ },
+
+ // In case someone needs to access hash.
+ // Actually, this is accessed from WidgetSet back-compatibility code
+ _hash: hash
+ };
+
+ dijit.registry = registry;
+
+ return registry;
+});
diff --git a/lib/dijit/resources/_modules.js b/lib/dijit/resources/_modules.js
deleted file mode 100644
index e75636f1c..000000000
--- a/lib/dijit/resources/_modules.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*=====
-// dijit fallback for key summaries otherwise not covered by the doc parser
-
-dijit.demos = {
- // summary:
- // Home of the official dijit demo code
-};
-
-dijit.form = {
- // summary:
- // Form and input related widgets
-};
-
-dijit.layout = {
- // summary:
- // Layout related widgets
-};
-=====*/
diff --git a/lib/dijit/templates/Calendar.html b/lib/dijit/templates/Calendar.html
index a3428f5c7..b4405ed84 100644
--- a/lib/dijit/templates/Calendar.html
+++ b/lib/dijit/templates/Calendar.html
@@ -14,7 +14,7 @@
<span data-dojo-attach-point="increaseArrowNode" class="dijitA11ySideArrow">+</span>
</th>
</tr>
- <tr>
+ <tr role="row">
${!dayCellsHtml}
</tr>
</thead>
diff --git a/lib/dijit/templates/CheckedMenuItem.html b/lib/dijit/templates/CheckedMenuItem.html
index 8e1bf5773..71a0824d9 100644
--- a/lib/dijit/templates/CheckedMenuItem.html
+++ b/lib/dijit/templates/CheckedMenuItem.html
@@ -1,5 +1,4 @@
-<tr class="dijitReset dijitMenuItem" data-dojo-attach-point="focusNode" role="menuitemcheckbox" tabIndex="-1"
- data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">
+<tr class="dijitReset dijitMenuItem" data-dojo-attach-point="focusNode" role="menuitemcheckbox" tabIndex="-1">
<td class="dijitReset dijitMenuItemIconCell" role="presentation">
<img src="${_blankGif}" alt="" class="dijitMenuItemIcon dijitCheckedMenuItemIcon" data-dojo-attach-point="iconNode"/>
<span class="dijitCheckedMenuItemIconChar">&#10003;</span>
diff --git a/lib/dijit/templates/Dialog.html b/lib/dijit/templates/Dialog.html
index 1e4a2237a..0de2225ab 100644
--- a/lib/dijit/templates/Dialog.html
+++ b/lib/dijit/templates/Dialog.html
@@ -1,9 +1,10 @@
<div class="dijitDialog" role="dialog" aria-labelledby="${id}_title">
<div data-dojo-attach-point="titleBar" class="dijitDialogTitleBar">
- <span data-dojo-attach-point="titleNode" class="dijitDialogTitle" id="${id}_title"></span>
- <span data-dojo-attach-point="closeButtonNode" class="dijitDialogCloseIcon" data-dojo-attach-event="ondijitclick: onCancel" title="${buttonCancel}" role="button" tabIndex="-1">
- <span data-dojo-attach-point="closeText" class="closeText" title="${buttonCancel}">x</span>
- </span>
+ <span data-dojo-attach-point="titleNode" class="dijitDialogTitle" id="${id}_title"
+ role="heading" level="1"></span>
+ <span data-dojo-attach-point="closeButtonNode" class="dijitDialogCloseIcon" data-dojo-attach-event="ondijitclick: onCancel" title="${buttonCancel}" role="button" tabIndex="-1">
+ <span data-dojo-attach-point="closeText" class="closeText" title="${buttonCancel}">x</span>
+ </span>
</div>
- <div data-dojo-attach-point="containerNode" class="dijitDialogPaneContent"></div>
+ <div data-dojo-attach-point="containerNode" class="dijitDialogPaneContent"></div>
</div>
diff --git a/lib/dijit/templates/InlineEditBox.html b/lib/dijit/templates/InlineEditBox.html
index 75451e31f..d6c7096dc 100644
--- a/lib/dijit/templates/InlineEditBox.html
+++ b/lib/dijit/templates/InlineEditBox.html
@@ -1,10 +1,10 @@
-<span data-dojo-attach-point="editNode" role="presentation" style="position: absolute; visibility:hidden" class="dijitReset dijitInline"
+<span data-dojo-attach-point="editNode" role="presentation" class="dijitReset dijitInline dijitOffScreen"
data-dojo-attach-event="onkeypress: _onKeyPress"
><span data-dojo-attach-point="editorPlaceholder"></span
><span data-dojo-attach-point="buttonContainer"
- ><button data-dojo-type="dijit.form.Button" data-dojo-props="label: '${buttonSave}', 'class': 'saveButton'"
+ ><button data-dojo-type="dijit/form/Button" data-dojo-props="label: '${buttonSave}', 'class': 'saveButton'"
data-dojo-attach-point="saveButton" data-dojo-attach-event="onClick:save"></button
- ><button data-dojo-type="dijit.form.Button" data-dojo-props="label: '${buttonCancel}', 'class': 'cancelButton'"
+ ><button data-dojo-type="dijit/form/Button" data-dojo-props="label: '${buttonCancel}', 'class': 'cancelButton'"
data-dojo-attach-point="cancelButton" data-dojo-attach-event="onClick:cancel"></button
></span
></span>
diff --git a/lib/dijit/templates/Menu.html b/lib/dijit/templates/Menu.html
index 45e12a011..2c3cb53ba 100644
--- a/lib/dijit/templates/Menu.html
+++ b/lib/dijit/templates/Menu.html
@@ -1,3 +1,4 @@
-<table class="dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable" role="menu" tabIndex="${tabIndex}" data-dojo-attach-event="onkeypress:_onKeyPress" cellspacing="0">
+<table class="dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable" role="menu" tabIndex="${tabIndex}"
+ data-dojo-attach-event="onkeypress:_onKeyPress" cellspacing="0">
<tbody class="dijitReset" data-dojo-attach-point="containerNode"></tbody>
</table>
diff --git a/lib/dijit/templates/MenuBarItem.html b/lib/dijit/templates/MenuBarItem.html
index f5e262966..f236dfe01 100644
--- a/lib/dijit/templates/MenuBarItem.html
+++ b/lib/dijit/templates/MenuBarItem.html
@@ -1,4 +1,4 @@
-<div class="dijitReset dijitInline dijitMenuItem dijitMenuItemLabel" data-dojo-attach-point="focusNode" role="menuitem" tabIndex="-1"
- data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">
+<div class="dijitReset dijitInline dijitMenuItem dijitMenuItemLabel" data-dojo-attach-point="focusNode"
+ role="menuitem" tabIndex="-1">
<span data-dojo-attach-point="containerNode"></span>
</div>
diff --git a/lib/dijit/templates/MenuItem.html b/lib/dijit/templates/MenuItem.html
index b4fe7d603..920038435 100644
--- a/lib/dijit/templates/MenuItem.html
+++ b/lib/dijit/templates/MenuItem.html
@@ -1,5 +1,4 @@
-<tr class="dijitReset dijitMenuItem" data-dojo-attach-point="focusNode" role="menuitem" tabIndex="-1"
- data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">
+<tr class="dijitReset dijitMenuItem" data-dojo-attach-point="focusNode" role="menuitem" tabIndex="-1">
<td class="dijitReset dijitMenuItemIconCell" role="presentation">
<img src="${_blankGif}" alt="" class="dijitIcon dijitMenuItemIcon" data-dojo-attach-point="iconNode"/>
</td>
diff --git a/lib/dijit/templates/TitlePane.html b/lib/dijit/templates/TitlePane.html
index 4e7aece4f..4990bfb1d 100644
--- a/lib/dijit/templates/TitlePane.html
+++ b/lib/dijit/templates/TitlePane.html
@@ -1,6 +1,6 @@
<div>
- <div data-dojo-attach-event="onclick:_onTitleClick, onkeypress:_onTitleKey"
- class="dijitTitlePaneTitle" data-dojo-attach-point="titleBarNode">
+ <div data-dojo-attach-event="onclick:_onTitleClick, onkeydown:_onTitleKey"
+ class="dijitTitlePaneTitle" data-dojo-attach-point="titleBarNode" id="${id}_titleBarNode">
<div class="dijitTitlePaneTitleFocus" data-dojo-attach-point="focusNode">
<img src="${_blankGif}" alt="" data-dojo-attach-point="arrowNode" class="dijitArrowNode" role="presentation"
/><span data-dojo-attach-point="arrowNodeInner" class="dijitArrowNodeInner"></span
@@ -9,7 +9,7 @@
</div>
<div class="dijitTitlePaneContentOuter" data-dojo-attach-point="hideNode" role="presentation">
<div class="dijitReset" data-dojo-attach-point="wipeNode" role="presentation">
- <div class="dijitTitlePaneContentInner" data-dojo-attach-point="containerNode" role="region" id="${id}_pane">
+ <div class="dijitTitlePaneContentInner" data-dojo-attach-point="containerNode" role="region" id="${id}_pane" aria-labelledby="${id}_titleBarNode">
<!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->
</div>
</div>
diff --git a/lib/dijit/templates/TooltipDialog.html b/lib/dijit/templates/TooltipDialog.html
index 00a6022e2..52d26abb1 100644
--- a/lib/dijit/templates/TooltipDialog.html
+++ b/lib/dijit/templates/TooltipDialog.html
@@ -2,5 +2,5 @@
<div class="dijitTooltipContainer" role="presentation">
<div class ="dijitTooltipContents dijitTooltipFocusNode" data-dojo-attach-point="containerNode" role="dialog"></div>
</div>
- <div class="dijitTooltipConnector" role="presentation"></div>
+ <div class="dijitTooltipConnector" role="presentation" data-dojo-attach-point="connectorNode"></div>
</div>
diff --git a/lib/dijit/templates/Tree.html b/lib/dijit/templates/Tree.html
index 4e1b9432e..9d00191bf 100644
--- a/lib/dijit/templates/Tree.html
+++ b/lib/dijit/templates/Tree.html
@@ -1,4 +1,3 @@
-<div class="dijitTree dijitTreeContainer" role="tree"
- data-dojo-attach-event="onkeypress:_onKeyPress">
+<div class="dijitTree dijitTreeContainer" role="tree">
<div class="dijitInline dijitTreeIndent" style="position: absolute; top: -9999px" data-dojo-attach-point="indentDetector"></div>
</div>
diff --git a/lib/dijit/templates/TreeNode.html b/lib/dijit/templates/TreeNode.html
index f55450cc3..ae3e66a0d 100644
--- a/lib/dijit/templates/TreeNode.html
+++ b/lib/dijit/templates/TreeNode.html
@@ -1,12 +1,13 @@
<div class="dijitTreeNode" role="presentation"
- ><div data-dojo-attach-point="rowNode" class="dijitTreeRow" role="presentation" data-dojo-attach-event="onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick"
+ ><div data-dojo-attach-point="rowNode" class="dijitTreeRow dijitInline" role="presentation"
+ ><div data-dojo-attach-point="indentNode" class="dijitInline"></div
><img src="${_blankGif}" alt="" data-dojo-attach-point="expandoNode" class="dijitTreeExpando" role="presentation"
/><span data-dojo-attach-point="expandoNodeText" class="dijitExpandoText" role="presentation"
></span
><span data-dojo-attach-point="contentNode"
class="dijitTreeContent" role="presentation">
<img src="${_blankGif}" alt="" data-dojo-attach-point="iconNode" class="dijitIcon dijitTreeIcon" role="presentation"
- /><span data-dojo-attach-point="labelNode" class="dijitTreeLabel" role="treeitem" tabindex="-1" aria-selected="false" data-dojo-attach-event="onfocus:_onLabelFocus"></span>
+ /><span data-dojo-attach-point="labelNode" class="dijitTreeLabel" role="treeitem" tabindex="-1" aria-selected="false"></span>
</span
></div>
<div data-dojo-attach-point="containerNode" class="dijitTreeContainer" role="presentation" style="display: none;"></div>
diff --git a/lib/dijit/themes/claro/Calendar.css b/lib/dijit/themes/claro/Calendar.css
index a0f959759..1b0ddaed0 100644
--- a/lib/dijit/themes/claro/Calendar.css
+++ b/lib/dijit/themes/claro/Calendar.css
@@ -33,15 +33,18 @@
*/
.claro .dijitCalendar {
border: solid 1px #b5bcc7;
+ border-collapse: separate;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
background-color: #cfe5fa;
- background-image: url("images/calendarContainerImages.png");
- background-position: 0 -448px;
+ background-image: url("images/calendar.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0.4) 2px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0.4) 2px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0.4) 2px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0.4) 2px, rgba(255, 255, 255, 0) 100%);
text-align: center;
padding: 6px 5px 3px 5px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- border-collapse: separate;
}
.dj_ie6 .claro .dijitCalendar {
background-image: none;
@@ -50,7 +53,7 @@
border: none;
}
.claro .dijitCalendarHover, .claro .dijitCalendar:hover, .claro .dijitCalendarActive {
- /* treat dijitCalenderActive like hover since there's
+ /* treat dijitCalendarActive like hover since there's
* no concept of clicking a Calendar as a whole (although you can click things inside the calendar)
*/
@@ -113,9 +116,6 @@
.claro .dijitCalendarDateTemplate {
text-align: center;
background-color: #ffffff;
- background-image: url("images/calendarContainerImages.png");
- background-position: 0 0;
- background-repeat: repeat-x;
border-bottom: 1px solid #d3d3d3;
padding-top: 0;
font-size: 0.909em;
@@ -215,8 +215,6 @@
background-color: #7dbdfa;
}
.claro .dijitCalendarActiveDate .dijitCalendarDateLabel, .claro .dijitCalendarEnabledDate:active .dijitCalendarDateLabel {
- background-image: url("images/calendarContainerImages.png");
- background-position: 0 -300px;
background-color: #7dbdfa;
border: solid 1px #ffffff;
-webkit-transition-duration: 0.1s;
@@ -249,13 +247,13 @@
margin-right: -4px;
}
.claro .dijitCalendar .dijitDropDownButton .dijitButtonNode {
- background-color: transparent;
- background-image: none;
padding: 0 3px 0 2px;
border: solid 1px #b5bcc7;
-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ background-color: transparent;
+ background-image: none;
}
.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode, .claro .dijitCalendar .dijitDropDownButton:hover .dijitButtonNode {
background-color: #e5f2fe;
@@ -276,9 +274,12 @@
padding: 2px 0;
}
.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover, .claro .dijitCalendarMonthMenu .dijitCalendarMonthLabel:hover {
- background-color: #abd6ff;
border-color: #759dc0;
border-width: 1px 0;
- background-image: url("images/commonHighlight.png");
- background-repeat: repeat-x;
+ background-color: #abd6ff;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0));
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0));
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0));
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0));
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr= #ffffff , endColorstr= #abd6ff );
}
diff --git a/lib/dijit/themes/claro/Calendar.less b/lib/dijit/themes/claro/Calendar.less
index 55decd3b4..8b8f5794f 100644
--- a/lib/dijit/themes/claro/Calendar.less
+++ b/lib/dijit/themes/claro/Calendar.less
@@ -35,25 +35,28 @@
@import "variables";
.claro .dijitCalendar {
- border:solid 1px @border-color;
+ border: solid 1px @border-color;
+ border-collapse: separate; // in case user CSS has set border-collapse: collapse for tables
+ .border-radius(4px);
+
+ // Background color and alpha-gradient
background-color: @calendar-background-color;
- background-image:url(@image-calendar-container);
- background-position:0 -448px;
- background-repeat:repeat-x;
+ background-image: url("images/calendar.png"); // fallback for browsers that don't support CSS gradients
+ background-repeat: repeat-x; // so bottom of calendar isn't affected by gradient image repeating
+ .alpha-white-gradient(1, 0px, 0.4, 2px, 0, 100%);
+
text-align:center;
padding:6px 5px 3px 5px;
- .border-radius(4px);
- border-collapse: separate; // in case user CSS has set border-collapse: collapse for tables
}
.dj_ie6 .claro .dijitCalendar {
- background-image:none;
+ background-image:none; // because on IE6 background-image overrides background-color
}
.claro .dijitCalendar img {
border:none;
}
.claro .dijitCalendarHover, .claro .dijitCalendar:hover,
.claro .dijitCalendarActive {
- /* treat dijitCalenderActive like hover since there's
+ /* treat dijitCalendarActive like hover since there's
* no concept of clicking a Calendar as a whole (although you can click things inside the calendar)
*/
background-color: @hovered-background-color;
@@ -120,9 +123,6 @@
.claro .dijitCalendarDateTemplate {
text-align:center;
background-color:@calendar-currentmonth-background-color;
- background-image:url(@image-calendar-container);
- background-position:0 0;
- background-repeat:repeat-x;
border-bottom: 1px solid @minor-border-color;
padding-top:0;
font-size:0.909em;
@@ -209,8 +209,6 @@
}
.claro .dijitCalendarActiveDate .dijitCalendarDateLabel,
.claro .dijitCalendarEnabledDate:active .dijitCalendarDateLabel {
- background-image:url(@image-calendar-container);
- background-position:0 -300px;
background-color: @calendar-date-pressed-background-color;
border:solid 1px @calendar-date-pressed-border-color;
.transition-duration(.1s);
@@ -244,11 +242,13 @@
margin-right:-4px;
}
.claro .dijitCalendar .dijitDropDownButton .dijitButtonNode {
- background-color: transparent;
- background-image: none;
padding: 0 3px 0 2px;
border:solid 1px @border-color;
.box-shadow(0 0 0 rgba(0,0,0,0));
+
+ // Override background settings from vanilla .dijitButtonNode. We want to inherit background of Calendar.
+ background-color: transparent;
+ background-image: none;
}
.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode,
.claro .dijitCalendar .dijitDropDownButton:hover .dijitButtonNode {
@@ -271,9 +271,7 @@
}
.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover,
.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabel:hover {
- background-color: @hovered-background-color;
border-color: @hovered-border-color;
border-width:1px 0;
- background-image: url(@image-common-highlight);
- background-repeat:repeat-x;
+ .gradient-and-filter(@hovered-background-color, 70, 0);
}
diff --git a/lib/dijit/themes/claro/ColorPalette.css b/lib/dijit/themes/claro/ColorPalette.css
index a23b2dfd0..cc768ac60 100644
--- a/lib/dijit/themes/claro/ColorPalette.css
+++ b/lib/dijit/themes/claro/ColorPalette.css
@@ -20,7 +20,7 @@
* .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg
* adds border for active or selected state
*/
-.claro .dijitColorPalette {
+.claro .dijitColorPalette {
border: 1px solid #b5bcc7;
background: #ffffff;
-moz-border-radius: 0;
diff --git a/lib/dijit/themes/claro/Common.css b/lib/dijit/themes/claro/Common.css
index 83f6128c1..8984e1654 100644
--- a/lib/dijit/themes/claro/Common.css
+++ b/lib/dijit/themes/claro/Common.css
@@ -20,12 +20,44 @@
outline: 1px dotted #494949;
}
-/* Drag and Drop */
-.claro .dojoDndItemBefore, .claro .dojoDndItemAfter {
- border-top: 1px solid #759dc0;
+/* Drag and Drop*/
+.claro .dojoDndItem {
+ border-color: rgba(0, 0, 0, 0);
+ -webkit-transition-duration: 0.25s;
+ -moz-transition-duration: 0.25s;
+ transition-duration: 0.25s;
+ -webkit-transition-property: background-color, border-color;
+ -moz-transition-property: background-color, border-color;
+ transition-property: background-color, border-color;
}
.claro .dojoDndItemOver {
- cursor: pointer;
+ background-color: #abd6ff;
+ background-image: url("images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
+ padding: 1px;
+ border: solid 1px #759dc0;
+ color: #000000;
+}
+.claro .dojoDndItemAnchor, .claro .dojoDndItemSelected {
+ background-color: #cfe5fa;
+ background-image: url("images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
+ padding: 1px;
+ border: solid 1px #759dc0;
+ color: #000000;
+}
+.claro .dojoDndItemBefore, .claro .dojoDndItemAfter {
+ border-color: #759dc0;
}
.claro table.dojoDndAvatar {
border: 1px solid #b5bcc7;
diff --git a/lib/dijit/themes/claro/Common.less b/lib/dijit/themes/claro/Common.less
index 248fc1ab8..078d6fdca 100644
--- a/lib/dijit/themes/claro/Common.less
+++ b/lib/dijit/themes/claro/Common.less
@@ -20,14 +20,36 @@
outline: 1px dotted @focus-outline-color;
}
-/* Drag and Drop */
-.claro .dojoDndItemBefore,
-.claro .dojoDndItemAfter{
- border-top: 1px solid @dnd-dropseparator-color;
+/* Drag and Drop*/
+.claro .dojoDndItem {
+ border-color: rgba(0,0,0,0); // rgba() instead of none to prevent flash on hover fade-in
+ .transition-duration(.25s);
+ .transition-property(background-color, border-color)
}
.claro .dojoDndItemOver {
- cursor:pointer;
- }
+ // Hovered item. Matches dijitTreeRowHover.
+ background-color:@hovered-background-color;
+ .standard-gradient;
+ padding: 1px; // reduce from 2px in dijit.css
+ border:solid 1px @hovered-border-color;
+ color:@hovered-text-color;
+}
+.claro .dojoDndItemAnchor,
+.claro .dojoDndItemSelected {
+ // Selected items(s). Matches dijitTreeRowSelected.
+ background-color:@selected-background-color;
+ .standard-gradient;
+ padding: 1px; // reduce from 2px in dijit.css
+ border:solid 1px @selected-border-color;
+ color:@selected-text-color;
+}
+
+.claro .dojoDndItemBefore,
+.claro .dojoDndItemAfter {
+ // line to indicate that user is dropping before/after this dojoDndItem
+ border-color: @dnd-dropseparator-color;
+}
+
.claro table.dojoDndAvatar {
border: 1px solid @border-color;
border-collapse: collapse;
diff --git a/lib/dijit/themes/claro/Dialog.css b/lib/dijit/themes/claro/Dialog.css
index ae0b18df6..744b649dd 100644
--- a/lib/dijit/themes/claro/Dialog.css
+++ b/lib/dijit/themes/claro/Dialog.css
@@ -56,6 +56,15 @@
border-top: 1px solid #d3d3d3;
margin: 10px -8px -10px;
}
+.claro .dijitTooltipDialog .dijitDialogPaneActionBar {
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ margin: 10px -10px -8px;
+}
.claro .dijitDialogPaneActionBar .dijitButton {
float: none;
}
@@ -65,8 +74,13 @@
border: 1px solid #ffffff;
border-top: none;
background-color: #abd6ff;
- background-image: url("images/titlebar.png");
+ background-image: url("images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 5px 7px 4px 7px;
}
.claro .dijitDialogTitle {
@@ -121,8 +135,10 @@
/* the part with the text */
background-color: #ffffff;
- background-image: url("images/tooltipGradient.png");
- background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(bottom, rgba(207, 229, 250, 0.1) 0px, #ffffff 10px);
+ background-image: -webkit-linear-gradient(bottom, rgba(207, 229, 250, 0.1) 0px, #ffffff 10px);
+ background-image: -o-linear-gradient(bottom, rgba(207, 229, 250, 0.1) 0px, #ffffff 10px);
+ background-image: linear-gradient(bottom, rgba(207, 229, 250, 0.1) 0px, #ffffff 10px);
background-position: bottom;
border: 1px solid #759dc0;
padding: 6px 8px;
@@ -134,9 +150,6 @@
font-size: 1em;
color: #000000;
}
-.dj_ie6 .claro .dijitTooltipContainer {
- background-image: none;
-}
.claro .dijitTooltipConnector {
/* the arrow piece */
diff --git a/lib/dijit/themes/claro/Dialog.less b/lib/dijit/themes/claro/Dialog.less
index 5e74be747..8b5b38673 100644
--- a/lib/dijit/themes/claro/Dialog.less
+++ b/lib/dijit/themes/claro/Dialog.less
@@ -59,6 +59,15 @@
border-top: 1px solid @minor-border-color;
margin: 10px -8px -10px;
}
+.claro .dijitTooltipDialog .dijitDialogPaneActionBar {
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ margin: 10px -10px -8px;
+}
.claro .dijitDialogPaneActionBar .dijitButton {
float: none;
}
@@ -68,8 +77,7 @@
border: 1px solid @dialog-titlebar-border-color;
border-top:none;
background-color: @dialog-titlebar-background-color;
- background-image: url(@image-titlebar);
- background-repeat:repeat-x;
+ .standard-gradient;
padding: 5px 7px 4px 7px;
}
@@ -123,8 +131,7 @@
.claro .dijitTooltipContainer {
/* the part with the text */
background-color:@popup-background-color;
- background-image:url(@image-tooltip-gradient);
- background-repeat:repeat-x;
+ .linear-gradient(bottom, @tooltip-gradient-color 0px, @popup-background-color 10px);
background-position:bottom;
border:1px solid @popup-border-color;
padding:6px 8px;
@@ -134,9 +141,6 @@
color: @text-color;
}
-.dj_ie6 .claro .dijitTooltipContainer {
- background-image: none;
-}
.claro .dijitTooltipConnector {
/* the arrow piece */
border: 0;
diff --git a/lib/dijit/themes/claro/Editor.css b/lib/dijit/themes/claro/Editor.css
index 9f167f921..8d691f8b4 100644
--- a/lib/dijit/themes/claro/Editor.css
+++ b/lib/dijit/themes/claro/Editor.css
@@ -25,20 +25,20 @@
}
.claro .dijitEditor .dijitEditorIFrameContainer {
background-color: #ffffff;
- background-image: url("form/images/textBox_back.png");
background-repeat: repeat-x;
}
-.dj_ie6 .claro .dijitEditor .dijitEditorIFrameContainer {
- background-image: none;
-}
.claro .dijitEditorHover .dijitEditorIFrameContainer, .claro .dijitEditorHover .dijitEditorIFrameContainer .dijitEditorIFrame {
background-color: #e5f2fe;
}
.claro .dijitEditorFocused .dijitEditorIFrameContainer, .claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame {
- /* TODO: contradicts rule above, which background-color do you want? */
-
background-color: #ffffff;
}
+.claro .dijitEditorHover .dijitEditorIFrameContainer, .claro .dijitEditorFocused .dijitEditorIFrameContainer {
+ background-image: -moz-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -webkit-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -o-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+}
/* Disabled */
.claro .dijitEditorDisabled {
border: 1px solid #d3d3d3;
diff --git a/lib/dijit/themes/claro/Editor.less b/lib/dijit/themes/claro/Editor.less
index f74a5d462..ddc59ccb4 100644
--- a/lib/dijit/themes/claro/Editor.less
+++ b/lib/dijit/themes/claro/Editor.less
@@ -28,22 +28,20 @@
}
.claro .dijitEditor .dijitEditorIFrameContainer{
background-color: @textbox-background-color;
- background-image: url(@image-form-textbox-background);
background-repeat:repeat-x;
}
-.dj_ie6 .claro .dijitEditor .dijitEditorIFrameContainer{
- background-image: none;
-}
.claro .dijitEditorHover .dijitEditorIFrameContainer,
.claro .dijitEditorHover .dijitEditorIFrameContainer .dijitEditorIFrame{
background-color: @textbox-hovered-background-color;
}
.claro .dijitEditorFocused .dijitEditorIFrameContainer,
.claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame{
- /* TODO: contradicts rule above, which background-color do you want? */
background-color: @textbox-focused-background-color;
}
-
+.claro .dijitEditorHover .dijitEditorIFrameContainer,
+.claro .dijitEditorFocused .dijitEditorIFrameContainer {
+ .textbox-background-image;
+}
/* Disabled */
.claro .dijitEditorDisabled {
diff --git a/lib/dijit/themes/claro/Menu.css b/lib/dijit/themes/claro/Menu.css
index e1c1562e8..d54f04ddc 100644
--- a/lib/dijit/themes/claro/Menu.css
+++ b/lib/dijit/themes/claro/Menu.css
@@ -4,8 +4,8 @@ There are three areas of styling for the Menu:
1. The menu
There are three types of menus:
- i)Context Menu
- ii)Drop down Menu
+ i) Context Menu
+ ii) Drop down Menu
iii) Navigation Menu
All three types of menus are affected by the .dijitMenu class in which you can set the background-color, padding and border
.dijitMenu affects the drop down menu in TimeTextBox, Calendar, ComboBox and FilteringSelect
@@ -18,7 +18,7 @@ There are three areas of styling for the Menu:
3. Menu items - items in the menu.
.dijitMenuItem - for color
.dijitMenuItemHover, .dijitMenuItemSelected - for background-color, border, text color, padding of a menu item or menubar item that has been hovered over or selected
- .dijitMenuItemActive - for bacgkround-color of an active (mousedown) menu item
+ .dijitMenuItemActive - for background-color of an active (mousedown) menu item
td.dijitMenuItemIconCell - for padding around a menu item's icon
td.dijitMenuItemLabel - for padding around a menu item's label
.dijitMenuSeparatorTop - for border, top border, of the separator
@@ -34,15 +34,15 @@ There are three areas of styling for the Menu:
margin: 0;
padding: 0;
background-color: #efefef;
- background-image: url("images/commonHighlight.png");
- background-position: 0 0;
+ background-image: url("images/standardGradient.png");
background-repeat: repeat-x;
-}
-.dj_ie6 .claro .dijitMenuBar {
- background-image: none;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.claro .dijitMenu {
- background-repeat: repeat-y;
background-color: #ffffff;
border: 1px solid #759dc0;
/* so adjoining borders of MenuBar/ComboBox and Menu overlap, avoiding double border */
@@ -54,16 +54,16 @@ There are three areas of styling for the Menu:
/* above -1px makes top/bottom borders disappear on IE6 */
}
+.claro .dijitMenuItem {
+ color: #000000;
+}
.claro .dijitMenuBar .dijitMenuItem {
padding: 6px 10px 7px;
- background-position: 0 100px;
margin: -1px;
}
-.claro .dijitMenuItem {
- background-image: url("images/menuHighlight.png");
- background-position: 0 -40px;
- background-repeat: repeat-x;
- color: #000000;
+.claro .dijitMenuBar .dijitMenuItemHover, .claro .dijitMenuBar .dijitMenuItemSelected {
+ border: solid 1px #759dc0;
+ padding: 5px 9px 6px;
}
/* this prevents jiggling upon hover of a menu item */
.claro .dijitMenuTable {
@@ -74,27 +74,28 @@ There are three areas of styling for the Menu:
.claro .dijitMenuItem td {
padding: 1px;
}
-/* hover over a MenuBarItem */
-.claro .dijitMenuPassive .dijitMenuItemHover, .claro .dijitMenuPassive .dijitMenuItemSelected {
+/* hover over a MenuItem or MenuBarItem */
+.claro .dijitSelectMenu .dijitMenuItemHover td,
+.claro .dijitSelectMenu .dijitMenuItemSelected td,
+.claro .dijitMenuItemHover,
+.claro .dijitMenuItemSelected {
background-color: #abd6ff;
- border: solid 1px #759dc0;
- background-position: 0 0;
- color: #000000;
- padding: 5px 9px 6px;
-}
-.claro .dijitMenuPassive .dijitMenuItemActive {
- background-position: 0 -177px;
-}
-.dj_ie6 .claro .dijitMenuItem, .dj_ie6 .claro .dijitMenuPassive .dijitMenuItem {
- background-image: none;
+ background-image: url("images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
-/* MenuBarItem that has been selected and menu drops down from it */
-.claro .dijitMenuActive .dijitMenuItemHover, .claro .dijitMenuActive .dijitMenuItemSelected {
- border: solid 1px #759dc0;
- padding: 5px 9px 6px;
- background-color: #abd6ff;
- background-position: 0 0;
- color: #000000;
+.claro .dijitMenuItemActive {
+ background-image: url("images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.dj_ie .claro .dijitMenuActive .dijitMenuItemHover,
.dj_ie .claro .dijitMenuActive .dijitMenuItemSelected,
@@ -104,13 +105,6 @@ There are three areas of styling for the Menu:
padding-bottom: 5px;
margin-top: -3px;
}
-.claro .dijitMenuActive .dijitMenuItemActive {
- background-color: #7dbdfa;
- background-position: 0 -177px;
-}
-.claro .dijitMenuItemActive {
- background-position: 0 -177px;
-}
.claro td.dijitMenuItemIconCell {
padding: 2px;
margin: 0 0 0 4px;
@@ -162,25 +156,23 @@ There are three areas of styling for the Menu:
margin-left: 0;
background-image: none;
}
-.claro .dijitComboBoxMenu .dijitMenuItem {
+.claro .dijitSelectMenu .dijitMenuItem td, .claro .dijitComboBoxMenu .dijitMenuItem {
padding: 2px;
border-width: 1px 0 1px 0;
border-style: solid;
border-color: #ffffff;
}
-.claro .dijitComboBoxMenu .dijitMenuItemSelected {
+.claro .dijitSelectMenu .dijitMenuItemSelected td, .claro .dijitComboBoxMenu .dijitMenuItemSelected {
color: #000000;
border-color: #759dc0;
background-color: #abd6ff;
}
-.claro .dijitComboBoxMenu .dijitMenuItemHover {
+.claro .dijitSelectMenu .dijitMenuItemHover td, .claro .dijitComboBoxMenu .dijitMenuItemHover {
color: #000000;
border-color: #769dc0;
background-color: #abd6ff;
- background-position: 0 0;
}
.claro .dijitComboBoxMenuActive .dijitMenuItemSelected {
- background-position: 0 -177px;
background-color: #7dbdfa;
/* TODO: why is this a different color than normal .dijitMenuItemSelected? */
diff --git a/lib/dijit/themes/claro/Menu.less b/lib/dijit/themes/claro/Menu.less
index 80467a5b6..9f4f86071 100644
--- a/lib/dijit/themes/claro/Menu.less
+++ b/lib/dijit/themes/claro/Menu.less
@@ -4,8 +4,8 @@ There are three areas of styling for the Menu:
1. The menu
There are three types of menus:
- i)Context Menu
- ii)Drop down Menu
+ i) Context Menu
+ ii) Drop down Menu
iii) Navigation Menu
All three types of menus are affected by the .dijitMenu class in which you can set the background-color, padding and border
.dijitMenu affects the drop down menu in TimeTextBox, Calendar, ComboBox and FilteringSelect
@@ -18,7 +18,7 @@ There are three areas of styling for the Menu:
3. Menu items - items in the menu.
.dijitMenuItem - for color
.dijitMenuItemHover, .dijitMenuItemSelected - for background-color, border, text color, padding of a menu item or menubar item that has been hovered over or selected
- .dijitMenuItemActive - for bacgkround-color of an active (mousedown) menu item
+ .dijitMenuItemActive - for background-color of an active (mousedown) menu item
td.dijitMenuItemIconCell - for padding around a menu item's icon
td.dijitMenuItemLabel - for padding around a menu item's label
.dijitMenuSeparatorTop - for border, top border, of the separator
@@ -37,15 +37,10 @@ There are three areas of styling for the Menu:
margin: 0;
padding: 0;
background-color: @bar-background-color;
- background-image: url(@image-common-highlight);
- background-position:0 0;
- background-repeat:repeat-x;
-}
-.dj_ie6 .claro .dijitMenuBar {
- background-image:none;
+ .standard-gradient;
}
+
.claro .dijitMenu {
- background-repeat:repeat-y;
background-color:@menu-background-color;
border: 1px solid @popup-border-color;
@@ -55,16 +50,19 @@ There are three areas of styling for the Menu:
.dj_ie6 .claro .dijitMenu {
margin: 0; /* above -1px makes top/bottom borders disappear on IE6 */
}
+
+.claro .dijitMenuItem {
+ color: @text-color;
+}
.claro .dijitMenuBar .dijitMenuItem {
padding: 6px 10px 7px;
- background-position:0 100px;
margin:-1px;
-}
-.claro .dijitMenuItem {
- background-image: url(@image-menu-highlight);
- background-position:0 -40px;
- background-repeat:repeat-x;
- color: @text-color;
+}
+.claro .dijitMenuBar .dijitMenuItemHover,
+.claro .dijitMenuBar .dijitMenuItemSelected {
+ // on hover or selection of MenuBar item, add border and reduce padding to compensate
+ border:solid 1px @hovered-border-color;
+ padding: 5px 9px 6px;
}
/* this prevents jiggling upon hover of a menu item */
@@ -76,50 +74,36 @@ There are three areas of styling for the Menu:
.claro .dijitMenuItem td{
padding:1px;
}
-/* hover over a MenuBarItem */
-.claro .dijitMenuPassive .dijitMenuItemHover,
-.claro .dijitMenuPassive .dijitMenuItemSelected {
+/* hover over a MenuItem or MenuBarItem */
+.claro .dijitSelectMenu .dijitMenuItemHover td,
+.claro .dijitSelectMenu .dijitMenuItemSelected td,
+.claro .dijitMenuItemHover,
+.claro .dijitMenuItemSelected {
+ // note: seems like the selected MenuItem should use @pressed-background-color
+ // and .active-gradient, but claro didn't to that
background-color: @hovered-background-color;
- border:solid 1px @hovered-border-color;
- background-position:0 0;
- color:@text-color;
- padding: 5px 9px 6px;
+ .standard-gradient;
}
-.claro .dijitMenuPassive .dijitMenuItemActive{
- background-position:0 -177px;
-}
-.dj_ie6 .claro .dijitMenuItem,
-.dj_ie6 .claro .dijitMenuPassive .dijitMenuItem {
- background-image: none;
-}
-
-/* MenuBarItem that has been selected and menu drops down from it */
-.claro .dijitMenuActive .dijitMenuItemHover,
-.claro .dijitMenuActive .dijitMenuItemSelected {
- border:solid 1px @hovered-border-color;
- padding: 5px 9px 6px;
- background-color: @hovered-background-color;
- background-position:0 0;
- color:@hovered-text-color;
+.claro .dijitMenuItemActive {
+ // todo: seems like the selected MenuItem should come here
+ // todo: seems like should use @pressed-background-color
+ .active-gradient;
}
.dj_ie .claro .dijitMenuActive .dijitMenuItemHover,
.dj_ie .claro .dijitMenuActive .dijitMenuItemSelected,
.dj_ie .claro .dijitMenuPassive .dijitMenuItemHover,
.dj_ie .claro .dijitMenuPassive .dijitMenuItemSelected {
+ // Selectivity set to override ComboBox rules below.
+ // If this rule isn't present, on IE6 hovering an item in the ComboBox drop down causes two
+ // items to be highlighted (except when hovering the first item in the list)
padding-top: 6px;
padding-bottom: 5px;
margin-top: -3px;
}
-.claro .dijitMenuActive .dijitMenuItemActive{
- background-color: @pressed-background-color;
- background-position:0 -177px;
-}
-.claro .dijitMenuItemActive {
- background-position:0 -177px;
-}
+
.claro td.dijitMenuItemIconCell {
- padding: 2px;
- margin: 0 0 0 4px;
+ padding: 2px;
+ margin: 0 0 0 4px;
}
.claro td.dijitMenuItemLabel {
padding-top: 5px;
@@ -168,25 +152,26 @@ There are three areas of styling for the Menu:
background-image: none;
}
+.claro .dijitSelectMenu .dijitMenuItem td,
.claro .dijitComboBoxMenu .dijitMenuItem {
padding: @textbox-padding; // Make drop down menu text line up with text in <input>.
border-width:1px 0 1px 0;
border-style:solid;
border-color: @select-dropdownitem-background-color;
}
+.claro .dijitSelectMenu .dijitMenuItemSelected td,
.claro .dijitComboBoxMenu .dijitMenuItemSelected {
color:@selected-text-color;
border-color:@hovered-border-color;
background-color:@hovered-background-color;
}
+.claro .dijitSelectMenu .dijitMenuItemHover td,
.claro .dijitComboBoxMenu .dijitMenuItemHover {
color: #000000;
border-color: #769dc0;
background-color: #abd6ff;
- background-position: 0 0;
}
.claro .dijitComboBoxMenuActive .dijitMenuItemSelected {
- background-position:0 -177px;
background-color: @select-dropdownitem-hovered-background-color; /* TODO: why is this a different color than normal .dijitMenuItemSelected? */
}
.claro .dijitMenuPreviousButton, .claro .dijitMenuNextButton {
diff --git a/lib/dijit/themes/claro/ProgressBar.css b/lib/dijit/themes/claro/ProgressBar.css
index 925021f7a..5716c4ae7 100644
--- a/lib/dijit/themes/claro/ProgressBar.css
+++ b/lib/dijit/themes/claro/ProgressBar.css
@@ -30,13 +30,20 @@
.claro .dijitProgressBarEmpty {
/* outer container and background of the bar that's not finished yet*/
- background: #ffffff url("images/progressBarEmpty.png") no-repeat left;
+ background-color: #ffffff;
border-color: #759dc0;
}
.claro .dijitProgressBarTile {
/* inner container for finished portion when in 'tile' (image) mode */
- background: #abd6ff url("images/progressBarFull.png") repeat-x top;
+ background-color: #abd6ff;
+ background-image: url("images/progressBarFull.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.93) 0px, rgba(255, 255, 255, 0.41) 1px, rgba(255, 255, 255, 0.7) 2px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.93) 0px, rgba(255, 255, 255, 0.41) 1px, rgba(255, 255, 255, 0.7) 2px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.93) 0px, rgba(255, 255, 255, 0.41) 1px, rgba(255, 255, 255, 0.7) 2px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.93) 0px, rgba(255, 255, 255, 0.41) 1px, rgba(255, 255, 255, 0.7) 2px, rgba(255, 255, 255, 0) 100%);
+ background-attachment: scroll;
}
.dj_ie6 .claro .dijitProgressBarTile {
background-image: none;
diff --git a/lib/dijit/themes/claro/ProgressBar.less b/lib/dijit/themes/claro/ProgressBar.less
index 8edf426a0..096618f08 100644
--- a/lib/dijit/themes/claro/ProgressBar.less
+++ b/lib/dijit/themes/claro/ProgressBar.less
@@ -32,12 +32,18 @@
}
.claro .dijitProgressBarEmpty {
/* outer container and background of the bar that's not finished yet*/
- background: @progressbar-empty-background-color url(@image-progressbar-empty) no-repeat left;
+ background-color: @progressbar-empty-background-color;
border-color: @progressbar-border-color;
}
.claro .dijitProgressBarTile {
/* inner container for finished portion when in 'tile' (image) mode */
- background: @progressbar-full-background-color url(@image-progressbar-full) repeat-x top;
+ background-color: @progressbar-full-background-color;
+
+ // gradient background using CSS gradient, with fallback to image for IE
+ background-image: url("images/progressBarFull.png");
+ background-repeat: repeat-x;
+ .alpha-white-gradient(0.93,0px, 0.41,1px, 0.7,2px, 0,100%);
+ background-attachment: scroll; // override strange "fixed" setting from dijit.css
}
.dj_ie6 .claro .dijitProgressBarTile {
background-image: none;
diff --git a/lib/dijit/themes/claro/README b/lib/dijit/themes/claro/README
index 3b4b4aa4e..0a254623f 100644
--- a/lib/dijit/themes/claro/README
+++ b/lib/dijit/themes/claro/README
@@ -1,41 +1,11 @@
These are "less" files that compile into the CSS of claro.
----------
-Installing and running on Windows:
-
-1. Install node:
- a) Go to https://github.com/ajaxorg/node-builds, press download button, and select "download zip"
- b) unzip the file into C:\
-
-2. Add node environment variables:
-
- a) open Control Panel --> click System icon --> select Advanced tab --> click Environment variables button
- b) press "edit" on path
- c) depending on what directory you unzipped to and the exact filenames, you will add something like
-
- ;C:\ajaxorg-node-builds-0fcee7d\win32
-
-4. To compile all the files:
-
- C:\> cd C:\myworkspace\dijit\themes\claro
- C:\> node compile.js
-
---------
-To install/run less version 2 on mac:
-
-1. Install Node.js
- Download a built copy from https://github.com/ajaxorg/node-builds.
- Alternately, go to http://nodejs.org/#download (./configure, make, make install).
+1. Install node from http://nodejs.org/#download
-2. Edit .bash_profile etc. to add node to your path
-
- export PATH=$PATH:/opt/less/bin
-
-To compile all the files:
+2. To compile all the files:
$ cd dijit/themes/claro
$ node compile.js
------
See http://lesscss.org/ and https://github.com/cloudhead/less.js/ for more information.
diff --git a/lib/dijit/themes/claro/TimePicker.css b/lib/dijit/themes/claro/TimePicker.css
index c8d6bb29d..847bcc192 100644
--- a/lib/dijit/themes/claro/TimePicker.css
+++ b/lib/dijit/themes/claro/TimePicker.css
@@ -35,19 +35,19 @@
.claro .dijitTimePickerItem {
/* dijitTimePickerItem refers to both Tick's (minor values like 2:15, 2:30, 2:45) and Marker's (major values like 2PM, 3PM) */
- background-image: url("images/commonHighlight.png");
- background-position: 0 -1px;
+ background-image: url("images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
border-top: solid 1px #b5bcc7;
border-bottom: solid 1px #b5bcc7;
margin-right: -1px;
margin-left: -1px;
margin-top: -1px;
}
-/* to make up for lack of alpha transparency in IE6 */
-.dj_ie6 .claro .dijitTimePickerItem {
- background-image: none;
-}
.claro .dijitTimePickerTick {
/* minor value */
@@ -100,12 +100,13 @@
border-right: none;
border-color: #b5bcc7;
background-color: #efefef;
- background-image: url("images/commonHighlight.png");
- background-position: 0 -1px;
+ background-image: url("images/standardGradient.png");
background-repeat: repeat-x;
-}
-.dj_ie6 .claro .dijitTimePicker .dijitButtonNode {
- background-image: none;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.claro .dijitTimePicker .dijitArrowButtonInner {
height: 100%;
diff --git a/lib/dijit/themes/claro/TimePicker.less b/lib/dijit/themes/claro/TimePicker.less
index a6253f7dd..0f3bf9c1a 100644
--- a/lib/dijit/themes/claro/TimePicker.less
+++ b/lib/dijit/themes/claro/TimePicker.less
@@ -34,19 +34,13 @@
}
.claro .dijitTimePickerItem{
/* dijitTimePickerItem refers to both Tick's (minor values like 2:15, 2:30, 2:45) and Marker's (major values like 2PM, 3PM) */
- background-image: url(@image-common-highlight);
- background-position:0 -1px;
- background-repeat:repeat-x;
+ .standard-gradient;
border-top:solid 1px @border-color;
border-bottom:solid 1px @border-color;
margin-right:-1px;
margin-left:-1px;
margin-top:-1px;
}
-/* to make up for lack of alpha transparency in IE6 */
-.dj_ie6 .claro .dijitTimePickerItem {
- background-image: none;
-}
.claro .dijitTimePickerTick {
/* minor value */
color:@timepicker-minorvalue-text-color;
@@ -95,12 +89,7 @@
border-right:none;
border-color:@border-color;
background-color: @unselected-background-color;
- background-image: url(@image-common-highlight);
- background-position:0 -1px;
- background-repeat:repeat-x;
-}
-.dj_ie6 .claro .dijitTimePicker .dijitButtonNode {
- background-image: none;
+ .standard-gradient;
}
.claro .dijitTimePicker .dijitArrowButtonInner{
height: 100%; /* hack claro.button.css */
@@ -122,3 +111,5 @@
.claro .dijitTimePicker .dijitDownArrowHover .dijitArrowButtonInner {
background-position:-70px 45%;
}
+
+// TODO: should have active rule, for clicking a .dijitTimePickerItem \ No newline at end of file
diff --git a/lib/dijit/themes/claro/TitlePane.css b/lib/dijit/themes/claro/TitlePane.css
index 141561506..356aef1cc 100644
--- a/lib/dijit/themes/claro/TitlePane.css
+++ b/lib/dijit/themes/claro/TitlePane.css
@@ -19,15 +19,17 @@
*/
.claro .dijitTitlePaneTitle {
background-color: #efefef;
- background-image: url("images/titlebar.png");
+ background-image: url("images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
border: 1px solid #b5bcc7;
padding: 0 7px 3px 7px;
min-height: 17px;
}
-.dj_ie6 .claro .dijitTitlePaneTitle {
- background-image: none;
-}
.claro .dijitTitlePaneTitleHover {
background-color: #abd6ff;
border-color: #759dc0;
@@ -35,7 +37,13 @@
.claro .dijitTitlePaneTitleActive {
background-color: #7dbdfa;
border-color: #759dc0;
- background-position: 0 -136px;
+ background-image: url("images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.claro .dijitTitlePaneTitleFocus {
margin-top: 3px;
diff --git a/lib/dijit/themes/claro/TitlePane.less b/lib/dijit/themes/claro/TitlePane.less
index 89da9f3d9..d899453d6 100644
--- a/lib/dijit/themes/claro/TitlePane.less
+++ b/lib/dijit/themes/claro/TitlePane.less
@@ -22,15 +22,11 @@
.claro .dijitTitlePaneTitle {
background-color: @unselected-background-color; // TODO: Mailed Jason, shouldn't this toggle to @selected-background-color when pane opened?
- background-image: url(@image-titlebar);
- background-repeat:repeat-x;
+ .standard-gradient;
border:1px solid @border-color;
padding: 0 7px 3px 7px;
min-height:17px;
}
-.dj_ie6 .claro .dijitTitlePaneTitle {
- background-image: none;
-}
.claro .dijitTitlePaneTitleHover {
background-color: @hovered-background-color;
border-color: @hovered-border-color;
@@ -38,7 +34,7 @@
.claro .dijitTitlePaneTitleActive {
background-color: @pressed-background-color;
border-color: @pressed-border-color;
- background-position:0 -136px;
+ .active-gradient;
}
.claro .dijitTitlePaneTitleFocus {
margin-top:3px;
diff --git a/lib/dijit/themes/claro/Toolbar.css b/lib/dijit/themes/claro/Toolbar.css
index 18c605c66..da9cc015e 100644
--- a/lib/dijit/themes/claro/Toolbar.css
+++ b/lib/dijit/themes/claro/Toolbar.css
@@ -20,9 +20,13 @@
.claro .dijitToolbar {
border-bottom: 1px solid #b5bcc7;
background-color: #efefef;
- background-image: url("images/commonHighlight.png");
- background-position: 0 0;
+ background-image: url("images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 2px 0 2px 4px;
zoom: 1;
}
@@ -47,13 +51,13 @@
-webkit-transition-property: background-color;
-moz-transition-property: background-color;
transition-property: background-color;
- -webkit-transition-duration: 0.3s, 0.35s;
- -moz-transition-duration: 0.3s, 0.35s;
- transition-duration: 0.3s, 0.35s;
- background-image: url("images/commonHighlight.png");
- background-position: 0 -30px;
- background-repeat: repeat-x;
+ -webkit-transition-duration: 0.3s;
+ -moz-transition-duration: 0.3s;
+ transition-duration: 0.3s;
background-color: rgba(171, 214, 255, 0);
+ background-image: none;
+ /* cancel gradient for normal buttons, we don't want any gradient besides toolbar's on non-hovered buttons */
+
}
.dj_ie .claro .dijitToolbar .dijitButton .dijitButtonNode,
.dj_ie .claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
@@ -64,15 +68,6 @@
/* for IE, which doesn't understand rgba(...) */
}
-.dj_ie6 .claro .dijitToolbar .dijitButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitToggleButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboBox .dijitButtonNode {
- background: none;
- /* because background-color: transparent above doesn't work on IE*/
-
-}
/* hover status */
.dj_ie .claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
.dj_ie .claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
@@ -112,13 +107,18 @@
.claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
.claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode,
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode {
- background-position: 0 0;
border-width: 1px;
background-color: #abd6ff;
+ background-image: url("images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 1px;
}
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
- background-position: 0 0;
background-color: #f3ffff;
}
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNodeHover, .claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButtonHover {
@@ -128,7 +128,13 @@
.claro .dijitToolbar .dijitButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
border-width: 1px;
background-color: #7dbdfa;
- background-position: 0 -177px;
+ background-image: url("images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 1px;
}
.claro .dijitToolbar .dijitComboButtonActive {
@@ -140,14 +146,27 @@
}
.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
background-color: #f3ffff;
- background-position: 0 -177px;
padding: 2px;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNodeActive {
background-color: #7dbdfa;
+ background-image: url("images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButtonActive {
background-color: #7dbdfa;
+ background-image: url("images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
/* Avoid double border between button and arrow */
.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton, .claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
@@ -170,9 +189,6 @@
background-color: #ffffff;
padding: 1px;
}
-.dj_ie6 .claro .dijitToolbar {
- background-image: none;
-}
.claro .dijitToolbarSeparator {
/* separator icon in the editor sprite */
diff --git a/lib/dijit/themes/claro/Toolbar.less b/lib/dijit/themes/claro/Toolbar.less
index b61e8191a..90b9009e2 100644
--- a/lib/dijit/themes/claro/Toolbar.less
+++ b/lib/dijit/themes/claro/Toolbar.less
@@ -23,9 +23,7 @@
.claro .dijitToolbar {
border-bottom: 1px solid @border-color;
background-color: @bar-background-color;
- background-image: url(@image-common-highlight);
- background-position:0 0;
- background-repeat:repeat-x;
+ .standard-gradient;
padding: 2px 0 2px 4px;
zoom: 1;
}
@@ -45,12 +43,10 @@
.border-radius(@toolbar-button-border-radius);
.box-shadow(none);
.transition-property(background-color);
- .transition-duration(.3s, .35s);
+ .transition-duration(.3s);
- background-image: url(@image-common-highlight);
- background-position:0 -30px;
- background-repeat:repeat-x;
background-color:rgba(171,214,255,0);
+ background-image: none; /* cancel gradient for normal buttons, we don't want any gradient besides toolbar's on non-hovered buttons */
}
.dj_ie .claro .dijitToolbar .dijitButton .dijitButtonNode,
.dj_ie .claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
@@ -59,13 +55,7 @@
.dj_ie .claro .dijitToolbar .dijitComboBox .dijitButtonNode {
background-color: transparent; /* for IE, which doesn't understand rgba(...) */
}
-.dj_ie6 .claro .dijitToolbar .dijitButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitToggleButton .dijitButtonNode,
-.dj_ie6 .claro .dijitToolbar .dijitComboBox .dijitButtonNode {
- background: none; /* because background-color: transparent above doesn't work on IE*/
-}
+
/* hover status */
.dj_ie .claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
.dj_ie .claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
@@ -103,14 +93,13 @@
.claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
.claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode,
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode {
- background-position:0 0;
border-width:1px;
background-color: @hovered-background-color;
+ .standard-gradient;
padding: 1px;
}
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode,
.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
- background-position:0 0;
background-color: @toolbar-combobutton-hovered-unhoveredsection-background-color;
}
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNodeHover,
@@ -124,7 +113,7 @@
.claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
border-width: 1px;
background-color:@pressed-background-color;
- background-position:0 -177px;
+ .active-gradient;
padding: 1px;
}
.claro .dijitToolbar .dijitComboButtonActive {
@@ -135,14 +124,15 @@
.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode,
.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
background-color: @toolbar-combobutton-hovered-unhoveredsection-background-color;
- background-position:0 -177px;
padding: 2px;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNodeActive {
background-color: @pressed-background-color;
+ .active-gradient;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButtonActive {
background-color: @pressed-background-color;
+ .active-gradient;
}
/* Avoid double border between button and arrow */
@@ -165,10 +155,6 @@
padding: 1px;
}
-.dj_ie6 .claro .dijitToolbar {
- background-image: none;
-}
-
.claro .dijitToolbarSeparator {
/* separator icon in the editor sprite */
background: url(@image-editor-icons-enabled);
diff --git a/lib/dijit/themes/claro/Tree.css b/lib/dijit/themes/claro/Tree.css
index 738bb3313..f41b1da37 100644
--- a/lib/dijit/themes/claro/Tree.css
+++ b/lib/dijit/themes/claro/Tree.css
@@ -37,17 +37,13 @@
.claro .dijitTreeRow, .claro .dijitTreeNode .dojoDndItemBefore, .claro .dijitTreeNode .dojoDndItemAfter {
/* so insert line shows up on IE when dropping after a target element */
- padding: 4px 1px 2px 0;
- margin: 0 1px;
- /* replaced by border for selected/hovered row */
-
+ padding: 4px 0 2px 0;
background-color: none;
background-color: transparent;
background-color: rgba(171, 214, 255, 0);
background-position: 0 0;
background-repeat: repeat-x;
- border-color: rgba(118, 157, 192, 0);
- border-width: 0;
+ border: solid 0 transparent;
color: #000000;
-webkit-transition-property: background-color, border-color;
-moz-transition-property: background-color, border-color;
@@ -60,20 +56,31 @@
transition-timing-function: ease-out;
}
.claro .dijitTreeRowSelected {
- background-repeat: repeat-x;
background-color: #cfe5fa;
- background-image: url("images/commonHighlight.png");
+ background-image: url("images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 3px 0 1px;
- margin: 0;
- border: solid 1px #759dc0;
+ border-color: #759dc0;
+ border-width: 1px 0;
color: #000000;
}
.claro .dijitTreeRowHover {
background-color: #abd6ff;
- background-image: url("images/commonHighlight.png");
+ background-image: url("images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 3px 0 1px;
- margin: 0;
- border: solid 1px #759dc0;
+ border-color: #759dc0;
+ border-width: 1px 0;
color: #000000;
-webkit-transition-duration: 0.25s;
-moz-transition-duration: 0.25s;
@@ -81,16 +88,18 @@
}
.claro .dijitTreeRowActive {
background-color: #7dbdfa;
- background-image: url("images/commonHighlight.png");
- background-position: 0 -177px;
+ background-image: url("images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 3px 0 1px;
- margin-left: 0;
- border: solid 1px #759dc0;
+ border-color: #759dc0;
+ border-width: 1px 0;
color: #000000;
}
-.dj_ie6 .claro .dijitTreeRow {
- background-image: none;
-}
.claro .dijitTreeRowFocused {
background-repeat: repeat;
}
diff --git a/lib/dijit/themes/claro/Tree.less b/lib/dijit/themes/claro/Tree.less
index ff6cd5a14..1b027769b 100644
--- a/lib/dijit/themes/claro/Tree.less
+++ b/lib/dijit/themes/claro/Tree.less
@@ -40,8 +40,7 @@
.claro .dijitTreeNode .dojoDndItemBefore,
.claro .dijitTreeNode .dojoDndItemAfter {
/* so insert line shows up on IE when dropping after a target element */
- padding: 4px 1px 2px 0;
- margin: 0 1px; /* replaced by border for selected/hovered row */
+ padding: 4px 0 2px 0;
background-color: none; // IE6 doesn't understand rgba() or transparent below
background-color: transparent; // IE8 doesn't understand rgba() below
@@ -49,8 +48,7 @@
background-position:0 0;
background-repeat:repeat-x;
- border-color: rgba(118,157,192,0); // rgba() instead of none to prevent flash on hover fade-in
- border-width: 0;
+ border: solid 0 transparent;
color: @text-color;
@@ -60,34 +58,29 @@
}
.claro .dijitTreeRowSelected {
- background-repeat:repeat-x;
- background-color:@selected-background-color;
- background-image: url(@image-common-highlight);
+ background-color: @selected-background-color;
+ .standard-gradient;
padding: 3px 0 1px;
- margin: 0;
- border:solid 1px @selected-border-color;
- color:@selected-text-color;
+ border-color: @selected-border-color;
+ border-width: 1px 0;
+ color: @selected-text-color;
}
.claro .dijitTreeRowHover {
- background-color:@hovered-background-color;
- background-image: url(@image-common-highlight);
+ background-color: @hovered-background-color;
+ .standard-gradient;
padding: 3px 0 1px;
- margin: 0;
- border:solid 1px @hovered-border-color;
- color:@hovered-text-color;
+ border-color: @hovered-border-color;
+ border-width: 1px 0;
+ color: @hovered-text-color;
.transition-duration(.25s);
}
.claro .dijitTreeRowActive {
background-color:@pressed-background-color;
- background-image: url(@image-common-highlight);
- background-position:0 -177px;
+ .active-gradient;
padding: 3px 0 1px;
- margin-left: 0;
- border:solid 1px @pressed-border-color;
- color:@selected-text-color;
-}
-.dj_ie6 .claro .dijitTreeRow {
- background-image: none;
+ border-color: @pressed-border-color;
+ border-width: 1px 0;
+ color: @selected-text-color;
}
.claro .dijitTreeRowFocused {
background-repeat: repeat;
diff --git a/lib/dijit/themes/claro/claro_rtl.css b/lib/dijit/themes/claro/claro_rtl.css
index 6f85707f5..aab8f0873 100644
--- a/lib/dijit/themes/claro/claro_rtl.css
+++ b/lib/dijit/themes/claro/claro_rtl.css
@@ -4,7 +4,6 @@
@import url("form/Button_rtl.css");
@import url("layout/TabContainer_rtl.css");
@import url("form/Slider_rtl.css");
-@import url("form/Select_rtl.css");
@import url("Dialog_rtl.css");
@import url("Editor_rtl.css");
@import url("../../icons/editorIcons_rtl.css");/* RTL sprite for editor icons to be used by all themes*/
diff --git a/lib/dijit/themes/claro/form/Button.css b/lib/dijit/themes/claro/form/Button.css
index bc7c3dc18..f7718c105 100644
--- a/lib/dijit/themes/claro/form/Button.css
+++ b/lib/dijit/themes/claro/form/Button.css
@@ -43,16 +43,20 @@
border: 1px solid #759dc0;
padding: 2px 4px 4px 4px;
- background-image: url("../form/images/button.png");
- background-position: center top;
- background-repeat: repeat-x;
- background-color: #e5f2fe;
color: #000000;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
+ background-color: #bcd8f4;
+ background-image: url("images/buttonEnabled.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0) 3px, rgba(255, 255, 255, 0.75) 100%);
+ background-image: -webkit-linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0) 3px, rgba(255, 255, 255, 0.75) 100%);
+ background-image: -o-linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0) 3px, rgba(255, 255, 255, 0.75) 100%);
+ background-image: linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0) 3px, rgba(255, 255, 255, 0.75) 100%);
+ _background-image: none;
}
.claro .dijitComboButton .dijitArrowButton {
border-left-width: 0;
@@ -100,7 +104,7 @@
.claro .dijitComboButton .dijitButtonNodeHover,
.claro .dijitComboButton .dijitDownArrowButtonHover,
.claro .dijitToggleButtonHover .dijitButtonNode {
- background-color: #abd6ff;
+ background-color: #86bdf2;
color: #000000;
-webkit-transition-duration: 0.2s;
-moz-transition-duration: 0.2s;
@@ -111,11 +115,11 @@
.claro .dijitDropDownButtonActive .dijitButtonNode,
.claro .dijitComboButtonActive .dijitButtonNode,
.claro .dijitToggleButtonActive .dijitButtonNode,
-.claro .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
- background-color: #abd6ff;
- -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
- -moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
- box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+.claro .dijitToggleButtonChecked .dijitButtonNode {
+ background-color: #86bdf2;
+ -webkit-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
transition-duration: 0.1s;
@@ -132,13 +136,18 @@
.claro .dijitDropDownButtonDisabled .dijitButtonNode,
.claro .dijitComboButtonDisabled .dijitButtonNode,
.claro .dijitToggleButtonDisabled .dijitButtonNode {
- background-position: 0 -149px;
background-color: #efefef;
border: solid 1px #d3d3d3;
color: #818181;
-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
+ background-image: url("images/buttonDisabled.png");
+ background-image: -moz-linear-gradient(#ffffff 0%, rgba(255, 255, 255, 0) 40%);
+ background-image: -webkit-linear-gradient(#ffffff 0%, rgba(255, 255, 255, 0) 40%);
+ background-image: -o-linear-gradient(#ffffff 0%, rgba(255, 255, 255, 0) 40%);
+ background-image: linear-gradient(#ffffff 0%, rgba(255, 255, 255, 0) 40%);
+ _background-image: none;
}
.claro .dijitComboButtonDisabled .dijitArrowButton {
border-left-width: 0;
@@ -149,9 +158,6 @@
/* override dijit.css so that ComboBox rounded corners work */
}
-.dj_ie6 .claro .dijitButtonNode {
- background-image: none;
-}
.claro .dijitComboButton .dijitStretch {
-moz-border-radius: 4px 0 0 4px;
border-radius: 4px 0 0 4px;
diff --git a/lib/dijit/themes/claro/form/Button.less b/lib/dijit/themes/claro/form/Button.less
index 208e4de52..5d5953237 100644
--- a/lib/dijit/themes/claro/form/Button.less
+++ b/lib/dijit/themes/claro/form/Button.less
@@ -40,16 +40,22 @@
.claro .dijitToggleButton .dijitButtonNode {
/* rules for the dijit.form.*Button widgets (see also ComboButton section below) */
border: 1px solid @button-border-color;
- padding:2px 4px 4px 4px;
- background-image: url("../@{image-form-button}");
- background-position: center top;
- background-repeat: repeat-x;
- background-color: @button-background-color;
+ padding: 2px 4px 4px 4px;
color: @text-color;
.border-radius(@button-border-radius);
.box-shadow(0 1px 1px rgba(0,0,0,0.15));
+
+ background-color: desaturate(darken(@button-background-color, 10), 20);
+
+ // Alpha transparency layer to add gradient to above background color.
+ // Use CSS gradient with fallback to image for IE.
+ background-image: url("images/buttonEnabled.png");
+ background-repeat: repeat-x;
+ .alpha-white-gradient(1, 0px, 0, 3px, 0.75, 100%);
+ _background-image: none; // IE6 can't handle background-color and background-image at once.
}
+
.claro .dijitComboButton .dijitArrowButton {
border-left-width: 0;
padding: 4px 2px 4px 2px; /* TODO: still needed? */
@@ -101,7 +107,7 @@
.claro .dijitComboButton .dijitButtonNodeHover,
.claro .dijitComboButton .dijitDownArrowButtonHover,
.claro .dijitToggleButtonHover .dijitButtonNode {
- background-color: @button-hovered-background-color;
+ background-color: desaturate(darken(@button-hovered-background-color, 10), 20);
color:@text-color;
.transition-duration(.2s);
}
@@ -111,9 +117,9 @@
.claro .dijitDropDownButtonActive .dijitButtonNode,
.claro .dijitComboButtonActive .dijitButtonNode,
.claro .dijitToggleButtonActive .dijitButtonNode,
-.claro .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
- background-color: @button-pressed-background-color;
- .box-shadow(0 0 0 rgba(0,0,0,0));
+.claro .dijitToggleButtonChecked .dijitButtonNode {
+ background-color: desaturate(darken(@button-pressed-background-color, 10), 20);
+ .box-shadow(inset 0px 1px 1px rgba(0, 0, 0, 0.2));
.transition-duration(.1s);
}
@@ -129,13 +135,19 @@
.claro .dijitButtonDisabled .dijitButtonNode,
.claro .dijitDropDownButtonDisabled .dijitButtonNode,
.claro .dijitComboButtonDisabled .dijitButtonNode,
-.claro .dijitToggleButtonDisabled .dijitButtonNode {
- background-position:0 -149px;
+.claro .dijitToggleButtonDisabled .dijitButtonNode {
background-color: @disabled-background-color;
border: solid 1px @disabled-border-color;
color: @disabled-text-color;
.box-shadow(0 0 0 rgba(0,0,0,0));
+
+ // Change the gradient from light to dark.
+ // Again using CSS gradient with fallback to image for IE.
+ background-image: url("images/buttonDisabled.png");
+ .alpha-white-gradient(1, 0%, 0, 40%);
+ _background-image: none; // IE6 can't handle background-color and background-image at once.
}
+
.claro .dijitComboButtonDisabled .dijitArrowButton{
border-left-width: 0;
}
@@ -144,10 +156,6 @@
border-collapse: separate; /* override dijit.css so that ComboBox rounded corners work */
}
-.dj_ie6 .claro .dijitButtonNode {
- background-image: none;
-}
-
.claro .dijitComboButton .dijitStretch {
.border-radius(@button-border-radius 0 0 @button-border-radius);
}
diff --git a/lib/dijit/themes/claro/form/Common.css b/lib/dijit/themes/claro/form/Common.css
index ce108c1ae..b7b91c134 100644
--- a/lib/dijit/themes/claro/form/Common.css
+++ b/lib/dijit/themes/claro/form/Common.css
@@ -4,15 +4,17 @@
.claro .dijitTextBox, .claro .dijitInputInner {
color: #000000;
}
-.claro .dijitTextBoxError .dijitValidationContainer {
+.claro .dijitValidationTextBoxError .dijitValidationContainer {
background-color: #d46464;
background-image: url("../form/images/error.png");
background-position: top center;
border: solid #d46464 0;
- border-left-width: 1px;
width: 9px;
}
-.claro .dijitTextBoxError .dijitValidationIcon {
+.claro .dijitTextBoxError .dijitValidationContainer {
+ border-left-width: 1px;
+}
+.claro .dijitValidationTextBoxError .dijitValidationIcon {
width: 0;
background-color: transparent !important;
/* so the INPUT doesn't obscure the border in rtl+a11y */
@@ -26,13 +28,16 @@
.claro .dijitTextArea, .claro .dijitInputField .dijitPlaceHolder {
padding: 2px;
}
-.claro .dijitTextBox .dijitInputField {
+.claro .dijitSelect .dijitInputField, .claro .dijitTextBox .dijitInputField {
padding: 1px 2px;
}
.dj_gecko .claro .dijitTextBox .dijitInputInner, .dj_webkit .claro .dijitTextBox .dijitInputInner {
padding: 1px;
}
-.claro .dijitTextBox, .claro .dijitTextBox .dijitButtonNode {
+.claro .dijitSelect,
+.claro .dijitSelect .dijitButtonContents,
+.claro .dijitTextBox,
+.claro .dijitTextBox .dijitButtonNode {
/* color for (outer) border on *TextBox widgets, and border between input and buttons on ComboBox and Spinner */
border-color: #b5bcc7;
@@ -43,11 +48,14 @@
-moz-transition-duration: 0.35s;
transition-duration: 0.35s;
}
-.claro .dijitTextBox {
+.claro .dijitSelect, .claro .dijitTextBox {
background-color: #ffffff;
}
/* hover */
-.claro .dijitTextBoxHover, .claro .dijitTextBoxHover .dijitButtonNode {
+.claro .dijitSelectHover,
+.claro .dijitSelectHover .dijitButtonContents,
+.claro .dijitTextBoxHover,
+.claro .dijitTextBoxHover .dijitButtonNode {
border-color: #759dc0;
-webkit-transition-duration: 0.25s;
-moz-transition-duration: 0.25s;
@@ -55,18 +63,23 @@
}
.claro .dijitTextBoxHover {
background-color: #e5f2fe;
- background-image: url("../form/images/textBox_back.png");
- background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -webkit-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -o-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
}
/* error state */
-.claro .dijitTextBoxError, .claro .dijitTextBoxError .dijitButtonNode {
+.claro .dijitSelectError,
+.claro .dijitSelectError .dijitButtonContents,
+.claro .dijitTextBoxError,
+.claro .dijitTextBoxError .dijitButtonNode {
border-color: #d46464;
}
-.claro .dijitTextBoxError, .claro .dijitTextBoxError .dijitInputContainer {
- background-color: #ffffff;
-}
/* focused state */
-.claro .dijitTextBoxFocused, .claro .dijitTextBoxFocused .dijitButtonNode {
+.claro .dijitSelectFocused,
+.claro .dijitSelectFocused .dijitButtonContents,
+.claro .dijitTextBoxFocused,
+.claro .dijitTextBoxFocused .dijitButtonNode {
border-color: #759dc0;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
@@ -74,27 +87,35 @@
}
.claro .dijitTextBoxFocused {
background-color: #ffffff;
- background-image: url("../form/images/textBox_back.png");
- background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -webkit-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -o-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
}
.claro .dijitTextBoxFocused .dijitInputContainer {
background: #ffffff;
}
-.claro .dijitTextBoxErrorFocused, .claro .dijitTextBoxErrorFocused .dijitButtonNode {
+.claro .dijitSelectErrorFocused,
+.claro .dijitSelectErrorFocused .dijitButtonContents,
+.claro .dijitTextBoxErrorFocused,
+.claro .dijitTextBoxErrorFocused .dijitButtonNode {
border-color: #ce5050;
}
/* disabled state */
-.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitButtonNode {
+.claro .dijitSelectDisabled,
+.claro .dijitSelectDisabled .dijitButtonContents,
+.claro .dijitTextBoxDisabled,
+.claro .dijitTextBoxDisabled .dijitButtonNode {
border-color: #d3d3d3;
}
-.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputContainer {
+.claro .dijitSelectDisabled, .claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputContainer {
background-color: #efefef;
background-image: none;
}
-.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputInner {
+.claro .dijitSelectDisabled, .claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputInner {
color: #818181;
}
-.dj_webkit .claro .dijitTextBoxDisabled input {
+.dj_webkit .claro .dijitDisabled input {
/* because WebKit lightens disabled input/textarea no matter what color you specify */
color: #757575;
@@ -106,12 +127,14 @@
}
/*========================= for special widgets =========================*/
/* Input boxes with an arrow (for a drop down) */
-.claro .dijitComboBox .dijitArrowButtonInner {
+.claro .dijitSelect .dijitArrowButtonInner, .claro .dijitComboBox .dijitArrowButtonInner {
background-image: url("../form/images/commonFormArrows.png");
background-position: -35px 53%;
background-repeat: no-repeat;
margin: 0;
width: 16px;
+}
+.claro .dijitComboBox .dijitArrowButtonInner {
border: 1px solid #ffffff;
}
.claro .dijitToolbar .dijitComboBox .dijitArrowButtonInner {
@@ -122,13 +145,18 @@
}
/* Add 1px vertical padding to the <input> where user types and the validation icon,
to match the 1px border on arrow button */
-.claro .dijitTextBox .dijitInputInner, .claro .dijitTextBox .dijitValidationContainer {
+.claro .dijitSelectLabel, .claro .dijitTextBox .dijitInputInner, .claro .dijitValidationTextBox .dijitValidationContainer {
padding: 1px 0;
}
.claro .dijitComboBox .dijitButtonNode {
background-color: #efefef;
- background-image: url("../form/images/formHighlight.png");
+ background-image: url("../images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
/* Arrow "hover" effect:
* The arrow button should change color whenever the mouse is in a position such that clicking it
@@ -144,9 +172,18 @@
/* Arrow Button change when drop down is open */
.claro .dijitComboBox .dijitHasDropDownOpen {
background-color: #7dbdfa;
- background-position: 0 -177px;
+ background-image: url("../images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 1px;
}
+.dj_iequirks .claro .dijitComboBox .dijitHasDropDownOpen {
+ padding: 1px 0;
+}
.claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
background-position: -70px 53%;
border: 0 none;
@@ -166,10 +203,6 @@
height: 0;
width: 0;
}
-/* ie6 doesn't support transparent background img */
-.dj_ie6 .claro .dijitTextBox, .dj_ie6 .claro .dijitComboBox .dijitButtonNode {
- background-image: none;
-}
.dj_borderbox .claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
width: 18px;
}
diff --git a/lib/dijit/themes/claro/form/Common.less b/lib/dijit/themes/claro/form/Common.less
index 742a43ff7..3c625f46f 100644
--- a/lib/dijit/themes/claro/form/Common.less
+++ b/lib/dijit/themes/claro/form/Common.less
@@ -13,15 +13,19 @@
color: @text-color;
}
-.claro .dijitTextBoxError .dijitValidationContainer {
+.claro .dijitValidationTextBoxError .dijitValidationContainer {
background-color: @erroricon-background-color;
background-image: url("../@{image-form-error}");
background-position: top center;
border: solid @erroricon-background-color 0;
- border-left-width: 1px;
width: 9px;
}
-.claro .dijitTextBoxError .dijitValidationIcon {
+
+.claro .dijitTextBoxError .dijitValidationContainer {
+ border-left-width: 1px;
+}
+
+.claro .dijitValidationTextBoxError .dijitValidationIcon {
width: 0;
background-color: transparent !important; /* so the INPUT doesn't obscure the border in rtl+a11y */
}
@@ -35,12 +39,15 @@
.claro .dijitInputField .dijitPlaceHolder {
padding: @textbox-padding;
}
+
+.claro .dijitSelect .dijitInputField,
.claro .dijitTextBox .dijitInputField {
// Subtract 1px from top/bottom because we add 1px to other nodes, see rules below.
// Although we are theoretically only adding 1px to top/bottom browsers seem to pad inputs by 1px on left/right,
// although that varies by so compensate for that too.
padding: @textbox-padding - 1px @textbox-padding;
}
+
.dj_gecko .claro .dijitTextBox .dijitInputInner,
.dj_webkit .claro .dijitTextBox .dijitInputInner {
// Although we are theoretically only adding 1px to top/bottom, some browsers seem to pad inputs by 1px on left/right,
@@ -48,6 +55,8 @@
padding: @textbox-padding - 1px;
}
+.claro .dijitSelect,
+.claro .dijitSelect .dijitButtonContents,
.claro .dijitTextBox,
.claro .dijitTextBox .dijitButtonNode {
/* color for (outer) border on *TextBox widgets, and border between input and buttons on ComboBox and Spinner */
@@ -55,70 +64,84 @@
.transition-property(background-color, border);
.transition-duration(.35s);
}
+
+.claro .dijitSelect,
.claro .dijitTextBox {
background-color: @textbox-background-color;
}
/* hover */
+.claro .dijitSelectHover,
+.claro .dijitSelectHover .dijitButtonContents,
.claro .dijitTextBoxHover,
.claro .dijitTextBoxHover .dijitButtonNode {
border-color: @hovered-border-color;
.transition-duration(.25s);
}
+
.claro .dijitTextBoxHover {
background-color: @textbox-hovered-background-color;
- background-image: url("../@{image-form-textbox-background}");
- background-repeat: repeat-x;
+ .textbox-background-image;
}
/* error state */
+.claro .dijitSelectError,
+.claro .dijitSelectError .dijitButtonContents,
.claro .dijitTextBoxError,
.claro .dijitTextBoxError .dijitButtonNode {
border-color: @error-border-color;
}
-.claro .dijitTextBoxError,
-.claro .dijitTextBoxError .dijitInputContainer {
- background-color: @textbox-error-background-color;
-}
/* focused state */
+.claro .dijitSelectFocused,
+.claro .dijitSelectFocused .dijitButtonContents,
.claro .dijitTextBoxFocused,
.claro .dijitTextBoxFocused .dijitButtonNode {
border-color:@focused-border-color;
.transition-duration(.1s);
}
+
.claro .dijitTextBoxFocused {
background-color: @textbox-focused-background-color;
- background-image: url("../@{image-form-textbox-background}");
- background-repeat: repeat-x;
+ .textbox-background-image;
}
.claro .dijitTextBoxFocused .dijitInputContainer {
background: @textbox-focused-background-color;
}
+.claro .dijitSelectErrorFocused,
+.claro .dijitSelectErrorFocused .dijitButtonContents,
.claro .dijitTextBoxErrorFocused,
.claro .dijitTextBoxErrorFocused .dijitButtonNode {
border-color: @error-focused-border-color;
}
/* disabled state */
+.claro .dijitSelectDisabled,
+.claro .dijitSelectDisabled .dijitButtonContents,
.claro .dijitTextBoxDisabled,
.claro .dijitTextBoxDisabled .dijitButtonNode {
border-color: @disabled-border-color;
}
+
+.claro .dijitSelectDisabled,
.claro .dijitTextBoxDisabled,
.claro .dijitTextBoxDisabled .dijitInputContainer {
background-color: @textbox-disabled-background-color;
background-image: none;
}
+
+.claro .dijitSelectDisabled,
.claro .dijitTextBoxDisabled,
.claro .dijitTextBoxDisabled .dijitInputInner {
color: @disabled-text-color;
}
-.dj_webkit .claro .dijitTextBoxDisabled input {
+
+.dj_webkit .claro .dijitDisabled input {
/* because WebKit lightens disabled input/textarea no matter what color you specify */
color: darken(@disabled-text-color, 5%)
}
+
.dj_webkit .claro textarea.dijitTextAreaDisabled {
/* because WebKit lightens disabled input/textarea no matter what color you specify */
color: darken(@disabled-text-color, 40%)
@@ -128,12 +151,16 @@
/* Input boxes with an arrow (for a drop down) */
+.claro .dijitSelect .dijitArrowButtonInner,
.claro .dijitComboBox .dijitArrowButtonInner {
background-image: url("../@{image-form-common-arrows}");
background-position:-35px 53%;
background-repeat: no-repeat;
margin: 0;
width:16px;
+}
+
+.claro .dijitComboBox .dijitArrowButtonInner {
border: 1px solid @arrowbutton-inner-border-color; // white gutter around the arrow button
}
@@ -147,15 +174,15 @@
/* Add 1px vertical padding to the <input> where user types and the validation icon,
to match the 1px border on arrow button */
+.claro .dijitSelectLabel,
.claro .dijitTextBox .dijitInputInner,
-.claro .dijitTextBox .dijitValidationContainer {
+.claro .dijitValidationTextBox .dijitValidationContainer {
padding: 1px 0;
}
.claro .dijitComboBox .dijitButtonNode {
background-color: @arrowbutton-background-color;
- background-image: url("../@{image-form-highlight}");
- background-repeat:repeat-x;
+ .standard-gradient("../");
}
/* Arrow "hover" effect:
@@ -167,6 +194,7 @@
.claro .dijitComboBox .dijitDownArrowButtonHover {
background-color:@arrowbutton-hovered-background-color;
}
+
.claro .dijitComboBoxOpenOnClickHover .dijitArrowButtonInner,
.claro .dijitComboBox .dijitDownArrowButtonHover .dijitArrowButtonInner {
background-position:-70px 53%;
@@ -175,9 +203,14 @@
/* Arrow Button change when drop down is open */
.claro .dijitComboBox .dijitHasDropDownOpen { // .dijitHasDropDown is on dijitArrowButton node
background-color: @pressed-background-color;
- background-position:0 -177px;
+ .active-gradient("../");
padding: 1px; // Since no border on arrow button (see rule below)
}
+
+.dj_iequirks .claro .dijitComboBox .dijitHasDropDownOpen {
+ padding: 1px 0;
+}
+
.claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
background-position:-70px 53%;
border: 0 none;
@@ -199,14 +232,10 @@
width: 0;
}
-/* ie6 doesn't support transparent background img */
-.dj_ie6 .claro .dijitTextBox,
-.dj_ie6 .claro .dijitComboBox .dijitButtonNode {
- background-image: none;
-}
.dj_borderbox .claro .dijitComboBox .dijitHasDropDownOpen .dijitArrowButtonInner {
width:18px; // quirks mode means border-box sizing, so 18px with the border (same as 16px without border)
}
+
.dj_borderbox .claro .dijitComboBoxFocused .dijitHasDropDownOpen .dijitArrowButtonInner {
width:16px; // when no border, then back to 16px just like content-box sizing
}
diff --git a/lib/dijit/themes/claro/form/Common_rtl.css b/lib/dijit/themes/claro/form/Common_rtl.css
index 74827c16f..f5206c196 100644
--- a/lib/dijit/themes/claro/form/Common_rtl.css
+++ b/lib/dijit/themes/claro/form/Common_rtl.css
@@ -1,10 +1,5 @@
/* claro/form/Common_rtl.css */
-/*claro should not have the icon on the container
-.claro .dijitTextBoxRtlError .dijitValidationIcon {
- border-left-width: 0;
- border-right-width: 1px;
-}*/
.claro .dijitTextBoxRtlError .dijitValidationContainer {
- border-left-width: 0;
- border-right-width: 1px;
+ border-left-width: 0 !important;
+ border-right-width: 1px !important;
}
diff --git a/lib/dijit/themes/claro/form/Common_rtl.less b/lib/dijit/themes/claro/form/Common_rtl.less
index fd4975a51..7c9952993 100644
--- a/lib/dijit/themes/claro/form/Common_rtl.less
+++ b/lib/dijit/themes/claro/form/Common_rtl.less
@@ -2,12 +2,7 @@
@import "../variables";
-/*claro should not have the icon on the container
-.claro .dijitTextBoxRtlError .dijitValidationIcon {
- border-left-width: 0;
- border-right-width: 1px;
-}*/
.claro .dijitTextBoxRtlError .dijitValidationContainer {
- border-left-width: 0;
- border-right-width: 1px;
+ border-left-width: 0 !important;
+ border-right-width: 1px !important;
}
diff --git a/lib/dijit/themes/claro/form/NumberSpinner.css b/lib/dijit/themes/claro/form/NumberSpinner.css
index fcc804969..70603b7e7 100644
--- a/lib/dijit/themes/claro/form/NumberSpinner.css
+++ b/lib/dijit/themes/claro/form/NumberSpinner.css
@@ -35,9 +35,13 @@
.claro .dijitSpinner .dijitArrowButton {
width: auto;
background-color: #efefef;
- background-image: url("../form/images/formHighlight.png");
- background-position: 0 0;
+ background-image: url("../images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
overflow: hidden;
}
.dj_iequirks .claro .dijitSpinner .dijitArrowButton {
@@ -70,7 +74,10 @@
/* compensate for inner border */
}
-.dj_ie6 .claro .dijitSpinner .dijitArrowButtonInner, .dj_ie7 .claro .dijitSpinner .dijitArrowButtonInner {
+.dj_iequirks .claro .dijitSpinner .dijitArrowButtonInner,
+.dj_ie6 .claro .dijitSpinner .dijitArrowButtonInner,
+.dj_ie7 .claro .dijitSpinner .dijitArrowButtonInner,
+.dj_ie8 .claro .dijitSpinner .dijitArrowButtonInner {
margin-top: 0;
/* since its bottom aligned */
@@ -104,7 +111,13 @@
/* mouse down status */
.claro .dijitSpinner .dijitDownArrowButtonActive, .claro .dijitSpinner .dijitUpArrowButtonActive {
background-color: #7dbefa;
- background-position: 0 -177px;
+ background-image: url("../images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner, .claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
/* hide inner border while button is depressed */
diff --git a/lib/dijit/themes/claro/form/NumberSpinner.less b/lib/dijit/themes/claro/form/NumberSpinner.less
index 1c79d3a37..e15c7821d 100644
--- a/lib/dijit/themes/claro/form/NumberSpinner.less
+++ b/lib/dijit/themes/claro/form/NumberSpinner.less
@@ -37,9 +37,7 @@
.claro .dijitSpinner .dijitArrowButton {
width:auto;
background-color: @arrowbutton-background-color;
- background-image: url("../@{image-form-highlight}");
- background-position:0 0;
- background-repeat:repeat-x;
+ .standard-gradient("../");
overflow: hidden;
}
.dj_iequirks .claro .dijitSpinner .dijitArrowButton {
@@ -68,8 +66,10 @@
margin: -1px 0 -1px 0; /* compensate for inner border */
}
+.dj_iequirks .claro .dijitSpinner .dijitArrowButtonInner,
.dj_ie6 .claro .dijitSpinner .dijitArrowButtonInner,
-.dj_ie7 .claro .dijitSpinner .dijitArrowButtonInner {
+.dj_ie7 .claro .dijitSpinner .dijitArrowButtonInner,
+.dj_ie8 .claro .dijitSpinner .dijitArrowButtonInner {
margin-top: 0; /* since its bottom aligned */
}
@@ -112,7 +112,7 @@
.claro .dijitSpinner .dijitDownArrowButtonActive,
.claro .dijitSpinner .dijitUpArrowButtonActive {
background-color: #7dbefa; // TODO. Mailed Jason about inconsistent ComboBox/Spinner behavior.
- background-position:0 -177px;
+ .active-gradient("../");
}
.claro .dijitSpinner .dijitUpArrowButtonActive .dijitArrowButtonInner,
.claro .dijitSpinner .dijitDownArrowButtonActive .dijitArrowButtonInner {
diff --git a/lib/dijit/themes/claro/form/Select.css b/lib/dijit/themes/claro/form/Select.css
index bfbca4ec8..5158dbd17 100644
--- a/lib/dijit/themes/claro/form/Select.css
+++ b/lib/dijit/themes/claro/form/Select.css
@@ -16,82 +16,69 @@
* 4. Various states
* .dijitSelectHover|.dijitSelectFocused|.dijitSelectDisabled .* - for border, padding and background-color|image
*/
-.claro .dijitSelect .dijitButtonText {
- padding: 2px;
-}
/* normal status */
-.claro .dijitSelect {
- border: 1px solid #b5bcc7;
- background-color: #ffffff;
- border-collapse: separate;
-}
-.dj_ie6 .claro .dijitSelect, .dj_ie6 .claro .dijitSelect .dijitButtonNode {
- background-image: none;
-}
-.claro .dijitSelect .dijitButtonContents {
- border: 0 solid #b5bcc7;
- border-right-width: 1px;
+.claro .dijitSelect .dijitArrowButtonContainer {
+ border: 1px solid #ffffff;
}
.claro .dijitSelect .dijitArrowButton {
padding: 0;
- border: 1px solid #ffffff;
- border-top: none;
background-color: #efefef;
- background-image: url("../form/images/formHighlight.png");
+ background-image: url("../images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
}
.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
- background-image: url("../form/images/commonFormArrows.png");
- background-position: -35px 70%;
- background-repeat: no-repeat;
- width: 16px;
height: 16px;
}
/* hover status */
.claro .dijitSelectHover {
- border: 1px solid #759dc0;
background-color: #e5f2fe;
- background-image: url("../form/images/textBox_back.png");
+ background-image: -moz-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -webkit-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: -o-linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
+ background-image: linear-gradient(rgba(127, 127, 127, 0.2) 0%, rgba(127, 127, 127, 0) 2px);
background-repeat: repeat-x;
}
-.claro .dijitSelectHover .dijitButtonContents {
+.claro .dijitSelectFocused, .claro .dijitSelectHover {
border-color: #759dc0;
}
.claro .dijitSelectHover .dijitArrowButton {
background-color: #abd6ff;
}
.claro .dijitSelectHover .dijitArrowButton .dijitArrowButtonInner {
- background-position: -70px 70%;
+ background-position: -70px 53%;
}
/* focused status */
-.claro .dijitSelectFocused {
- border: 1px solid #759dc0;
-}
-.claro .dijitSelectFocused .dijitButtonContents {
- border-color: #759dc0;
-}
.claro .dijitSelectFocused .dijitArrowButton {
background-color: #7dbefa;
- background-position: 0 -177px;
+ background-image: url("../images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
+}
+.claro .dijitSelectFocused .dijitArrowButton {
border: none;
- padding: 0 1px;
+ padding: 1px;
}
.claro .dijitSelectFocused .dijitArrowButton .dijitArrowButtonInner {
- background-position: -70px 70%;
- margin-bottom: 1px;
+ background-position: -70px 53%;
}
/* disable status */
.claro .dijitSelectDisabled {
- border: 1px solid #d3d3d3;
+ border-color: #d3d3d3;
background-color: #efefef;
background-image: none;
color: #818181;
}
-.claro .dijitSelectDisabled .dijitArrowButton {
- background-color: #efefef;
-}
.claro .dijitSelectDisabled .dijitArrowButton .dijitArrowButtonInner {
- background-position: 0 70%;
+ background-position: 0 53%;
}
/* Dropdown menu style for select */
.claro .dijitSelectMenu td.dijitMenuItemIconCell, .claro .dijitSelectMenu td.dijitMenuArrowCell {
diff --git a/lib/dijit/themes/claro/form/Select.less b/lib/dijit/themes/claro/form/Select.less
index 0e7426112..3c2cac682 100644
--- a/lib/dijit/themes/claro/form/Select.less
+++ b/lib/dijit/themes/claro/form/Select.less
@@ -19,101 +19,75 @@
@import "../variables";
-.claro .dijitSelect .dijitButtonText {
- padding: @textbox-padding;
-}
-
/* normal status */
-.claro .dijitSelect {
- border: 1px solid @border-color;
- background-color: @textbox-background-color;
- border-collapse: separate;
-}
-.dj_ie6 .claro .dijitSelect,
-.dj_ie6 .claro .dijitSelect .dijitButtonNode {
- background-image:none;
-}
-
-.claro .dijitSelect .dijitButtonContents {
- border: 0 solid @border-color;
- border-right-width: 1px;
+.claro .dijitSelect .dijitArrowButtonContainer {
+ border: 1px solid @arrowbutton-inner-border-color;
}
.claro .dijitSelect .dijitArrowButton {
padding: 0;
- border: 1px solid @arrowbutton-inner-border-color;
- border-top:none;
background-color: @arrowbutton-background-color;
- background-image: url("../@{image-form-highlight}");
- background-repeat:repeat-x;
+ .standard-gradient("../");
}
.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
- background-image: url("../@{image-form-common-arrows}");
- background-position:-35px 70%;
- background-repeat: no-repeat;
- width:16px;
height:16px;
}
/* hover status */
.claro .dijitSelectHover {
- border: 1px solid @hovered-border-color;
background-color: @textbox-hovered-background-color;
- background-image: url("../@{image-form-textbox-background}");
+ .textbox-background-image;
background-repeat: repeat-x;
}
-.claro .dijitSelectHover .dijitButtonContents {
+.claro .dijitSelectFocused,
+.claro .dijitSelectHover {
border-color:@hovered-border-color;
}
.claro .dijitSelectHover .dijitArrowButton {
background-color:@arrowbutton-hovered-background-color;
}
+
.claro .dijitSelectHover .dijitArrowButton .dijitArrowButtonInner {
- background-position:-70px 70%;
+ background-position:-70px 53%;
}
/* focused status */
-.claro .dijitSelectFocused {
- border: 1px solid @focused-border-color;
-}
-.claro .dijitSelectFocused .dijitButtonContents {
- border-color:@focused-border-color;
-}
.claro .dijitSelectFocused .dijitArrowButton {
background-color:#7dbefa; // TODO. Mailed Jason about inconsistent ComboBox/Spinner behavior.
- background-position:0 -177px;
+ .active-gradient("../");
+}
+
+.claro .dijitSelectFocused .dijitArrowButton {
border: none;
- padding: 0 1px;
+ padding: 1px;
}
+
.claro .dijitSelectFocused .dijitArrowButton .dijitArrowButtonInner {
- background-position:-70px 70%;
- margin-bottom: 1px;
+ background-position:-70px 53%;
}
/* disable status */
.claro .dijitSelectDisabled {
- border: 1px solid @disabled-border-color;
+ border-color: @disabled-border-color;
background-color: @disabled-background-color;
background-image: none;
color: @disabled-text-color;
}
-.claro .dijitSelectDisabled .dijitArrowButton {
- background-color: @disabled-background-color;
-}
+
.claro .dijitSelectDisabled .dijitArrowButton .dijitArrowButtonInner {
- background-position:0 70%
+ background-position:0 53%
}
/* Dropdown menu style for select */
-
.claro .dijitSelectMenu td.dijitMenuItemIconCell,
.claro .dijitSelectMenu td.dijitMenuArrowCell {
/* so that arrow and icon cells from MenuItem are not displayed */
display: none;
}
+
.claro .dijitSelectMenu td.dijitMenuItemLabel {
/* line up menu text with text in select box (in LTR and RTL modes) */
padding: @textbox-padding;
diff --git a/lib/dijit/themes/claro/form/Select_rtl.css b/lib/dijit/themes/claro/form/Select_rtl.css
deleted file mode 100644
index a14d4ec42..000000000
--- a/lib/dijit/themes/claro/form/Select_rtl.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.claro .dijitSelectRtl .dijitButtonContents {
- border-right-width: 0;
- border-left-width: 1px;
-}
diff --git a/lib/dijit/themes/claro/form/Select_rtl.less b/lib/dijit/themes/claro/form/Select_rtl.less
deleted file mode 100644
index ffa40dc44..000000000
--- a/lib/dijit/themes/claro/form/Select_rtl.less
+++ /dev/null
@@ -1,6 +0,0 @@
-@import "../variables";
-
-.claro .dijitSelectRtl .dijitButtonContents {
- border-right-width: 0;
- border-left-width: 1px;
-}
diff --git a/lib/dijit/themes/claro/form/Slider.css b/lib/dijit/themes/claro/form/Slider.css
index eb82e17ad..b704a1b56 100644
--- a/lib/dijit/themes/claro/form/Slider.css
+++ b/lib/dijit/themes/claro/form/Slider.css
@@ -63,7 +63,7 @@
background-image: none;
border-color: #d3d3d3;
}
-.claro .dijitRuleLabel {
+.claro .dijitRuleLabelsContainer {
color: #000000;
}
/* Horizontal Slider */
@@ -71,16 +71,14 @@
padding: 2px 0;
}
.claro .dijitSlider .dijitSliderProgressBarH, .claro .dijitSlider .dijitSliderLeftBumper {
- background-image: url("../form/images/sliderHorizontal.png");
- background-repeat: repeat-x;
- background-position: 0 -20px;
border-color: #b5bcc7;
background-color: #cfe5fa;
+ background-image: -moz-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px);
+ background-image: -webkit-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px);
+ background-image: -o-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px);
+ background-image: linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px);
}
.claro .dijitSlider .dijitSliderRemainingBarH, .claro .dijitSlider .dijitSliderRightBumper {
- background-image: url("../form/images/sliderHorizontal.png");
- background-repeat: repeat-x;
- background-position: 0 -11px;
border-color: #b5bcc7;
background-color: #ffffff;
}
@@ -91,24 +89,26 @@
border-left: solid 1px #b5bcc7;
}
.claro .dijitSliderHover .dijitSliderProgressBarH, .claro .dijitSliderHover .dijitSliderLeftBumper {
- background-position: 0 -20px;
background-color: #abd6ff;
border-color: #759dc0;
}
.claro .dijitSliderHover .dijitSliderRemainingBarH, .claro .dijitSliderHover .dijitSliderRightBumper {
- background-position: 0 0;
background-color: #ffffff;
border-color: #759dc0;
}
.claro .dijitSliderFocused .dijitSliderProgressBarH, .claro .dijitSliderFocused .dijitSliderLeftBumper {
- background-position: 0 -30px;
background-color: #abd6ff;
border-color: #759dc0;
+ -webkit-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
}
.claro .dijitSliderFocused .dijitSliderRemainingBarH, .claro .dijitSliderFocused .dijitSliderRightBumper {
- background-position: 0 -9px;
background-color: #ffffff;
border-color: #759dc0;
+ -webkit-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.2);
}
.claro .dijitSliderDisabled .dijitSliderProgressBarH, .claro .dijitSliderDisabled .dijitSliderLeftBumper {
background-color: #d3d3d3;
@@ -124,16 +124,14 @@
padding: 0 2px;
}
.claro .dijitSlider .dijitSliderProgressBarV, .claro .dijitSlider .dijitSliderBottomBumper {
- background-image: url("../form/images/sliderVertical.png");
- background-repeat: repeat-y;
- background-position: -36px 0;
border-color: #b5bcc7;
background-color: #cfe5fa;
+ background-image: -moz-linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 1px);
+ background-image: -webkit-linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 1px);
+ background-image: -o-linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 1px);
+ background-image: linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 1px);
}
.claro .dijitSlider .dijitSliderRemainingBarV, .claro .dijitSlider .dijitSliderTopBumper {
- background-image: url("../form/images/sliderVertical.png");
- background-repeat: repeat-y;
- background-position: -3px 0;
border-color: #b5bcc7;
background-color: #ffffff;
}
@@ -144,20 +142,26 @@
border-top: solid 1px #b5bcc7;
}
.claro .dijitSliderHover .dijitSliderProgressBarV, .claro .dijitSliderHover .dijitSliderBottomBumper {
- background-position: -36px 0;
background-color: #abd6ff;
+ border-color: #759dc0;
}
.claro .dijitSliderHover .dijitSliderRemainingBarV, .claro .dijitSliderHover .dijitSliderTopBumper {
- background-position: 0 0;
background-color: #ffffff;
+ border-color: #759dc0;
}
.claro .dijitSliderFocused .dijitSliderProgressBarV, .claro .dijitSliderFocused .dijitSliderBottomBumper {
- background-position: -56px 0;
background-color: #abd6ff;
+ border-color: #759dc0;
+ -webkit-box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 0.2);
}
.claro .dijitSliderFocused .dijitSliderRemainingBarV, .claro .dijitSliderFocused .dijitSliderTopBumper {
- background-position: -18px 0;
background-color: #ffffff;
+ border-color: #759dc0;
+ -webkit-box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 1px 0px 1px rgba(0, 0, 0, 0.2);
}
.claro .dijitSliderDisabled .dijitSliderProgressBarV, .claro .dijitSliderDisabled .dijitSliderBottomBumper {
background-color: #d3d3d3;
@@ -317,13 +321,3 @@
background-position: -107px 49%;
background-color: #efefef;
}
-.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarH,
-.dj_ie6 .claro .dijitSlider .dijitSliderLeftBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarH,
-.dj_ie6 .claro .dijitSlider .dijitSliderRightBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarV,
-.dj_ie6 .claro .dijitSlider .dijitSliderTopBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarV,
-.dj_ie6 .claro .dijitSlider .dijitSliderBottomBumper {
- background-image: none;
-}
diff --git a/lib/dijit/themes/claro/form/Slider.less b/lib/dijit/themes/claro/form/Slider.less
index db0f8cb24..2c5bfe914 100644
--- a/lib/dijit/themes/claro/form/Slider.less
+++ b/lib/dijit/themes/claro/form/Slider.less
@@ -66,7 +66,7 @@
background-image: none;
border-color: @disabled-border-color;
}
-.claro .dijitRuleLabel {
+.claro .dijitRuleLabelsContainer {
color: @text-color;
}
@@ -77,17 +77,12 @@
}
.claro .dijitSlider .dijitSliderProgressBarH,
.claro .dijitSlider .dijitSliderLeftBumper{
- background-image: url("../@{image-form-slider-horizontal}");
- background-repeat:repeat-x;
- background-position:0 -20px;
border-color: @border-color;
background-color: @slider-fullbar-background-color;
+ .alpha-white-gradient (top, 1,0px, 1,1px, 0,2px);
}
.claro .dijitSlider .dijitSliderRemainingBarH,
.claro .dijitSlider .dijitSliderRightBumper{
- background-image: url("../@{image-form-slider-horizontal}");
- background-repeat:repeat-x;
- background-position:0 -11px;
border-color: @border-color;
background-color: @slider-remainingbar-background-color;
}
@@ -99,27 +94,25 @@
}
.claro .dijitSliderHover .dijitSliderProgressBarH,
.claro .dijitSliderHover .dijitSliderLeftBumper{
- background-position:0 -20px;
background-color: @slider-hovered-fullbar-background-color;
border-color: @hovered-border-color;
}
.claro .dijitSliderHover .dijitSliderRemainingBarH,
.claro .dijitSliderHover .dijitSliderRightBumper{
- background-position:0 0;
background-color: @slider-hovered-remainingbar-background-color;
border-color: @hovered-border-color;
}
.claro .dijitSliderFocused .dijitSliderProgressBarH,
.claro .dijitSliderFocused .dijitSliderLeftBumper{
- background-position:0 -30px;
background-color: @slider-focused-fullbar-background-color;
border-color: @focused-border-color;
+ .box-shadow(inset 0px 1px 1px rgba(0, 0, 0, 0.2));
}
.claro .dijitSliderFocused .dijitSliderRemainingBarH,
.claro .dijitSliderFocused .dijitSliderRightBumper{
- background-position:0 -9px;
background-color: @slider-focused-remainingbar-background-color;
border-color: @focused-border-color;
+ .box-shadow(inset 0px 1px 1px rgba(0, 0, 0, 0.2));
}
.claro .dijitSliderDisabled .dijitSliderProgressBarH,
.claro .dijitSliderDisabled .dijitSliderLeftBumper{
@@ -138,17 +131,12 @@
}
.claro .dijitSlider .dijitSliderProgressBarV,
.claro .dijitSlider .dijitSliderBottomBumper{
- background-image: url("../@{image-form-slider-vertical}");
- background-repeat:repeat-y;
- background-position:-36px 0;
border-color: @border-color;
background-color: @slider-fullbar-background-color;
+ .alpha-white-gradient (left, 1,0px, 0,1px);
}
.claro .dijitSlider .dijitSliderRemainingBarV,
.claro .dijitSlider .dijitSliderTopBumper{
- background-image: url("../@{image-form-slider-vertical}");
- background-repeat:repeat-y;
- background-position:-3px 0;
border-color: @border-color;
background-color: @slider-remainingbar-background-color;
}
@@ -160,23 +148,25 @@
}
.claro .dijitSliderHover .dijitSliderProgressBarV,
.claro .dijitSliderHover .dijitSliderBottomBumper{
- background-position:-36px 0;
background-color: @slider-hovered-fullbar-background-color;
+ border-color: @hovered-border-color;
}
.claro .dijitSliderHover .dijitSliderRemainingBarV,
.claro .dijitSliderHover .dijitSliderTopBumper{
- background-position:0 0;
background-color: @slider-hovered-remainingbar-background-color;
+ border-color: @hovered-border-color;
}
.claro .dijitSliderFocused .dijitSliderProgressBarV,
.claro .dijitSliderFocused .dijitSliderBottomBumper{
- background-position:-56px 0;
background-color: @slider-focused-fullbar-background-color;
+ border-color: @focused-border-color;
+ .box-shadow(inset 1px 0px 1px rgba(0, 0, 0, 0.2));
}
.claro .dijitSliderFocused .dijitSliderRemainingBarV,
.claro .dijitSliderFocused .dijitSliderTopBumper{
- background-position:-18px 0;
background-color: @slider-focused-remainingbar-background-color;
+ border-color: @focused-border-color;
+ .box-shadow(inset 1px 0px 1px rgba(0, 0, 0, 0.2));
}
.claro .dijitSliderDisabled .dijitSliderProgressBarV,
.claro .dijitSliderDisabled .dijitSliderBottomBumper{
@@ -352,14 +342,3 @@
background-position:-107px 49%;
background-color:@disabled-background-color;
}
-
-.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarH,
-.dj_ie6 .claro .dijitSlider .dijitSliderLeftBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarH,
-.dj_ie6 .claro .dijitSlider .dijitSliderRightBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderProgressBarV,
-.dj_ie6 .claro .dijitSlider .dijitSliderTopBumper,
-.dj_ie6 .claro .dijitSlider .dijitSliderRemainingBarV,
-.dj_ie6 .claro .dijitSlider .dijitSliderBottomBumper {
- background-image:none;
-}
diff --git a/lib/dijit/themes/claro/form/images/button.png b/lib/dijit/themes/claro/form/images/button.png
deleted file mode 100644
index cb787cb2c..000000000
--- a/lib/dijit/themes/claro/form/images/button.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/buttonDisabled.png b/lib/dijit/themes/claro/form/images/buttonDisabled.png
new file mode 100644
index 000000000..faf57ba1d
--- /dev/null
+++ b/lib/dijit/themes/claro/form/images/buttonDisabled.png
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/buttonDisabled.svg b/lib/dijit/themes/claro/form/images/buttonDisabled.svg
new file mode 100644
index 000000000..72a51a017
--- /dev/null
+++ b/lib/dijit/themes/claro/form/images/buttonDisabled.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for buttonDisabled.png, which is used by IE7-9 for Button gradients.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match gradients defined in Button.css. It is however an approximation, since generated
+ output has a constant height, rather than matching the height of each button.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="18px" viewBox="0 0 1 18" preserveAspectRatio="none">
+
+ <defs>
+ <linearGradient id="disabled" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="50%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+
+ <!--
+ Swatch for disabled buttons. It will only fill the top part of the disabled buttons.
+ The bottom of disabled buttons are pure background-color
+ -->
+ <rect x="0" y="0" width="1" height="18" fill="url(#disabled)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/form/images/buttonEnabled.png b/lib/dijit/themes/claro/form/images/buttonEnabled.png
new file mode 100644
index 000000000..0932a9947
--- /dev/null
+++ b/lib/dijit/themes/claro/form/images/buttonEnabled.png
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/buttonEnabled.svg b/lib/dijit/themes/claro/form/images/buttonEnabled.svg
new file mode 100644
index 000000000..d9e564ab8
--- /dev/null
+++ b/lib/dijit/themes/claro/form/images/buttonEnabled.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for buttonEnabled.png, which is used by IE7-9 for Button gradients.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match gradients defined in Button.css. It is however an approximation, since generated
+ output has a constant height, rather than matching the height of each button.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="149px" viewBox="0 0 1 149" preserveAspectRatio="none">
+
+ <defs>
+ <linearGradient id="enabled" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="2%" stop-color="#ffffff" stop-opacity="0"/>
+ <stop offset="15%" stop-color="#ffffff" stop-opacity="0.7"/> <!-- near bottom of average height buttons -->
+ </linearGradient>
+ </defs>
+
+ <!--
+ Swatch for enabled buttons. It's 149px tall to account for tall buttons, but usually
+ only the top will be visible.
+ -->
+ <rect x="0" y="0" width="1" height="149" fill="url(#enabled)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/form/images/button_grad_d.png b/lib/dijit/themes/claro/form/images/button_grad_d.png
deleted file mode 100644
index 3a71a4653..000000000
--- a/lib/dijit/themes/claro/form/images/button_grad_d.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/formHighlight.png b/lib/dijit/themes/claro/form/images/formHighlight.png
deleted file mode 100644
index f90eb25ba..000000000
--- a/lib/dijit/themes/claro/form/images/formHighlight.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/shadow.png b/lib/dijit/themes/claro/form/images/shadow.png
deleted file mode 100644
index 72d60e628..000000000
--- a/lib/dijit/themes/claro/form/images/shadow.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/sliderHorizontal.png b/lib/dijit/themes/claro/form/images/sliderHorizontal.png
deleted file mode 100644
index d769a6489..000000000
--- a/lib/dijit/themes/claro/form/images/sliderHorizontal.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/sliderVertical.png b/lib/dijit/themes/claro/form/images/sliderVertical.png
deleted file mode 100644
index 9d69d04c2..000000000
--- a/lib/dijit/themes/claro/form/images/sliderVertical.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/form/images/textBox_back.png b/lib/dijit/themes/claro/form/images/textBox_back.png
deleted file mode 100644
index dfc752afe..000000000
--- a/lib/dijit/themes/claro/form/images/textBox_back.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/activeGradient.png b/lib/dijit/themes/claro/images/activeGradient.png
new file mode 100644
index 000000000..7e5716c0b
--- /dev/null
+++ b/lib/dijit/themes/claro/images/activeGradient.png
Binary files differ
diff --git a/lib/dijit/themes/claro/images/activeGradient.svg b/lib/dijit/themes/claro/images/activeGradient.svg
new file mode 100644
index 000000000..8ab6ce9c1
--- /dev/null
+++ b/lib/dijit/themes/claro/images/activeGradient.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for standardGradient.png, which is used by IE7-9 for light-to-dark gradient of many widgets.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from .standard-gradient() mixin in variables.css.
+ It is however an approximation, since generated
+ output has a constant height, rather than matching the height of each node.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="16px" viewBox="0 0 1 1" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="rgb(190,190,190)" stop-opacity="0.98"/>
+ <stop offset="20%" stop-color="#ffffff" stop-opacity="0.65"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="1" height="1" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/images/calendar.png b/lib/dijit/themes/claro/images/calendar.png
new file mode 100644
index 000000000..de66cbdb4
--- /dev/null
+++ b/lib/dijit/themes/claro/images/calendar.png
Binary files differ
diff --git a/lib/dijit/themes/claro/images/calendarContainerImages.png b/lib/dijit/themes/claro/images/calendarContainerImages.png
deleted file mode 100644
index 44fa088b7..000000000
--- a/lib/dijit/themes/claro/images/calendarContainerImages.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/commonHighlight.png b/lib/dijit/themes/claro/images/commonHighlight.png
deleted file mode 100644
index f90eb25ba..000000000
--- a/lib/dijit/themes/claro/images/commonHighlight.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/dnd.png b/lib/dijit/themes/claro/images/dnd.png
index 8cb04aa43..29bef4d38 100644
--- a/lib/dijit/themes/claro/images/dnd.png
+++ b/lib/dijit/themes/claro/images/dnd.png
Binary files differ
diff --git a/lib/dijit/themes/claro/images/menuHighlight.png b/lib/dijit/themes/claro/images/menuHighlight.png
deleted file mode 100644
index 22328a7d8..000000000
--- a/lib/dijit/themes/claro/images/menuHighlight.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/progressBarEmpty.png b/lib/dijit/themes/claro/images/progressBarEmpty.png
deleted file mode 100644
index e0a68561f..000000000
--- a/lib/dijit/themes/claro/images/progressBarEmpty.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/standardGradient.png b/lib/dijit/themes/claro/images/standardGradient.png
new file mode 100644
index 000000000..345402f62
--- /dev/null
+++ b/lib/dijit/themes/claro/images/standardGradient.png
Binary files differ
diff --git a/lib/dijit/themes/claro/images/standardGradient.svg b/lib/dijit/themes/claro/images/standardGradient.svg
new file mode 100644
index 000000000..807c3c70b
--- /dev/null
+++ b/lib/dijit/themes/claro/images/standardGradient.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for standardGradient.png, which is used by IE7-9 for light-to-dark gradient of many widgets.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from .standard-gradient() mixin in variables.css.
+ It is however an approximation, since generated
+ output has a constant height, rather than matching the height of each node.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" viewBox="0 0 1 1" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.7"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="1" height="1" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/images/titlebar.png b/lib/dijit/themes/claro/images/titlebar.png
deleted file mode 100644
index 48181035a..000000000
--- a/lib/dijit/themes/claro/images/titlebar.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/tooltipGradient.png b/lib/dijit/themes/claro/images/tooltipGradient.png
deleted file mode 100644
index ce4860e79..000000000
--- a/lib/dijit/themes/claro/images/tooltipGradient.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/images/treeExpand_loading.gif b/lib/dijit/themes/claro/images/treeExpand_loading.gif
deleted file mode 100644
index 424d376ac..000000000
--- a/lib/dijit/themes/claro/images/treeExpand_loading.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/AccordionContainer.css b/lib/dijit/themes/claro/layout/AccordionContainer.css
index 34831764c..b59aeca8b 100644
--- a/lib/dijit/themes/claro/layout/AccordionContainer.css
+++ b/lib/dijit/themes/claro/layout/AccordionContainer.css
@@ -50,16 +50,17 @@
background-color: transparent;
/* pick up color from dijitAccordionInnerContainer */
- background-image: url("../layout/images/accordion.png");
- background-position: 0 0;
+ background-image: url("../images/standardGradient.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
padding: 5px 7px 2px 7px;
min-height: 17px;
color: #494949;
}
-.dj_ie6 .claro .dijitAccordionTitle {
- background-image: none;
-}
.claro .dijitAccordionContainer .dijitAccordionChildWrapper {
/* this extends the blue trim styling of the title bar to wrapping around the node.
* done by setting margin
@@ -83,7 +84,13 @@
transition-duration: 0.1s;
}
.claro .dijitAccordionInnerContainerActive .dijitAccordionTitle {
- background-position: 0 -136px;
+ background-image: url("../images/activeGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(190, 190, 190, 0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
color: #000000;
}
/* Open (a.k.a. selected) pane */
@@ -93,7 +100,13 @@
}
.claro .dijitAccordionInnerContainerSelected .dijitAccordionTitle {
color: #000000;
- background-position: 0 0;
+ background-image: url("../images/standardGradient.png");
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.7) 0%, rgba(255, 255, 255, 0) 100%);
+ _background-image: none;
/* avoid effect when clicking the title of the open pane */
}
@@ -114,7 +127,7 @@
}
.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionChildWrapper, .claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionChildWrapper {
background-color: #ffffff;
- border: 1px solid #759dc0 !important;
+ border: 1px solid #759dc0;
-webkit-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.25);
-moz-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.25);
box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.25);
diff --git a/lib/dijit/themes/claro/layout/AccordionContainer.less b/lib/dijit/themes/claro/layout/AccordionContainer.less
index b3aa62248..fd4308c30 100644
--- a/lib/dijit/themes/claro/layout/AccordionContainer.less
+++ b/lib/dijit/themes/claro/layout/AccordionContainer.less
@@ -43,16 +43,12 @@
}
.claro .dijitAccordionTitle {
background-color: transparent; /* pick up color from dijitAccordionInnerContainer */
- background-image: url("../@{image-layout-accordion}");
- background-position:0 0;
- background-repeat:repeat-x;
+ .standard-gradient("../");
padding: 5px 7px 2px 7px;
min-height:17px;
color:@unselected-text-color;
}
-.dj_ie6 .claro .dijitAccordionTitle {
- background-image: none;
-}
+
.claro .dijitAccordionContainer .dijitAccordionChildWrapper {
/* this extends the blue trim styling of the title bar to wrapping around the node.
* done by setting margin
@@ -75,7 +71,7 @@
.transition-duration(.1s);
}
.claro .dijitAccordionInnerContainerActive .dijitAccordionTitle {
- background-position:0 -136px;
+ .active-gradient("../");
color:@selected-text-color;
}
@@ -87,7 +83,7 @@
}
.claro .dijitAccordionInnerContainerSelected .dijitAccordionTitle {
color:@selected-text-color;
- background-position: 0 0; /* avoid effect when clicking the title of the open pane */
+ .standard-gradient("../"); /* avoid effect when clicking the title of the open pane */
}
/* Hovering open or closed pane */
@@ -97,6 +93,8 @@
color:@hovered-text-color;
}
+// TODO: why do we have any hover effect on the selected pane?
+// Since you can't click it, there shouldn't be a hover effect.
.claro .dijitAccordionInnerContainerHover,
.claro .dijitAccordionInnerContainerSelectedActive {
/* note: clicking the currently selected Accordion pane should have no effect, so treating same as hover. */
@@ -108,6 +106,6 @@
.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionChildWrapper,
.claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionChildWrapper {
background-color:@pane-background-color;
- border:1px solid @hovered-border-color !important;
+ border:1px solid @hovered-border-color;
.box-shadow(inset 0 0 3px rgba(0, 0, 0, .25));
}
diff --git a/lib/dijit/themes/claro/layout/BorderContainer.css b/lib/dijit/themes/claro/layout/BorderContainer.css
index 8c0a5fa96..f00c5d1d7 100644
--- a/lib/dijit/themes/claro/layout/BorderContainer.css
+++ b/lib/dijit/themes/claro/layout/BorderContainer.css
@@ -84,26 +84,28 @@ Splitters and gutters:
margin: 0;
}
/* hovered splitter */
-.claro .dijitSplitterHHover {
+.claro .dijitSplitterHHover, .claro .dijitSplitterVHover {
font-size: 1px;
- background: url("../layout/images/splitterHorizontalHover.png") no-repeat center top;
+ background-color: #cfe5fa;
}
-.claro .dijitSplitterHHover .dijitSplitterThumb {
- background: #759dc0 none;
+.claro .dijitSplitterHHover {
+ background-image: -moz-linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
+ background-image: -webkit-linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
+ background-image: -o-linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
+ background-image: linear-gradient(left, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
}
.claro .dijitSplitterVHover {
- font-size: 1px;
- background: url("../layout/images/splitterVerticalHover.png") no-repeat center left;
+ background-image: -moz-linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
+ background-image: -webkit-linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
+ background-image: -o-linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
+ background-image: linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0) 50%, #ffffff 100%);
}
-.claro .dijitSplitterVHover .dijitSplitterThumb {
+.claro .dijitSplitterHHover .dijitSplitterThumb, .claro .dijitSplitterVHover .dijitSplitterThumb {
background: #759dc0 none;
}
-.dj_ie6 .dijitSplitterHHover, .dj_ie6 .claro .dijitSplitterVHover {
- background-color: #cfe5fa;
- background-image: none;
-}
/* active splitter */
.claro .dijitSplitterHActive, .claro .dijitSplitterVActive {
font-size: 1px;
background-color: #abd6ff;
+ background-image: none;
}
diff --git a/lib/dijit/themes/claro/layout/BorderContainer.less b/lib/dijit/themes/claro/layout/BorderContainer.less
index b7c672e63..f3edcd3c5 100644
--- a/lib/dijit/themes/claro/layout/BorderContainer.less
+++ b/lib/dijit/themes/claro/layout/BorderContainer.less
@@ -95,34 +95,30 @@ Splitters and gutters:
}
/* hovered splitter */
-.claro .dijitSplitterHHover {
+.claro .dijitSplitterHHover,
+.claro .dijitSplitterVHover {
font-size: 1px;
- background: url("../@{image-layout-splitter-horizontal-hover}") no-repeat center top;
+ background-color: @splitter-hovered-background-color;
}
-
-.claro .dijitSplitterHHover .dijitSplitterThumb {
- background:@hovered-border-color none;
+.claro .dijitSplitterHHover {
+ .alpha-white-gradient (left, 1,0px, 0,50%, 1,100%);
}
.claro .dijitSplitterVHover {
- font-size: 1px;
- background: url("../@{image-layout-splitter-vertical-hover}") no-repeat center left;
+ .alpha-white-gradient (top, 1,0px, 0,50%, 1,100%);
}
+.claro .dijitSplitterHHover .dijitSplitterThumb,
.claro .dijitSplitterVHover .dijitSplitterThumb {
background:@hovered-border-color none;
}
-.dj_ie6 .dijitSplitterHHover,
-.dj_ie6 .claro .dijitSplitterVHover {
- background-color: @splitter-hovered-background-color;
- background-image:none;
-}
/* active splitter */
.claro .dijitSplitterHActive,
.claro .dijitSplitterVActive {
font-size: 1px;
background-color:@splitter-dragged-background-color;
+ background-image: none; // color all the way across, not gradient like in hover mode
}
diff --git a/lib/dijit/themes/claro/layout/TabContainer.css b/lib/dijit/themes/claro/layout/TabContainer.css
index 641b921ec..6db8550ec 100644
--- a/lib/dijit/themes/claro/layout/TabContainer.css
+++ b/lib/dijit/themes/claro/layout/TabContainer.css
@@ -17,18 +17,18 @@
* .tabStripButtonDisabled - styles for disabled tab strip buttons
*
* Tab Button:
- * .dijitTabContainerTop-tabs .dijitTabInnerDiv/.dijitTabContent - styles for top tab button container
- * .dijitTabContainerBottom-tabs .dijitTabInnerDiv/.dijitTabContent - styles for bottom tab button container
- * .dijitTabContainerLeft-tabs .dijitTabInnerDiv/.dijitTabContent - styles for left tab button container
- * .dijitTabContainerRight-tabs .dijitTabInnerDiv/.dijitTabContent - styles for right tab button container
+ * .dijitTabContainerTop-tabs .dijitTab - styles for top tab button container
+ * .dijitTabContainerBottom-tabs .dijitTab - styles for bottom tab button container
+ * .dijitTabContainerLeft-tabs .dijitTab - styles for left tab button container
+ * .dijitTabContainerRight-tabs .dijitTab - styles for right tab button container
*
- * .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv/.dijitTabContent
+ * .dijitTabContainerTop-tabs .dijitTabChecked .dijitTab
* - styles for selected status of top tab button
* same to Bottom, Left, Right Tabs
*
- * .dijitTabHover .dijitTabInnerDiv - styles when mouse hover on tab buttons
- * .dijitTabActive .dijitTabInnerDiv - styles when mouse down on tab buttons
- * .dijitTabChecked .dijitTabInnerDiv - styles when on buttons of selected tab
+ * .dijitTabHover .dijitTab - styles when mouse hover on tab buttons
+ * .dijitTabActive .dijitTab - styles when mouse down on tab buttons
+ * .dijitTabChecked .dijitTab - styles when on buttons of selected tab
*
* .dijitTabCloseButton - the close action buttons lie at the right top of each tab button on closable tabs
* .dijitTabCloseButtonHover - styles when mouse hover on close action button
@@ -77,7 +77,8 @@
display: none;
}
-.claro .dijitTabInnerDiv {
+.claro .dijitTab {
+ border: 1px solid #b5bcc7;
background-color: #efefef;
-webkit-transition-property: background-color, border;
-moz-transition-property: background-color, border;
@@ -87,132 +88,104 @@
transition-duration: 0.35s;
color: #494949;
}
-.claro .dijitTabHover .dijitTabInnerDiv {
+.claro .dijitTabHover {
+ border-color: #759dc0;
background-color: #abd6ff;
-webkit-transition-duration: 0.25s;
-moz-transition-duration: 0.25s;
transition-duration: 0.25s;
color: #000000;
}
-.claro .dijitTabActive .dijitTabInnerDiv {
+.claro .dijitTabActive {
+ border-color: #759dc0;
background-color: #7dbdfa;
color: #000000;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
transition-duration: 0.1s;
}
-.claro .dijitTabChecked .dijitTabInnerDiv {
+.claro .dijitTabChecked {
+ border-color: #b5bcc7;
background-color: #cfe5fa;
color: #000000;
}
-.claro .dijitTabContent {
- border: 1px solid #b5bcc7;
-}
-.claro .dijitTabHover .dijitTabContent {
- border-color: #759dc0;
-}
-.claro .dijitTabActive .dijitTabContent {
- border-color: #759dc0;
-}
-.claro .dijitTabChecked .dijitTabContent {
- color: #000000;
- border-color: #b5bcc7;
+.claro .dijitTabDisabled {
+ background-color: #d3d3d3;
}
-.claro .tabStripButton .dijitTabInnerDiv {
+.claro .tabStripButton {
background-color: transparent;
-}
-.claro .tabStripButton .dijitTabContent {
border: none;
}
/*** end common ***/
/*************** top tab ***************/
.claro .dijitTabContainerTop-tabs .dijitTab {
+ /* unselected (and not hovered/pressed) tab */
+
top: 1px;
/* used for overlap */
margin-right: 1px;
- padding-top: 3px;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTab {
- top: 3px;
-}
-/* for top tab padding. change height when status changes */
-.claro .dijitTabContainerTop-tabs .dijitTabContent {
padding: 3px 6px;
border-bottom-width: 0;
- background-image: url("../layout/images/tabTop.png");
- background-position: 0 0;
- background-repeat: repeat-x;
min-width: 60px;
text-align: center;
-}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 4px;
- padding-top: 6px;
-}
-/* normal status */
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
- background-image: url("../layout/images/tabTop.png");
- background-position: 0 -248px;
- background-position: bottom;
+ background-image: url("images/tabTopUnselected.png");
background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
-webkit-box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
-moz-box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
}
-/* checked status */
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image: none;
+.claro .dijitTabContainerTop-tabs .dijitTabChecked {
+ /* selected tab */
+
+ padding-bottom: 4px;
+ padding-top: 9px;
+ background-image: url("images/tabTopSelected.png");
+ background-image: -moz-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+ background-image: -webkit-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+ background-image: -o-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+ background-image: linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
-webkit-box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- background-position: 0 -102px;
- background-repeat: repeat-x;
-}
/** end top tab **/
/*************** bottom tab ***************/
.claro .dijitTabContainerBottom-tabs .dijitTab {
+ /* unselected (and not hovered/pressed) tab */
+
top: -1px;
/* used for overlap */
margin-right: 1px;
-}
-/* calculate the position and size */
-.claro .dijitTabContainerBottom-tabs .dijitTabContent {
padding: 3px 6px;
border-top-width: 0;
- background-image: url("../layout/images/tabBottom.png");
- background-position: 0 -249px;
- background-repeat: repeat-x;
- background-position: bottom;
min-width: 60px;
text-align: center;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTab {
- padding-bottom: 3px;
-}
-/* normal status */
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background-image: url("../layout/images/tabBottom.png");
- background-position: top;
+ background-image: url("images/tabBottomUnselected.png");
background-repeat: repeat-x;
+ background-position: bottom;
+ background-image: -moz-linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
-moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
}
-/* checked status */
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 7px;
- padding-top: 4px;
- background-position: 0 -119px;
-}
+/* selected tab */
.claro .dijitTabContainerBottom-tabs .dijitTabChecked {
- padding-bottom: 0;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image: none;
+ padding-bottom: 9px;
+ padding-top: 4px;
+ background-image: url("images/tabBottomSelected.png");
+ background-image: -moz-linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+ background-image: -webkit-linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+ background-image: -o-linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+ background-image: linear-gradient(bottom, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
@@ -220,33 +193,29 @@
/** end bottom tab **/
/*************** left tab ***************/
.claro .dijitTabContainerLeft-tabs .dijitTab {
- border-right-width: 0;
+ /* unselected (and not hovered/pressed) tab */
+
left: 1px;
/* used for overlap */
margin-bottom: 1px;
-}
-/* normal status */
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background-image: url("../layout/images/tabLeft.png");
- background-position: -347px -340px;
- background-repeat: repeat-y;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabContent {
padding: 3px 8px 4px 4px;
- background-image: url("../layout/images/tabLeft.png");
+ background-image: url("images/tabLeftUnselected.png");
background-repeat: repeat-y;
- background-position: 0 0;
+ background-image: -moz-linear-gradient(left, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(left, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(left, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(left, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
}
-/* checked status */
-.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
+/* selected tab */
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked {
+ border-right-width: 0;
padding-right: 9px;
- border-right: none;
- background-image: none;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position: 0 -179px;
- background-repeat: repeat-y;
+ background-image: url("images/tabLeftSelected.png");
+ background-image: -moz-linear-gradient(left, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
+ background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
+ background-image: -o-linear-gradient(left, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
+ background-image: linear-gradient(left, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
-webkit-box-shadow: -1px 0 2px rgba(0, 0, 0, 0.05);
-moz-box-shadow: -1px 0 2px rgba(0, 0, 0, 0.05);
box-shadow: -1px 0 2px rgba(0, 0, 0, 0.05);
@@ -254,51 +223,50 @@
/** end left tab **/
/*************** right tab ***************/
.claro .dijitTabContainerRight-tabs .dijitTab {
- border-left-width: 0;
+ /* unselected (and not hovered/pressed) tab */
+
left: -1px;
/* used for overlap */
margin-bottom: 1px;
-}
-/* normal status */
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- background-image: url("../layout/images/tabRight.png");
- background-repeat: repeat-y;
- background-position: -1px -347px;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabContent {
padding: 3px 8px 4px 4px;
- background-image: url("../layout/images/tabRight.png");
- background-position: right top;
+ background-image: url("images/tabRightUnselected.png");
background-repeat: repeat-y;
-}
-/* checked status */
-.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabContent {
+ background-position: right;
+ background-image: -moz-linear-gradient(right, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(right, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(right, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(right, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+}
+.claro .dijitTabContainerRight-tabs .dijitTabChecked {
+ /* selected tab */
+
padding-left: 5px;
- border-left: none;
- background-image: none;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position: -348px -179px;
+ border-left-width: 0;
+ background-image: url("images/tabRightSelected.png");
+ background-image: -moz-linear-gradient(right, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
+ background-image: -webkit-linear-gradient(right, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
+ background-image: -o-linear-gradient(right, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
+ background-image: linear-gradient(right, rgba(255, 255, 255, 0.5) 0px, #ffffff 30px);
-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.07);
-moz-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.07);
box-shadow: 1px 0 2px rgba(0, 0, 0, 0.07);
}
/** end right tab **/
/** round corner **/
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv, .claro .dijitTabContainerTop-tabs .dijitTabContent {
+.claro .dijitTabContainerTop-tabs .dijitTab {
-moz-border-radius: 2px 2px 0 0;
border-radius: 2px 2px 0 0;
}
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv, .claro .dijitTabContainerBottom-tabs .dijitTabContent {
+.claro .dijitTabContainerBottom-tabs .dijitTab {
-moz-border-radius: 0 0 2px 2px;
border-radius: 0 0 2px 2px;
}
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv, .claro .dijitTabContainerLeft-tabs .dijitTabContent {
+.claro .dijitTabContainerLeft-tabs .dijitTab {
-moz-border-radius: 2px 0 0 2px;
border-radius: 2px 0 0 2px;
}
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv, .claro .dijitTabContainerRight-tabs .dijitTabContent {
+.claro .dijitTabContainerRight-tabs .dijitTab {
-moz-border-radius: 0 2px 2px 0;
border-radius: 0 2px 2px 0;
}
@@ -310,15 +278,18 @@
.claro .dijitTabListContainer-top .tabStripButton {
padding: 4px 3px;
margin-top: 7px;
- background-image: url("../layout/images/tabTop.png");
- background-position: 0 0;
+ background-image: -moz-linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(top, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
}
.claro .dijitTabListContainer-bottom .tabStripButton {
- padding: 5px 3px;
- margin-bottom: 4px;
- background-image: url("../layout/images/tabTop.png");
- background-position: 0 -248px;
- background-position: bottom;
+ padding: 4px 3px;
+ margin-bottom: 7px;
+ background-image: -moz-linear-gradient(bottom, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
+ background-image: -webkit-linear-gradient(bottom, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
+ background-image: -o-linear-gradient(bottom, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
+ background-image: linear-gradient(bottom, #ffffff 0px, rgba(255, 255, 255, 0.1) 1px, rgba(255, 255, 255, 0.6) 6px, rgba(255, 255, 255, 0) 100%);
}
.claro .tabStripButtonHover {
background-color: #abd6ff;
@@ -361,10 +332,9 @@
}
.claro .dijitTabContainerNested .dijitTabContainerTop-tabs {
border-bottom: solid 1px #b5bcc7;
- padding: 1px 2px 4px;
- margin-top: -2px;
+ padding: 2px 2px 4px;
}
-.claro .dijitTabContainerTabListNested .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTab {
background: rgba(255, 255, 255, 0) none repeat scroll 0 0;
border: none;
padding: 4px;
@@ -378,11 +348,7 @@
-moz-border-radius: 2px;
border-radius: 2px;
}
-.claro .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv {
- /* 4 element selector to override box-shadow setting from above rule:
- * .claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv { ... }
- */
-
+.claro .dijitTabContainerTabListNested .dijitTab {
background: none;
border: none;
top: 0;
@@ -392,7 +358,7 @@
-moz-box-shadow: none;
box-shadow: none;
}
-.claro .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTabHover {
background-color: #e5f2fe;
border: solid 1px #cfe5fa;
padding: 3px;
@@ -403,18 +369,21 @@
.claro .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
text-decoration: none;
}
-.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTabActive {
border: solid 1px #759dc0;
padding: 3px;
- background: #abd6ff url("../layout/images/tabNested.png") repeat-x;
+ background: #abd6ff url("images/tabNested.png") repeat-x;
+ background-image: -moz-linear-gradient(rgba(255, 255, 255, 0.61) 0%, rgba(255, 255, 255, 0) 17%, rgba(255, 255, 255, 0) 83%, rgba(255, 255, 255, 0.61) 100%);
+ background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.61) 0%, rgba(255, 255, 255, 0) 17%, rgba(255, 255, 255, 0) 83%, rgba(255, 255, 255, 0.61) 100%);
+ background-image: -o-linear-gradient(rgba(255, 255, 255, 0.61) 0%, rgba(255, 255, 255, 0) 17%, rgba(255, 255, 255, 0) 83%, rgba(255, 255, 255, 0.61) 100%);
+ background-image: linear-gradient(rgba(255, 255, 255, 0.61) 0%, rgba(255, 255, 255, 0) 17%, rgba(255, 255, 255, 0) 83%, rgba(255, 255, 255, 0.61) 100%);
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
transition-duration: 0.1s;
}
-.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTabChecked {
padding: 3px;
border: solid 1px #759dc0;
- background-position: 0 105px;
background-color: #cfe5fa;
}
.claro .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
@@ -426,9 +395,6 @@
/* prevent double border */
}
-.dj_ie6 .claro .dijitTabContent,
-.dj_ie6 .claro .dijitTabInnerDiv,
-.dj_ie6 .dijitTabListContainer-top .tabStripButton,
-.dj_ie6 .dijitTabListContainer-bottom .tabStripButton {
- background-image: none;
+.claro .dijitTab, .claro .tabStripButton {
+ _background-image: none !important;
}
diff --git a/lib/dijit/themes/claro/layout/TabContainer.less b/lib/dijit/themes/claro/layout/TabContainer.less
index 16947ff9c..74495b209 100644
--- a/lib/dijit/themes/claro/layout/TabContainer.less
+++ b/lib/dijit/themes/claro/layout/TabContainer.less
@@ -17,18 +17,18 @@
* .tabStripButtonDisabled - styles for disabled tab strip buttons
*
* Tab Button:
- * .dijitTabContainerTop-tabs .dijitTabInnerDiv/.dijitTabContent - styles for top tab button container
- * .dijitTabContainerBottom-tabs .dijitTabInnerDiv/.dijitTabContent - styles for bottom tab button container
- * .dijitTabContainerLeft-tabs .dijitTabInnerDiv/.dijitTabContent - styles for left tab button container
- * .dijitTabContainerRight-tabs .dijitTabInnerDiv/.dijitTabContent - styles for right tab button container
+ * .dijitTabContainerTop-tabs .dijitTab - styles for top tab button container
+ * .dijitTabContainerBottom-tabs .dijitTab - styles for bottom tab button container
+ * .dijitTabContainerLeft-tabs .dijitTab - styles for left tab button container
+ * .dijitTabContainerRight-tabs .dijitTab - styles for right tab button container
*
- * .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv/.dijitTabContent
+ * .dijitTabContainerTop-tabs .dijitTabChecked .dijitTab
* - styles for selected status of top tab button
* same to Bottom, Left, Right Tabs
*
- * .dijitTabHover .dijitTabInnerDiv - styles when mouse hover on tab buttons
- * .dijitTabActive .dijitTabInnerDiv - styles when mouse down on tab buttons
- * .dijitTabChecked .dijitTabInnerDiv - styles when on buttons of selected tab
+ * .dijitTabHover .dijitTab - styles when mouse hover on tab buttons
+ * .dijitTabActive .dijitTab - styles when mouse down on tab buttons
+ * .dijitTabChecked .dijitTab - styles when on buttons of selected tab
*
* .dijitTabCloseButton - the close action buttons lie at the right top of each tab button on closable tabs
* .dijitTabCloseButtonHover - styles when mouse hover on close action button
@@ -49,6 +49,13 @@
@import "../variables";
+.unselected-tab-gradient (@direction) {
+ // white line, dark line, then fade from light to dark
+ .alpha-white-gradient (@direction, 1,0px, 1,1px, 0.1,2px, 0.6,7px, 0,100%);
+}
+.topBottom-selected-tab-gradient (@direction) {
+ .alpha-white-gradient (@direction, 1,0px, 1,1px, 0,2px, 1,7px); // white line, blue line, remainder white
+}
/*** some common features ***/
.claro .dijitTabPaneWrapper {
background:@pane-background-color;
@@ -78,45 +85,37 @@
/* set the spacer invisible. note that height:0 doesn't work on IE/quirks, it's still 10px. */
display: none;
}
-.claro .dijitTabInnerDiv {
+.claro .dijitTab {
+ border: 1px solid @border-color;
background-color:@unselected-background-color;
.transition-property(background-color, border);
.transition-duration(.35s);
color:@unselected-text-color;
}
-.claro .dijitTabHover .dijitTabInnerDiv {
+.claro .dijitTabHover {
+ border-color: @hovered-border-color;
background-color:@hovered-background-color;
.transition-duration(.25s);
color:@hovered-text-color;
}
-.claro .dijitTabActive .dijitTabInnerDiv {
+.claro .dijitTabActive {
+ border-color: @pressed-border-color;
background-color:@pressed-background-color;
color:@selected-text-color;
.transition-duration(.1s);
}
-.claro .dijitTabChecked .dijitTabInnerDiv {
- background-color:@selected-background-color;
- color:@selected-text-color;
-}
-
-.claro .dijitTabContent {
- border: 1px solid @border-color;
-}
-.claro .dijitTabHover .dijitTabContent {
- border-color: @hovered-border-color;
-}
-.claro .dijitTabActive .dijitTabContent {
- border-color: @pressed-border-color;
-}
-.claro .dijitTabChecked .dijitTabContent {
- color:@selected-text-color; // todo: redundant with .claro .dijitTabChecked .dijitTabInnerDiv above?
+.claro .dijitTabChecked {
+ // selected tab
border-color: @border-color; // don't use @selected-border-color because need to match border of TabContainer
+ background-color: @selected-background-color;
+ color: @selected-text-color;
+}
+.claro .dijitTabDisabled {
+ background-color: @tab-disabled-background-color;
}
-.claro .tabStripButton .dijitTabInnerDiv {
+.claro .tabStripButton {
background-color: transparent;
-}
-.claro .tabStripButton .dijitTabContent {
border: none;
}
/*** end common ***/
@@ -124,169 +123,133 @@
/*************** top tab ***************/
.claro .dijitTabContainerTop-tabs .dijitTab {
+ /* unselected (and not hovered/pressed) tab */
top: 1px; /* used for overlap */
margin-right: 1px;
- padding-top: 3px;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTab {
- top: 3px;
-}
-/* for top tab padding. change height when status changes */
-.claro .dijitTabContainerTop-tabs .dijitTabContent {
padding:3px 6px;
border-bottom-width: 0;
- background-image:url("../@{image-layout-tab-top}");
- background-position:0 0;
- background-repeat:repeat-x;
min-width: 60px;
text-align: center;
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabTopUnselected.png");
+ background-repeat: repeat-x;
+ .unselected-tab-gradient(top);
+
+ .box-shadow(0 -1px 1px rgba(0, 0, 0, 0.04));
}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
+
+.claro .dijitTabContainerTop-tabs .dijitTabChecked {
+ /* selected tab */
padding-bottom: 4px;
- padding-top: 6px;
-}
+ padding-top: 9px;
-/* normal status */
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
- background-image:url("../@{image-layout-tab-top}");
- background-position:0 -248px;
- background-position:bottom;
- background-repeat:repeat-x;
- .box-shadow(0 -1px 1px rgba(0, 0, 0, 0.04));
-}
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabTopSelected.png");
+ .topBottom-selected-tab-gradient (top);
-/* checked status */
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image:none;
.box-shadow(0 -1px 2px rgba(0, 0, 0, 0.05));
}
-.claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabContent {
- background-position:0 -102px;
- background-repeat:repeat-x;
-}
+
/** end top tab **/
/*************** bottom tab ***************/
.claro .dijitTabContainerBottom-tabs .dijitTab {
+ /* unselected (and not hovered/pressed) tab */
top: -1px; /* used for overlap */
margin-right: 1px;
-}
-/* calculate the position and size */
-.claro .dijitTabContainerBottom-tabs .dijitTabContent {
padding:3px 6px;
border-top-width: 0;
- background-image: url("../@{image-layout-tab-bottom}");
- background-position:0 -249px;
- background-repeat: repeat-x;
- background-position:bottom;
min-width: 60px;
text-align: center;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTab {
- padding-bottom: 3px;
-}
-/* normal status */
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background-image: url("../@{image-layout-tab-bottom}");
- background-position: top;
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabBottomUnselected.png");
background-repeat: repeat-x;
+ background-position: bottom;
+ .unselected-tab-gradient(bottom);
+
.box-shadow(0 1px 1px rgba(0, 0, 0, 0.04));
-
}
-/* checked status */
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabContent {
- padding-bottom: 7px;
- padding-top: 4px;
- background-position:0 -119px;
-}
+/* selected tab */
.claro .dijitTabContainerBottom-tabs .dijitTabChecked {
- padding-bottom: 0;
-}
-.claro .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-image:none;
+ padding-bottom: 9px;
+ padding-top: 4px;
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabBottomSelected.png");
+ .topBottom-selected-tab-gradient (bottom);
+
.box-shadow(0 1px 2px rgba(0, 0, 0, 0.05));
}
/** end bottom tab **/
/*************** left tab ***************/
.claro .dijitTabContainerLeft-tabs .dijitTab {
- border-right-width: 0;
+ /* unselected (and not hovered/pressed) tab */
left: 1px; /* used for overlap */
margin-bottom: 1px;
-}
-/* normal status */
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background-image: url("../@{image-layout-tab-left}");
- background-position: -347px -340px;
- background-repeat: repeat-y;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabContent {
padding:3px 8px 4px 4px;
- background-image: url("../@{image-layout-tab-left}");
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabLeftUnselected.png");
background-repeat: repeat-y;
- background-position:0 0;
+ .unselected-tab-gradient(left);
}
-/* checked status */
-.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabContent {
+
+/* selected tab */
+.claro .dijitTabContainerLeft-tabs .dijitTabChecked {
+ border-right-width: 0;
padding-right: 9px;
- border-right: none;
- background-image: none;
-}
-.claro .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position:0 -179px;
- background-repeat:repeat-y;
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabLeftSelected.png");
+ .alpha-white-gradient (left, 0.5,0px, 1,30px); // 1/2 inch blue gradient, remainder white
+
.box-shadow(-1px 0 2px rgba(0, 0, 0, .05));
}
/** end left tab **/
/*************** right tab ***************/
.claro .dijitTabContainerRight-tabs .dijitTab {
- border-left-width: 0;
+ /* unselected (and not hovered/pressed) tab */
left: -1px; /* used for overlap */
margin-bottom: 1px;
-}
-/* normal status */
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- background-image: url("../@{image-layout-tab-right}");
- background-repeat: repeat-y;
- background-position: -1px -347px;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabContent {
padding:3px 8px 4px 4px;
- background-image: url("../@{image-layout-tab-right}");
- background-position:right top;
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabRightUnselected.png");
background-repeat: repeat-y;
+ background-position: right;
+ .unselected-tab-gradient(right);
}
-/* checked status */
-.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabContent {
+.claro .dijitTabContainerRight-tabs .dijitTabChecked {
+ /* selected tab */
padding-left: 5px;
- border-left: none;
- background-image: none;
-}
-.claro .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv {
- background-position:-348px -179px;
+ border-left-width: 0;
+
+ // gradient (CSS gradient, with backup image for IE6-9)
+ background-image: url("images/tabRightSelected.png");
+ .alpha-white-gradient (right, 0.5,0px, 1,30px); // 1/2 inch blue gradient, remainder white
+
.box-shadow(1px 0 2px rgba(0, 0, 0, 0.07));
}
/** end right tab **/
/** round corner **/
-.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerTop-tabs .dijitTabContent {
+.claro .dijitTabContainerTop-tabs .dijitTab {
.border-radius(2px 2px 0 0);
}
-.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerBottom-tabs .dijitTabContent{
+.claro .dijitTabContainerBottom-tabs .dijitTab {
.border-radius(0 0 2px 2px);
}
-.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerLeft-tabs .dijitTabContent{
+.claro .dijitTabContainerLeft-tabs .dijitTab {
.border-radius(2px 0 0 2px);
}
-.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv,
-.claro .dijitTabContainerRight-tabs .dijitTabContent{
+.claro .dijitTabContainerRight-tabs .dijitTab {
.border-radius(0 2px 2px 0);
}
@@ -298,15 +261,12 @@
.claro .dijitTabListContainer-top .tabStripButton {
padding: 4px 3px;
margin-top:7px;
- background-image: url("../@{image-layout-tab-top}");
- background-position:0 0;
+ .alpha-white-gradient (top, 1,0px, 0.1,1px, 0.6,6px, 0,100%); // to match unselected tab, but had to tweak numbers
}
.claro .dijitTabListContainer-bottom .tabStripButton {
- padding:5px 3px;
- margin-bottom:4px;
- background-image: url("../@{image-layout-tab-top}");
- background-position:0 -248px;
- background-position:bottom;
+ padding:4px 3px;
+ margin-bottom:7px;
+ .alpha-white-gradient (bottom, 1,0px, 0.1,1px, 0.6,6px, 0,100%); // to match unselected tab, but had to tweak numbers
}
.claro .tabStripButtonHover {
background-color:@hovered-background-color;
@@ -349,10 +309,9 @@
}
.claro .dijitTabContainerNested .dijitTabContainerTop-tabs {
border-bottom:solid 1px @border-color;
- padding:1px 2px 4px;
- margin-top:-2px;
+ padding:2px 2px 4px;
}
-.claro .dijitTabContainerTabListNested .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTab {
background:rgba(255, 255, 255, 0) none repeat scroll 0 0;
border: none;
padding: 4px;
@@ -361,34 +320,35 @@
.transition-duration(.3s);
.border-radius(2px);
}
-.claro .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv {
- /* 4 element selector to override box-shadow setting from above rule:
- * .claro .dijitTabContainerTop-tabs .dijitTabChecked .dijitTabInnerDiv { ... }
- */
+.claro .dijitTabContainerTabListNested .dijitTab {
background: none;
border: none;
top: 0;/* to override top: 1px/-1px for normal tabs */
.box-shadow(none);
}
-.claro .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTabHover {
background-color: @nestedtab-hovered-background-color;
border:solid 1px @nestedtab-hovered-border-color;
- padding: 3px;
+ padding: 3px; // 4px above padding - 1px compensation for border
.transition-duration(.2s);
}
.claro .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
text-decoration: none;
}
-.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTabActive {
border:solid 1px @nestedtab-selected-border-color;
padding: 3px;
- background: @nestedtab-selected-background-color url("../@{image-layout-tab-nested}") repeat-x;
+
+ // CSS gradient with fallback to image for IE
+ // this is in a weird place, only for active state; mailed Jason about it
+ background: @nestedtab-selected-background-color url("images/tabNested.png") repeat-x;
+ .alpha-white-gradient (0.61,0%, 0,17%, 0,83%, 0.61,100%);
+
.transition-duration(.1s);
}
-.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
+.claro .dijitTabContainerTabListNested .dijitTabChecked {
padding: 3px;
border:solid 1px @selected-border-color;
- background-position: 0 105px;
background-color:@selected-background-color;
}
.claro .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
@@ -399,10 +359,8 @@
border: none;/* prevent double border */
}
-
-.dj_ie6 .claro .dijitTabContent,
-.dj_ie6 .claro .dijitTabInnerDiv,
-.dj_ie6 .dijitTabListContainer-top .tabStripButton,
-.dj_ie6 .dijitTabListContainer-bottom .tabStripButton{
- background-image: none;
+.claro .dijitTab,
+.claro .tabStripButton {
+ // IE6 can't handle background-image and background-color on same node
+ _background-image: none !important;
}
diff --git a/lib/dijit/themes/claro/layout/TabContainer_rtl.css b/lib/dijit/themes/claro/layout/TabContainer_rtl.css
index 89fdff097..3b4d87ad3 100644
--- a/lib/dijit/themes/claro/layout/TabContainer_rtl.css
+++ b/lib/dijit/themes/claro/layout/TabContainer_rtl.css
@@ -2,66 +2,3 @@
margin-right: 0;
margin-left: 1px;
}
-.claro .dijitTabRtl {
- -moz-box-orient: horizontal;
- text-align: right;
-}
-.dj_ie7 .claro .dijitTabRtl .dijitTabContent {
- display: block;
- left: 0;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl, .dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
- top: 1px;
-}
-.dj_ie7 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie6 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie6 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv {
- float: left;
-}
-.dj_ie6 .claro .dijitTabRtl .tabLabel,
-.dj_ie6 .claro .dijitTabContainerRight-tabs .dijitTabRtl,
-.dj_ie6 .claro .dijitTabContainerLeft-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerLeft-tabs .dijitTabRtl .dijitTabInnerDiv {
- /*Make the .tablabel have width in ie6 with haslayout property, fix Close icon position bug*/
-
- zoom: 1;
-}
-.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton, .dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton, .dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
- margin-right: 5px;
-}
-.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs, .dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
- width: 1%;
-}
-.dj_ie6 .dijitTabContainerTopStrip, .dj_ie6 .dijitTabContainerBottomStrip {
- position: absolute;
-}
-.dj_iequirks .claro .dijitTabContainerTopRtl .dijitTabContainerTopStrip {
- padding-top: 10px;
-}
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtlChecked .dijitTabInnerDiv {
- background-position: -341px -179px;
-}
-.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon, .dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
- position: relative;
-}
-.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
- /* this strange rule prevents IE6 bug in themeTester.html?dir=rtl upon closing
- * "Closable" tab, where the other tabs disappear
- */
-
- padding-left: 3px;
-}
-.dj_iequirks-rtl .claro .dijitTabListWrapper {
- /* this strange rule prevents IE6 bug in themeTesterQuirk.html?dir=rtl upon closing
- * "Closable" tab, where the other tabs disappear
- */
-
- border-left: 1px solid #ffffff;
- border-right: 1px solid #ffffff;
-}
diff --git a/lib/dijit/themes/claro/layout/TabContainer_rtl.less b/lib/dijit/themes/claro/layout/TabContainer_rtl.less
index eaada0d0a..c6cec49fd 100644
--- a/lib/dijit/themes/claro/layout/TabContainer_rtl.less
+++ b/lib/dijit/themes/claro/layout/TabContainer_rtl.less
@@ -5,77 +5,3 @@
margin-right: 0;
margin-left: 1px;
}
-.claro .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
-}
-.dj_ie7 .claro .dijitTabRtl .dijitTabContent {
- display: block;
- left: 0;
-}
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabCheckedRtl {
- top: 1px;
-}
-
-// Note that .tabStripButtonRtl .dijitButtonContents needed for IE8 quirks but breaks IE6 quirks
-.dj_ie7 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie8 .claro .tabStripButtonRtl .dijitButtonContents,
-.dj_ie6 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie6 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerTop-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_iequirks .claro .dijitTabContainerBottom-tabs .dijitTabRtl .dijitTabInnerDiv {
- float:left;
-}
-.dj_ie6 .claro .dijitTabRtl .tabLabel,
-.dj_ie6 .claro .dijitTabContainerRight-tabs .dijitTabRtl,
-.dj_ie6 .claro .dijitTabContainerLeft-tabs .dijitTabRtl,
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtl .dijitTabInnerDiv,
-.dj_ie7 .claro .dijitTabContainerLeft-tabs .dijitTabRtl .dijitTabInnerDiv {
- /*Make the .tablabel have width in ie6 with haslayout property, fix Close icon position bug*/
- zoom:1;
-}
-.dj_ie6 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_ie7 .claro .dijitTabRtl .dijitTabCloseButton,
-.dj_iequirks .claro .dijitTabRtl .dijitTabCloseButton {
- margin-right:5px;
-}
-
-.dj_ie6 .claro .dijitTabContainerRightRtl .dijitTabContainerRight-tabs,
-.dj_ie6 .claro .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
- width:1%;
-}
-
-.dj_ie6 .dijitTabContainerTopStrip,
-.dj_ie6 .dijitTabContainerBottomStrip {
- position:absolute;
-}
-.dj_iequirks .claro .dijitTabContainerTopRtl .dijitTabContainerTopStrip {
- padding-top: 10px;
-}
-.dj_ie7 .claro .dijitTabContainerRight-tabs .dijitTabRtlChecked .dijitTabInnerDiv {
- background-position:-341px -179px;
-}
-
-.dj_ie6 .dijitTabContainerTopRtl .dijitTabStripIcon,
-.dj_ie6 .dijitTabContainerBottomRtl .dijitTabStripIcon {
- position: relative;
-}
-
-
-.dj_ie6-rtl .claro .dijitTabContainerTop-tabs {
- /* this strange rule prevents IE6 bug in themeTester.html?dir=rtl upon closing
- * "Closable" tab, where the other tabs disappear
- */
- padding-left: 3px;
-}
-
-.dj_iequirks-rtl .claro .dijitTabListWrapper {
- /* this strange rule prevents IE6 bug in themeTesterQuirk.html?dir=rtl upon closing
- * "Closable" tab, where the other tabs disappear
- */
- border-left: 1px solid @pane-background-color;
- border-right: 1px solid @pane-background-color;
-}
diff --git a/lib/dijit/themes/claro/layout/images/accordion.png b/lib/dijit/themes/claro/layout/images/accordion.png
deleted file mode 100644
index 48181035a..000000000
--- a/lib/dijit/themes/claro/layout/images/accordion.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/splitterHorizontalHover.png b/lib/dijit/themes/claro/layout/images/splitterHorizontalHover.png
deleted file mode 100644
index 0f5b691f6..000000000
--- a/lib/dijit/themes/claro/layout/images/splitterHorizontalHover.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/splitterVerticalHover.png b/lib/dijit/themes/claro/layout/images/splitterVerticalHover.png
deleted file mode 100644
index 2c3c6960e..000000000
--- a/lib/dijit/themes/claro/layout/images/splitterVerticalHover.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabBottom.png b/lib/dijit/themes/claro/layout/images/tabBottom.png
deleted file mode 100644
index dbcfc851b..000000000
--- a/lib/dijit/themes/claro/layout/images/tabBottom.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabBottomSelected.png b/lib/dijit/themes/claro/layout/images/tabBottomSelected.png
new file mode 100644
index 000000000..f92b05f45
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabBottomSelected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabBottomSelected.svg b/lib/dijit/themes/claro/layout/images/tabBottomSelected.svg
new file mode 100644
index 000000000..4e6ff6d43
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabBottomSelected.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabBottomSelected.png, which is used by IE7-9 for selected tabs.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from .topBottom-selected-tab-gradient() from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="250px" viewBox="0 0 1 250" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="1" height="242" fill="white"/>
+ <rect x="0" y="242" width="1" height="6" fill="url(#gradient)"/>
+ <rect x="0" y="248" width="1" height="2" fill="white"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabBottomUnselected.png b/lib/dijit/themes/claro/layout/images/tabBottomUnselected.png
new file mode 100644
index 000000000..7815d9cfb
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabBottomUnselected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabBottomUnselected.svg b/lib/dijit/themes/claro/layout/images/tabBottomUnselected.svg
new file mode 100644
index 000000000..4193238e8
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabBottomUnselected.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabBottomUnselected.png, which is used by IE7-9 for the selected tabs.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="16px" viewBox="0 0 1 16" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="100%" x2="0%" y2="0%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="6%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="13%" stop-color="#ffffff" stop-opacity="0.2"/>
+ <stop offset="43%" stop-color="#ffffff" stop-opacity="0.6"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="1" height="16" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabLeft.png b/lib/dijit/themes/claro/layout/images/tabLeft.png
deleted file mode 100644
index 8e9fcba27..000000000
--- a/lib/dijit/themes/claro/layout/images/tabLeft.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabLeftSelected.png b/lib/dijit/themes/claro/layout/images/tabLeftSelected.png
new file mode 100644
index 000000000..9700afb37
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabLeftSelected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabLeftSelected.svg b/lib/dijit/themes/claro/layout/images/tabLeftSelected.svg
new file mode 100644
index 000000000..12e7d8a64
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabLeftSelected.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabLeftSelected.png, which is used by IE7-9 for selected tabs.
+ Compile to png with batik, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1000px" height="1px" viewBox="0 0 1000 1" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="100%" y2="0%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.5"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="1"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="30" height="1" fill="url(#gradient)"/>
+ <rect x="30" y="0" width="970" height="1" fill="white"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabLeftUnselected.png b/lib/dijit/themes/claro/layout/images/tabLeftUnselected.png
new file mode 100644
index 000000000..412390e08
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabLeftUnselected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabLeftUnselected.svg b/lib/dijit/themes/claro/layout/images/tabLeftUnselected.svg
new file mode 100644
index 000000000..e31c211b7
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabLeftUnselected.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabLeftUnselected.png, which is used by IE7-9 for the selected tabs.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="150px" height="1px" viewBox="0 0 100 1" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="100%" y2="0%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.5"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="150" height="1" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabRight.png b/lib/dijit/themes/claro/layout/images/tabRight.png
deleted file mode 100644
index 0aaae53a1..000000000
--- a/lib/dijit/themes/claro/layout/images/tabRight.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabRightSelected.png b/lib/dijit/themes/claro/layout/images/tabRightSelected.png
new file mode 100644
index 000000000..1a2843499
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabRightSelected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabRightSelected.svg b/lib/dijit/themes/claro/layout/images/tabRightSelected.svg
new file mode 100644
index 000000000..d8d3d674a
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabRightSelected.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabRightSelected.png, which is used by IE7-9 for selected tabs.
+ Compile to png with batik, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1000px" height="1px" viewBox="0 0 1000 1" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="100%" y1="0%" x2="0%" y2="0%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.5"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="1"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="970" height="1" fill="white"/>
+ <rect x="970" y="0" width="30" height="1" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabRightUnselected.png b/lib/dijit/themes/claro/layout/images/tabRightUnselected.png
new file mode 100644
index 000000000..2bdd00e4d
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabRightUnselected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabRightUnselected.svg b/lib/dijit/themes/claro/layout/images/tabRightUnselected.svg
new file mode 100644
index 000000000..d1379a717
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabRightUnselected.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabRightUnselected.png, which is used by IE7-9 for the selected tabs.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="150px" height="1px" viewBox="0 0 100 1" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="100%" y1="0%" x2="0%" y2="0%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0.5"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="150" height="1" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabTop.png b/lib/dijit/themes/claro/layout/images/tabTop.png
deleted file mode 100644
index 2822487ed..000000000
--- a/lib/dijit/themes/claro/layout/images/tabTop.png
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabTopSelected.png b/lib/dijit/themes/claro/layout/images/tabTopSelected.png
new file mode 100644
index 000000000..f4d577258
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabTopSelected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabTopSelected.svg b/lib/dijit/themes/claro/layout/images/tabTopSelected.svg
new file mode 100644
index 000000000..d06e646ea
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabTopSelected.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabTopSelected.png, which is used by IE7-9 for the selected tabs.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from .topBottom-selected-tab-gradient() from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="250px" viewBox="0 0 1 250" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="0"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="1"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="1" height="2" fill="white"/>
+ <rect x="0" y="2" width="1" height="6" fill="url(#gradient)"/>
+ <rect x="0" y="8" width="1" height="242" fill="white"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/layout/images/tabTopUnselected.png b/lib/dijit/themes/claro/layout/images/tabTopUnselected.png
new file mode 100644
index 000000000..8c34545f5
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabTopUnselected.png
Binary files differ
diff --git a/lib/dijit/themes/claro/layout/images/tabTopUnselected.svg b/lib/dijit/themes/claro/layout/images/tabTopUnselected.svg
new file mode 100644
index 000000000..c55e92532
--- /dev/null
+++ b/lib/dijit/themes/claro/layout/images/tabTopUnselected.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<!--
+ Source file for tabTopUnSelected.png, which is used by IE7-9 for the selected tabs.
+ Compile to png with batik, gimp, or online tool ex: http://www.fileformat.info/convert/image/svg2raster.htm
+
+ Output should match CSS gradient from TabContainer.less.
+-->
+<svg xmlns="http://www.w3.org/2000/svg" width="1px" height="16px" viewBox="0 0 1 16" preserveAspectRatio="none">
+ <defs>
+ <linearGradient id="gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="0%" y2="100%">
+ <stop offset="0%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="6%" stop-color="#ffffff" stop-opacity="1"/>
+ <stop offset="13%" stop-color="#ffffff" stop-opacity="0.2"/>
+ <stop offset="43%" stop-color="#ffffff" stop-opacity="0.6"/>
+ <stop offset="100%" stop-color="#ffffff" stop-opacity="0"/>
+ </linearGradient>
+ </defs>
+ <rect x="0" y="0" width="1" height="16" fill="url(#gradient)"/>
+</svg> \ No newline at end of file
diff --git a/lib/dijit/themes/claro/variables.less b/lib/dijit/themes/claro/variables.less
index ca7d6773c..ac21a5ff7 100644
--- a/lib/dijit/themes/claro/variables.less
+++ b/lib/dijit/themes/claro/variables.less
@@ -6,7 +6,7 @@
@disabled-color: #d3d3d3; // Base for disabled backgrounds and borders
@error-color: #d46464;
-@container-background-color:#fff; // Backgrounds for various content areas such as TitlePane, ContentPane and Inputs
+@container-background-color:#fff; // Backgrounds for various content areas such as TitlePane, ContentPane and Inputs (if changed, adjust selected tab to match)
@minor-selected-color: spin(saturate(darken(@primary-color, 6), 19), 0); // Color for various arrows and buttons
@base-border-color: spin(desaturate(darken(@primary-color, 29), 44), -1); // Augmented and used directly by variables to create border colors for various widgets
@@ -136,6 +136,9 @@
@dialog-titlebar-border-color: @container-background-color; // Inner border around the title sectionof a Dialog, inside the main border of the Dialog and the border between title and content
@dialog-titlebar-background-color: @minor-selected-color;
+// Tooltip
+@tooltip-gradient-color: fade(@primary-color,10%); // a little swath of color at the bottom of tooltips
+
// BorderContainer
@splitter-hovered-background-color: @primary-color; // Color of splitter when user hovers it, before mouse down
@splitter-dragged-background-color: @minor-selected-color; // Color of splitter while it's being dragged
@@ -156,49 +159,29 @@
@document-shadedsection-background-color: @bar-background-color;// background color used for <pre>, <code>, and table header rows
@document-border-color: @disabled-color; // Border for <pre>, <code>, tables, etc.
-// Images
+// Icons, arrows, etc.
@image-arrow-sprite: "images/spriteArrows.png";
-@image-calendar-container: "images/calendarContainerImages.png";
@image-calendar-arrows: "images/calendarArrows.png";
@image-calendar-arrows-ie6: "images/calendarArrows8bit.png";
@image-checkmark: "images/checkmarkNoBorder.png";
@image-checkmark-ie6: "images/checkmarkNoBorder.gif";
-@image-common-highlight: "images/commonHighlight.png";
@image-dialog-close: "images/dialogCloseIcon.png";
@image-dialog-close-ie6: "images/dialogCloseIcon8bit.png";
@image-dnd: "images/dnd.png";
@image-editor-icons-enabled: "../../icons/images/editorIconsEnabled.png";
-@image-form-button: "form/images/button.png";
@image-form-button-arrows: "form/images/buttonArrows.png";
@image-form-checkbox-and-radios: "form/images/checkboxRadioButtonStates.png";
@image-form-checkbox-and-radios-ie6: "form/images/checkboxAndRadioButtons_IE6.png";
@image-form-common-arrows: "form/images/commonFormArrows.png";
@image-form-error: "form/images/error.png";
-@image-form-highlight: "form/images/formHighlight.png";
-@image-form-slider-horizontal: "form/images/sliderHorizontal.png";
@image-form-slider-thumbs: "form/images/sliderThumbs.png";
-@image-form-slider-vertical: "form/images/sliderVertical.png";
-@image-form-textbox-background: "form/images/textBox_back.png";
-@image-layout-accordion: "layout/images/accordion.png";
-@image-layout-splitter-horizontal-hover: "layout/images/splitterHorizontalHover.png";
-@image-layout-splitter-vertical-hover: "layout/images/splitterVerticalHover.png";
-@image-layout-tab-bottom: "layout/images/tabBottom.png";
-@image-layout-tab-close: "layout/images/tabClose.png";
-@image-layout-tab-left: "layout/images/tabLeft.png";
-@image-layout-tab-nested: "layout/images/tabNested.png";
-@image-layout-tab-right: "layout/images/tabRight.png";
-@image-layout-tab-top: "layout/images/tabTop.png";
+@image-layout-tab-close: "layout/images/tabClose.png"; // [x] icon to close a tab
@image-loading-animation: "images/loadingAnimation.gif";
-@image-menu-highlight: "images/menuHighlight.png";
-@image-progressbar-empty: "images/progressBarEmpty.png";
-@image-progressbar-full: "images/progressBarFull.png";
-@image-progressbar-anim: "images/progressBarAnim.gif";
-@image-titlebar: "images/titlebar.png";
-@image-tooltip: "images/tooltip.png";
-@image-tooltip-ie6: "images/tooltip8bit.png";
-@image-tooltip-gradient: "images/tooltipGradient.png";
+@image-tooltip: "images/tooltip.png"; // arrow connectors
+@image-tooltip-ie6: "images/tooltip8bit.png"; // arrow connectors (8 bit)
@image-tree-expand: "images/treeExpandImages.png";
@image-tree-expand-ie6: "images/treeExpandImages8bit.png";
+@image-progressbar-anim: "images/progressBarAnim.gif";
// Mixins
@@ -242,3 +225,154 @@
-moz-transition-timing-function: @value;
transition-timing-function: @value;
}
+
+.linear-gradient (@value1, @value2) {
+ // summary:
+ // Expands to browser specific background-image specifications for a linear-gradient (2 stops)
+ background-image: -moz-linear-gradient(@value1, @value2); // FF3.6 - FF15 (FF16+ supports linear-gradient)
+ background-image: -webkit-linear-gradient(@value1, @value2); // Chrome10+, Safari5.1+
+ background-image: -o-linear-gradient(@value1, @value2); // Opera 11.10+
+ background-image: linear-gradient(@value1, @value2);
+}
+.linear-gradient (@value1, @value2, @value3) {
+ background-image: -moz-linear-gradient(@value1, @value2, @value3); // FF3.6 - FF15 (FF16+ supports linear-gradient)
+ background-image: -webkit-linear-gradient(@value1, @value2, @value3); // Chrome10+, Safari5.1+
+ background-image: -o-linear-gradient(@value1, @value2, @value3); // Opera 11.10+
+ background-image: linear-gradient(@value1, @value2, @value3);
+}
+.linear-gradient (@value1, @value2, @value3, @value4) {
+ background-image: -moz-linear-gradient(@value1, @value2, @value3, @value4); // FF3.6 - FF15 (FF16+ supports linear-gradient)
+ background-image: -webkit-linear-gradient(@value1, @value2, @value3, @value4); // Chrome10+, Safari5.1+
+ background-image: -o-linear-gradient(@value1, @value2, @value3, @value4); // Opera 11.10+
+ background-image: linear-gradient(@value1, @value2, @value3, @value4);
+}
+.linear-gradient (@value1, @value2, @value3, @value4, @value5) {
+ background-image: -moz-linear-gradient(@value1, @value2, @value3, @value4, @value5); // FF3.6 - FF15 (FF16+ supports linear-gradient)
+ background-image: -webkit-linear-gradient(@value1, @value2, @value3, @value4, @value5); // Chrome10+, Safari5.1+
+ background-image: -o-linear-gradient(@value1, @value2, @value3, @value4, @value5); // Opera 11.10+
+ background-image: linear-gradient(@value1, @value2, @value3, @value4, @value5);
+}
+.linear-gradient (@value1, @value2, @value3, @value4, @value5, @value6) {
+ background-image: -moz-linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6); // FF3.6 - FF15 (FF16+ supports linear-gradient)
+ background-image: -webkit-linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6); // Chrome10+, Safari5.1+
+ background-image: -o-linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6); // Opera 11.10+
+ background-image: linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6);
+}
+.linear-gradient (@value1, @value2, @value3, @value4, @value5, @value6, @value7) {
+ background-image: -moz-linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6, @value7); // FF3.6 - FF15 (FF16+ supports linear-gradient)
+ background-image: -webkit-linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6, @value7); // Chrome10+, Safari5.1+
+ background-image: -o-linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6, @value7); // Opera 11.10+
+ background-image: linear-gradient(@value1, @value2, @value3, @value4, @value5, @value6, @value7);
+}
+
+.alpha-white-gradient (@opacity1, @stop1, @opacity2, @stop2) {
+ // summary:
+ // For setting up white background-image with variable transparency.
+ // example:
+ // Gradient starts at top (0%) with 30% opacity, and then ends at bottom (100%) with full transparency
+ // | .alpha-white-gradient(0.3, 0%, 0, 100%)
+ //
+ .linear-gradient(rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2);
+}
+.alpha-white-gradient (@start, @opacity1, @stop1, @opacity2, @stop2) {
+ .linear-gradient(@start, rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2);
+}
+.alpha-white-gradient (@opacity1, @stop1, @opacity2, @stop2, @opacity3, @stop3) {
+ .linear-gradient(rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2, rgba(255,255,255, @opacity3) @stop3);
+}
+.alpha-white-gradient (@start, @opacity1, @stop1, @opacity2, @stop2, @opacity3, @stop3) {
+ .linear-gradient(@start, rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2, rgba(255,255,255, @opacity3) @stop3);
+}
+.alpha-white-gradient (@opacity1, @stop1, @opacity2, @stop2, @opacity3, @stop3, @opacity4, @stop4) {
+ .linear-gradient(rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2, rgba(255,255,255, @opacity3) @stop3, rgba(255,255,255, @opacity4) @stop4);
+}
+.alpha-white-gradient (@start, @opacity1, @stop1, @opacity2, @stop2, @opacity3, @stop3, @opacity4, @stop4) {
+ .linear-gradient(@start, rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2, rgba(255,255,255, @opacity3) @stop3, rgba(255,255,255, @opacity4) @stop4);
+}
+.alpha-white-gradient (@start, @opacity1, @stop1, @opacity2, @stop2, @opacity3, @stop3, @opacity4, @stop4, @opacity5, @stop5) {
+ .linear-gradient(@start, rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2, rgba(255,255,255, @opacity3) @stop3, rgba(255,255,255, @opacity4) @stop4, rgba(255,255,255, @opacity5) @stop5);
+}
+.alpha-white-gradient (@start, @opacity1, @stop1, @opacity2, @stop2, @opacity3, @stop3, @opacity4, @stop4, @opacity5, @stop5, @opacity6, @stop6) {
+ .linear-gradient(@start, rgba(255,255,255,@opacity1) @stop1, rgba(255,255,255,@opacity2) @stop2, rgba(255,255,255, @opacity3) @stop3, rgba(255,255,255, @opacity4) @stop4, rgba(255,255,255, @opacity5) @stop5, rgba(255,255,255, @opacity6) @stop6);
+}
+
+.gradient-and-filter (@color, @fade1, @fade2) {
+ // summary:
+ // Sets up a background color with a vertical gradient.
+ // In order to make transitions work properly on mozilla and webkit, this is done by combining
+ // a background-color which will be changed based on state (ex: hover) with a constant
+ // white alpha-transparency background-image. On IE it creates a DXImageTransform filter.
+ // @color:
+ // The color
+ // @fade1:
+ // The percent to fade at the top
+ // @fade2:
+ // The percent to fade at the bottom
+ background-color: @color; // the base color
+ .linear-gradient(fadeout(#fff, 100-@fade1), fadeout(#fff, 100-@fade2));
+ filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr="lighten(@color, @fade1)~", endColorstr="lighten(@color, @fade2)~")"; // IE
+}
+.horizontal-gradient-and-filter (@color, @fade1, @fade2) {
+ // summary:
+ // Sets up a background color with a horizontal gradient.
+ // In order to make transitions work properly on mozilla and webkit, this is done by combining
+ // a background-color which will be changed based on state (ex: hover) with a constant
+ // white alpha-transparency background-image. On IE it creates a DXImageTransform filter.
+ // @color:
+ // The color
+ // @fade1:
+ // The percent to fade at the top
+ // @fade2:
+ // The percent to fade at the bottom
+ background-color: @color; // the base color
+ .linear-gradient(left, fadeout(#fff, 100-@fade1), fadeout(#fff, 100-@fade2));
+ filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr="lighten(@color, @fade1)~", endColorstr="lighten(@color, @fade2)~"gradientType=1)"; // IE
+}
+
+
+// Mixins defining gradients
+
+.textbox-background-image () {
+ // summary:
+ // Background image used for hovered TextBoxes and similar controls.
+ // It's just a small inset shadow below the top border (inside of the TextBox).
+ .linear-gradient(rgba(127,127,127,0.2) 0%, rgba(127,127,127,0) 2px);
+}
+
+.standard-gradient (@pathToRoot: "") {
+ // summary:
+ // Light to dark background-image used by widgets with short height (~16px) including:
+ // - MenuBar, and hovered MenuItem/MenuBarItem
+ // - arrow icon wrapper for Select, ComboBox, Spinner
+ // - Toolbar and hovered Toolbar buttons
+ // - TitlePane title bar, AccordionContainer title bar, Dialog title bar
+
+ // Fallback for IE
+ background-image: url("@{pathToRoot}images/standardGradient.png");
+ background-repeat: repeat-x;
+
+ // CSS gradient for other browsers
+ .alpha-white-gradient(0.7, 0%, 0, 100%);
+
+ // IE6 can't handle a background-image with transparency and a background-color; the color is blocked out
+ _background-image: none;
+}
+.active-gradient (@pathToRoot: "") {
+ // summary:
+ // Light to dark background-image with an inset gray shadow at the top,
+ // used by widgets when they are active (ie: mousedown) or selected, including:
+ // - active MenuItem/MenuBarItem
+ // - arrow icon wrapper for Select, ComboBox, Spinner when active or drop down is open
+ // - active Toolbar buttons
+ // - active TitlePane title bar, AccordionContainer title bar
+
+ // Fallback for IE
+ background-image: url("@{pathToRoot}images/activeGradient.png");
+ background-repeat: repeat-x;
+
+ // CSS gradient for other browsers
+ .linear-gradient(rgba(190,190,190,0.98) 0px, rgba(255, 255, 255, 0.65) 3px, rgba(255, 255, 255, 0) 100%);
+
+ // IE6 can't handle a background-image with transparency and a background-color; the color is blocked out
+ _background-image: none;
+}
diff --git a/lib/dijit/themes/dijit.css b/lib/dijit/themes/dijit.css
index 4c60bf371..dbf900663 100644
--- a/lib/dijit/themes/dijit.css
+++ b/lib/dijit/themes/dijit.css
@@ -17,11 +17,11 @@
margin:0;
border:0;
padding:0;
- line-height:normal;
font: inherit;
+ line-height:normal;
color: inherit;
}
-.dijit_a11y .dijitReset {
+.dj_a11y .dijitReset {
-moz-appearance: none; /* remove predefined high-contrast styling in Firefox */
}
@@ -56,32 +56,45 @@ table.dijitInline {
position: relative; /* to support setting width/height, see #2033 */
}
+.dj_ie6 .dijitComboBox .dijitInputContainer,
.dijitInputContainer {
/* for positioning of placeHolder */
#zoom: 1;
overflow: hidden;
- float: none !important; /* needed by FF to squeeze the INPUT in */
+ float: none !important; /* needed to squeeze the INPUT in */
position: relative;
- vertical-align: middle;
- #display: inline;
+}
+.dj_ie7 .dijitInputContainer {
+ float: left !important; /* needed by IE to squeeze the INPUT in */
+ clear: left;
+ display: inline-block !important; /* to fix wrong text alignment in rtl text box */
}
+.dj_ie .dijitSelect input,
.dj_ie input.dijitTextBox,
.dj_ie .dijitTextBox input {
font-size: 100%;
}
+.dijitSelect .dijitButtonText {
+ float: left;
+ vertical-align: top;
+}
+TABLE.dijitSelect {
+ padding: 0 !important; /* messes up border alignment */
+}
.dijitTextBox .dijitSpinnerButtonContainer,
.dijitTextBox .dijitArrowButtonContainer,
-.dijitTextBox .dijitValidationContainer {
+.dijitValidationTextBox .dijitValidationContainer {
float: right;
text-align: center;
}
+.dijitSelect input.dijitInputField,
.dijitTextBox input.dijitInputField {
/* override unreasonable user styling of buttons and icons */
padding-left: 0 !important;
padding-right: 0 !important;
}
-.dijitTextBox .dijitValidationContainer {
+.dijitValidationTextBox .dijitValidationContainer {
display: none;
}
@@ -90,10 +103,10 @@ table.dijitInline {
line-height:1px;
}
-.dijitOffScreen {
- position: absolute;
- left: 50%;
- top: -10000px;
+.dijitOffScreen { /* these class attributes should supercede any inline positioning style */
+ position: absolute !important;
+ left: 50% !important;
+ top: -10000px !important;
}
/*
@@ -152,12 +165,12 @@ table.dijitInline {
/****
A11Y
****/
-.dijit_a11y .dijitIcon,
-.dijit_a11y div.dijitArrowButtonInner, /* is this only for Spinner? if so, it should be deleted */
-.dijit_a11y span.dijitArrowButtonInner,
-.dijit_a11y img.dijitArrowButtonInner,
-.dijit_a11y .dijitCalendarIncrementControl,
-.dijit_a11y .dijitTreeExpando {
+.dj_a11y .dijitIcon,
+.dj_a11y div.dijitArrowButtonInner, /* is this only for Spinner? if so, it should be deleted */
+.dj_a11y span.dijitArrowButtonInner,
+.dj_a11y img.dijitArrowButtonInner,
+.dj_a11y .dijitCalendarIncrementControl,
+.dj_a11y .dijitTreeExpando {
/* hide icon nodes in high contrast mode; when necessary they will be replaced by character equivalents
* exception for input.dijitArrowButtonInner, because the icon and character are controlled by the same node */
display: none;
@@ -166,7 +179,7 @@ table.dijitInline {
display: block; /* override previous rule */
}
-.dijit_a11y .dijitA11ySideArrow {
+.dj_a11y .dijitA11ySideArrow {
display: inline !important; /* display text instead */
cursor: pointer;
}
@@ -177,20 +190,20 @@ table.dijitInline {
* Avoid screen jitter when switching selected date by compensating for the selected node's
* border w/padding on other nodes.
*/
-.dijit_a11y .dijitCalendarDateLabel {
+.dj_a11y .dijitCalendarDateLabel {
padding: 1px;
border: 0px !important;
}
-.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
+.dj_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
border-style: solid !important;
border-width: 1px !important;
padding: 0;
}
-.dijit_a11y .dijitCalendarDateTemplate {
+.dj_a11y .dijitCalendarDateTemplate {
padding-bottom: 0.1em !important; /* otherwise bottom border doesn't appear on IE */
border: 0px !important;
}
-.dijit_a11y .dijitButtonNode {
+.dj_a11y .dijitButtonNode {
border: black outset medium !important;
/* In claro, hovering a toolbar button reduces padding and adds a border.
@@ -198,13 +211,16 @@ table.dijitInline {
*/
padding: 0 !important;
}
+.dj_a11y .dijitArrowButton {
+ padding: 0 !important;
+}
-.dijit_a11y .dijitButtonContents{
+.dj_a11y .dijitButtonContents {
margin: 0.15em; /* Margin needed to make focus outline visible */
}
-.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
-.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
+.dj_a11y .dijitTextBoxReadOnly .dijitInputField,
+.dj_a11y .dijitTextBoxReadOnly .dijitButtonNode {
border-style: outset!important;
border-width: medium!important;
border-color: #999 !important;
@@ -215,6 +231,7 @@ table.dijitInline {
.dijitButtonNode * {
vertical-align: middle;
}
+.dijitSelect .dijitArrowButtonInner,
.dijitButtonNode .dijitArrowButtonInner {
/* the arrow icon node */
background: no-repeat center;
@@ -248,7 +265,7 @@ table.dijitInline {
}
/* Buttons */
-.dj_gecko .dijit_a11y .dijitButtonDisabled .dijitButtonNode {
+.dj_gecko .dj_a11y .dijitButtonDisabled .dijitButtonNode {
opacity: 0.5;
}
@@ -299,6 +316,9 @@ td.dijitButtonContents {
padding:0;
}
+.dijitSelect {
+ border:1px solid gray;
+}
.dijitButtonNode {
/* Node that is acting as a button -- may or may not be a BUTTON element */
border:1px solid gray;
@@ -318,6 +338,8 @@ td.dijitButtonContents {
border-width: 0;
}
+.dijitSelect,
+.dijitSelect *,
.dijitButtonNode,
.dijitButtonNode * {
cursor: pointer;
@@ -356,11 +378,11 @@ div.dijitArrowButton {
.dijitTextBoxDisabled {
color: gray;
}
-.dj_webkit .dijitTextBoxDisabled input {
- color: #eee; /* because WebKit lightens disabled input/textarea no matter what color you specify */
+.dj_safari .dijitTextBoxDisabled input {
+ color: #B0B0B0; /* because Safari lightens disabled input/textarea no matter what color you specify */
}
-.dj_webkit textarea.dijitTextAreaDisabled {
- color: #333; /* because WebKit lightens disabled input/textarea no matter what color you specify */
+.dj_safari textarea.dijitTextAreaDisabled {
+ color: #333; /* because Safari lightens disabled input/textarea no matter what color you specify */
}
.dj_gecko .dijitTextBoxReadOnly input.dijitInputField, /* disable arrow and validation presentation inputs but allow real input for text selection */
.dj_gecko .dijitTextBoxDisabled input {
@@ -389,13 +411,17 @@ div.dijitArrowButton {
outline: 5px -webkit-focus-ring-color;
}
+.dijitSelect input,
.dijitTextBox input {
float: left; /* needed by IE to remove secret margin */
}
+.dj_ie6 input.dijitTextBox,
+.dj_ie6 .dijitTextBox input {
+ float: none;
+}
.dijitInputInner {
/* for when an <input> is embedded inside an inline-block <div> with a size and border */
border:0 !important;
- vertical-align:middle !important;
background-color:transparent !important;
width:100% !important;
/* IE dislikes horizontal tweaking combined with width:100% so punish everyone for consistency */
@@ -404,15 +430,16 @@ div.dijitArrowButton {
margin-left: 0 !important;
margin-right: 0 !important;
}
-.dijit_a11y .dijitTextBox input {
+.dj_a11y .dijitTextBox input {
margin: 0 !important;
}
-.dijitTextBoxError input.dijitValidationInner,
+.dijitValidationTextBoxError input.dijitValidationInner,
+.dijitSelect input,
.dijitTextBox input.dijitArrowButtonInner {
/* <input> used to display arrow icon/validation icon, or in arrow character in high contrast mode.
* The css below is a trick to hide the character in non-high-contrast mode
*/
- text-indent: -1em !important;
+ text-indent: -2em !important;
direction: ltr !important;
text-align: left !important;
height: auto !important;
@@ -420,15 +447,26 @@ div.dijitArrowButton {
#letter-spacing: -5em !important;
#text-align: right !important;
}
+.dj_ie .dijitSelect input,
.dj_ie .dijitTextBox input,
.dj_ie input.dijitTextBox {
overflow-y: visible; /* inputs need help expanding when padding is added or line-height is adjusted */
line-height: normal; /* strict mode */
}
-.dj_ie7 .dijitTextBox input.dijitValidationInner,
-.dj_ie7 .dijitTextBox input.dijitArrowButtonInner {
- line-height: 86%; /* IE7 problem where the icon is vertically too low w/o this - real input stays at normal */
+.dijitSelect .dijitSelectLabel span {
+ line-height: 100%;
+}
+.dj_ie .dijitSelect .dijitSelectLabel {
+ line-height: normal;
}
+.dj_ie6 .dijitSelect .dijitSelectLabel,
+.dj_ie7 .dijitSelect .dijitSelectLabel,
+.dj_ie8 .dijitSelect .dijitSelectLabel,
+.dj_iequirks .dijitSelect .dijitSelectLabel,
+.dijitSelect td,
+.dj_ie6 .dijitSelect input,
+.dj_iequirks .dijitSelect input,
+.dj_ie6 .dijitSelect .dijitValidationContainer,
.dj_ie6 .dijitTextBox input,
.dj_ie6 input.dijitTextBox,
.dj_iequirks .dijitTextBox input.dijitValidationInner,
@@ -438,14 +476,15 @@ div.dijitArrowButton {
.dj_iequirks input.dijitTextBox {
line-height: 100%; /* IE7 problem where the icon is vertically way too low w/o this */
}
-.dijit_a11y input.dijitValidationInner,
-.dijit_a11y input.dijitArrowButtonInner {
+.dj_a11y input.dijitValidationInner,
+.dj_a11y input.dijitArrowButtonInner {
/* (in high contrast mode) revert rules from above so character displays */
text-indent: 0 !important;
width: 1em !important;
#text-align: left !important;
+ color: black !important;
}
-.dijitTextBoxError .dijitValidationContainer {
+.dijitValidationTextBoxError .dijitValidationContainer {
display: inline;
cursor: default;
}
@@ -457,6 +496,7 @@ div.dijitArrowButton {
/* dividing line between input area and up/down button(s) for ComboBox and Spinner */
border-width: 0 0 0 1px !important; /* !important needed due to wayward ".theme .dijitButtonNode" rules */
}
+.dj_a11y .dijitSelect .dijitArrowButtonContainer,
.dijitToolbar .dijitComboBox .dijitArrowButtonContainer {
/* overrides above rule plus mirror-image rule in dijit_rtl.css to have no divider when ComboBox in Toolbar */
border-width: 0 !important;
@@ -470,7 +510,7 @@ div.dijitArrowButton {
/* dividing line between input area and up/down button(s) for ComboBox and Spinner */
border-width: 0;
}
-.dj_ie .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
+.dj_ie .dj_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitButtonNode {
clear: both; /* IE workaround */
}
@@ -495,35 +535,36 @@ div.dijitArrowButton {
.dijitSpinnerButtonContainer .dijitButtonNode {
border-width: 0;
}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border: 0 none !important;
+.dj_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
+ border-width: 0px !important;
+ border-style: solid !important;
}
-.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner,
-.dijit_a11y .dijitSpinnerButtonContainer input {
+.dj_a11y .dijitTextBox .dijitSpinnerButtonContainer,
+.dj_a11y .dijitSpinner .dijitArrowButtonInner,
+.dj_a11y .dijitSpinnerButtonContainer input {
width: 1em !important;
}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
+.dj_a11y .dijitSpinner .dijitArrowButtonInner {
margin: 0 auto !important; /* should auto-center */
}
-.dj_ie .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
+.dj_ie .dj_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
padding-left: 0.3em !important;
padding-right: 0.3em !important;
margin-left: 0.3em !important;
margin-right: 0.3em !important;
width: 1.4em !important;
}
-.dj_ie7 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
+.dj_ie7 .dj_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
padding-left: 0 !important; /* manually center INPUT: character is .5em and total width = 1em */
padding-right: 0 !important;
width: 1em !important;
}
-.dj_ie6 .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
+.dj_ie6 .dj_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
margin-left: 0.1em !important;
margin-right: 0.1em !important;
width: 1em !important;
}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
+.dj_iequirks .dj_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
margin-left: 0 !important;
margin-right: 0 !important;
width: 2em !important;
@@ -545,7 +586,7 @@ div.dijitArrowButton {
.dj_iequirks .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
width: auto;
}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitArrowButton {
+.dj_a11y .dijitSpinnerButtonContainer .dijitArrowButton {
overflow: visible !important;
}
.dijitSpinner .dijitSpinnerButtonContainer .dijitDownArrowButton {
@@ -578,6 +619,7 @@ div.dijitArrowButton {
padding-left: 0 !important;
padding-right: 0 !important;
width: 100%;
+ visibility: hidden;
}
.dj_ie .dijitSpinner .dijitArrowButtonInner .dijitInputField {
zoom: 50%; /* emulate transform: scale(0.5) */
@@ -586,26 +628,19 @@ div.dijitArrowButton {
overflow: hidden;
}
-.dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
+.dj_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
width: 100%;
}
-.dj_iequirks .dijit_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
- width: 1em; /* matches .dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer rule - 100% is the whole screen width in quirks */
+.dj_iequirks .dj_a11y .dijitSpinner .dijitSpinnerButtonContainer .dijitArrowButton {
+ width: 1em; /* matches .dj_a11y .dijitTextBox .dijitSpinnerButtonContainer rule - 100% is the whole screen width in quirks */
}
-.dijitSpinner .dijitArrowButtonInner .dijitInputField {
- visibility: hidden;
-}
-.dijit_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
+.dj_a11y .dijitSpinner .dijitArrowButtonInner .dijitInputField {
vertical-align:top;
visibility: visible;
}
-.dijit_a11y .dijitSpinnerButtonContainer {
+.dj_a11y .dijitSpinnerButtonContainer {
width: 1em;
}
-.dijit_a11y .dijitSpinnerButtonContainer .dijitButtonNode {
- border-width: 1px 0 0 0;
- border-style: solid !important;
-}
/****
dijit.form.CheckBox
@@ -641,20 +676,20 @@ div.dijitArrowButton {
filter: alpha(opacity=0);
}
-.dijit_a11y .dijitCheckBox,
-.dijit_a11y .dijitRadio {
+.dj_a11y .dijitCheckBox,
+.dj_a11y .dijitRadio {
/* in a11y mode we display the native checkbox (not the icon), so don't restrict the size */
width: auto !important;
height: auto !important;
}
-.dijit_a11y .dijitCheckBoxInput {
+.dj_a11y .dijitCheckBoxInput {
opacity: 1;
filter: none;
width: auto;
height: auto;
}
-.dijit_a11y .dijitFocusedLabel {
+.dj_a11y .dijitFocusedLabel {
/* for checkboxes or radio buttons in high contrast mode, use border rather than outline to indicate focus (outline does not work in FF)*/
border: 1px dotted;
outline: 0px !important;
@@ -664,6 +699,9 @@ div.dijitArrowButton {
dijit.ProgressBar
****/
+.dijitProgressBar {
+ z-index: 0; /* so z-index settings below have no effect outside of the ProgressBar */
+}
.dijitProgressBarEmpty {
/* outer container and background of the bar that's not finished yet*/
position:relative;overflow:hidden;
@@ -699,7 +737,7 @@ div.dijitArrowButton {
background-attachment: fixed;
}
-.dijit_a11y .dijitProgressBarTile {
+.dj_a11y .dijitProgressBarTile {
/* a11y: The border provides visibility in high-contrast mode */
border-width:2px;
border-style:solid;
@@ -721,7 +759,7 @@ div.dijitArrowButton {
display:none;
}
-.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
+.dj_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
display:block;
position:absolute;
top:0;
@@ -768,7 +806,7 @@ div.dijitArrowButton {
.dijitTooltipConnector {
position: absolute;
}
-.dijit_a11y .dijitTooltipConnector {
+.dj_a11y .dijitTooltipConnector {
display: none; /* won't show b/c it's background-image; hide to avoid border gap */
}
@@ -804,6 +842,7 @@ body .dijitAlignClient { position: absolute; }
.dijitBorderContainer, .dijitBorderContainerNoGutter {
position:relative;
overflow: hidden;
+ z-index: 0; /* so z-index settings below have no effect outside of the BorderContainer */
}
.dijitBorderContainerPane,
@@ -883,7 +922,7 @@ body .dijitAlignClient { position: absolute; }
overflow: hidden;
display: block;
}
-.dj_ff3 .dijit_a11y div.dijitSplitter:focus {
+.dj_ff3 .dj_a11y div.dijitSplitter:focus {
outline-style:dotted;
outline-width: 2px;
}
@@ -932,11 +971,11 @@ body .dijitAlignClient { position: absolute; }
cursor: row-resize;
}
-.dijit_a11y .dijitSplitterH {
+.dj_a11y .dijitSplitterH {
border-top:1px solid #d3d3d3 !important;
border-bottom:1px solid #d3d3d3 !important;
}
-.dijit_a11y .dijitSplitterV {
+.dj_a11y .dijitSplitterV {
border-left:1px solid #d3d3d3 !important;
border-right:1px solid #d3d3d3 !important;
}
@@ -974,6 +1013,12 @@ body .dijitAlignClient { position: absolute; }
/* TitlePane that cannot be toggled */
cursor: default;
}
+.dijitFixedOpen .dijitArrowNode, .dijitFixedOpen .dijitArrowNodeInner,
+.dijitFixedClosed .dijitArrowNode, .dijitFixedClosed .dijitArrowNodeInner{
+ /* don't show the open close icon, it makes the user think the pane is closable*/
+ display: none;
+}
+
.dijitTitlePaneTitle * {
vertical-align: middle;
}
@@ -981,12 +1026,12 @@ body .dijitAlignClient { position: absolute; }
/* normally, hide arrow text in favor of icon */
display: none;
}
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dj_a11y .dijitTitlePane .dijitArrowNodeInner {
/* ... except in a11y mode, then show text arrow */
display:inline !important;
font-family: monospace; /* because - and + are different widths */
}
-.dijit_a11y .dijitTitlePane .dijitArrowNode {
+.dj_a11y .dijitTitlePane .dijitArrowNode {
/* ... and hide icon */
display:none;
}
@@ -1066,8 +1111,8 @@ body .dijitAlignClient { position: absolute; }
}
-.dijit_a11y .dijitColorPalette .dijitPaletteTable,
-.dijit_a11y .dijitColorPalette .dijitPaletteTable * {
+.dj_a11y .dijitColorPalette .dijitPaletteTable,
+.dj_a11y .dijitColorPalette .dijitPaletteTable * {
/* table cells are to catch events, but the swatches are in the PaletteImg behind the table */
background-color: transparent !important;
}
@@ -1093,12 +1138,12 @@ body .dijitAlignClient { position: absolute; }
font-weight: normal !important;
}
-.dijit_a11y .dijitAccordionTitle .arrowTextUp,
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextDown {
+.dj_a11y .dijitAccordionTitle .arrowTextUp,
+.dj_a11y .dijitAccordionTitleSelected .arrowTextDown {
display: inline;
}
-.dijit_a11y .dijitAccordionTitleSelected .arrowTextUp {
+.dj_a11y .dijitAccordionTitleSelected .arrowTextUp {
display: none;
}
@@ -1185,6 +1230,15 @@ body .dijitAlignClient { position: absolute; }
cursor:pointer;
}
+/*
+No need to show a focus border since it's obvious from the shading, and there's a .dj_a11y .dijitMenuItemSelected
+rule below that handles the high contrast case when there's no shading.
+Hiding the focus border also works around webkit bug https://code.google.com/p/chromium/issues/detail?id=125779.
+*/
+.dijitMenuItem:focus {
+ outline: none
+}
+
.dijitMenuPassive .dijitMenuItemHover,
.dijitMenuItemSelected {
/*
@@ -1207,11 +1261,10 @@ body .dijitAlignClient { position: absolute; }
opacity:0.5;
cursor:default;
}
-.dj_ie .dijit_a11y .dijitMenuItemDisabled,
-.dj_ie .dijit_a11y .dijitMenuItemDisabled td,
-.dj_ie .dijitMenuItemDisabled *,
-.dj_ie .dijitMenuItemDisabled td {
- color:gray !important;
+.dj_ie .dj_a11y .dijitMenuItemDisabled,
+.dj_ie .dj_a11y .dijitMenuItemDisabled *,
+.dj_ie .dijitMenuItemDisabled * {
+ color: gray;
filter: alpha(opacity=35);
}
@@ -1220,25 +1273,25 @@ body .dijitAlignClient { position: absolute; }
vertical-align: middle;
}
-.dijit_a11y .dijitMenuItemSelected {
- border: 1px dotted black !important;
+.dj_a11y .dijitMenuItemSelected {
+ border: 1px dotted black !important; /* for 2.0 use outline instead, to prevent jitter */
}
-.dj_ff3 .dijit_a11y .dijitMenuItem td {
+.dj_ff3 .dj_a11y .dijitMenuItem td {
padding: 0 !important;
background:none !important;
}
-.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
+.dj_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
border-width: 1px;
border-style: solid;
}
-.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
+.dj_ie8 .dj_a11y .dijitMenuItemLabel {
position:static;
}
.dijitMenuExpandA11y {
display: none;
}
-.dijit_a11y .dijitMenuExpandA11y {
+.dj_a11y .dijitMenuExpandA11y {
display: inline;
}
@@ -1270,13 +1323,13 @@ body .dijitAlignClient { position: absolute; }
.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
visibility: visible;
}
-.dijit_a11y .dijitCheckedMenuItemIconChar {
+.dj_a11y .dijitCheckedMenuItemIconChar {
display:inline !important;
}
-.dijit_a11y .dijitCheckedMenuItemIcon {
+.dj_a11y .dijitCheckedMenuItemIcon {
display: none;
}
-.dj_ie .dijit_a11y .dijitMenuBar .dijitMenuItem {
+.dj_ie .dj_a11y .dijitMenuBar .dijitMenuItem {
/* so bottom border of MenuBar appears on IE7 in high-contrast mode */
margin: 0;
}
@@ -1287,8 +1340,27 @@ body .dijitAlignClient { position: absolute; }
cursor: default; /* because pressing it has no effect */
}
-/* TabContainer */
+/***
+TabContainer
+
+Main class hierarchy:
+
+.dijitTabContainer - the whole TabContainer
+ .dijitTabController / .dijitTabListContainer-top - wrapper for tab buttons, scroll buttons
+ .dijitTabListWrapper / .dijitTabContainerTopStrip - outer wrapper for tab buttons (normal width)
+ .nowrapTabStrip / .dijitTabContainerTop-tabs - inner wrapper for tab buttons (50K width)
+ .dijitTabPaneWrapper - wrapper for content panes, has all borders except the one between content and tabs
+***/
+
+.dijitTabContainer {
+ z-index: 0; /* so z-index settings below have no effect outside of the TabContainer */
+ overflow-y: visible; /* prevent off-by-one-pixel errors from hiding bottom border (opposite tab labels) */
+}
+.dj_ie6 .dijitTabContainer {
+ /* workaround IE6 problem when tall content overflows TabContainer, see editor/test_FullScreen.html */
+ overflow: hidden;
+}
.dijitTabContainerNoLayout {
width: 100%; /* otherwise ScrollingTabController goes to 50K pixels wide */
}
@@ -1297,9 +1369,13 @@ body .dijitAlignClient { position: absolute; }
.dijitTabContainerTop-tabs,
.dijitTabContainerLeft-tabs,
.dijitTabContainerRight-tabs {
+ z-index: 1;
overflow: visible !important; /* so tabs can cover up border adjacent to container */
}
+.dijitTabController {
+ z-index: 1;
+}
.dijitTabContainerBottom-container,
.dijitTabContainerTop-container,
.dijitTabContainerLeft-container,
@@ -1313,12 +1389,14 @@ body .dijitAlignClient { position: absolute; }
display: block;
position: relative;
text-align: left; /* just in case ancestor has non-standard setting */
+ z-index: 1;
}
.dijitTabListWrapper {
overflow: hidden;
+ z-index: 1;
}
-.dijit_a11y .tabStripButton img {
+.dj_a11y .tabStripButton img {
/* hide the icons (or rather the empty space where they normally appear) because text will appear instead */
display: none;
}
@@ -1332,7 +1410,7 @@ body .dijitAlignClient { position: absolute; }
.dijitTabContainerLeft-tabs {
border-right: 1px solid black;
- float: left;
+ float: left; /* needed for IE7 RTL mode */
}
.dijitTabContainerLeft-container {
border-left: 0;
@@ -1347,7 +1425,7 @@ body .dijitAlignClient { position: absolute; }
.dijitTabContainerRight-tabs {
border-left: 1px solid black;
- float: left;
+ float: left; /* needed for IE7 RTL mode */
}
.dijitTabContainerRight-container {
border-right: 0;
@@ -1393,11 +1471,6 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
#display:inline; /* don't use .dj_ie since that increases the priority */
}
-.dijitTabInnerDiv {
- position:relative;
-}
-
-
.tabStripButton {
z-index: 12;
}
@@ -1435,13 +1508,13 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
/* images off, high-contrast mode styles */
-.dijit_a11y .dijitTabCloseButton {
+.dj_a11y .dijitTabCloseButton {
background-image: none !important;
width: auto !important;
height: auto !important;
}
-.dijit_a11y .dijitTabCloseText {
+.dj_a11y .dijitTabCloseText {
display: inline;
}
@@ -1460,14 +1533,14 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
cursor: text;
}
-.dijit_a11y .dijitInlineEditBoxDisplayMode,
+.dj_a11y .dijitInlineEditBoxDisplayMode,
.dj_ie6 .dijitInlineEditBoxDisplayMode {
/* except that IE6 doesn't support transparent borders, nor does high contrast mode */
border: none;
}
.dijitInlineEditBoxDisplayModeHover,
-.dijit_a11y .dijitInlineEditBoxDisplayModeHover,
+.dj_a11y .dijitInlineEditBoxDisplayModeHover,
.dj_ie6 .dijitInlineEditBoxDisplayModeHover {
/* An InlineEditBox in view mode (click this to edit the text) */
background-color: #e2ebf2;
@@ -1505,7 +1578,7 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
display: none;
}
-.dijit_a11y .dijitExpandoText {
+.dj_a11y .dijitExpandoText {
display: inline;
padding-left: 10px;
padding-right: 10px;
@@ -1524,7 +1597,7 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
.dijitDialog {
position: absolute;
z-index: 999;
- overflow: hidden; /* override overflow: auto; from ContentPane to make dragging smoother */
+ overflow: hidden; /* override overflow: auto; from ContentPane to make dragging smoother */
}
.dijitDialogTitleBar {
@@ -1555,8 +1628,8 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
}
/* images off, high-contrast mode styles */
-.dijit_a11y .dijitSpinnerButtonContainer,
-.dijit_a11y .dijitDialog {
+.dj_a11y .dijitSpinnerButtonContainer,
+.dj_a11y .dijitDialog {
opacity: 1 !important;
background-color: white !important;
}
@@ -1567,7 +1640,7 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
position:absolute;
}
-.dijit_a11y .dijitDialog .closeText {
+.dj_a11y .dijitDialog .closeText {
display:inline;
}
@@ -1587,7 +1660,7 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
right:50%;
}
-.dijit_a11y div.dijitSliderImageHandle,
+.dj_a11y div.dijitSliderImageHandle,
.dijitSliderImageHandle {
margin:0;
padding:0;
@@ -1597,16 +1670,16 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
height:0;
cursor: pointer;
}
-.dj_iequirks .dijit_a11y .dijitSliderImageHandle {
+.dj_iequirks .dj_a11y .dijitSliderImageHandle {
font-size: 0;
}
.dj_ie7 .dijitSliderImageHandle {
overflow: hidden; /* IE7 workaround to make slider handle VISIBLE in non-a11y mode */
}
-.dj_ie7 .dijit_a11y .dijitSliderImageHandle {
+.dj_ie7 .dj_a11y .dijitSliderImageHandle {
overflow: visible; /* IE7 workaround to make slider handle VISIBLE in a11y mode */
}
-.dijit_a11y .dijitSliderFocused .dijitSliderImageHandle {
+.dj_a11y .dijitSliderFocused .dijitSliderImageHandle {
border:4px solid #000;
height:8px;
width:8px;
@@ -1727,6 +1800,7 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
.dijitSliderDecorationV {
height: 100%;
+ white-space: nowrap;
}
.dijitSliderButton {
@@ -1736,7 +1810,7 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
display:block;
}
-.dijit_a11y .dijitSliderButtonInner {
+.dj_a11y .dijitSliderButtonInner {
visibility:visible !important;
}
@@ -1825,17 +1899,17 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
margin-top:-.55em;
}
-.dijit_a11y .dijitSliderReadOnly,
-.dijit_a11y .dijitSliderDisabled {
+.dj_a11y .dijitSliderReadOnly,
+.dj_a11y .dijitSliderDisabled {
opacity:0.6;
}
-.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
-.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
+.dj_ie .dj_a11y .dijitSliderReadOnly .dijitSliderBar,
+.dj_ie .dj_a11y .dijitSliderDisabled .dijitSliderBar {
filter: alpha(opacity=40);
}
/* + and - Slider buttons: override theme settings to display icons */
-.dijit_a11y .dijitSlider .dijitSliderButtonContainer div {
+.dj_a11y .dijitSlider .dijitSliderButtonContainer div {
font-family: monospace; /* otherwise hyphen is larger and more vertically centered */
font-size: 1em;
line-height: 1em;
@@ -1845,10 +1919,16 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
}
/* Icon-only buttons (often in toolbars) still display the text in high-contrast mode */
-.dijit_a11y .dijitButtonContents .dijitButtonText,
-.dijit_a11y .dijitTab .tabLabel {
+.dj_a11y .dijitButtonContents .dijitButtonText,
+.dj_a11y .dijitTab .tabLabel {
display: inline !important;
}
+.dj_a11y .dijitSelect .dijitButtonText {
+ display: inline-block !important;
+}
+.dijitSelectError .dijitButtonContents .dijitButtonText {
+ display: none !important;
+}
/* TextArea, SimpleTextArea */
.dijitTextArea {
@@ -1932,10 +2012,16 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
color:white;
cursor:pointer;
}
-.dijit_a11y .dijitTimePickerItemSelected .dijitTimePickerItemInner {
+
+.dijitTimePickerItemDisabled {
+ color:gray;
+ text-decoration:line-through;
+}
+
+.dj_a11y .dijitTimePickerItemSelected .dijitTimePickerItemInner {
border: solid 4px black;
}
-.dijit_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
+.dj_a11y .dijitTimePickerItemHover .dijitTimePickerItemInner {
border: dashed 4px black;
}
@@ -1944,60 +2030,72 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
/* character (instead of icon) to show that ToggleButton is checked */
display:none !important;
}
-.dijit_a11y .dijitToggleButton .dijitToggleButtonIconChar {
+.dj_a11y .dijitToggleButton .dijitToggleButtonIconChar {
display:inline !important;
visibility:hidden;
}
.dj_ie6 .dijitToggleButtonIconChar, .dj_ie6 .tabStripButton .dijitButtonText {
font-family: "Arial Unicode MS"; /* otherwise the a11y character (checkmark, arrow, etc.) appears as a box */
}
-.dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
+.dj_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
display: inline !important; /* In high contrast mode, display the check symbol */
visibility:visible !important;
}
.dijitArrowButtonChar {
- display:none !important;
+ display:none !important;
}
-.dijit_a11y .dijitArrowButtonChar {
- display:inline !important;
+.dj_a11y .dijitArrowButtonChar {
+ display:inline !important;
}
-.dijit_a11y .dijitDropDownButton .dijitArrowButtonInner,
-.dijit_a11y .dijitComboButton .dijitArrowButtonInner {
+.dj_a11y .dijitDropDownButton .dijitArrowButtonInner,
+.dj_a11y .dijitComboButton .dijitArrowButtonInner {
display:none !important;
}
/* Select */
-.dijitSelect {
- margin: 0.2em;
- border-collapse: collapse;
+.dj_a11y .dijitSelect {
+ border-collapse: separate !important;
+ border-width: 1px;
+ border-style: solid;
}
-.dj_ie .dijitSelect,
-.dj_ie7 .dijitSelect,
-.dj_iequirks .dijitSelect {
+.dj_ie .dijitSelect {
vertical-align: middle; /* Set this back for what we hack in dijit inline */
}
+.dj_ie6 .dijitSelect .dijitValidationContainer,
.dj_ie8 .dijitSelect .dijitButtonText {
vertical-align: top;
}
+.dj_ie6 .dijitTextBox .dijitInputContainer,
+.dj_iequirks .dijitTextBox .dijitInputContainer,
+.dj_ie6 .dijitTextBox .dijitArrowButtonInner,
+.dj_ie6 .dijitSpinner .dijitSpinnerButtonInner,
+.dijitSelect .dijitSelectLabel {
+ vertical-align: baseline;
+}
+
+.dijitNumberTextBox {
+ text-align: left;
+ direction: ltr;
+}
+
+.dijitNumberTextBox .dijitInputInner {
+ text-align: inherit; /* input */
+}
+
.dijitToolbar .dijitSelect {
margin: 0;
}
.dj_webkit .dijitToolbar .dijitSelect {
padding-left: 0.3em;
}
-.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
- border-style: outset!important;
- border-width: medium!important;
- border-color: #999 !important;
- color:#999 !important;
-}
.dijitSelect .dijitButtonContents {
padding: 0;
- background: transparent none;
white-space: nowrap;
text-align: left;
+ border-style: none solid none none;
+ border-width: 1px;
}
.dijitSelectFixedWidth .dijitButtonContents {
width: 100%;
@@ -2049,3 +2147,46 @@ div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
/* a region the user would be able to click on, but it's disabled */
cursor: default;
}
+
+/* Drag and Drop */
+.dojoDndItem {
+ padding: 2px; /* will be replaced by border during drag over (dojoDndItemBefore, dojoDndItemAfter) */
+
+ /* Prevent magnifying-glass text selection icon to appear on mobile webkit as it causes a touchout event */
+ -webkit-touch-callout: none;
+ -webkit-user-select: none; /* Disable selection/Copy of UIWebView */
+}
+.dojoDndHorizontal .dojoDndItem {
+ /* make contents of horizontal container be side by side, rather than vertical */
+ #display: inline;
+ display: inline-block;
+}
+
+.dojoDndItemBefore,
+.dojoDndItemAfter {
+ border: 0px solid #369;
+}
+.dojoDndItemBefore {
+ border-width: 2px 0 0 0;
+ padding: 0 2px 2px 2px;
+}
+.dojoDndItemAfter {
+ border-width: 0 0 2px 0;
+ padding: 2px 2px 0 2px;
+}
+.dojoDndHorizontal .dojoDndItemBefore {
+ border-width: 0 0 0 2px;
+ padding: 2px 2px 2px 0;
+}
+.dojoDndHorizontal .dojoDndItemAfter {
+ border-width: 0 2px 0 0;
+ padding: 2px 0 2px 2px;
+}
+
+.dojoDndItemOver {
+ cursor:pointer;
+}
+.dj_gecko .dijitArrowButtonInner INPUT,
+.dj_gecko INPUT.dijitArrowButtonInner {
+ -moz-user-focus:ignore;
+}
diff --git a/lib/dijit/themes/dijit_rtl.css b/lib/dijit/themes/dijit_rtl.css
index 9c1b69c0d..432b79ecd 100644
--- a/lib/dijit/themes/dijit_rtl.css
+++ b/lib/dijit/themes/dijit_rtl.css
@@ -15,6 +15,9 @@
/* workaround bug where label invisible (themeTesterQuirk.html?dir=rtl) */
float:left;
}
+.dj_ie .dijitTextBoxRtl .dijitInputContainer {
+ clear: right;
+}
/* TextBox, ComboBox, Spinner */
@@ -31,17 +34,20 @@
left: auto;
}
-.dj_ie7 .dijitInputContainer {
- /* to fix wrong text alignment in rtl text box in IE */
- display: inline-block;
+.dijitSelectRtl .dijitButtonText {
+ float: right;
}
.dijitTextBoxRtl .dijitSpinnerButtonContainer,
-.dijitTextBoxRtl .dijitValidationContainer,
+.dijitValidationTextBoxRtl .dijitValidationContainer,
.dijitTextBoxRtl .dijitArrowButtonContainer {
float: left;
}
+div.dijitNumberTextBoxRtl {
+ text-align: right;
+}
+
/* Calendar */
.dijitCalendarRtl .dijitCalendarNextYear {
@@ -108,6 +114,23 @@
margin-left: 0;
margin-right: 1em;
}
+.dj_ie6 .dijitTabRtl .tabLabel,
+.dj_ie6 .dijitTabContainerRight-tabs .dijitTabRtl,
+.dj_ie6 .dijitTabContainerLeft-tabs .dijitTabRtl,
+.dj_ie7 .dijitTabContainerRight-tabs .dijitTabRtl,
+.dj_ie7 .dijitTabContainerLeft-tabs .dijitTabRtl {
+ zoom: 1;
+}
+.dj_ie6 .dijitTabContainerRight-tabs .dijitTabRtl,
+.dj_ie7 .dijitTabContainerRight-tabs .dijitTabRtl {
+ left: 0;
+}
+
+.dj_ie6 .dijitTabContainerRightRtl .dijitTabContainerRight-tabs,
+.dj_ie6 .dijitTabContainerLeftRtl .dijitTabContainerLeft-tabs {
+ /* otherwise tab labels invisible */
+ width: 1%;
+}
/* TimePicker */
.dj_ie .dijitTimePickerRtl .dijitTimePickerItem {
@@ -124,5 +147,19 @@
/* Select */
.dijitSelectRtl .dijitButtonContents {
+ border-style: none none none solid;
text-align: right;
}
+
+/* DnD
+ * These rules should apply for containers that are dir=rtl (either set directly, or inherited)
+ * but seems the best we can do is look for .dijitRtl on an ancestor node.
+ */
+.dijitRtl .dojoDndHorizontal .dojoDndItemBefore {
+ border-width: 0 2px 0 0;
+ padding: 2px 0 2px 2px;
+}
+.dijitRtl .dojoDndHorizontal .dojoDndItemAfter {
+ border-width: 0 0 0 2px;
+ padding: 2px 2px 2px 0;
+}
diff --git a/lib/dijit/themes/nihilo/Common.css b/lib/dijit/themes/nihilo/Common.css
index 498699083..1a1c7f930 100644
--- a/lib/dijit/themes/nihilo/Common.css
+++ b/lib/dijit/themes/nihilo/Common.css
@@ -1,17 +1,9 @@
-/* DnD avatar-specific settings */
-/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
-.nihilo .dojoDndItemBefore {
- border-top: 2px solid #369;
-}
-
-.nihilo .dojoDndItemAfter {
- border-bottom: 2px solid #369;
-}
-
.nihilo .dojoDndItemOver {
- cursor:pointer;
+ background-image: url(images/treeHover.png);
}
+/* DnD avatar-specific settings */
+/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
.nihilo table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
.nihilo .dojoDndAvatar td { border: none; }
.nihilo .dojoDndAvatar tr { border: none; }
diff --git a/lib/dijit/themes/nihilo/Dialog.css b/lib/dijit/themes/nihilo/Dialog.css
index 4affeb866..248260467 100644
--- a/lib/dijit/themes/nihilo/Dialog.css
+++ b/lib/dijit/themes/nihilo/Dialog.css
@@ -67,15 +67,7 @@
}
.nihilo .dijitTooltipContainer {
- /*
- The part with the text.
-
- NOTE:
- FF doesn't clip images used as CSS bgs if you specify a border
- radius. If you use a solid color, it does. Webkit gets it right.
- Sigh.
- background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
- */
+ /* The part with the text. */
background-color: #fff;
border:1px solid #d3d3d3;
padding:0.45em;
diff --git a/lib/dijit/themes/nihilo/form/Button.css b/lib/dijit/themes/nihilo/form/Button.css
index 90e1ee2cc..83c719b25 100644
--- a/lib/dijit/themes/nihilo/form/Button.css
+++ b/lib/dijit/themes/nihilo/form/Button.css
@@ -16,14 +16,13 @@
background: #fff url("../images/buttonEnabled.png") repeat-x top left;
}
-.nihilo .dijitSelect .dijitButtonContents {
- border-right: none;
-}
-
.nihilo .dijitButtonText {
text-align: center;
padding: 0 0.3em;
}
+.nihilo .dijitInputField {
+ padding: 0; /* set padding:0 for .nihilo .dijitSelect .dijitButtonText but with a low priority rule that can be easily trumped by the user */
+}
.nihilo .dijitComboBox .dijitButtonNode {
border-width: 0 0 0 1px;
diff --git a/lib/dijit/themes/nihilo/form/Button_rtl.css b/lib/dijit/themes/nihilo/form/Button_rtl.css
index 60d4c4da4..07886d058 100644
--- a/lib/dijit/themes/nihilo/form/Button_rtl.css
+++ b/lib/dijit/themes/nihilo/form/Button_rtl.css
@@ -1,8 +1,4 @@
-.dijitRtl .nihilo .dijitComboBox .dijitButtonNode {
+.nihilo .dijitComboBoxRtl .dijitButtonNode {
border-width: 0 0 0 1px;
}
-.dijitRtl .nihilo .dijitSelect .dijitButtonContents {
- border-left: none;
- border-right-width: 1px;
-}
diff --git a/lib/dijit/themes/nihilo/form/Common.css b/lib/dijit/themes/nihilo/form/Common.css
index b67195f4b..31bf95ee3 100644
--- a/lib/dijit/themes/nihilo/form/Common.css
+++ b/lib/dijit/themes/nihilo/form/Common.css
@@ -10,11 +10,12 @@
dijit.form.ComboBox (partial)
****/
-.nihilo .dijitInputContainer input,
-.nihilo .dijitTextBox {
+.nihilo .dijitInputContainer input {
margin: 0 0.1em;
}
+.nihilo .dijitSelect .dijitButtonContents,
+.nihilo .dijitSelect,
.nihilo .dijitTextBox,
.nihilo .dijitTextArea {
/* For all except dijit.form.NumberSpinner: the actual input element.
@@ -23,26 +24,34 @@
*/
background:#fff url("../images/validationInputBg.png") repeat-x top left;
#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+}
+.nihilo .dijitSelect,
+.nihilo .dijitTextBox,
+.nihilo .dijitTextArea {
border:1px solid #d3d3d3;
}
+.nihilo .dijitSelect .dijitArrowButton,
.nihilo .dijitComboBox .dijitButtonNode {
- padding: 0 0.2em !important;
+ padding: 0 0.2em;
}
+.nihilo .dijitSelect .dijitButtonContents,
.nihilo .dijitTextBox .dijitButtonNode {
/* line between the input area and the drop down button */
border-color: #d3d3d3;
}
+.nihilo .dijitSelectFocused,
.nihilo .dijitTextBoxFocused,
.nihilo .dijitTextAreaFocused {
/* input field when focused (ie: typing affects it) */
border-color:#b3b3b3;
}
+.nihilo .dijitSelectFocused TD,
.nihilo .dijitTextBoxFocused .dijitButtonNode,
.nihilo .dijitSpinner .dijitUpArrowButtonActive,
.nihilo .dijitSpinner .dijitDownArrowButtonActive {
- border-left-color:#d3d3d3;
+ border-color:#d3d3d3;
}
.nihilo .dijitSpinnerFocused .dijitDownArrowButton,
.nihilo .dijitSpinner .dijitUpArrowButtonActive,
@@ -62,7 +71,7 @@
}
/* Validation errors */
-.nihilo .dijitValidationIcon {
+.nihilo .dijitValidationTextBoxError .dijitValidationIcon {
/* prevent height change when widget goes from valid to invalid state */
width: 16px;
background: transparent url('../images/warning.png') no-repeat center center;
diff --git a/lib/dijit/themes/nihilo/form/Select.css b/lib/dijit/themes/nihilo/form/Select.css
index 61967e550..6e6a9c442 100644
--- a/lib/dijit/themes/nihilo/form/Select.css
+++ b/lib/dijit/themes/nihilo/form/Select.css
@@ -1,45 +1,38 @@
-.nihilo .dijitSelect .dijitButtonNode {
- padding: 0;
-}
-
-/* Make unselected "look" more like a text box and less like a button */
-.nihilo .dijitSelect .dijitButtonContents {
- padding-top: 1px;
- background:#fff url("../images/validationInputBg.png") repeat-x top left;
- #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
-}
-.nihilo .dijitSelectHover .dijitButtonContents,
-.nihilo .dijitSelectActive .dijitButtonContents,
-.nihilo .dijitSelectOpened .dijitButtonContents,
-.nihilo .dijitSelectDisabled .dijitButtonContents,
-.nihilo .dijitSelectReadOnly .dijitButtonContents{
+.nihilo .dijitSelectError .dijitButtonContents,
+.nihilo .dijitSelectHover .dijitArrowButton,
+.nihilo .dijitSelectActive .dijitArrowButton,
+.nihilo .dijitSelectOpened .dijitArrowButton,
+.nihilo .dijitSelectDisabled .dijitArrowButton,
+.nihilo .dijitSelectReadOnly .dijitArrowButton {
background: transparent none;
}
-.dj_ie .nihilo .dijitSelect .dijitButtonContents {
- padding-top: 0;
-}
.nihilo .dijitSelect .dijitArrowButton {
- padding: 0 2px;
+ background: #bcd5f0 url("../images/buttonEnabled.png") repeat-x top left;
+ border-width: 0;
}
/* Mirror DropDownButton */
-.nihilo .dijitSelectDisabled .dijitButtonNode {
- border-color: #dedede;
+.nihilo .dijitSelectDisabled,
+.nihilo .dijitSelectDisabled TD {
+ border-color: #dedede !important;
background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
}
-.dj_ie .nihilo .dijitSelectDisabled .dijitButtonNode * {
+.dj_ie .nihilo .dijitSelectDisabled TD * {
filter: gray() alpha(opacity=50);
}
-.nihilo .dijitSelectHover .dijitButtonNode {
+.nihilo .dijitSelectHover,
+.nihilo .dijitSelectHover TD {
color:#000;
background:#fcfcfc url("../images/buttonHover.png") repeat-x top left;
}
-.nihilo .dijitSelectActive .dijitButtonNode,
-.nihilo .dijitSelectOpened .dijitButtonNode {
- border-color:#dedede;
+.nihilo .dijitSelectActive,
+.nihilo .dijitSelectOpened,
+.nihilo .dijitSelectActive TD,
+.nihilo .dijitSelectOpened TD {
+ border-color:#dedede !important;
background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
}
@@ -51,4 +44,3 @@
.nihilo .dijitSelectMenu .dijitMenuArrowCell {
padding: 0.1em 0.2em;
}
-
diff --git a/lib/dijit/themes/nihilo/form/TimeTextBox.css b/lib/dijit/themes/nihilo/form/TimeTextBox.css
index bf67b66d0..d450925b4 100644
--- a/lib/dijit/themes/nihilo/form/TimeTextBox.css
+++ b/lib/dijit/themes/nihilo/form/TimeTextBox.css
@@ -1 +1 @@
-@CHARSET "UTF-8"; \ No newline at end of file
+@CHARSET "UTF-8";
diff --git a/lib/dijit/themes/nihilo/images/dndNoCopy.png b/lib/dijit/themes/nihilo/images/dndNoCopy.png
index 9bf9c3396..998c2f269 100644
--- a/lib/dijit/themes/nihilo/images/dndNoCopy.png
+++ b/lib/dijit/themes/nihilo/images/dndNoCopy.png
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/dndNoMove.png b/lib/dijit/themes/nihilo/images/dndNoMove.png
index cb8bd8bdd..e909173e0 100644
--- a/lib/dijit/themes/nihilo/images/dndNoMove.png
+++ b/lib/dijit/themes/nihilo/images/dndNoMove.png
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif b/lib/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
deleted file mode 100644
index 6803db442..000000000
--- a/lib/dijit/themes/nihilo/images/tabBottomActiveSpriteLR.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif b/lib/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
deleted file mode 100644
index b6b08ce48..000000000
--- a/lib/dijit/themes/nihilo/images/tabBottomEnabledSpriteLR.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif b/lib/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
deleted file mode 100644
index 010b08ae9..000000000
--- a/lib/dijit/themes/nihilo/images/tabBottomHoverSpriteLR.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabLeftChecked.gif b/lib/dijit/themes/nihilo/images/tabLeftChecked.gif
deleted file mode 100644
index d59fd4a5b..000000000
--- a/lib/dijit/themes/nihilo/images/tabLeftChecked.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabRightChecked.gif b/lib/dijit/themes/nihilo/images/tabRightChecked.gif
deleted file mode 100644
index d32f44e3c..000000000
--- a/lib/dijit/themes/nihilo/images/tabRightChecked.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabStripe.gif b/lib/dijit/themes/nihilo/images/tabStripe.gif
deleted file mode 100644
index a93467520..000000000
--- a/lib/dijit/themes/nihilo/images/tabStripe.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabStripeBottom.gif b/lib/dijit/themes/nihilo/images/tabStripeBottom.gif
deleted file mode 100644
index 64c3376bd..000000000
--- a/lib/dijit/themes/nihilo/images/tabStripeBottom.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabStripeLeft.gif b/lib/dijit/themes/nihilo/images/tabStripeLeft.gif
deleted file mode 100644
index d607a45f7..000000000
--- a/lib/dijit/themes/nihilo/images/tabStripeLeft.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/images/tabStripeRight.gif b/lib/dijit/themes/nihilo/images/tabStripeRight.gif
deleted file mode 100644
index 9778cedf7..000000000
--- a/lib/dijit/themes/nihilo/images/tabStripeRight.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/nihilo/layout/TabContainer.css b/lib/dijit/themes/nihilo/layout/TabContainer.css
index 21266577e..dba38c3fa 100644
--- a/lib/dijit/themes/nihilo/layout/TabContainer.css
+++ b/lib/dijit/themes/nihilo/layout/TabContainer.css
@@ -1,9 +1,5 @@
/**
* dijit.layout.TabContainer
- *
- * To style TabContainer with rounded corners
- * you can use these classes: .dijitTab (left), .dijitTabContent (center), dijitTabInnerDiv (right)
- * For tabs aligned to top you can style a stripe div right underneath the tabs using .dijitTabStripe
*/
@import url("../Menu.css");
@@ -28,54 +24,25 @@
padding: 0;
}
-.nihilo .dijitTabInnerDiv {
- padding:0 3px 0 0;
- margin: 0 0 0 4px;
- background: url("../images/tabContainerSprite.gif") no-repeat;
- background-position: right -400px;
-}
-
.nihilo .dijitTab {
+ padding:3px 6px 3px 4px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
+ position: relative;
line-height:normal;
- margin:0 2px 0 0; /* space between one tab and the next in top/bottom mode */
- padding:0;
- background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
+ margin: 0 1px; /* space between one tab and the next in top/bottom mode */
color: #6d6d6d;
+ border: 1px #dedede solid;
border-bottom: 1px #ccc solid;
}
-.nihilo .dijitTabInnerDiv .dijitTabContent {
- padding:3px 3px 3px 4px;
- background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
- position: relative;
-}
-
/* hovered tab */
.nihilo .dijitTabHover {
color: #243C5F;
- background: url("../images/tabContainerSprite.gif") no-repeat 0 -150px;
-}
-
-.nihilo .dijitTabHover .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
-}
-
-.nihilo .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
}
-/* checked tab*/
-.nihilo .dijitTabChecked
-{
- /* the selected tab (with or without hover) */
- background: url("../images/tabContainerSprite.gif") no-repeat 0 -0;
-}
-
-.nihilo .dijitTabChecked .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
-}
-
-.nihilo .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
+/* selected tab */
+.nihilo .dijitTabChecked {
background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
color: #243C5F !important;
}
@@ -95,11 +62,7 @@
border: none;
top: 0; /* override top:1px setting of top-level tabs */
}
-.nihilo .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv,
-.nihilo .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
- background: none;
-}
-.nihilo .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent .tabLabel {
+.nihilo .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
text-decoration: underline;
}
.nihilo .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
@@ -142,6 +105,10 @@
background-position: bottom;
padding-left: 3px;
}
+.nihilo .dijitTabContainerTop-tabs .dijitTab {
+ border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+}
.dj_ie6 .nihilo .dijitTabListContainer-top,
.dj_ie7 .nihilo .dijitTabListContainer-top {
@@ -163,7 +130,7 @@
border-top: none;
}
-/* checked tabs */
+/* selected tab */
.nihilo .dijitTabContainerTop-tabs .dijitTabChecked {
border-bottom-color: #f8f8f8;
}
@@ -187,68 +154,43 @@
background-position: top;
padding-left: 3px;
}
-
-.dj_ie6 .nihilo .dijitTabListContainer-bottom,
-.dj_ie7 .nihilo .dijitTabListContainer-bottom {
- z-index: 3;
-}
-
-.dj_ie6 .nihilo .dijitTabContainerBottom-tabs,
-.dj_ie7 .nihilo .dijitTabContainerBottom-tabs {
- border-top: 1px solid #ccc;
- margin-top: -1px;
-}
-
-/* bottom container */
-.nihilo .dijitTabContainerBottom-container {
- border-bottom: none;
-}
-
.nihilo .dijitTabContainerBottom-tabs .dijitTab {
- border-bottom: none;
- border-top: 1px solid #ccc;
- background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
-}
-
-/* checked tabs */
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
- border-top-color: #f8f8f8;
-}
-
-.nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
- padding-top: 3px;
- padding-bottom: 3px;
- background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
+ border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-bottom: none;
+ border-top: 1px solid #ccc;
+ padding-top: 3px;
+ padding-bottom: 3px;
+ background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
-}
.nihilo .dijitTabContainerBottom-tabs .dijitTabHover {
color: #243C5F;
- background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
-}
-
-.nihilo .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
-}
-
-.nihilo .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
}
.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
/* the selected tab (with or without hover) */
- background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
+ border-top-color: #f8f8f8;
+ background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
+
+.dj_ie6 .nihilo .dijitTabListContainer-bottom,
+.dj_ie7 .nihilo .dijitTabListContainer-bottom {
+ z-index: 3;
}
-.nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
+.dj_ie6 .nihilo .dijitTabContainerBottom-tabs,
+.dj_ie7 .nihilo .dijitTabContainerBottom-tabs {
+ border-top: 1px solid #ccc;
+ margin-top: -1px;
+}
+
+/* bottom container */
+.nihilo .dijitTabContainerBottom-container {
+ border-bottom: none;
}
/* strip */
@@ -264,14 +206,15 @@
.nihilo .dijitTabContainerTop-spacer {
height: 2px;
border: 1px solid #ccc;
- background: #f8f8f8;
}
.nihilo .dijitTabContainerTop-spacer {
margin-top: -1px;
+ background: #f3f3f3;
}
.nihilo .dijitTabContainerBottom-spacer {
margin-bottom: -1px;
+ background: #f8f8f8;
}
@@ -281,49 +224,42 @@
border-color: #ccc;
padding-top: 3px;
}
+.nihilo .dijitTabContainerRight-tabs .dijitTab {
+ border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-left: 1px solid #ccc;
+ border-bottom: 1px solid #dedede !important;
+}
+
.nihilo .dijitTabContainerRight .dijitTabListWrapper {
padding-right: 3px;
}
+.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
+ border-left: 1px solid #f8f8f8;
+}
+
/* right container */
.nihilo .dijitTabContainerRight-container {
border-right: none;
}
-.nihilo .dijitTabContainerRight-tabs .dijitTab {
- border-bottom: none;
- border-left: 1px solid #ccc;
- border-bottom: 1px solid #dedede !important;
-}
-
-
-/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
-.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabInnerDiv {
+/* some odd ie bug when borders disappear when setting a bottom margin, this sort of helps */
+.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTab {
border-bottom: solid #fff 1px;
}
-/* checked tabs */
+/* selected tab */
.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
border-left-color: #f8f8f8;
}
-.nihilo .dijitTabContainerRight-tabs .dijitTabChecked {
- background: url("../images/tabRightChecked.gif") no-repeat left top !important;
-}
-
-/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
-.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+/* some odd ie bug when borders disappear when setting a bottom margin, this sort of helps */
+.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabChecked,
+.dj_ie .nihilo .dijitTabContainerRight-tabs .dijitTabCheckedHover {
border-bottom: solid #efefef 1px;
}
-.nihilo .dijitTabContainerRight-tabs .dijitTab {
- background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
-}
-.nihilo .dijitTabContainerRight-tabs .dijitTabHover .dijitTab {
- background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
-}
-
/* strip */
.nihilo .dijitTabContainerRightStrip {
padding-right: 2px;
@@ -338,35 +274,26 @@
border-color: #ccc;
padding-top: 3px;
}
-
-/* left conatiner */
-.nihilo .dijitTabContainerLeft-container {
- border-left: none;
-}
-
.nihilo .dijitTabContainerLeft-tabs .dijitTab {
- border-right: 1px solid #ccc;
- border-bottom: 1px solid #dedede;
+ border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-right: 1px solid #ccc;
+ border-bottom: 1px solid #dedede;
}
-/* checked tabs */
+/* selected tab */
.nihilo .dijitTabContainerLeft-tabs .dijitTabChecked {
border-right: 1px solid #f8f8f8;
}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -200px;
-}
-.nihilo .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- background: url("../images/tabLeftChecked.gif") no-repeat right top;
+/* left container */
+.nihilo .dijitTabContainerLeft-container {
+ border-left: none;
}
-.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+
+.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabChecked,
+.dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabCheckedHover {
border-bottom: solid #efefef 1px;
}
@@ -389,8 +316,7 @@
/* left/right tabs */
.nihilo .dijitTabContainerLeft-tabs .dijitTab,
.nihilo .dijitTabContainerRight-tabs .dijitTab {
- margin-right:auto;
- margin-bottom:2px; /* space between one tab and the next in left/right mode */
+ margin: 1px 0; /* space between one tab and the next in left/right mode */
}
/* left/right tabstrip */
@@ -419,7 +345,7 @@
/* ================================ */
-/* this resets the tabcontainer stripe when within a contentpane */
+/* this resets the tabcontainer strip when within a contentpane */
.nihilo .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
border-left: 0 solid #ccc;
border-top: 0 solid #ccc;
@@ -433,10 +359,7 @@
/* Menu and slider control styles */
.nihilo .dijitTabContainer .tabStripButton {
margin-right: 0;
-}
-
-.nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
- padding: 5px 0 6px;
+ padding: 5px 3px 6px 0px;
}
.dj_ie6 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
@@ -445,10 +368,6 @@
padding-bottom: 7px;
}
-.nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
- padding: 3px 0 5px;
-}
-
.dj_ie6 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
.dj_ie7 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
.dj_opera .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
@@ -482,15 +401,6 @@
}
.nihilo .dijitTabContainer .tabStripButton-bottom {
- background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
border-bottom: medium none;
border-top: 1px solid #CCCCCC;
}
-
-.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
- background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
-}
-
-.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
- background: transparent;
-} \ No newline at end of file
diff --git a/lib/dijit/themes/soria/Common.css b/lib/dijit/themes/soria/Common.css
index d5a7c9df6..93efae7ba 100644
--- a/lib/dijit/themes/soria/Common.css
+++ b/lib/dijit/themes/soria/Common.css
@@ -1,16 +1,15 @@
-/* DnD avatar-specific settings */
-/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
-.soria .dojoDndItemBefore {
- border-top: 2px solid #369;
+/* DnD hovered and selected node(s) */
+.soria .dojoDndItemOver {
+ background-image: url(images/treeHover.png);
}
-
-.soria .dojoDndItemAfter {
- border-bottom: 2px solid #369;
+.soria .dojoDndItemAnchor,
+.soria .dojoDndItemSelected {
+ background-color: #B8CBEC;
}
-.soria .dojoDndItemOver {
- cursor:pointer;
-}
+
+/* DnD avatar-specific settings */
+/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
.soria table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
.soria .dojoDndAvatar td { border: none; }
diff --git a/lib/dijit/themes/soria/Dialog.css b/lib/dijit/themes/soria/Dialog.css
index 1e0503a0b..956df8d5e 100644
--- a/lib/dijit/themes/soria/Dialog.css
+++ b/lib/dijit/themes/soria/Dialog.css
@@ -67,15 +67,7 @@
}
.soria .dijitTooltipContainer {
- /*
- The part with the text.
-
- NOTE:
- FF doesn't clip images used as CSS bgs if you specify a border
- radius. If you use a solid color, it does. Webkit gets it right.
- Sigh.
- background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
- */
+ /* The part with the text. */
background-color: #fff;
border:1px solid #cbcbcb;
padding:0.45em;
diff --git a/lib/dijit/themes/soria/form/Button.css b/lib/dijit/themes/soria/form/Button.css
index 9efe7ead8..e00c48f58 100644
--- a/lib/dijit/themes/soria/form/Button.css
+++ b/lib/dijit/themes/soria/form/Button.css
@@ -14,14 +14,14 @@
padding: 0.1em 0.2em 0.2em 0.2em;
background: #bcd5f0 url("../images/buttonEnabled.png") repeat-x top left;
}
-.soria .dijitSelect .dijitButtonContents {
- border-right: none;
-}
.soria .dijitButtonText {
text-align: center;
padding: 0 0.3em;
}
+.soria .dijitInputField {
+ padding: 0; /* set padding:0 for .soria .dijitSelect .dijitButtonText but with a low priority rule that can be easily trumped by the user */
+}
.soria .dijitArrowButton {
color: #111;
diff --git a/lib/dijit/themes/soria/form/Button_rtl.css b/lib/dijit/themes/soria/form/Button_rtl.css
index e2f3728f3..cf47470a9 100644
--- a/lib/dijit/themes/soria/form/Button_rtl.css
+++ b/lib/dijit/themes/soria/form/Button_rtl.css
@@ -1,7 +1,3 @@
-.dijitRtl .soria .dijitComboBox .dijitButtonNode {
+.soria .dijitComboBoxRtl .dijitButtonNode {
border-width: 0 0 0 1px;
}
-.dijitRtl .soria .dijitSelect .dijitButtonContents {
- border-left: none;
- border-right-width: 1px;
-}
diff --git a/lib/dijit/themes/soria/form/Common.css b/lib/dijit/themes/soria/form/Common.css
index 42dfefa2e..d6ea6e275 100644
--- a/lib/dijit/themes/soria/form/Common.css
+++ b/lib/dijit/themes/soria/form/Common.css
@@ -10,11 +10,12 @@
dijit.form.ComboBox (partial)
****/
-.soria .dijitInputContainer input,
-.soria .dijitTextBox {
+.soria .dijitInputContainer input {
margin: 0 0.1em;
}
+.soria .dijitSelect .dijitButtonContents,
+.soria .dijitSelect,
.soria .dijitTextBox,
.soria .dijitTextArea {
/* For all except dijit.form.NumberSpinner: the actual input element.
@@ -23,26 +24,35 @@
*/
background:#fff url("../images/validationInputBg.png") repeat-x top left;
#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+}
+.soria .dijitSelect,
+.soria .dijitTextBox,
+.soria .dijitTextArea {
border:1px solid #8ba0bd;
}
+.soria .dijitSelect .dijitArrowButton,
.soria .dijitComboBox .dijitButtonNode {
padding: 0 0.2em;
}
+
+.soria .dijitSelect .dijitButtonContents,
.soria .dijitTextBox .dijitButtonNode {
/* line between the input area and the drop down button */
border-color: #8ba0bd;
}
+.soria .dijitSelectFocused,
.soria .dijitTextBoxFocused,
.soria .dijitTextAreaFocused {
/* input field when focused (ie: typing affects it) */
border-color:#406b9b;
}
+.soria .dijitSelectFocused TD,
.soria .dijitTextBoxFocused .dijitButtonNode,
.soria .dijitSpinner .dijitUpArrowButtonActive,
.soria .dijitSpinner .dijitDownArrowButtonActive {
- border-left-color:#8ba0bd;
+ border-color:#8ba0bd;
}
.soria .dijitSpinnerFocused .dijitDownArrowButton,
.soria .dijitSpinner .dijitUpArrowButtonActive,
@@ -62,7 +72,7 @@
}
/* Validation errors */
-.soria .dijitValidationIcon {
+.soria .dijitValidationTextBoxError .dijitValidationIcon {
/* prevent height change when widget goes from valid to invalid state */
width: 16px;
background: transparent url('../images/warning.png') no-repeat center center;
diff --git a/lib/dijit/themes/soria/form/Select.css b/lib/dijit/themes/soria/form/Select.css
index 18567720e..895ab7eaa 100644
--- a/lib/dijit/themes/soria/form/Select.css
+++ b/lib/dijit/themes/soria/form/Select.css
@@ -1,46 +1,40 @@
-.soria .dijitSelect .dijitButtonNode {
- padding: 0;
-}
-
/* Make unselected "look" more like a text box and less like a button */
-.soria .dijitSelect .dijitButtonContents {
- padding-top: 1px;
- background:#fff url("../images/validationInputBg.png") repeat-x top left;
- #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
-}
-.soria .dijitSelectHover .dijitButtonContents,
-.soria .dijitSelectActive .dijitButtonContents,
-.soria .dijitSelectOpened .dijitButtonContents,
-.soria .dijitSelectDisabled .dijitButtonContents,
-.soria .dijitSelectReadOnly .dijitButtonContents{
+.soria .dijitSelectError .dijitButtonContents,
+.soria .dijitSelectHover .dijitArrowButton,
+.soria .dijitSelectActive .dijitArrowButton,
+.soria .dijitSelectOpened .dijitArrowButton,
+.soria .dijitSelectDisabled .dijitArrowButton,
+.soria .dijitSelectReadOnly .dijitArrowButton {
background: transparent none;
}
-.dj_ie .soria .dijitSelect .dijitButtonContents {
- padding-top: 0;
-}
-
.soria .dijitSelect .dijitArrowButton {
- padding: 0 2px;
+ background: #bcd5f0 url("../images/buttonEnabled.png") repeat-x top left;
+ border-width: 0;
}
/* Mirror DropDownButton */
-.soria .dijitSelectDisabled .dijitButtonNode {
- border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
- background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
+.soria .dijitSelectDisabled,
+.soria .dijitSelectDisabled TD {
+ border-color: #b9bbdd !important;
+ background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
}
-.dj_ie .soria .dijitSelectDisabled .dijitButtonNode * {
+.dj_ie .soria .dijitSelectDisabled TD * {
filter: gray() alpha(opacity=50);
}
-.soria .dijitSelectHover .dijitButtonNode {
- color:#000;
- background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
+.soria .dijitSelectHover,
+.soria .dijitSelectHover TD {
+ border-color:#a5beda #5c7590 #5c7590 #a5beda !important;
+ color:#000;
+ background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
}
-.soria .dijitSelectActive .dijitButtonNode,
-.soria .dijitSelectOpened .dijitButtonNode {
- border-color:#657c9c;
- background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
+.soria .dijitSelectActive,
+.soria .dijitSelectOpened,
+.soria .dijitSelectActive TD,
+.soria .dijitSelectOpened TD {
+ border-color:#657c9c !important;
+ background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
}
/* Make the menu look more combobox-like */
@@ -51,4 +45,3 @@
.soria .dijitSelectMenu .dijitMenuArrowCell {
padding: 0.1em 0.2em;
}
-
diff --git a/lib/dijit/themes/soria/form/TimeTextBox.css b/lib/dijit/themes/soria/form/TimeTextBox.css
index bf67b66d0..d450925b4 100644
--- a/lib/dijit/themes/soria/form/TimeTextBox.css
+++ b/lib/dijit/themes/soria/form/TimeTextBox.css
@@ -1 +1 @@
-@CHARSET "UTF-8"; \ No newline at end of file
+@CHARSET "UTF-8";
diff --git a/lib/dijit/themes/soria/images/dndNoCopy.png b/lib/dijit/themes/soria/images/dndNoCopy.png
index 9bf9c3396..998c2f269 100644
--- a/lib/dijit/themes/soria/images/dndNoCopy.png
+++ b/lib/dijit/themes/soria/images/dndNoCopy.png
Binary files differ
diff --git a/lib/dijit/themes/soria/images/dndNoMove.png b/lib/dijit/themes/soria/images/dndNoMove.png
index cb8bd8bdd..e909173e0 100644
--- a/lib/dijit/themes/soria/images/dndNoMove.png
+++ b/lib/dijit/themes/soria/images/dndNoMove.png
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif b/lib/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
deleted file mode 100644
index 7c2ed86d2..000000000
--- a/lib/dijit/themes/soria/images/tabBottomActiveSpriteLR.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif b/lib/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
deleted file mode 100644
index 59f3edd60..000000000
--- a/lib/dijit/themes/soria/images/tabBottomHoverSpriteLR.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabLeftChecked.gif b/lib/dijit/themes/soria/images/tabLeftChecked.gif
index 3e7475aa5..439aa6b44 100644
--- a/lib/dijit/themes/soria/images/tabLeftChecked.gif
+++ b/lib/dijit/themes/soria/images/tabLeftChecked.gif
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabRightChecked.gif b/lib/dijit/themes/soria/images/tabRightChecked.gif
index ec4b65936..cfffd1e70 100644
--- a/lib/dijit/themes/soria/images/tabRightChecked.gif
+++ b/lib/dijit/themes/soria/images/tabRightChecked.gif
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabStripe.gif b/lib/dijit/themes/soria/images/tabStripe.gif
deleted file mode 100644
index 51a2d40aa..000000000
--- a/lib/dijit/themes/soria/images/tabStripe.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabStripeBottom.gif b/lib/dijit/themes/soria/images/tabStripeBottom.gif
deleted file mode 100644
index 41b1ac0f6..000000000
--- a/lib/dijit/themes/soria/images/tabStripeBottom.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabStripeLeft.gif b/lib/dijit/themes/soria/images/tabStripeLeft.gif
deleted file mode 100644
index b2214fa41..000000000
--- a/lib/dijit/themes/soria/images/tabStripeLeft.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/soria/images/tabStripeRight.gif b/lib/dijit/themes/soria/images/tabStripeRight.gif
deleted file mode 100644
index bff311553..000000000
--- a/lib/dijit/themes/soria/images/tabStripeRight.gif
+++ /dev/null
Binary files differ
diff --git a/lib/dijit/themes/soria/layout/TabContainer.css b/lib/dijit/themes/soria/layout/TabContainer.css
index b96d16955..38a1a77e1 100644
--- a/lib/dijit/themes/soria/layout/TabContainer.css
+++ b/lib/dijit/themes/soria/layout/TabContainer.css
@@ -1,9 +1,5 @@
/**
* dijit.layout.TabContainer
- *
- * To style TabContainer with rounded corners
- * you can use these classes: .dijitTab (left), .dijitTabContent (center), dijitTabInnerDiv (right)
- * For tabs aligned to top you can style a stripe div right underneath the tabs using .dijitTabStripe
*/
/* Classes for all types of tabs (top/bottom/left/right) */
@@ -32,68 +28,39 @@
padding-left: 0;
}
-.soria .dijitTabInnerDiv {
- padding:0 3px 0 0;
- margin: 0 0 0 4px;
- background: url("../images/tabContainerSprite.gif") no-repeat;
- background-position: right -400px;
-}
-
.soria .dijitTab {
+ padding:4px 6px 2px 4px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -351px;
+ position: relative;
line-height:normal;
margin:0 2px 0 0; /* space between one tab and the next in top/bottom mode */
- padding:0;
- background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
color: #243C5F;
+ border: 1px #8BA0BD solid;
border-bottom: 1px #B1BADF solid;
}
-.soria .dijitTabInnerDiv .dijitTabContent {
- padding:4px 3px 2px 4px;
- background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
- position: relative;
-}
-
-
-
-.soria .dijitTabListWrapper {
- z-index: 10;
-}
-
/* hovered tab */
.soria .dijitTabHover {
color: #243C5F;
- background: url("../images/tabContainerSprite.gif") no-repeat 0 -150px;
-}
-
-.soria .dijitTabHover .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -250px;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -201px;
}
-.soria .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
- background: url("../images/tabContainerSprite.gif") repeat-x 0 -200px;
-}
-
-/* checked tab*/
+/* selected tab*/
.soria .dijitTabChecked
{
- /* the selected tab (with or without hover) */
- background: url("../images/tabContainerSprite.gif") no-repeat 0 -0;
+ background: url("../images/tabContainerSprite.gif") repeat-x 0 -51px;
+ color: #243C5F !important;
}
-.soria .dijitTabChecked .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -100px;
-}
-.soria .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
- color: #243C5F !important;
+.soria .dijitTabListWrapper {
+ z-index: 10;
}
+
/* Nested Tabs */
.soria .dijitTabContainerTabListNested {
- background: #F0F4FC;
background: #D9E9F9;
border: none;
}
@@ -102,11 +69,7 @@
border: none;
top: 0; /* override top:1px setting of top-level tabs */
}
-.soria .dijitTabContainerTabListNested .dijitTab .dijitTabInnerDiv,
-.soria .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
- background: none;
-}
-.soria .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent .tabLabel {
+.soria .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
text-decoration: underline;
}
.soria .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
@@ -146,6 +109,10 @@
border-color: #B1BADF;
padding-left: 3px;
}
+.soria .dijitTabContainerTop-tabs .dijitTab {
+ border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+}
.soria .dijitTabContainerTopNoStrip {
padding-top: 3px;
@@ -160,12 +127,12 @@
border-bottom: none;
}
-/*non-checked tabs */
+/*unselected tabs */
.soria .dijitTabContainerTop-tabs .dijitTab {
top: 1px;
}
-/* checked tabs */
+/* selected tabs */
.soria .dijitTabContainerTop-tabs .dijitTabChecked {
border-bottom-color: #94b4e6;
}
@@ -202,59 +169,32 @@
float: left;
}
-/* bottom container */
-.soria .dijitTabContainerBottom-container {
- border-bottom: none;
-}
-
.soria .dijitTabContainerBottom-tabs .dijitTab {
- border-bottom: none;
- border-top: 1px solid #B1BADF;
- background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
-}
-
-/* checked tabs */
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
- border-top-color:#94b4e6;
-}
-
-
-.soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
- padding-top: 3px;
- padding-bottom: 3px;
- background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
-}
-
-.soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom right;
+ border-bottom: none;
+ border-top: 1px solid #B1BADF;
+ border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ padding-top: 3px;
+ padding-bottom: 3px;
+ background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
}
.soria .dijitTabContainerBottom-tabs .dijitTabHover {
- color: #243C5F;
- background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom left;
-}
-
-.soria .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url("../images/tabBottomHoverSpriteLR.gif") no-repeat bottom right;
-}
-
-.soria .dijitTabContainerBottom-tabs .dijitTabHover .dijitTabInnerDiv .dijitTabContent {
background: url("../images/tabBottomHoverC.gif") repeat-x bottom left;
}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
- /* the selected tab (with or without hover) */
- background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom left;
+.soria .dijitTabContainerBottom-tabs .dijitTabChecked {
+ border-top-color:#94b4e6;
+ background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv {
- background: url("../images/tabBottomActiveSpriteLR.gif") no-repeat bottom right;
-}
-.soria .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
- background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
+/* bottom container */
+.soria .dijitTabContainerBottom-container {
+ border-bottom: none;
}
+
/* strip */
.soria .dijitTabContainerBottomStrip {
padding-bottom: 2px;
@@ -288,51 +228,44 @@
border-color: #ccc;
padding-top: 3px;
}
+.soria .dijitTabContainerRight-tabs .dijitTab {
+ border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-bottom: none;
+ border-left: 1px solid #B1BADF;
+ border-bottom: 1px solid #B1BADF !important;
+ padding: 4px 6px 2px 8px;
+}
+
+.soria .dijitTabContainerRight-tabs .dijitTabChecked {
+ border-left-color: #94b4e6;
+ background: url("../images/tabRightChecked.gif") no-repeat left top !important;
+}
+
/* right container */
.soria .dijitTabContainerRight-container {
border-right: none;
}
-.soria .dijitTabContainerRight-tabs .dijitTab {
- border-bottom: none;
- border-left: 1px solid #B1BADF;
- border-bottom: 1px solid #B1BADF !important;
-}
-
-/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
-.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
+/* some odd ie bug when borders disappear when setting a bottom margin, this sort of helps */
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTab,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTab {
border-bottom: solid #B1BADF 1px;
margin-bottom: -1px;
}
-/* checked tabs */
-.soria .dijitTabContainerRight-tabs .dijitTabChecked {
- border-left-color: #94b4e6;
-}
-
-.soria .dijitTabContainerRight-tabs .dijitTabChecked {
- background: url("../images/tabRightChecked.gif") no-repeat left top !important;
-}
-/* some odd ie bug when borders dissapear when setting a bottom margin, this sortof helps */
-.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+/* some odd ie bug when borders disappear when setting a bottom margin, this sort of helps */
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabChecked,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabChecked,
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover {
border-bottom: solid #94b4e6 1px;
margin-bottom: -1px;
}
-.soria .dijitTabContainerRight-tabs .dijitTab {
- background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
-}
-.soria .dijitTabContainerRight-tabs .dijitTabHover .dijitTab {
- background: url("../images/tabContainerSprite.gif") no-repeat left -200px;
-}
-
/* strip */
.soria .dijitTabContainerRightStrip {
padding-right: 2px;
@@ -348,43 +281,34 @@
padding-top: 3px;
height: 100%;
}
-
-/* left conatiner */
-.soria .dijitTabContainerLeft-container {
- border-left: none;
-}
-
.soria .dijitTabContainerLeft-tabs .dijitTab {
- border-right: 1px solid #B1BADF;
- border-bottom: 1px solid #B1BADF;
+ border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-right: 1px solid #B1BADF;
+ border-bottom: 1px solid #B1BADF;
}
-/* checked tabs */
.soria .dijitTabContainerLeft-tabs .dijitTabChecked {
border-right: 1px solid #94b4e6;
+ background: url("../images/tabLeftChecked.gif") no-repeat right top;
}
-.soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -350px;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTabHover .dijitTabInnerDiv {
- background: url("../images/tabContainerSprite.gif") no-repeat right -200px;
-}
-.soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
- background: url("../images/tabLeftChecked.gif") no-repeat right top;
+/* left container */
+.soria .dijitTabContainerLeft-container {
+ border-left: none;
}
-.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
+
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTab,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTab {
border-bottom: solid #B1BADF 1px;
margin-bottom: -1px;
}
-.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
-.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTab,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTab,
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTab,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTab {
border-bottom: solid #94b4e6 1px;
margin-bottom: -1px;
}
@@ -401,8 +325,7 @@
/* left/right tabs */
.soria .dijitTabContainerLeft-tabs .dijitTab,
.soria .dijitTabContainerRight-tabs .dijitTab {
- margin-right:auto;
- margin-bottom:2px; /* space between one tab and the next in left/right mode */
+ margin: 1px 0; /* space between one tab and the next in left/right mode */
}
/* left/right tabstrip */
@@ -421,7 +344,7 @@
}
/* ================================ */
-/* this resets the tabcontainer stripe when within a contentpane */
+/* this resets the tabcontainer strip when within a contentpane */
.soria .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
border-left: 0 solid #ccc;
border-top: 0 solid #ccc;
@@ -441,19 +364,11 @@
margin-top: 1px;
}
-.soria .tabStripButton .dijitTabContent{
- padding: 6px 0 5px 0;
-}
-
.dj_ie6 .soria .tabStripButton .dijitTabContent,
.dj_ie7 .soria .tabStripButton .dijitTabContent {
padding-top: 7px;
}
-.soria .tabStrip-disabled .tabStripButton .dijitTabContent {
- padding: 5px 0 3px 0;
-}
-
.dj_ie6 .soria .tabStrip-disabled .tabStripButton .dijitTabContent,
.dj_ie7 .soria .tabStrip-disabled .tabStripButton .dijitTabContent {
padding-top: 6px;
@@ -465,14 +380,10 @@
border-top: 1px solid #B1BADF;
}
-.soria .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
+.soria .dijitTabContainer .tabStripButton-bottom .dijitTab {
background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
}
-.soria .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
- background: transparent;
-}
-
.soria .dijitTabStripIcon {
height: 14px;
width: 14px;
diff --git a/lib/dijit/themes/tundra/Common.css b/lib/dijit/themes/tundra/Common.css
index eb3e341f7..82a133bec 100644
--- a/lib/dijit/themes/tundra/Common.css
+++ b/lib/dijit/themes/tundra/Common.css
@@ -1,16 +1,14 @@
-/* DnD avatar-specific settings */
-/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
-.tundra .dojoDndItemBefore {
- border-top: 2px solid #369;
+/* DnD hovered and selected node(s) */
+.tundra .dojoDndItemOver {
+ background-image: url(images/treeHover.png);
}
-
-.tundra .dojoDndItemAfter {
- border-bottom: 2px solid #369;
+.tundra .dojoDndItemAnchor,
+.tundra .dojoDndItemSelected {
+ background-color: #E2EBFE;
}
-.tundra .dojoDndItemOver {
- cursor:pointer;
-}
+/* DnD avatar-specific settings */
+/* For now it uses a default set of rules. Some other DnD classes can be modified as well. */
.tundra table.dojoDndAvatar { -moz-border-radius: 0; border: 1px solid #ccc; border-collapse: collapse; background-color: #fff; font-size: 75%; color: black;}
.tundra .dojoDndAvatar td { border: none; }
diff --git a/lib/dijit/themes/tundra/form/Button.css b/lib/dijit/themes/tundra/form/Button.css
index 2c68aef04..d274745e9 100644
--- a/lib/dijit/themes/tundra/form/Button.css
+++ b/lib/dijit/themes/tundra/form/Button.css
@@ -18,6 +18,9 @@
text-align: center;
padding: 0 0.3em;
}
+.tundra .dijitInputField {
+ padding: 0; /* set padding:0 for .tundra .dijitSelect .dijitButtonText but with a low priority rule that can be easily trumped by the user */
+}
.tundra .dijitDisabled .dijitButtonText {
color: #7F7F7F;
@@ -112,12 +115,11 @@
.tundra .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
background-position: -49px center;
}
-.dj_webkit .tundra .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner {
- margin-top: -1px; /* image has too many blank pixels on top */
-}
.dj_ie .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
margin-top: -2px; /* image has too many blank pixels on top */
}
+.dj_webkit .tundra .dijitSpinner .dijitUpArrowButton .dijitArrowButtonInner,
+.dj_iequirks .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner,
.dj_ie8 .tundra .dijitSpinner .dijitDownArrowButton .dijitArrowButtonInner {
margin-top: -1px; /* image has too many blank pixels on top */
}
diff --git a/lib/dijit/themes/tundra/form/Common.css b/lib/dijit/themes/tundra/form/Common.css
index 96899e138..2122184da 100644
--- a/lib/dijit/themes/tundra/form/Common.css
+++ b/lib/dijit/themes/tundra/form/Common.css
@@ -10,8 +10,7 @@
dijit.form.ComboBox (partial)
****/
-.tundra .dijitInputContainer input,
-.tundra .dijitTextBox {
+.tundra .dijitInputContainer input {
margin: 0 0.1em;
}
@@ -19,6 +18,8 @@
padding: 3px;
}
+.tundra .dijitSelect .dijitButtonContents,
+.tundra .dijitSelect,
.tundra .dijitTextBox {
/* For all except dijit.form.NumberSpinner: the actual input element.
For TextBox, ComboBox, Spinner: the div that contains the input.
@@ -26,13 +27,17 @@
*/
background:#fff url("../images/validationInputBg.png") repeat-x top left;
#background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+}
+.tundra .dijitSelect,
+.tundra .dijitTextBox {
border:1px solid #b3b3b3;
}
-/* ComboBox specific rules*/
+.tundra .dijitSelect .dijitArrowButton,
.tundra .dijitComboBox .dijitButtonNode {
padding: 0 0.2em;
}
+.tundra .dijitSelect .dijitButtonContents,
.tundra .dijitTextBox .dijitButtonNode {
/* line between the input area and the drop down button, and also between
* the up and down buttons of a spinner
@@ -40,10 +45,12 @@
border-color: #9b9b9b;
}
+.tundra .dijitSelectFocused,
.tundra .dijitTextBoxFocused {
/* input field when focused (ie: typing affects it) */
border-color:#406b9b;
}
+.tundra .dijitSelectFocused TD,
.tundra .dijitTextBoxFocused .dijitButtonNode {
border-color:#366dba;
}
@@ -59,7 +66,7 @@
}
/* Validation errors */
-.tundra .dijitValidationIcon {
+.tundra .dijitValidationTextBoxError .dijitValidationIcon {
/* prevent height change when widget goes from valid to invalid state */
width: 16px;
background: transparent url('../images/warning.png') no-repeat center center;
diff --git a/lib/dijit/themes/tundra/form/Select.css b/lib/dijit/themes/tundra/form/Select.css
index b0290167a..3e0e77e0a 100644
--- a/lib/dijit/themes/tundra/form/Select.css
+++ b/lib/dijit/themes/tundra/form/Select.css
@@ -1,47 +1,39 @@
-.tundra .dijitSelect .dijitButtonNode {
- padding: 0;
-}
-.tundra .dijitSelect .dijitButtonNode .dijitArrowButtonInner {
- margin: 0 4px 0 5px;
-}
-
/* Make unselected content portion "look" more like a text box and less like a button */
-.tundra .dijitSelect .dijitButtonContents {
- padding-top: 1px;
- background:#fff url("../images/validationInputBg.png") repeat-x top left;
- #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
-}
-.tundra .dijitSelectHover .dijitButtonContents,
-.tundra .dijitSelectActive .dijitButtonContents,
-.tundra .dijitSelectOpened .dijitButtonContents,
-.tundra .dijitSelectDisabled .dijitButtonContents,
-.tundra .dijitSelectReadOnly .dijitButtonContents{
+.tundra .dijitSelectError .dijitButtonContents,
+.tundra .dijitSelectHover .dijitArrowButton,
+.tundra .dijitSelectActive .dijitArrowButton,
+.tundra .dijitSelectOpened .dijitArrowButton,
+.tundra .dijitSelectDisabled .dijitArrowButton,
+.tundra .dijitSelectReadOnly .dijitArrowButton {
background: transparent none;
}
-.dj_ie .tundra .dijitSelect .dijitButtonContents {
- padding-top: 0;
+.tundra .dijitSelect .dijitArrowButton {
+ background: #fff url("../images/buttonEnabled.png") repeat-x bottom left;
+ border-width: 0;
}
/* Mirror DropDownButton */
-.tundra .dijitSelectDisabled .dijitButtonNode {
- border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+.tundra .dijitSelectDisabled,
+.tundra .dijitSelectDisabled TD {
+ border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5 !important;
background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
}
-.dj_ie .tundra .dijitSelectDisabled .dijitButtonNode * {
+.dj_ie .tundra .dijitSelectDisabled TD * {
filter: gray() alpha(opacity=50);
}
-.tundra .dijitSelectHover .dijitButtonNode {
- border-color:#a5beda;
- border-bottom-color:#5c7590;
- border-right-color:#5c7590;
+.tundra .dijitSelectHover,
+.tundra .dijitSelectHover TD {
+ border-color:#a5beda #5c7590 #5c7590 #a5beda !important;
color:#243C5F;
background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
}
-.tundra .dijitSelectActive .dijitButtonNode,
-.tundra .dijitSelectOpened .dijitButtonNode {
- border-color:#366dba;
+.tundra .dijitSelectActive,
+.tundra .dijitSelectOpened,
+.tundra .dijitSelectActive TD,
+.tundra .dijitSelectOpened TD {
+ border-color:#366dba !important;
background: #ededed url("../images/buttonActive.png") bottom repeat-x;
}
@@ -53,5 +45,3 @@
.tundra .dijitSelectMenu .dijitMenuArrowCell {
padding: 0.1em 0.2em;
}
-
-
diff --git a/lib/dijit/themes/tundra/images/dndNoCopy.png b/lib/dijit/themes/tundra/images/dndNoCopy.png
index 9bf9c3396..998c2f269 100644
--- a/lib/dijit/themes/tundra/images/dndNoCopy.png
+++ b/lib/dijit/themes/tundra/images/dndNoCopy.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/dndNoMove.png b/lib/dijit/themes/tundra/images/dndNoMove.png
index cb8bd8bdd..e909173e0 100644
--- a/lib/dijit/themes/tundra/images/dndNoMove.png
+++ b/lib/dijit/themes/tundra/images/dndNoMove.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/layout/TabContainer.css b/lib/dijit/themes/tundra/layout/TabContainer.css
index 667da4ad9..a6676c673 100644
--- a/lib/dijit/themes/tundra/layout/TabContainer.css
+++ b/lib/dijit/themes/tundra/layout/TabContainer.css
@@ -9,15 +9,11 @@
.tundra .dijitTab {
line-height:normal;
margin-right:4px; /* space between one tab and the next in top/bottom mode */
- padding:0;
+ padding:2px 8px 2px 9px;
border:1px solid #ccc;
background:#e2e2e2 url("../images/tabEnabled.png") repeat-x;
}
-.tundra .dijitTabInnerDiv {
- padding:2px 8px 2px 9px;
-}
-
.tundra .dijitTabSpacer {
display: none;
}
@@ -37,7 +33,7 @@
bottom: 2px;
}
-/* checked tab*/
+/* selected tab */
.tundra .dijitTabChecked {
/* the selected tab (with or without hover) */
background-color:#fff;
@@ -98,12 +94,11 @@
border: none;
top: 0; /* to override top: 1px/-1px for normal tabs */
}
-.tundra .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
-}
-.tundra .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent .tabLabel {
+
+.tundra .dijitTabContainerTabListNested .dijitTabHover .tabLabel {
text-decoration: underline;
}
-.tundra .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent .tabLabel {
+.tundra .dijitTabContainerTabListNested .dijitTabChecked .tabLabel {
text-decoration: underline;
font-weight: bold;
/*background:#f3f3f3;*/
@@ -149,7 +144,7 @@
border-top: none;
}
-/* checked tabs */
+/* selected tab */
.tundra .dijitTabContainerTop-tabs .dijitTabChecked {
border-bottom-color:white;
}
@@ -192,7 +187,7 @@
border-bottom: none;
}
-/* checked tabs */
+/* selected tab */
.tundra .dijitTabContainerBottom-tabs .dijitTabChecked {
border-top-color:white;
}
@@ -222,7 +217,7 @@
border-right: none;
}
-/* checked tabs */
+/* selected tab */
.tundra .dijitTabContainerRight-tabs .dijitTabChecked {
border-left-color:white;
}
@@ -245,12 +240,12 @@
height: 100%;
}
-/* left conatiner */
+/* left container */
.tundra .dijitTabContainerLeft-container {
border-left: none;
}
-/* checked tabs */
+/* selected tab */
.tundra .dijitTabContainerLeft-tabs .dijitTabChecked {
border-right-color:white;
}
@@ -292,29 +287,18 @@
}
.tundra .dijitTabContainerBottom .tabStripButton {
- padding-top: 2px;
+ padding-top: 3px;
}
-.tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+.tundra .tabStrip-disabled .tabStripButton {
padding-bottom: 3px;
padding-top: 1px;
}
-.tundra .tabStripButton .dijitTabInnerDiv {
+.tundra .tabStripButton {
padding: 3px 2px 4px 2px;
}
-.dj_ie6 .tundra .tabStripButton .dijitTabInnerDiv,
-.dj_ie7 .tundra .tabStripButton .dijitTabInnerDiv,
-.dj_opera .tundra .tabStripButton .dijitTabInnerDiv {
- padding-bottom: 5px;
-}
-.dj_ie6 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
-.dj_ie7 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
-.dj_opera .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
- padding-bottom: 4px;
-}
-
.tundra .dijitTabStripIcon {
height: 14px;
width: 14px;
diff --git a/lib/dijit/themes/tundra/layout/TabContainer_rtl.css b/lib/dijit/themes/tundra/layout/TabContainer_rtl.css
index fb8e28e9b..6e5ba7580 100644
--- a/lib/dijit/themes/tundra/layout/TabContainer_rtl.css
+++ b/lib/dijit/themes/tundra/layout/TabContainer_rtl.css
@@ -1,51 +1,3 @@
.tundra .dijitTabRtl {
- -moz-box-orient:horizontal;
- text-align: right;
-}
-
-.tundra .dijitTabRtl .dijitTabInnerDiv {
padding:2px 9px 2px 8px;
}
-
-.tundra .tabStrip-disabled .tabStripButtonRtl .dijitTabInnerDiv {
- /* this is not special for RTL mode, but just here to override rule above (for enabled tabstrip) */
- padding-bottom: 3px;
- padding-top: 1px;
-}
-
-.tundra .tabStripButtonRtl .dijitTabInnerDiv {
- padding: 3px 2px 4px 2px;
-}
-
-.tundra .dijitTabPaneWrapper {
- #zoom: 1;
-}
-
-.dj_ie-rtl .tundra .dijitTabContainerLeft-tabs {
- margin-left: 1px !important;
-}
-
-.dj_ie-rtl .tundra .dijitTabContainerRight-tabs {
- margin-right: 1px !important;
-}
-
-.tundra .dijitTabContainerLeft-tabs .dijitTabRtl,
-.tundra .dijitTabContainerRight-tabs .dijitTabRtl {
- margin-left:0;
-}
-
-.dj_ie .tundra .dijitTabRtl .dijitTabInnerDiv {
- /* without this the tab label and icon become invisible, as though they were set to visibility:hidden */
- width : 0.1% !important;
-}
-
-
-
-.dj_iequirks-rtl .tundra .dijitTabContainerTopNone,
-.dj_iequirks-rtl .tundra .dijitTabContainerBottomNone {
- /* this strange rule prevents IE6 bug in themeTesterQuirk.html?dir=rtl upon closing
- * "Closable" tab, where the other tabs disappear
- */
- border-left: 1px solid #fff;
- border-right: 1px solid #fff;
-}
diff --git a/lib/dijit/tree/ForestStoreModel.js b/lib/dijit/tree/ForestStoreModel.js
index d0b895335..c8520788b 100644
--- a/lib/dijit/tree/ForestStoreModel.js
+++ b/lib/dijit/tree/ForestStoreModel.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/tree/ForestStoreModel",["dojo/_base/array","dojo/_base/declare","dojo/_base/lang","dojo/_base/window","./TreeStoreModel"],function(_1,_2,_3,_4,_5){return _2("dijit.tree.ForestStoreModel",_5,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_6){this.root={store:this,root:true,id:_6.rootId,label:_6.rootLabel,children:_6.rootChildren};},mayHaveChildren:function(_7){return _7===this.root||this.inherited(arguments);},getChildren:function(_8,_9,_a){if(_8===this.root){if(this.root.children){_9(this.root.children);}else{this.store.fetch({query:this.query,onComplete:_3.hitch(this,function(_b){this.root.children=_b;_9(_b);}),onError:_a});}}else{this.inherited(arguments);}},isItem:function(_c){return (_c===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_d){if(_d.identity==this.root.id){var _e=_d.scope?_d.scope:_4.global;if(_d.onItem){_d.onItem.call(_e,this.root);}}else{this.inherited(arguments);}},getIdentity:function(_f){return (_f===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(_10){return (_10===this.root)?this.root.label:this.inherited(arguments);},newItem:function(_11,_12,_13){if(_12===this.root){this.onNewRootItem(_11);return this.store.newItem(_11);}else{return this.inherited(arguments);}},onNewRootItem:function(){},pasteItem:function(_14,_15,_16,_17,_18){if(_15===this.root){if(!_17){this.onLeaveRoot(_14);}}this.inherited(arguments,[_14,_15===this.root?null:_15,_16===this.root?null:_16,_17,_18]);if(_16===this.root){this.onAddToRoot(_14);}},onAddToRoot:function(_19){},onLeaveRoot:function(_1a){},_requeryTop:function(){var _1b=this.root.children||[];this.store.fetch({query:this.query,onComplete:_3.hitch(this,function(_1c){this.root.children=_1c;if(_1b.length!=_1c.length||_1.some(_1b,function(_1d,idx){return _1c[idx]!=_1d;})){this.onChildrenChange(this.root,_1c);}})});},onNewItem:function(_1e,_1f){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(_20){if(_1.indexOf(this.root.children,_20)!=-1){this._requeryTop();}this.inherited(arguments);},onSetItem:function(_21,_22,_23,_24){this._requeryTop();this.inherited(arguments);}});}); \ No newline at end of file
+define("dijit/tree/ForestStoreModel",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","./TreeStoreModel"],function(_1,_2,_3,_4,_5){return _2("dijit.tree.ForestStoreModel",_5,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_6){this.root={store:this,root:true,id:_6.rootId,label:_6.rootLabel,children:_6.rootChildren};},mayHaveChildren:function(_7){return _7===this.root||this.inherited(arguments);},getChildren:function(_8,_9,_a){if(_8===this.root){if(this.root.children){_9(this.root.children);}else{this.store.fetch({query:this.query,onComplete:_4.hitch(this,function(_b){this.root.children=_b;_9(_b);}),onError:_a});}}else{this.inherited(arguments);}},isItem:function(_c){return (_c===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_d){if(_d.identity==this.root.id){var _e=_d.scope||_3.global;if(_d.onItem){_d.onItem.call(_e,this.root);}}else{this.inherited(arguments);}},getIdentity:function(_f){return (_f===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(_10){return (_10===this.root)?this.root.label:this.inherited(arguments);},newItem:function(_11,_12,_13){if(_12===this.root){this.onNewRootItem(_11);return this.store.newItem(_11);}else{return this.inherited(arguments);}},onNewRootItem:function(){},pasteItem:function(_14,_15,_16,_17,_18){if(_15===this.root){if(!_17){this.onLeaveRoot(_14);}}this.inherited(arguments,[_14,_15===this.root?null:_15,_16===this.root?null:_16,_17,_18]);if(_16===this.root){this.onAddToRoot(_14);}},onAddToRoot:function(_19){},onLeaveRoot:function(_1a){},_requeryTop:function(){var _1b=this.root.children||[];this.store.fetch({query:this.query,onComplete:_4.hitch(this,function(_1c){this.root.children=_1c;if(_1b.length!=_1c.length||_1.some(_1b,function(_1d,idx){return _1c[idx]!=_1d;})){this.onChildrenChange(this.root,_1c);}})});},onNewItem:function(_1e,_1f){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(_20){if(_1.indexOf(this.root.children,_20)!=-1){this._requeryTop();}this.inherited(arguments);},onSetItem:function(_21,_22,_23,_24){this._requeryTop();this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/tree/ForestStoreModel.js.uncompressed.js b/lib/dijit/tree/ForestStoreModel.js.uncompressed.js
new file mode 100644
index 000000000..2ef8d1546
--- /dev/null
+++ b/lib/dijit/tree/ForestStoreModel.js.uncompressed.js
@@ -0,0 +1,279 @@
+define("dijit/tree/ForestStoreModel", [
+ "dojo/_base/array", // array.indexOf array.some
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // global
+ "dojo/_base/lang", // lang.hitch
+ "./TreeStoreModel"
+], function(array, declare, kernel, lang, TreeStoreModel){
+
+// module:
+// dijit/tree/ForestStoreModel
+
+return declare("dijit.tree.ForestStoreModel", TreeStoreModel, {
+ // summary:
+ // Interface between a dijit.Tree and a dojo.data store that doesn't have a root item,
+ // a.k.a. a store that has multiple "top level" items.
+ //
+ // description:
+ // Use this class to wrap a dojo.data store, making all the items matching the specified query
+ // appear as children of a fabricated "root item". If no query is specified then all the
+ // items returned by fetch() on the underlying store become children of the root item.
+ // This class allows dijit.Tree to assume a single root item, even if the store doesn't have one.
+ //
+ // When using this class the developer must override a number of methods according to their app and
+ // data, including:
+ //
+ // - onNewRootItem
+ // - onAddToRoot
+ // - onLeaveRoot
+ // - onNewItem
+ // - onSetItem
+
+ // Parameters to constructor
+
+ // rootId: String
+ // ID of fabricated root item
+ rootId: "$root$",
+
+ // rootLabel: String
+ // Label of fabricated root item
+ rootLabel: "ROOT",
+
+ // query: String
+ // Specifies the set of children of the root item.
+ // example:
+ // | {type:'continent'}
+ query: null,
+
+ // End of parameters to constructor
+
+ constructor: function(params){
+ // summary:
+ // Sets up variables, etc.
+ // tags:
+ // private
+
+ // Make dummy root item
+ this.root = {
+ store: this,
+ root: true,
+ id: params.rootId,
+ label: params.rootLabel,
+ children: params.rootChildren // optional param
+ };
+ },
+
+ // =======================================================================
+ // Methods for traversing hierarchy
+
+ mayHaveChildren: function(/*dojo/data/Item*/ item){
+ // summary:
+ // Tells if an item has or may have children. Implementing logic here
+ // avoids showing +/- expando icon for nodes that we know don't have children.
+ // (For efficiency reasons we may not want to check if an element actually
+ // has children until user clicks the expando node)
+ // tags:
+ // extension
+ return item === this.root || this.inherited(arguments);
+ },
+
+ getChildren: function(/*dojo/data/Item*/ parentItem, /*function(items)*/ callback, /*function*/ onError){
+ // summary:
+ // Calls onComplete() with array of child items of given parent item, all loaded.
+ if(parentItem === this.root){
+ if(this.root.children){
+ // already loaded, just return
+ callback(this.root.children);
+ }else{
+ this.store.fetch({
+ query: this.query,
+ onComplete: lang.hitch(this, function(items){
+ this.root.children = items;
+ callback(items);
+ }),
+ onError: onError
+ });
+ }
+ }else{
+ this.inherited(arguments);
+ }
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ isItem: function(/* anything */ something){
+ return (something === this.root) ? true : this.inherited(arguments);
+ },
+
+ fetchItemByIdentity: function(/* object */ keywordArgs){
+ if(keywordArgs.identity == this.root.id){
+ var scope = keywordArgs.scope || kernel.global;
+ if(keywordArgs.onItem){
+ keywordArgs.onItem.call(scope, this.root);
+ }
+ }else{
+ this.inherited(arguments);
+ }
+ },
+
+ getIdentity: function(/* item */ item){
+ return (item === this.root) ? this.root.id : this.inherited(arguments);
+ },
+
+ getLabel: function(/* item */ item){
+ return (item === this.root) ? this.root.label : this.inherited(arguments);
+ },
+
+ // =======================================================================
+ // Write interface
+
+ newItem: function(/* dijit/tree/dndSource.__Item */ args, /*Item*/ parent, /*int?*/ insertIndex){
+ // summary:
+ // Creates a new item. See dojo/data/api/Write for details on args.
+ // Used in drag & drop when item from external source dropped onto tree.
+ if(parent === this.root){
+ this.onNewRootItem(args);
+ return this.store.newItem(args);
+ }else{
+ return this.inherited(arguments);
+ }
+ },
+
+ onNewRootItem: function(/* dijit/tree/dndSource.__Item */ /*===== args =====*/){
+ // summary:
+ // User can override this method to modify a new element that's being
+ // added to the root of the tree, for example to add a flag like root=true
+ },
+
+ pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){
+ // summary:
+ // Move or copy an item from one parent item to another.
+ // Used in drag & drop
+ if(oldParentItem === this.root){
+ if(!bCopy){
+ // It's onLeaveRoot()'s responsibility to modify the item so it no longer matches
+ // this.query... thus triggering an onChildrenChange() event to notify the Tree
+ // that this element is no longer a child of the root node
+ this.onLeaveRoot(childItem);
+ }
+ }
+ this.inherited(arguments, [childItem,
+ oldParentItem === this.root ? null : oldParentItem,
+ newParentItem === this.root ? null : newParentItem,
+ bCopy,
+ insertIndex
+ ]);
+ if(newParentItem === this.root){
+ // It's onAddToRoot()'s responsibility to modify the item so it matches
+ // this.query... thus triggering an onChildrenChange() event to notify the Tree
+ // that this element is now a child of the root node
+ this.onAddToRoot(childItem);
+ }
+ },
+
+ // =======================================================================
+ // Handling for top level children
+
+ onAddToRoot: function(/* item */ item){
+ // summary:
+ // Called when item added to root of tree; user must override this method
+ // to modify the item so that it matches the query for top level items
+ // example:
+ // | store.setValue(item, "root", true);
+ // tags:
+ // extension
+ console.log(this, ": item ", item, " added to root");
+ },
+
+ onLeaveRoot: function(/* item */ item){
+ // summary:
+ // Called when item removed from root of tree; user must override this method
+ // to modify the item so it doesn't match the query for top level items
+ // example:
+ // | store.unsetAttribute(item, "root");
+ // tags:
+ // extension
+ console.log(this, ": item ", item, " removed from root");
+ },
+
+ // =======================================================================
+ // Events from data store
+
+ _requeryTop: function(){
+ // reruns the query for the children of the root node,
+ // sending out an onSet notification if those children have changed
+ var oldChildren = this.root.children || [];
+ this.store.fetch({
+ query: this.query,
+ onComplete: lang.hitch(this, function(newChildren){
+ this.root.children = newChildren;
+
+ // If the list of children or the order of children has changed...
+ if(oldChildren.length != newChildren.length ||
+ array.some(oldChildren, function(item, idx){ return newChildren[idx] != item;})){
+ this.onChildrenChange(this.root, newChildren);
+ }
+ })
+ });
+ },
+
+ onNewItem: function(/* dojo/data/api/Item */ item, /* Object */ parentInfo){
+ // summary:
+ // Handler for when new items appear in the store. Developers should override this
+ // method to be more efficient based on their app/data.
+ // description:
+ // Note that the default implementation requeries the top level items every time
+ // a new item is created, since any new item could be a top level item (even in
+ // addition to being a child of another item, since items can have multiple parents).
+ //
+ // If developers can detect which items are possible top level items (based on the item and the
+ // parentInfo parameters), they should override this method to only call _requeryTop() for top
+ // level items. Often all top level items have parentInfo==null, but
+ // that will depend on which store you use and what your data is like.
+ // tags:
+ // extension
+ this._requeryTop();
+
+ this.inherited(arguments);
+ },
+
+ onDeleteItem: function(/*Object*/ item){
+ // summary:
+ // Handler for delete notifications from underlying store
+
+ // check if this was a child of root, and if so send notification that root's children
+ // have changed
+ if(array.indexOf(this.root.children, item) != -1){
+ this._requeryTop();
+ }
+
+ this.inherited(arguments);
+ },
+
+ onSetItem: function(/* item */ item,
+ /* attribute-name-string */ attribute,
+ /* Object|Array */ oldValue,
+ /* Object|Array */ newValue){
+ // summary:
+ // Updates the tree view according to changes to an item in the data store.
+ // Developers should override this method to be more efficient based on their app/data.
+ // description:
+ // Handles updates to an item's children by calling onChildrenChange(), and
+ // other updates to an item by calling onChange().
+ //
+ // Also, any change to any item re-executes the query for the tree's top-level items,
+ // since this modified item may have started/stopped matching the query for top level items.
+ //
+ // If possible, developers should override this function to only call _requeryTop() when
+ // the change to the item has caused it to stop/start being a top level item in the tree.
+ // tags:
+ // extension
+
+ this._requeryTop();
+ this.inherited(arguments);
+ }
+
+});
+
+});
diff --git a/lib/dijit/tree/ObjectStoreModel.js b/lib/dijit/tree/ObjectStoreModel.js
new file mode 100644
index 000000000..7021bec52
--- /dev/null
+++ b/lib/dijit/tree/ObjectStoreModel.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/tree/ObjectStoreModel",["dojo/_base/array","dojo/aspect","dojo/_base/declare","dojo/_base/lang","dojo/when"],function(_1,_2,_3,_4,_5){return _3("dijit.tree.ObjectStoreModel",null,{store:null,labelAttr:"name",root:null,query:null,constructor:function(_6){_4.mixin(this,_6);this.childrenCache={};},destroy:function(){for(var id in this.childrenCache){this.childrenCache[id].close&&this.childrenCache[id].close();}},getRoot:function(_7,_8){if(this.root){_7(this.root);}else{var _9;_5(_9=this.store.query(this.query),_4.hitch(this,function(_a){if(_a.length!=1){throw new Error("dijit.tree.ObjectStoreModel: root query returned "+_a.length+" items, but must return exactly one");}this.root=_a[0];_7(this.root);if(_9.observe){_9.observe(_4.hitch(this,function(_b){this.onChange(_b);}),true);}}),_8);}},mayHaveChildren:function(){return true;},getChildren:function(_c,_d,_e){var id=this.store.getIdentity(_c);if(this.childrenCache[id]){_5(this.childrenCache[id],_d,_e);return;}var _f=this.childrenCache[id]=this.store.getChildren(_c);_5(_f,_d,_e);if(_f.observe){_f.observe(_4.hitch(this,function(obj,_10,_11){this.onChange(obj);if(_10!=_11){_5(_f,_4.hitch(this,"onChildrenChange",_c));}}),true);}},isItem:function(){return true;},fetchItemByIdentity:function(_12){this.store.get(_12.identity).then(_4.hitch(_12.scope,_12.onItem),_4.hitch(_12.scope,_12.onError));},getIdentity:function(_13){return this.store.getIdentity(_13);},getLabel:function(_14){return _14[this.labelAttr];},newItem:function(_15,_16,_17,_18){return this.store.put(_15,{parent:_16,before:_18});},pasteItem:function(_19,_1a,_1b,_1c,_1d,_1e){if(!_1c){var _1f=[].concat(this.childrenCache[this.getIdentity(_1a)]),_20=_1.indexOf(_1f,_19);_1f.splice(_20,1);this.onChildrenChange(_1a,_1f);}return this.store.put(_19,{overwrite:true,parent:_1b,before:_1e});},onChange:function(){},onChildrenChange:function(){},onDelete:function(){}});}); \ No newline at end of file
diff --git a/lib/dijit/tree/ObjectStoreModel.js.uncompressed.js b/lib/dijit/tree/ObjectStoreModel.js.uncompressed.js
new file mode 100644
index 000000000..901f85f1b
--- /dev/null
+++ b/lib/dijit/tree/ObjectStoreModel.js.uncompressed.js
@@ -0,0 +1,250 @@
+define("dijit/tree/ObjectStoreModel", [
+ "dojo/_base/array", // array.filter array.forEach array.indexOf array.some
+ "dojo/aspect", // aspect.before, aspect.after
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.hitch
+ "dojo/when"
+], function(array, aspect, declare, lang, when){
+
+ // module:
+ // dijit/tree/ObjectStoreModel
+
+ return declare("dijit.tree.ObjectStoreModel", null, {
+ // summary:
+ // Implements dijit/tree/model connecting dijit/Tree to a dojo/store/api/Store that implements
+ // getChildren().
+ //
+ // If getChildren() returns an array with an observe() method, then it will be leveraged to reflect
+ // store updates to the tree. So, this class will work best when:
+ //
+ // 1. the store implements dojo/store/Observable
+ // 2. getChildren() is implemented as a query to the server (i.e. it calls store.query())
+ //
+ // Drag and Drop: To support drag and drop, besides implementing getChildren()
+ // and dojo/store/Observable, the store must support the parent option to put().
+ // And in order to have child elements ordered according to how the user dropped them,
+ // put() must support the before option.
+
+ // store: dojo/store/api/Store
+ // Underlying store
+ store: null,
+
+ // labelAttr: String
+ // Get label for tree node from this attribute
+ labelAttr: "name",
+
+ // root: [readonly] Object
+ // Pointer to the root item from the dojo/store/api/Store (read only, not a parameter)
+ root: null,
+
+ // query: anything
+ // Specifies datastore query to return the root item for the tree.
+ // Must only return a single item. Alternately can just pass in pointer
+ // to root item.
+ // example:
+ // | {id:'ROOT'}
+ query: null,
+
+ constructor: function(/* Object */ args){
+ // summary:
+ // Passed the arguments listed above (store, etc)
+ // tags:
+ // private
+
+ lang.mixin(this, args);
+
+ this.childrenCache = {}; // map from id to array of children
+ },
+
+ destroy: function(){
+ // TODO: should cancel any in-progress processing of getRoot(), getChildren()
+ for(var id in this.childrenCache){
+ this.childrenCache[id].close && this.childrenCache[id].close();
+ }
+ },
+
+ // =======================================================================
+ // Methods for traversing hierarchy
+
+ getRoot: function(onItem, onError){
+ // summary:
+ // Calls onItem with the root item for the tree, possibly a fabricated item.
+ // Calls onError on error.
+ if(this.root){
+ onItem(this.root);
+ }else{
+ var res;
+ when(res = this.store.query(this.query),
+ lang.hitch(this, function(items){
+ //console.log("queried root: ", res);
+ if(items.length != 1){
+ throw new Error("dijit.tree.ObjectStoreModel: root query returned " + items.length +
+ " items, but must return exactly one");
+ }
+ this.root = items[0];
+ onItem(this.root);
+
+ // Setup listener to detect if root item changes
+ if(res.observe){
+ res.observe(lang.hitch(this, function(obj){
+ // Presumably removedFrom == insertedInto == 1, and this call indicates item has changed.
+ //console.log("root changed: ", obj);
+ this.onChange(obj);
+ }), true); // true to listen for updates to obj
+ }
+ }),
+ onError
+ );
+ }
+ },
+
+ mayHaveChildren: function(/*===== item =====*/){
+ // summary:
+ // Tells if an item has or may have children. Implementing logic here
+ // avoids showing +/- expando icon for nodes that we know don't have children.
+ // (For efficiency reasons we may not want to check if an element actually
+ // has children until user clicks the expando node).
+ //
+ // Application code should override this method based on the data, for example
+ // it could be `return item.leaf == true;`.
+ // item: Object
+ // Item from the dojo/store
+ return true;
+ },
+
+ getChildren: function(/*Object*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){
+ // summary:
+ // Calls onComplete() with array of child items of given parent item.
+ // parentItem:
+ // Item from the dojo/store
+
+ var id = this.store.getIdentity(parentItem);
+ if(this.childrenCache[id]){
+ when(this.childrenCache[id], onComplete, onError);
+ return;
+ }
+
+ var res = this.childrenCache[id] = this.store.getChildren(parentItem);
+
+ // User callback
+ when(res, onComplete, onError);
+
+ // Setup listener in case children list changes, or the item(s) in the children list are
+ // updated in some way.
+ if(res.observe){
+ res.observe(lang.hitch(this, function(obj, removedFrom, insertedInto){
+ //console.log("observe on children of ", id, ": ", obj, removedFrom, insertedInto);
+
+ // If removedFrom == insertedInto, this call indicates that the item has changed.
+ // Even if removedFrom != insertedInto, the item may have changed.
+ this.onChange(obj);
+
+ if(removedFrom != insertedInto){
+ // Indicates an item was added, removed, or re-parented. The children[] array (returned from
+ // res.then(...)) has already been updated (like a live collection), so just use it.
+ when(res, lang.hitch(this, "onChildrenChange", parentItem));
+ }
+ }), true); // true means to notify on item changes
+ }
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ isItem: function(/*===== something =====*/){
+ return true; // Boolean
+ },
+
+ fetchItemByIdentity: function(/* object */ keywordArgs){
+ this.store.get(keywordArgs.identity).then(
+ lang.hitch(keywordArgs.scope, keywordArgs.onItem),
+ lang.hitch(keywordArgs.scope, keywordArgs.onError)
+ );
+ },
+
+ getIdentity: function(/* item */ item){
+ return this.store.getIdentity(item); // Object
+ },
+
+ getLabel: function(/*dojo/data/Item*/ item){
+ // summary:
+ // Get the label for an item
+ return item[this.labelAttr]; // String
+ },
+
+ // =======================================================================
+ // Write interface, for DnD
+
+ newItem: function(/* dijit/tree/dndSource.__Item */ args, /*Item*/ parent, /*int?*/ insertIndex, /*Item*/ before){
+ // summary:
+ // Creates a new item. See `dojo/data/api/Write` for details on args.
+ // Used in drag & drop when item from external source dropped onto tree.
+
+ return this.store.put(args, {
+ parent: parent,
+ before: before
+ });
+ },
+
+ pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem,
+ /*Boolean*/ bCopy, /*int?*/ insertIndex, /*Item*/ before){
+ // summary:
+ // Move or copy an item from one parent item to another.
+ // Used in drag & drop
+
+ if(!bCopy){
+ // In order for DnD moves to work correctly, childItem needs to be orphaned from oldParentItem
+ // before being adopted by newParentItem. That way, the TreeNode is moved rather than
+ // an additional TreeNode being created, and the old TreeNode subsequently being deleted.
+ // The latter loses information such as selection and opened/closed children TreeNodes.
+ // Unfortunately simply calling this.store.put() will send notifications in a random order, based
+ // on when the TreeNodes in question originally appeared, and not based on the drag-from
+ // TreeNode vs. the drop-onto TreeNode.
+
+ var oldParentChildren = [].concat(this.childrenCache[this.getIdentity(oldParentItem)]), // concat to make copy
+ index = array.indexOf(oldParentChildren, childItem);
+ oldParentChildren.splice(index, 1);
+ this.onChildrenChange(oldParentItem, oldParentChildren);
+ }
+
+ return this.store.put(childItem, {
+ overwrite: true,
+ parent: newParentItem,
+ before: before
+ });
+ },
+
+ // =======================================================================
+ // Callbacks
+
+ onChange: function(/*dojo/data/Item*/ /*===== item =====*/){
+ // summary:
+ // Callback whenever an item has changed, so that Tree
+ // can update the label, icon, etc. Note that changes
+ // to an item's children or parent(s) will trigger an
+ // onChildrenChange() so you can ignore those changes here.
+ // tags:
+ // callback
+ },
+
+ onChildrenChange: function(/*===== parent, newChildrenList =====*/){
+ // summary:
+ // Callback to do notifications about new, updated, or deleted items.
+ // parent: dojo/data/Item
+ // newChildrenList: Object[]
+ // Items from the store
+ // tags:
+ // callback
+ },
+
+ onDelete: function(/*dojo/data/Item*/ /*===== item =====*/){
+ // summary:
+ // Callback when an item has been deleted.
+ // Actually we have no way of knowing this with the new dojo.store API,
+ // so this method is never called (but it's left here since Tree connects
+ // to it).
+ // tags:
+ // callback
+ }
+ });
+});
diff --git a/lib/dijit/tree/TreeStoreModel.js b/lib/dijit/tree/TreeStoreModel.js
index f61977c2f..bba7dc74c 100644
--- a/lib/dijit/tree/TreeStoreModel.js
+++ b/lib/dijit/tree/TreeStoreModel.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/tree/TreeStoreModel",["dojo/_base/array","dojo/aspect","dojo/_base/declare","dojo/_base/json","dojo/_base/lang"],function(_1,_2,_3,_4,_5){return _3("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_6){_5.mixin(this,_6);this.connects=[];var _7=this.store;if(!_7.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_7.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([_2.after(_7,"onNew",_5.hitch(this,"onNewItem"),true),_2.after(_7,"onDelete",_5.hitch(this,"onDeleteItem"),true),_2.after(_7,"onSet",_5.hitch(this,"onSetItem"),true)]);}},destroy:function(){var h;while(h=this.connects.pop()){h.remove();}},getRoot:function(_8,_9){if(this.root){_8(this.root);}else{this.store.fetch({query:this.query,onComplete:_5.hitch(this,function(_a){if(_a.length!=1){throw new Error(this.declaredClass+": query "+_4.stringify(this.query)+" returned "+_a.length+" items, but must return exactly one item");}this.root=_a[0];_8(this.root);}),onError:_9});}},mayHaveChildren:function(_b){return _1.some(this.childrenAttrs,function(_c){return this.store.hasAttribute(_b,_c);},this);},getChildren:function(_d,_e,_f){var _10=this.store;if(!_10.isItemLoaded(_d)){var _11=_5.hitch(this,arguments.callee);_10.loadItem({item:_d,onItem:function(_12){_11(_12,_e,_f);},onError:_f});return;}var _13=[];for(var i=0;i<this.childrenAttrs.length;i++){var _14=_10.getValues(_d,this.childrenAttrs[i]);_13=_13.concat(_14);}var _15=0;if(!this.deferItemLoadingUntilExpand){_1.forEach(_13,function(_16){if(!_10.isItemLoaded(_16)){_15++;}});}if(_15==0){_e(_13);}else{_1.forEach(_13,function(_17,idx){if(!_10.isItemLoaded(_17)){_10.loadItem({item:_17,onItem:function(_18){_13[idx]=_18;if(--_15==0){_e(_13);}},onError:_f});}});}},isItem:function(_19){return this.store.isItem(_19);},fetchItemByIdentity:function(_1a){this.store.fetchItemByIdentity(_1a);},getIdentity:function(_1b){return this.store.getIdentity(_1b);},getLabel:function(_1c){if(this.labelAttr){return this.store.getValue(_1c,this.labelAttr);}else{return this.store.getLabel(_1c);}},newItem:function(_1d,_1e,_1f){var _20={parent:_1e,attribute:this.childrenAttrs[0]},_21;if(this.newItemIdAttr&&_1d[this.newItemIdAttr]){this.fetchItemByIdentity({identity:_1d[this.newItemIdAttr],scope:this,onItem:function(_22){if(_22){this.pasteItem(_22,null,_1e,true,_1f);}else{_21=this.store.newItem(_1d,_20);if(_21&&(_1f!=undefined)){this.pasteItem(_21,_1e,_1e,false,_1f);}}}});}else{_21=this.store.newItem(_1d,_20);if(_21&&(_1f!=undefined)){this.pasteItem(_21,_1e,_1e,false,_1f);}}},pasteItem:function(_23,_24,_25,_26,_27){var _28=this.store,_29=this.childrenAttrs[0];if(_24){_1.forEach(this.childrenAttrs,function(_2a){if(_28.containsValue(_24,_2a,_23)){if(!_26){var _2b=_1.filter(_28.getValues(_24,_2a),function(x){return x!=_23;});_28.setValues(_24,_2a,_2b);}_29=_2a;}});}if(_25){if(typeof _27=="number"){var _2c=_28.getValues(_25,_29).slice();_2c.splice(_27,0,_23);_28.setValues(_25,_29,_2c);}else{_28.setValues(_25,_29,_28.getValues(_25,_29).concat(_23));}}},onChange:function(){},onChildrenChange:function(){},onDelete:function(){},onNewItem:function(_2d,_2e){if(!_2e){return;}this.getChildren(_2e.item,_5.hitch(this,function(_2f){this.onChildrenChange(_2e.item,_2f);}));},onDeleteItem:function(_30){this.onDelete(_30);},onSetItem:function(_31,_32){if(_1.indexOf(this.childrenAttrs,_32)!=-1){this.getChildren(_31,_5.hitch(this,function(_33){this.onChildrenChange(_31,_33);}));}else{this.onChange(_31);}}});}); \ No newline at end of file
+define("dijit/tree/TreeStoreModel",["dojo/_base/array","dojo/aspect","dojo/_base/declare","dojo/_base/lang"],function(_1,_2,_3,_4){return _3("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_5){_4.mixin(this,_5);this.connects=[];var _6=this.store;if(!_6.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.tree.TreeStoreModel: store must support dojo.data.Identity");}if(_6.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([_2.after(_6,"onNew",_4.hitch(this,"onNewItem"),true),_2.after(_6,"onDelete",_4.hitch(this,"onDeleteItem"),true),_2.after(_6,"onSet",_4.hitch(this,"onSetItem"),true)]);}},destroy:function(){var h;while(h=this.connects.pop()){h.remove();}},getRoot:function(_7,_8){if(this.root){_7(this.root);}else{this.store.fetch({query:this.query,onComplete:_4.hitch(this,function(_9){if(_9.length!=1){throw new Error("dijit.tree.TreeStoreModel: root query returned "+_9.length+" items, but must return exactly one");}this.root=_9[0];_7(this.root);}),onError:_8});}},mayHaveChildren:function(_a){return _1.some(this.childrenAttrs,function(_b){return this.store.hasAttribute(_a,_b);},this);},getChildren:function(_c,_d,_e){var _f=this.store;if(!_f.isItemLoaded(_c)){var _10=_4.hitch(this,arguments.callee);_f.loadItem({item:_c,onItem:function(_11){_10(_11,_d,_e);},onError:_e});return;}var _12=[];for(var i=0;i<this.childrenAttrs.length;i++){var _13=_f.getValues(_c,this.childrenAttrs[i]);_12=_12.concat(_13);}var _14=0;if(!this.deferItemLoadingUntilExpand){_1.forEach(_12,function(_15){if(!_f.isItemLoaded(_15)){_14++;}});}if(_14==0){_d(_12);}else{_1.forEach(_12,function(_16,idx){if(!_f.isItemLoaded(_16)){_f.loadItem({item:_16,onItem:function(_17){_12[idx]=_17;if(--_14==0){_d(_12);}},onError:_e});}});}},isItem:function(_18){return this.store.isItem(_18);},fetchItemByIdentity:function(_19){this.store.fetchItemByIdentity(_19);},getIdentity:function(_1a){return this.store.getIdentity(_1a);},getLabel:function(_1b){if(this.labelAttr){return this.store.getValue(_1b,this.labelAttr);}else{return this.store.getLabel(_1b);}},newItem:function(_1c,_1d,_1e){var _1f={parent:_1d,attribute:this.childrenAttrs[0]},_20;if(this.newItemIdAttr&&_1c[this.newItemIdAttr]){this.fetchItemByIdentity({identity:_1c[this.newItemIdAttr],scope:this,onItem:function(_21){if(_21){this.pasteItem(_21,null,_1d,true,_1e);}else{_20=this.store.newItem(_1c,_1f);if(_20&&(_1e!=undefined)){this.pasteItem(_20,_1d,_1d,false,_1e);}}}});}else{_20=this.store.newItem(_1c,_1f);if(_20&&(_1e!=undefined)){this.pasteItem(_20,_1d,_1d,false,_1e);}}},pasteItem:function(_22,_23,_24,_25,_26){var _27=this.store,_28=this.childrenAttrs[0];if(_23){_1.forEach(this.childrenAttrs,function(_29){if(_27.containsValue(_23,_29,_22)){if(!_25){var _2a=_1.filter(_27.getValues(_23,_29),function(x){return x!=_22;});_27.setValues(_23,_29,_2a);}_28=_29;}});}if(_24){if(typeof _26=="number"){var _2b=_27.getValues(_24,_28).slice();_2b.splice(_26,0,_22);_27.setValues(_24,_28,_2b);}else{_27.setValues(_24,_28,_27.getValues(_24,_28).concat(_22));}}},onChange:function(){},onChildrenChange:function(){},onDelete:function(){},onNewItem:function(_2c,_2d){if(!_2d){return;}this.getChildren(_2d.item,_4.hitch(this,function(_2e){this.onChildrenChange(_2d.item,_2e);}));},onDeleteItem:function(_2f){this.onDelete(_2f);},onSetItem:function(_30,_31){if(_1.indexOf(this.childrenAttrs,_31)!=-1){this.getChildren(_30,_4.hitch(this,function(_32){this.onChildrenChange(_30,_32);}));}else{this.onChange(_30);}}});}); \ No newline at end of file
diff --git a/lib/dijit/tree/TreeStoreModel.js.uncompressed.js b/lib/dijit/tree/TreeStoreModel.js.uncompressed.js
new file mode 100644
index 000000000..307de04cb
--- /dev/null
+++ b/lib/dijit/tree/TreeStoreModel.js.uncompressed.js
@@ -0,0 +1,379 @@
+define("dijit/tree/TreeStoreModel", [
+ "dojo/_base/array", // array.filter array.forEach array.indexOf array.some
+ "dojo/aspect", // aspect.after
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang" // lang.hitch
+], function(array, aspect, declare, lang){
+
+ // module:
+ // dijit/tree/TreeStoreModel
+
+ return declare("dijit.tree.TreeStoreModel", null, {
+ // summary:
+ // Implements dijit/Tree/model connecting to a dojo.data store with a single
+ // root item. Any methods passed into the constructor will override
+ // the ones defined here.
+
+ // store: dojo/data/api/Read
+ // Underlying store
+ store: null,
+
+ // childrenAttrs: String[]
+ // One or more attribute names (attributes in the dojo.data item) that specify that item's children
+ childrenAttrs: ["children"],
+
+ // newItemIdAttr: String
+ // Name of attribute in the Object passed to newItem() that specifies the id.
+ //
+ // If newItemIdAttr is set then it's used when newItem() is called to see if an
+ // item with the same id already exists, and if so just links to the old item
+ // (so that the old item ends up with two parents).
+ //
+ // Setting this to null or "" will make every drop create a new item.
+ newItemIdAttr: "id",
+
+ // labelAttr: String
+ // If specified, get label for tree node from this attribute, rather
+ // than by calling store.getLabel()
+ labelAttr: "",
+
+ // root: [readonly] dojo/data/Item
+ // Pointer to the root item (read only, not a parameter)
+ root: null,
+
+ // query: anything
+ // Specifies datastore query to return the root item for the tree.
+ // Must only return a single item. Alternately can just pass in pointer
+ // to root item.
+ // example:
+ // | {id:'ROOT'}
+ query: null,
+
+ // deferItemLoadingUntilExpand: Boolean
+ // Setting this to true will cause the TreeStoreModel to defer calling loadItem on nodes
+ // until they are expanded. This allows for lazying loading where only one
+ // loadItem (and generally one network call, consequently) per expansion
+ // (rather than one for each child).
+ // This relies on partial loading of the children items; each children item of a
+ // fully loaded item should contain the label and info about having children.
+ deferItemLoadingUntilExpand: false,
+
+ constructor: function(/* Object */ args){
+ // summary:
+ // Passed the arguments listed above (store, etc)
+ // tags:
+ // private
+
+ lang.mixin(this, args);
+
+ this.connects = [];
+
+ var store = this.store;
+ if(!store.getFeatures()['dojo.data.api.Identity']){
+ throw new Error("dijit.tree.TreeStoreModel: store must support dojo.data.Identity");
+ }
+
+ // if the store supports Notification, subscribe to the notification events
+ if(store.getFeatures()['dojo.data.api.Notification']){
+ this.connects = this.connects.concat([
+ 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)
+ ]);
+ }
+ },
+
+ destroy: function(){
+ var h;
+ while(h = this.connects.pop()){ h.remove(); }
+ // TODO: should cancel any in-progress processing of getRoot(), getChildren()
+ },
+
+ // =======================================================================
+ // Methods for traversing hierarchy
+
+ getRoot: function(onItem, onError){
+ // summary:
+ // Calls onItem with the root item for the tree, possibly a fabricated item.
+ // Calls onError on error.
+ if(this.root){
+ onItem(this.root);
+ }else{
+ this.store.fetch({
+ query: this.query,
+ onComplete: lang.hitch(this, function(items){
+ if(items.length != 1){
+ throw new Error("dijit.tree.TreeStoreModel: root query returned " + items.length +
+ " items, but must return exactly one");
+ }
+ this.root = items[0];
+ onItem(this.root);
+ }),
+ onError: onError
+ });
+ }
+ },
+
+ mayHaveChildren: function(/*dojo/data/Item*/ item){
+ // summary:
+ // Tells if an item has or may have children. Implementing logic here
+ // avoids showing +/- expando icon for nodes that we know don't have children.
+ // (For efficiency reasons we may not want to check if an element actually
+ // has children until user clicks the expando node)
+ return array.some(this.childrenAttrs, function(attr){
+ return this.store.hasAttribute(item, attr);
+ }, this);
+ },
+
+ getChildren: function(/*dojo/data/Item*/ parentItem, /*function(items)*/ onComplete, /*function*/ onError){
+ // summary:
+ // Calls onComplete() with array of child items of given parent item, all loaded.
+
+ var store = this.store;
+ if(!store.isItemLoaded(parentItem)){
+ // The parent is not loaded yet, we must be in deferItemLoadingUntilExpand
+ // mode, so we will load it and just return the children (without loading each
+ // child item)
+ var getChildren = lang.hitch(this, arguments.callee);
+ store.loadItem({
+ item: parentItem,
+ onItem: function(parentItem){
+ getChildren(parentItem, onComplete, onError);
+ },
+ onError: onError
+ });
+ return;
+ }
+ // get children of specified item
+ var childItems = [];
+ for(var i=0; i<this.childrenAttrs.length; i++){
+ var vals = store.getValues(parentItem, this.childrenAttrs[i]);
+ childItems = childItems.concat(vals);
+ }
+
+ // count how many items need to be loaded
+ var _waitCount = 0;
+ if(!this.deferItemLoadingUntilExpand){
+ array.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+ }
+
+ if(_waitCount == 0){
+ // all items are already loaded (or we aren't loading them). proceed...
+ onComplete(childItems);
+ }else{
+ // still waiting for some or all of the items to load
+ array.forEach(childItems, function(item, idx){
+ if(!store.isItemLoaded(item)){
+ store.loadItem({
+ item: item,
+ onItem: function(item){
+ childItems[idx] = item;
+ if(--_waitCount == 0){
+ // all nodes have been loaded, send them to the tree
+ onComplete(childItems);
+ }
+ },
+ onError: onError
+ });
+ }
+ });
+ }
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ isItem: function(/* anything */ something){
+ return this.store.isItem(something); // Boolean
+ },
+
+ fetchItemByIdentity: function(/* object */ keywordArgs){
+ this.store.fetchItemByIdentity(keywordArgs);
+ },
+
+ getIdentity: function(/* item */ item){
+ return this.store.getIdentity(item); // Object
+ },
+
+ getLabel: function(/*dojo/data/Item*/ item){
+ // summary:
+ // Get the label for an item
+ if(this.labelAttr){
+ return this.store.getValue(item,this.labelAttr); // String
+ }else{
+ return this.store.getLabel(item); // String
+ }
+ },
+
+ // =======================================================================
+ // Write interface
+
+ newItem: function(/* dijit/tree/dndSource.__Item */ args, /*dojo/data/api/Item*/ parent, /*int?*/ insertIndex){
+ // summary:
+ // Creates a new item. See `dojo/data/api/Write` for details on args.
+ // Used in drag & drop when item from external source dropped onto tree.
+ // description:
+ // Developers will need to override this method if new items get added
+ // to parents with multiple children attributes, in order to define which
+ // children attribute points to the new item.
+
+ var pInfo = {parent: parent, attribute: this.childrenAttrs[0]}, LnewItem;
+
+ if(this.newItemIdAttr && args[this.newItemIdAttr]){
+ // Maybe there's already a corresponding item in the store; if so, reuse it.
+ this.fetchItemByIdentity({identity: args[this.newItemIdAttr], scope: this, onItem: function(item){
+ if(item){
+ // There's already a matching item in store, use it
+ this.pasteItem(item, null, parent, true, insertIndex);
+ }else{
+ // Create new item in the tree, based on the drag source.
+ LnewItem=this.store.newItem(args, pInfo);
+ if(LnewItem && (insertIndex!=undefined)){
+ // Move new item to desired position
+ this.pasteItem(LnewItem, parent, parent, false, insertIndex);
+ }
+ }
+ }});
+ }else{
+ // [as far as we know] there is no id so we must assume this is a new item
+ LnewItem=this.store.newItem(args, pInfo);
+ if(LnewItem && (insertIndex!=undefined)){
+ // Move new item to desired position
+ this.pasteItem(LnewItem, parent, parent, false, insertIndex);
+ }
+ }
+ },
+
+ pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){
+ // summary:
+ // Move or copy an item from one parent item to another.
+ // Used in drag & drop
+ var store = this.store,
+ parentAttr = this.childrenAttrs[0]; // name of "children" attr in parent item
+
+ // remove child from source item, and record the attribute that child occurred in
+ if(oldParentItem){
+ array.forEach(this.childrenAttrs, function(attr){
+ if(store.containsValue(oldParentItem, attr, childItem)){
+ if(!bCopy){
+ var values = array.filter(store.getValues(oldParentItem, attr), function(x){
+ return x != childItem;
+ });
+ store.setValues(oldParentItem, attr, values);
+ }
+ parentAttr = attr;
+ }
+ });
+ }
+
+ // modify target item's children attribute to include this item
+ if(newParentItem){
+ if(typeof insertIndex == "number"){
+ // call slice() to avoid modifying the original array, confusing the data store
+ var childItems = store.getValues(newParentItem, parentAttr).slice();
+ childItems.splice(insertIndex, 0, childItem);
+ store.setValues(newParentItem, parentAttr, childItems);
+ }else{
+ store.setValues(newParentItem, parentAttr,
+ store.getValues(newParentItem, parentAttr).concat(childItem));
+ }
+ }
+ },
+
+ // =======================================================================
+ // Callbacks
+
+ onChange: function(/*dojo/data/Item*/ /*===== item =====*/){
+ // summary:
+ // Callback whenever an item has changed, so that Tree
+ // can update the label, icon, etc. Note that changes
+ // to an item's children or parent(s) will trigger an
+ // onChildrenChange() so you can ignore those changes here.
+ // tags:
+ // callback
+ },
+
+ onChildrenChange: function(/*===== parent, newChildrenList =====*/){
+ // summary:
+ // Callback to do notifications about new, updated, or deleted items.
+ // parent: dojo/data/Item
+ // newChildrenList: dojo/data/Item[]
+ // tags:
+ // callback
+ },
+
+ onDelete: function(/*dojo/data/Item*/ /*===== item =====*/){
+ // summary:
+ // Callback when an item has been deleted.
+ // description:
+ // Note that there will also be an onChildrenChange() callback for the parent
+ // of this item.
+ // tags:
+ // callback
+ },
+
+ // =======================================================================
+ // Events from data store
+
+ onNewItem: function(/* dojo/data/Item */ item, /* Object */ parentInfo){
+ // summary:
+ // Handler for when new items appear in the store, either from a drop operation
+ // or some other way. Updates the tree view (if necessary).
+ // description:
+ // If the new item is a child of an existing item,
+ // calls onChildrenChange() with the new list of children
+ // for that existing item.
+ //
+ // tags:
+ // extension
+
+ // We only care about the new item if it has a parent that corresponds to a TreeNode
+ // we are currently displaying
+ if(!parentInfo){
+ return;
+ }
+
+ // Call onChildrenChange() on parent (ie, existing) item with new list of children
+ // In the common case, the new list of children is simply parentInfo.newValue or
+ // [ parentInfo.newValue ], although if items in the store has multiple
+ // child attributes (see `childrenAttr`), then it's a superset of parentInfo.newValue,
+ // so call getChildren() to be sure to get right answer.
+ this.getChildren(parentInfo.item, lang.hitch(this, function(children){
+ this.onChildrenChange(parentInfo.item, children);
+ }));
+ },
+
+ onDeleteItem: function(/*Object*/ item){
+ // summary:
+ // Handler for delete notifications from underlying store
+ this.onDelete(item);
+ },
+
+ onSetItem: function(item, attribute /*===== , oldValue, newValue =====*/){
+ // summary:
+ // Updates the tree view according to changes in the data store.
+ // description:
+ // Handles updates to an item's children by calling onChildrenChange(), and
+ // other updates to an item by calling onChange().
+ //
+ // See `onNewItem` for more details on handling updates to an item's children.
+ // item: Item
+ // attribute: attribute-name-string
+ // oldValue: Object|Array
+ // newValue: Object|Array
+ // tags:
+ // extension
+
+ if(array.indexOf(this.childrenAttrs, attribute) != -1){
+ // item's children list changed
+ this.getChildren(item, lang.hitch(this, function(children){
+ // See comments in onNewItem() about calling getChildren()
+ this.onChildrenChange(item, children);
+ }));
+ }else{
+ // item's label/icon/etc. changed.
+ this.onChange(item);
+ }
+ }
+ });
+});
diff --git a/lib/dijit/tree/_dndContainer.js b/lib/dijit/tree/_dndContainer.js
index f361278c1..c42bb417c 100644
--- a/lib/dijit/tree/_dndContainer.js
+++ b/lib/dijit/tree/_dndContainer.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/tree/_dndContainer",["dojo/aspect","dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/_base/lang","dojo/mouse","dojo/on"],function(_1,_2,_3,_4,_5,_6,on){return _2("dijit.tree._dndContainer",null,{constructor:function(_7,_8){this.tree=_7;this.node=_7.domNode;_5.mixin(this,_8);this.current=null;this.containerState="";_3.add(this.node,"dojoDndContainer");this.events=[on(this.node,_6.enter,_5.hitch(this,"onOverEvent")),on(this.node,_6.leave,_5.hitch(this,"onOutEvent")),_1.after(this.tree,"_onNodeMouseEnter",_5.hitch(this,"onMouseOver"),true),_1.after(this.tree,"_onNodeMouseLeave",_5.hitch(this,"onMouseOut"),true),on(this.node,"dragstart",_5.hitch(_4,"stop")),on(this.node,"selectstart",_5.hitch(_4,"stop"))];},destroy:function(){var h;while(h=this.events.pop()){h.remove();}this.node=this.parent=null;},onMouseOver:function(_9){this.current=_9;},onMouseOut:function(){this.current=null;},_changeState:function(_a,_b){var _c="dojoDnd"+_a;var _d=_a.toLowerCase()+"State";_3.replace(this.node,_c+_b,_c+this[_d]);this[_d]=_b;},_addItemClass:function(_e,_f){_3.add(_e,"dojoDndItem"+_f);},_removeItemClass:function(_10,_11){_3.remove(_10,"dojoDndItem"+_11);},onOverEvent:function(){this._changeState("Container","Over");},onOutEvent:function(){this._changeState("Container","");}});}); \ No newline at end of file
+define("dijit/tree/_dndContainer",["dojo/aspect","dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/_base/lang","dojo/on","dojo/touch"],function(_1,_2,_3,_4,_5,on,_6){return _2("dijit.tree._dndContainer",null,{constructor:function(_7,_8){this.tree=_7;this.node=_7.domNode;_5.mixin(this,_8);this.current=null;this.containerState="";_3.add(this.node,"dojoDndContainer");this.events=[on(this.node,_6.enter,_5.hitch(this,"onOverEvent")),on(this.node,_6.leave,_5.hitch(this,"onOutEvent")),_1.after(this.tree,"_onNodeMouseEnter",_5.hitch(this,"onMouseOver"),true),_1.after(this.tree,"_onNodeMouseLeave",_5.hitch(this,"onMouseOut"),true),on(this.node,"dragstart",_5.hitch(_4,"stop")),on(this.node,"selectstart",_5.hitch(_4,"stop"))];},destroy:function(){var h;while(h=this.events.pop()){h.remove();}this.node=this.parent=null;},onMouseOver:function(_9){this.current=_9;},onMouseOut:function(){this.current=null;},_changeState:function(_a,_b){var _c="dojoDnd"+_a;var _d=_a.toLowerCase()+"State";_3.replace(this.node,_c+_b,_c+this[_d]);this[_d]=_b;},_addItemClass:function(_e,_f){_3.add(_e,"dojoDndItem"+_f);},_removeItemClass:function(_10,_11){_3.remove(_10,"dojoDndItem"+_11);},onOverEvent:function(){this._changeState("Container","Over");},onOutEvent:function(){this._changeState("Container","");}});}); \ No newline at end of file
diff --git a/lib/dijit/tree/_dndContainer.js.uncompressed.js b/lib/dijit/tree/_dndContainer.js.uncompressed.js
new file mode 100644
index 000000000..c4ad84d01
--- /dev/null
+++ b/lib/dijit/tree/_dndContainer.js.uncompressed.js
@@ -0,0 +1,165 @@
+define("dijit/tree/_dndContainer", [
+ "dojo/aspect", // aspect.after
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove domClass.replace
+ "dojo/_base/event", // event.stop
+ "dojo/_base/lang", // lang.mixin lang.hitch
+ "dojo/on",
+ "dojo/touch"
+], function(aspect, declare,domClass, event, lang, on, touch){
+
+ // module:
+ // dijit/tree/_dndContainer
+
+ /*=====
+ var __Args = {
+ // summary:
+ // A dict of parameters for Tree source configuration.
+ // isSource: Boolean?
+ // Can be used as a DnD source. Defaults to true.
+ // accept: String[]
+ // List of accepted types (text strings) for a target; defaults to
+ // ["text", "treeNode"]
+ // copyOnly: Boolean?
+ // Copy items, if true, use a state of Ctrl key otherwise,
+ // dragThreshold: Number
+ // The move delay in pixels before detecting a drag; 0 by default
+ // betweenThreshold: Integer
+ // Distance from upper/lower edge of node to allow drop to reorder nodes
+ };
+ =====*/
+
+ return declare("dijit.tree._dndContainer", null, {
+
+ // summary:
+ // This is a base class for `dijit/tree/_dndSelector`, and isn't meant to be used directly.
+ // It's modeled after `dojo/dnd/Container`.
+ // tags:
+ // protected
+
+ /*=====
+ // current: DomNode
+ // The currently hovered TreeNode.rowNode (which is the DOM node
+ // associated w/a given node in the tree, excluding it's descendants)
+ current: null,
+ =====*/
+
+ constructor: function(tree, params){
+ // summary:
+ // A constructor of the Container
+ // tree: Node
+ // Node or node's id to build the container on
+ // params: __Args
+ // A dict of parameters, which gets mixed into the object
+ // tags:
+ // private
+ this.tree = tree;
+ this.node = tree.domNode; // TODO: rename; it's not a TreeNode but the whole Tree
+ lang.mixin(this, params);
+
+ // class-specific variables
+ this.current = null; // current TreeNode's DOM node
+
+ // states
+ this.containerState = "";
+ domClass.add(this.node, "dojoDndContainer");
+
+ // set up events
+ this.events = [
+ // Mouse (or touch) enter/leave on Tree itself
+ on(this.node, touch.enter, lang.hitch(this, "onOverEvent")),
+ on(this.node, touch.leave, lang.hitch(this, "onOutEvent")),
+
+ // switching between TreeNodes
+ aspect.after(this.tree, "_onNodeMouseEnter", lang.hitch(this, "onMouseOver"), true),
+ aspect.after(this.tree, "_onNodeMouseLeave", lang.hitch(this, "onMouseOut"), true),
+
+ // cancel text selection and text dragging
+ on(this.node, "dragstart", lang.hitch(event, "stop")),
+ on(this.node, "selectstart", lang.hitch(event, "stop"))
+ ];
+ },
+
+ destroy: function(){
+ // summary:
+ // Prepares this object to be garbage-collected
+
+ var h;
+ while(h = this.events.pop()){ h.remove(); }
+
+ // this.clearItems();
+ this.node = this.parent = null;
+ },
+
+ // mouse events
+ onMouseOver: function(widget /*===== , evt =====*/){
+ // summary:
+ // Called when mouse is moved over a TreeNode
+ // widget: TreeNode
+ // evt: Event
+ // tags:
+ // protected
+ this.current = widget;
+ },
+
+ onMouseOut: function(/*===== widget, evt =====*/){
+ // summary:
+ // Called when mouse is moved away from a TreeNode
+ // widget: TreeNode
+ // evt: Event
+ // tags:
+ // protected
+ this.current = null;
+ },
+
+ _changeState: function(type, newState){
+ // summary:
+ // Changes a named state to new state value
+ // type: String
+ // A name of the state to change
+ // newState: String
+ // new state
+ var prefix = "dojoDnd" + type;
+ var state = type.toLowerCase() + "State";
+ //domClass.replace(this.node, prefix + newState, prefix + this[state]);
+ domClass.replace(this.node, prefix + newState, prefix + this[state]);
+ this[state] = newState;
+ },
+
+ _addItemClass: function(node, type){
+ // summary:
+ // Adds a class with prefix "dojoDndItem"
+ // node: Node
+ // A node
+ // type: String
+ // A variable suffix for a class name
+ domClass.add(node, "dojoDndItem" + type);
+ },
+
+ _removeItemClass: function(node, type){
+ // summary:
+ // Removes a class with prefix "dojoDndItem"
+ // node: Node
+ // A node
+ // type: String
+ // A variable suffix for a class name
+ domClass.remove(node, "dojoDndItem" + type);
+ },
+
+ onOverEvent: function(){
+ // summary:
+ // This function is called once, when mouse is over our container
+ // tags:
+ // protected
+ this._changeState("Container", "Over");
+ },
+
+ onOutEvent: function(){
+ // summary:
+ // This function is called once, when mouse is out of our container
+ // tags:
+ // protected
+ this._changeState("Container", "");
+ }
+ });
+});
diff --git a/lib/dijit/tree/_dndSelector.js b/lib/dijit/tree/_dndSelector.js
index f0567444f..2bb8bb1ed 100644
--- a/lib/dijit/tree/_dndSelector.js
+++ b/lib/dijit/tree/_dndSelector.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/tree/_dndSelector",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/mouse","dojo/on","dojo/touch","dojo/_base/window","./_dndContainer"],function(_1,_2,_3,_4,_5,on,_6,_7,_8){return _3("dijit.tree._dndSelector",_8,{constructor:function(){this.selection={};this.anchor=null;this.tree.domNode.setAttribute("aria-multiselect",!this.singular);this.events.push(on(this.tree.domNode,_6.press,_4.hitch(this,"onMouseDown")),on(this.tree.domNode,_6.release,_4.hitch(this,"onMouseUp")),on(this.tree.domNode,_6.move,_4.hitch(this,"onMouseMove")));},singular:false,getSelectedTreeNodes:function(){var _9=[],_a=this.selection;for(var i in _a){_9.push(_a[i]);}return _9;},selectNone:function(){this.setSelection([]);return this;},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},addTreeNode:function(_b,_c){this.setSelection(this.getSelectedTreeNodes().concat([_b]));if(_c){this.anchor=_b;}return _b;},removeTreeNode:function(_d){this.setSelection(this._setDifference(this.getSelectedTreeNodes(),[_d]));return _d;},isTreeNodeSelected:function(_e){return _e.id&&!!this.selection[_e.id];},setSelection:function(_f){var _10=this.getSelectedTreeNodes();_1.forEach(this._setDifference(_10,_f),_4.hitch(this,function(_11){_11.setSelected(false);if(this.anchor==_11){delete this.anchor;}delete this.selection[_11.id];}));_1.forEach(this._setDifference(_f,_10),_4.hitch(this,function(_12){_12.setSelected(true);this.selection[_12.id]=_12;}));this._updateSelectionProperties();},_setDifference:function(xs,ys){_1.forEach(ys,function(y){y.__exclude__=true;});var ret=_1.filter(xs,function(x){return !x.__exclude__;});_1.forEach(ys,function(y){delete y["__exclude__"];});return ret;},_updateSelectionProperties:function(){var _13=this.getSelectedTreeNodes();var _14=[],_15=[];_1.forEach(_13,function(_16){_15.push(_16);_14.push(_16.getTreePath());});var _17=_1.map(_15,function(_18){return _18.item;});this.tree._set("paths",_14);this.tree._set("path",_14[0]||[]);this.tree._set("selectedNodes",_15);this.tree._set("selectedNode",_15[0]||null);this.tree._set("selectedItems",_17);this.tree._set("selectedItem",_17[0]||null);},onMouseDown:function(e){if(!this.current||this.tree.isExpandoNode(e.target,this.current)){return;}if(!_5.isLeft(e)){return;}e.preventDefault();var _19=this.current,_1a=_2.isCopyKey(e),id=_19.id;if(!this.singular&&!e.shiftKey&&this.selection[id]){this._doDeselect=true;return;}else{this._doDeselect=false;}this.userSelect(_19,_1a,e.shiftKey);},onMouseUp:function(e){if(!this._doDeselect){return;}this._doDeselect=false;this.userSelect(this.current,_2.isCopyKey(e),e.shiftKey);},onMouseMove:function(){this._doDeselect=false;},_compareNodes:function(n1,n2){if(n1===n2){return 0;}if("sourceIndex" in document.documentElement){return n1.sourceIndex-n2.sourceIndex;}else{if("compareDocumentPosition" in document.documentElement){return n1.compareDocumentPosition(n2)&2?1:-1;}else{if(document.createRange){var r1=doc.createRange();r1.setStartBefore(n1);var r2=doc.createRange();r2.setStartBefore(n2);return r1.compareBoundaryPoints(r1.END_TO_END,r2);}else{throw Error("dijit.tree._compareNodes don't know how to compare two different nodes in this browser");}}}},userSelect:function(_1b,_1c,_1d){if(this.singular){if(this.anchor==_1b&&_1c){this.selectNone();}else{this.setSelection([_1b]);this.anchor=_1b;}}else{if(_1d&&this.anchor){var cr=this._compareNodes(this.anchor.rowNode,_1b.rowNode),_1e,end,_1f=this.anchor;if(cr<0){_1e=_1f;end=_1b;}else{_1e=_1b;end=_1f;}var _20=[];while(_1e!=end){_20.push(_1e);_1e=this.tree._getNextNode(_1e);}_20.push(end);this.setSelection(_20);}else{if(this.selection[_1b.id]&&_1c){this.removeTreeNode(_1b);}else{if(_1c){this.addTreeNode(_1b,true);}else{this.setSelection([_1b]);this.anchor=_1b;}}}}},getItem:function(key){var _21=this.selection[key];return {data:_21,type:["treeNode"]};},forInSelectedItems:function(f,o){o=o||_7.global;for(var id in this.selection){f.call(o,this.getItem(id),id,this);}}});}); \ No newline at end of file
+define("dijit/tree/_dndSelector",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/Deferred","dojo/_base/kernel","dojo/_base/lang","dojo/cookie","dojo/mouse","dojo/on","dojo/touch","./_dndContainer"],function(_1,_2,_3,_4,_5,_6,_7,_8,on,_9,_a){return _3("dijit.tree._dndSelector",_a,{constructor:function(){this.selection={};this.anchor=null;if(!this.cookieName&&this.tree.id){this.cookieName=this.tree.id+"SaveSelectedCookie";}this.events.push(on(this.tree.domNode,_9.press,_6.hitch(this,"onMouseDown")),on(this.tree.domNode,_9.release,_6.hitch(this,"onMouseUp")),on(this.tree.domNode,_9.move,_6.hitch(this,"onMouseMove")));},singular:false,getSelectedTreeNodes:function(){var _b=[],_c=this.selection;for(var i in _c){_b.push(_c[i]);}return _b;},selectNone:function(){this.setSelection([]);return this;},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},addTreeNode:function(_d,_e){this.setSelection(this.getSelectedTreeNodes().concat([_d]));if(_e){this.anchor=_d;}return _d;},removeTreeNode:function(_f){this.setSelection(this._setDifference(this.getSelectedTreeNodes(),[_f]));return _f;},isTreeNodeSelected:function(_10){return _10.id&&!!this.selection[_10.id];},setSelection:function(_11){var _12=this.getSelectedTreeNodes();_1.forEach(this._setDifference(_12,_11),_6.hitch(this,function(_13){_13.setSelected(false);if(this.anchor==_13){delete this.anchor;}delete this.selection[_13.id];}));_1.forEach(this._setDifference(_11,_12),_6.hitch(this,function(_14){_14.setSelected(true);this.selection[_14.id]=_14;}));this._updateSelectionProperties();},_setDifference:function(xs,ys){_1.forEach(ys,function(y){y.__exclude__=true;});var ret=_1.filter(xs,function(x){return !x.__exclude__;});_1.forEach(ys,function(y){delete y["__exclude__"];});return ret;},_updateSelectionProperties:function(){var _15=this.getSelectedTreeNodes();var _16=[],_17=[],_18=[];_1.forEach(_15,function(_19){var ary=_19.getTreePath(),_1a=this.tree.model;_17.push(_19);_16.push(ary);ary=_1.map(ary,function(_1b){return _1a.getIdentity(_1b);},this);_18.push(ary.join("/"));},this);var _1c=_1.map(_17,function(_1d){return _1d.item;});this.tree._set("paths",_16);this.tree._set("path",_16[0]||[]);this.tree._set("selectedNodes",_17);this.tree._set("selectedNode",_17[0]||null);this.tree._set("selectedItems",_1c);this.tree._set("selectedItem",_1c[0]||null);if(this.tree.persist&&_18.length>0){_7(this.cookieName,_18.join(","),{expires:365});}},_getSavedPaths:function(){var _1e=this.tree;if(_1e.persist&&_1e.dndController.cookieName){var _1f,_20=[];_1f=_7(_1e.dndController.cookieName);if(_1f){_20=_1.map(_1f.split(","),function(_21){return _21.split("/");});}return _20;}},onMouseDown:function(e){if(!this.current||this.tree.isExpandoNode(e.target,this.current)){return;}if(_8.isLeft(e)){e.preventDefault();}else{if(e.type!="touchstart"){return;}}var _22=this.current,_23=_2.isCopyKey(e),id=_22.id;if(!this.singular&&!e.shiftKey&&this.selection[id]){this._doDeselect=true;return;}else{this._doDeselect=false;}this.userSelect(_22,_23,e.shiftKey);},onMouseUp:function(e){if(!this._doDeselect){return;}this._doDeselect=false;this.userSelect(this.current,_2.isCopyKey(e),e.shiftKey);},onMouseMove:function(){this._doDeselect=false;},_compareNodes:function(n1,n2){if(n1===n2){return 0;}if("sourceIndex" in document.documentElement){return n1.sourceIndex-n2.sourceIndex;}else{if("compareDocumentPosition" in document.documentElement){return n1.compareDocumentPosition(n2)&2?1:-1;}else{if(document.createRange){var r1=doc.createRange();r1.setStartBefore(n1);var r2=doc.createRange();r2.setStartBefore(n2);return r1.compareBoundaryPoints(r1.END_TO_END,r2);}else{throw Error("dijit.tree._compareNodes don't know how to compare two different nodes in this browser");}}}},userSelect:function(_24,_25,_26){if(this.singular){if(this.anchor==_24&&_25){this.selectNone();}else{this.setSelection([_24]);this.anchor=_24;}}else{if(_26&&this.anchor){var cr=this._compareNodes(this.anchor.rowNode,_24.rowNode),_27,end,_28=this.anchor;if(cr<0){_27=_28;end=_24;}else{_27=_24;end=_28;}var _29=[];while(_27!=end){_29.push(_27);_27=this.tree._getNextNode(_27);}_29.push(end);this.setSelection(_29);}else{if(this.selection[_24.id]&&_25){this.removeTreeNode(_24);}else{if(_25){this.addTreeNode(_24,true);}else{this.setSelection([_24]);this.anchor=_24;}}}}},getItem:function(key){var _2a=this.selection[key];return {data:_2a,type:["treeNode"]};},forInSelectedItems:function(f,o){o=o||_5.global;for(var id in this.selection){f.call(o,this.getItem(id),id,this);}}});}); \ No newline at end of file
diff --git a/lib/dijit/tree/_dndSelector.js.uncompressed.js b/lib/dijit/tree/_dndSelector.js.uncompressed.js
new file mode 100644
index 000000000..82423fb20
--- /dev/null
+++ b/lib/dijit/tree/_dndSelector.js.uncompressed.js
@@ -0,0 +1,356 @@
+define("dijit/tree/_dndSelector", [
+ "dojo/_base/array", // array.filter array.forEach array.map
+ "dojo/_base/connect", // connect.isCopyKey
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred
+ "dojo/_base/kernel", // global
+ "dojo/_base/lang", // lang.hitch
+ "dojo/cookie", // cookie
+ "dojo/mouse", // mouse.isLeft
+ "dojo/on",
+ "dojo/touch",
+ "./_dndContainer"
+], function(array, connect, declare, Deferred, kernel, lang, cookie, mouse, on, touch, _dndContainer){
+
+ // module:
+ // dijit/tree/_dndSelector
+
+
+ return declare("dijit.tree._dndSelector", _dndContainer, {
+ // summary:
+ // This is a base class for `dijit/tree/dndSource` , and isn't meant to be used directly.
+ // It's based on `dojo/dnd/Selector`.
+ // tags:
+ // protected
+
+ /*=====
+ // selection: Object
+ // (id to DomNode) map for every TreeNode that's currently selected.
+ // The DOMNode is the TreeNode.rowNode.
+ selection: {},
+ =====*/
+
+ constructor: function(){
+ // summary:
+ // Initialization
+ // tags:
+ // private
+
+ this.selection={};
+ this.anchor = null;
+
+ if(!this.cookieName && this.tree.id){
+ this.cookieName = this.tree.id + "SaveSelectedCookie";
+ }
+
+ this.events.push(
+ on(this.tree.domNode, touch.press, lang.hitch(this,"onMouseDown")),
+ on(this.tree.domNode, touch.release, lang.hitch(this,"onMouseUp")),
+ on(this.tree.domNode, touch.move, lang.hitch(this,"onMouseMove"))
+ );
+ },
+
+ // singular: Boolean
+ // Allows selection of only one element, if true.
+ // Tree hasn't been tested in singular=true mode, unclear if it works.
+ singular: false,
+
+ // methods
+ getSelectedTreeNodes: function(){
+ // summary:
+ // Returns a list of selected node(s).
+ // Used by dndSource on the start of a drag.
+ // tags:
+ // protected
+ var nodes=[], sel = this.selection;
+ for(var i in sel){
+ nodes.push(sel[i]);
+ }
+ return nodes;
+ },
+
+ selectNone: function(){
+ // summary:
+ // Unselects all items
+ // tags:
+ // private
+
+ this.setSelection([]);
+ return this; // self
+ },
+
+ destroy: function(){
+ // summary:
+ // Prepares the object to be garbage-collected
+ this.inherited(arguments);
+ this.selection = this.anchor = null;
+ },
+ addTreeNode: function(/*dijit/Tree._TreeNode*/ node, /*Boolean?*/isAnchor){
+ // summary:
+ // add node to current selection
+ // node: Node
+ // node to add
+ // isAnchor: Boolean
+ // Whether the node should become anchor.
+
+ this.setSelection(this.getSelectedTreeNodes().concat( [node] ));
+ if(isAnchor){ this.anchor = node; }
+ return node;
+ },
+ removeTreeNode: function(/*dijit/Tree._TreeNode*/ node){
+ // summary:
+ // remove node from current selection
+ // node: Node
+ // node to remove
+ this.setSelection(this._setDifference(this.getSelectedTreeNodes(), [node]));
+ return node;
+ },
+ isTreeNodeSelected: function(/*dijit/Tree._TreeNode*/ node){
+ // summary:
+ // return true if node is currently selected
+ // node: Node
+ // the node to check whether it's in the current selection
+
+ return node.id && !!this.selection[node.id];
+ },
+ setSelection: function(/*dijit/Tree._TreeNode[]*/ newSelection){
+ // summary:
+ // set the list of selected nodes to be exactly newSelection. All changes to the
+ // selection should be passed through this function, which ensures that derived
+ // attributes are kept up to date. Anchor will be deleted if it has been removed
+ // from the selection, but no new anchor will be added by this function.
+ // newSelection: Node[]
+ // list of tree nodes to make selected
+ var oldSelection = this.getSelectedTreeNodes();
+ array.forEach(this._setDifference(oldSelection, newSelection), lang.hitch(this, function(node){
+ node.setSelected(false);
+ if(this.anchor == node){
+ delete this.anchor;
+ }
+ delete this.selection[node.id];
+ }));
+ array.forEach(this._setDifference(newSelection, oldSelection), lang.hitch(this, function(node){
+ node.setSelected(true);
+ this.selection[node.id] = node;
+ }));
+ this._updateSelectionProperties();
+ },
+ _setDifference: function(xs,ys){
+ // summary:
+ // Returns a copy of xs which lacks any objects
+ // occurring in ys. Checks for membership by
+ // modifying and then reading the object, so it will
+ // not properly handle sets of numbers or strings.
+
+ array.forEach(ys, function(y){ y.__exclude__ = true; });
+ var ret = array.filter(xs, function(x){ return !x.__exclude__; });
+
+ // clean up after ourselves.
+ array.forEach(ys, function(y){ delete y['__exclude__'] });
+ return ret;
+ },
+ _updateSelectionProperties: function(){
+ // summary:
+ // Update the following tree properties from the current selection:
+ // path[s], selectedItem[s], selectedNode[s]
+
+ var selected = this.getSelectedTreeNodes();
+ var paths = [], nodes = [], selects = [];
+ array.forEach(selected, function(node){
+ var ary = node.getTreePath(), model = this.tree.model;
+ nodes.push(node);
+ paths.push(ary);
+ ary = array.map(ary, function(item){
+ return model.getIdentity(item);
+ }, this);
+ selects.push(ary.join("/"))
+ }, this);
+ var items = array.map(nodes,function(node){ return node.item; });
+ this.tree._set("paths", paths);
+ this.tree._set("path", paths[0] || []);
+ this.tree._set("selectedNodes", nodes);
+ this.tree._set("selectedNode", nodes[0] || null);
+ this.tree._set("selectedItems", items);
+ this.tree._set("selectedItem", items[0] || null);
+ if (this.tree.persist && selects.length > 0) {
+ cookie(this.cookieName, selects.join(","), {expires:365});
+ }
+ },
+ _getSavedPaths: function(){
+ // summary:
+ // Returns paths of nodes that were selected previously and saved in the cookie.
+
+ var tree = this.tree;
+ if(tree.persist && tree.dndController.cookieName){
+ var oreo, paths = [];
+ oreo = cookie(tree.dndController.cookieName);
+ if(oreo){
+ paths = array.map(oreo.split(","), function(path){
+ return path.split("/");
+ })
+ }
+ return paths;
+ }
+ },
+ // mouse events
+ onMouseDown: function(e){
+ // summary:
+ // Event processor for onmousedown/ontouchstart
+ // e: Event
+ // onmousedown/ontouchstart event
+ // tags:
+ // protected
+
+ // ignore click on expando node
+ if(!this.current || this.tree.isExpandoNode(e.target, this.current)){ return; }
+
+ if(mouse.isLeft(e)){
+ // Prevent text selection while dragging on desktop, see #16328. But don't call preventDefault()
+ // for mobile because it will break things completely, see #15838.
+ e.preventDefault();
+ }else if(e.type != "touchstart"){
+ // Ignore right click
+ return;
+ }
+
+ var treeNode = this.current,
+ copy = connect.isCopyKey(e), id = treeNode.id;
+
+ // if shift key is not pressed, and the node is already in the selection,
+ // delay deselection until onmouseup so in the case of DND, deselection
+ // will be canceled by onmousemove.
+ if(!this.singular && !e.shiftKey && this.selection[id]){
+ this._doDeselect = true;
+ return;
+ }else{
+ this._doDeselect = false;
+ }
+ this.userSelect(treeNode, copy, e.shiftKey);
+ },
+
+ onMouseUp: function(e){
+ // summary:
+ // Event processor for onmouseup/ontouchend
+ // e: Event
+ // onmouseup/ontouchend event
+ // tags:
+ // protected
+
+ // _doDeselect is the flag to indicate that the user wants to either ctrl+click on
+ // a already selected item (to deselect the item), or click on a not-yet selected item
+ // (which should remove all current selection, and add the clicked item). This can not
+ // be done in onMouseDown, because the user may start a drag after mousedown. By moving
+ // the deselection logic here, the user can drags an already selected item.
+ if(!this._doDeselect){ return; }
+ this._doDeselect = false;
+ this.userSelect(this.current, connect.isCopyKey(e), e.shiftKey);
+ },
+ onMouseMove: function(/*===== e =====*/){
+ // summary:
+ // event processor for onmousemove/ontouchmove
+ // e: Event
+ // onmousemove/ontouchmove event
+ this._doDeselect = false;
+ },
+
+ _compareNodes: function(n1, n2){
+ if(n1 === n2){
+ return 0;
+ }
+
+ if('sourceIndex' in document.documentElement){ //IE
+ //TODO: does not yet work if n1 and/or n2 is a text node
+ return n1.sourceIndex - n2.sourceIndex;
+ }else if('compareDocumentPosition' in document.documentElement){ //FF, Opera
+ return n1.compareDocumentPosition(n2) & 2 ? 1: -1;
+ }else if(document.createRange){ //Webkit
+ var r1 = doc.createRange();
+ r1.setStartBefore(n1);
+
+ var r2 = doc.createRange();
+ r2.setStartBefore(n2);
+
+ return r1.compareBoundaryPoints(r1.END_TO_END, r2);
+ }else{
+ throw Error("dijit.tree._compareNodes don't know how to compare two different nodes in this browser");
+ }
+ },
+
+ userSelect: function(node, multi, range){
+ // summary:
+ // Add or remove the given node from selection, responding
+ // to a user action such as a click or keypress.
+ // multi: Boolean
+ // Indicates whether this is meant to be a multi-select action (e.g. ctrl-click)
+ // range: Boolean
+ // Indicates whether this is meant to be a ranged action (e.g. shift-click)
+ // tags:
+ // protected
+
+ if(this.singular){
+ if(this.anchor == node && multi){
+ this.selectNone();
+ }else{
+ this.setSelection([node]);
+ this.anchor = node;
+ }
+ }else{
+ if(range && this.anchor){
+ var cr = this._compareNodes(this.anchor.rowNode, node.rowNode),
+ begin, end, anchor = this.anchor;
+
+ if(cr < 0){ //current is after anchor
+ begin = anchor;
+ end = node;
+ }else{ //current is before anchor
+ begin = node;
+ end = anchor;
+ }
+ var nodes = [];
+ //add everything betweeen begin and end inclusively
+ while(begin != end){
+ nodes.push(begin);
+ begin = this.tree._getNextNode(begin);
+ }
+ nodes.push(end);
+
+ this.setSelection(nodes);
+ }else{
+ if( this.selection[ node.id ] && multi ){
+ this.removeTreeNode( node );
+ }else if(multi){
+ this.addTreeNode(node, true);
+ }else{
+ this.setSelection([node]);
+ this.anchor = node;
+ }
+ }
+ }
+ },
+
+ getItem: function(/*String*/ key){
+ // summary:
+ // Returns the dojo/dnd/Container._Item (representing a dragged node) by it's key (id).
+ // Called by dojo/dnd/Source.checkAcceptance().
+ // tags:
+ // protected
+
+ var widget = this.selection[key];
+ return {
+ data: widget,
+ type: ["treeNode"]
+ }; // dojo/dnd/Container._Item
+ },
+
+ forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
+ // summary:
+ // Iterates over selected items;
+ // see `dojo/dnd/Container.forInItems()` for details
+ o = o || kernel.global;
+ for(var id in this.selection){
+ // console.log("selected item id: " + id);
+ f.call(o, this.getItem(id), id, this);
+ }
+ }
+ });
+});
diff --git a/lib/dijit/tree/dndSource.js b/lib/dijit/tree/dndSource.js
index a68af56c4..7698cd844 100644
--- a/lib/dijit/tree/dndSource.js
+++ b/lib/dijit/tree/dndSource.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/tree/dndSource",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/_base/lang","dojo/on","dojo/touch","dojo/topic","dojo/dnd/Manager","./_dndSelector"],function(_1,_2,_3,_4,_5,_6,on,_7,_8,_9,_a){return _3("dijit.tree.dndSource",_a,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(_b,_c){if(!_c){_c={};}_6.mixin(this,_c);this.isSource=typeof _c.isSource=="undefined"?true:_c.isSource;var _d=_c.accept instanceof Array?_c.accept:["text","treeNode"];this.accept=null;if(_d.length){this.accept={};for(var i=0;i<_d.length;++i){this.accept[_d[i]]=1;}}this.isDragging=false;this.mouseDown=false;this.targetAnchor=null;this.targetBox=null;this.dropPosition="";this._lastX=0;this._lastY=0;this.sourceState="";if(this.isSource){_4.add(this.node,"dojoDndSource");}this.targetState="";if(this.accept){_4.add(this.node,"dojoDndTarget");}this.topics=[_8.subscribe("/dnd/source/over",_6.hitch(this,"onDndSourceOver")),_8.subscribe("/dnd/start",_6.hitch(this,"onDndStart")),_8.subscribe("/dnd/drop",_6.hitch(this,"onDndDrop")),_8.subscribe("/dnd/cancel",_6.hitch(this,"onDndCancel"))];},checkAcceptance:function(){return true;},copyState:function(_e){return this.copyOnly||_e;},destroy:function(){this.inherited(arguments);var h;while(h=this.topics.pop()){h.remove();}this.targetAnchor=null;},_onDragMouse:function(e){var m=_9.manager(),_f=this.targetAnchor,_10=this.current,_11=this.dropPosition;var _12="Over";if(_10&&this.betweenThreshold>0){if(!this.targetBox||_f!=_10){this.targetBox=_5.position(_10.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_12="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_12="After";}}}if(_10!=_f||_12!=_11){if(_f){this._removeItemClass(_f.rowNode,_11);}if(_10){this._addItemClass(_10.rowNode,_12);}if(!_10){m.canDrop(false);}else{if(_10==this.tree.rootNode&&_12!="Over"){m.canDrop(false);}else{var _13=this.tree.model,_14=false;if(m.source==this){for(var _15 in this.selection){var _16=this.selection[_15];if(_16.item===_10.item){_14=true;break;}}}if(_14){m.canDrop(false);}else{if(this.checkItemAcceptance(_10.rowNode,m.source,_12.toLowerCase())&&!this._isParentChildDrop(m.source,_10.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_10;this.dropPosition=_12;}},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}this.inherited(arguments);var m=_9.manager();if(this.isDragging){this._onDragMouse(e);}else{if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>=this.dragThreshold||Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){var _17=this.getSelectedTreeNodes();if(_17.length){if(_17.length>1){var _18=this.selection,i=0,r=[],n,p;nextitem:while((n=_17[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(_18[p.id]){continue nextitem;}}r.push(n);}_17=r;}_17=_1.map(_17,function(n){return n.domNode;});m.startDrag(this,_17,this.copyState(_2.isCopyKey(e)));}}}},onMouseDown:function(e){this.mouseDown=true;this.mouseButton=e.button;this._lastX=e.pageX;this._lastY=e.pageY;this.inherited(arguments);},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;this.inherited(arguments);}},onMouseOut:function(){this.inherited(arguments);this._unmarkTargetAnchor();},checkItemAcceptance:function(){return true;},onDndSourceOver:function(_19){if(this!=_19){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=_9.manager();m.canDrop(false);}}},onDndStart:function(_1a,_1b,_1c){if(this.isSource){this._changeState("Source",this==_1a?(_1c?"Copied":"Moved"):"");}var _1d=this.checkAcceptance(_1a,_1b);this._changeState("Target",_1d?"":"Disabled");if(this==_1a){_9.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_1e){return _1.map(_1e,function(_1f){return {"id":_1f.id,"name":_1f.textContent||_1f.innerText||""};});},onDndDrop:function(_20,_21,_22){if(this.containerState=="Over"){var _23=this.tree,_24=_23.model,_25=this.targetAnchor;this.isDragging=false;var _26;var _27;_26=(_25&&_25.item)||_23.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_26=(_25.getParent()&&_25.getParent().item)||_23.item;_27=_25.getIndexInParent();if(this.dropPosition=="After"){_27=_25.getIndexInParent()+1;}}else{_26=(_25&&_25.item)||_23.item;}var _28;_1.forEach(_21,function(_29,idx){var _2a=_20.getItem(_29.id);if(_1.indexOf(_2a.type,"treeNode")!=-1){var _2b=_2a.data,_2c=_2b.item,_2d=_2b.getParent().item;}if(_20==this){if(typeof _27=="number"){if(_26==_2d&&_2b.getIndexInParent()<_27){_27-=1;}}_24.pasteItem(_2c,_2d,_26,_22,_27);}else{if(_24.isItem(_2c)){_24.pasteItem(_2c,_2d,_26,_22,_27);}else{if(!_28){_28=this.itemCreator(_21,_25.rowNode,_20);}_24.newItem(_28[idx],_26,_27);}}},this);this.tree._expandNode(_25);}this.onDndCancel();},onDndCancel:function(){this._unmarkTargetAnchor();this.isDragging=false;this.mouseDown=false;delete this.mouseButton;this._changeState("Source","");this._changeState("Target","");},onOverEvent:function(){this.inherited(arguments);_9.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=_9.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_2e,_2f){if(!_2e.tree||_2e.tree!=this.tree){return false;}var _30=_2e.tree.domNode;var ids=_2e.selection;var _31=_2f.parentNode;while(_31!=_30&&!ids[_31.id]){_31=_31.parentNode;}return _31.id&&ids[_31.id];},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor.rowNode,this.dropPosition);this.targetAnchor=null;this.targetBox=null;this.dropPosition=null;},_markDndStatus:function(_32){this._changeState("Source",_32?"Copied":"Moved");}});}); \ No newline at end of file
+define("dijit/tree/dndSource",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/_base/lang","dojo/on","dojo/touch","dojo/topic","dojo/dnd/Manager","./_dndSelector"],function(_1,_2,_3,_4,_5,_6,on,_7,_8,_9,_a){var _b=_3("dijit.tree.dndSource",_a,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,generateText:true,constructor:function(_c,_d){if(!_d){_d={};}_6.mixin(this,_d);var _e=_d.accept instanceof Array?_d.accept:["text","treeNode"];this.accept=null;if(_e.length){this.accept={};for(var i=0;i<_e.length;++i){this.accept[_e[i]]=1;}}this.isDragging=false;this.mouseDown=false;this.targetAnchor=null;this.targetBox=null;this.dropPosition="";this._lastX=0;this._lastY=0;this.sourceState="";if(this.isSource){_4.add(this.node,"dojoDndSource");}this.targetState="";if(this.accept){_4.add(this.node,"dojoDndTarget");}this.topics=[_8.subscribe("/dnd/source/over",_6.hitch(this,"onDndSourceOver")),_8.subscribe("/dnd/start",_6.hitch(this,"onDndStart")),_8.subscribe("/dnd/drop",_6.hitch(this,"onDndDrop")),_8.subscribe("/dnd/cancel",_6.hitch(this,"onDndCancel"))];},checkAcceptance:function(){return true;},copyState:function(_f){return this.copyOnly||_f;},destroy:function(){this.inherited(arguments);var h;while(h=this.topics.pop()){h.remove();}this.targetAnchor=null;},_onDragMouse:function(e,_10){var m=_9.manager(),_11=this.targetAnchor,_12=this.current,_13=this.dropPosition;var _14="Over";if(_12&&this.betweenThreshold>0){if(!this.targetBox||_11!=_12){this.targetBox=_5.position(_12.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_14="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_14="After";}}}if(_10||_12!=_11||_14!=_13){if(_11){this._removeItemClass(_11.rowNode,_13);}if(_12){this._addItemClass(_12.rowNode,_14);}if(!_12){m.canDrop(false);}else{if(_12==this.tree.rootNode&&_14!="Over"){m.canDrop(false);}else{var _15=false;if(m.source==this){for(var _16 in this.selection){var _17=this.selection[_16];if(_17.item===_12.item){_15=true;break;}}}if(_15){m.canDrop(false);}else{if(this.checkItemAcceptance(_12.rowNode,m.source,_14.toLowerCase())&&!this._isParentChildDrop(m.source,_12.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_12;this.dropPosition=_14;}},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}this.inherited(arguments);var m=_9.manager();if(this.isDragging){this._onDragMouse(e);}else{if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>=this.dragThreshold||Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){var _18=this.getSelectedTreeNodes();if(_18.length){if(_18.length>1){var _19=this.selection,i=0,r=[],n,p;nextitem:while((n=_18[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(_19[p.id]){continue nextitem;}}r.push(n);}_18=r;}_18=_1.map(_18,function(n){return n.domNode;});m.startDrag(this,_18,this.copyState(_2.isCopyKey(e)));this._onDragMouse(e,true);}}}},onMouseDown:function(e){this.mouseDown=true;this.mouseButton=e.button;this._lastX=e.pageX;this._lastY=e.pageY;this.inherited(arguments);},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;this.inherited(arguments);}},onMouseOut:function(){this.inherited(arguments);this._unmarkTargetAnchor();},checkItemAcceptance:function(){return true;},onDndSourceOver:function(_1a){if(this!=_1a){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=_9.manager();m.canDrop(false);}}},onDndStart:function(_1b,_1c,_1d){if(this.isSource){this._changeState("Source",this==_1b?(_1d?"Copied":"Moved"):"");}var _1e=this.checkAcceptance(_1b,_1c);this._changeState("Target",_1e?"":"Disabled");if(this==_1b){_9.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_1f){return _1.map(_1f,function(_20){return {"id":_20.id,"name":_20.textContent||_20.innerText||""};});},onDndDrop:function(_21,_22,_23){if(this.containerState=="Over"){var _24=this.tree,_25=_24.model,_26=this.targetAnchor;this.isDragging=false;var _27;var _28;var _29;_27=(_26&&_26.item)||_24.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_27=(_26.getParent()&&_26.getParent().item)||_24.item;_28=_26.getIndexInParent();if(this.dropPosition=="After"){_28=_26.getIndexInParent()+1;_29=_26.getNextSibling()&&_26.getNextSibling().item;}else{_29=_26.item;}}else{_27=(_26&&_26.item)||_24.item;}var _2a;_1.forEach(_22,function(_2b,idx){var _2c=_21.getItem(_2b.id);if(_1.indexOf(_2c.type,"treeNode")!=-1){var _2d=_2c.data,_2e=_2d.item,_2f=_2d.getParent().item;}if(_21==this){if(typeof _28=="number"){if(_27==_2f&&_2d.getIndexInParent()<_28){_28-=1;}}_25.pasteItem(_2e,_2f,_27,_23,_28,_29);}else{if(_25.isItem(_2e)){_25.pasteItem(_2e,_2f,_27,_23,_28,_29);}else{if(!_2a){_2a=this.itemCreator(_22,_26.rowNode,_21);}_25.newItem(_2a[idx],_27,_28,_29);}}},this);this.tree._expandNode(_26);}this.onDndCancel();},onDndCancel:function(){this._unmarkTargetAnchor();this.isDragging=false;this.mouseDown=false;delete this.mouseButton;this._changeState("Source","");this._changeState("Target","");},onOverEvent:function(){this.inherited(arguments);_9.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=_9.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_30,_31){if(!_30.tree||_30.tree!=this.tree){return false;}var _32=_30.tree.domNode;var ids=_30.selection;var _33=_31.parentNode;while(_33!=_32&&!ids[_33.id]){_33=_33.parentNode;}return _33.id&&ids[_33.id];},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor.rowNode,this.dropPosition);this.targetAnchor=null;this.targetBox=null;this.dropPosition=null;},_markDndStatus:function(_34){this._changeState("Source",_34?"Copied":"Moved");}});return _b;}); \ No newline at end of file
diff --git a/lib/dijit/tree/dndSource.js.uncompressed.js b/lib/dijit/tree/dndSource.js.uncompressed.js
new file mode 100644
index 000000000..2cd1b07ca
--- /dev/null
+++ b/lib/dijit/tree/dndSource.js.uncompressed.js
@@ -0,0 +1,564 @@
+define("dijit/tree/dndSource", [
+ "dojo/_base/array", // array.forEach array.indexOf array.map
+ "dojo/_base/connect", // isCopyKey
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add
+ "dojo/dom-geometry", // domGeometry.position
+ "dojo/_base/lang", // lang.mixin lang.hitch
+ "dojo/on", // subscribe
+ "dojo/touch",
+ "dojo/topic",
+ "dojo/dnd/Manager", // DNDManager.manager
+ "./_dndSelector"
+], function(array, connect, declare, domClass, domGeometry, lang, on, touch, topic, DNDManager, _dndSelector){
+
+// module:
+// dijit/tree/dndSource
+// summary:
+// Handles drag and drop operations (as a source or a target) for `dijit.Tree`
+
+/*=====
+var __Item = {
+ // summary:
+ // New item to be added to the Tree, like:
+ // id: Anything
+ id: "",
+ // name: String
+ name: ""
+};
+=====*/
+
+var dndSource = declare("dijit.tree.dndSource", _dndSelector, {
+ // summary:
+ // Handles drag and drop operations (as a source or a target) for `dijit.Tree`
+
+ // isSource: Boolean
+ // Can be used as a DnD source.
+ isSource: true,
+
+ // accept: String[]
+ // List of accepted types (text strings) for the Tree; defaults to
+ // ["text"]
+ accept: ["text", "treeNode"],
+
+ // copyOnly: [private] Boolean
+ // Copy items, if true, use a state of Ctrl key otherwise
+ copyOnly: false,
+
+ // dragThreshold: Number
+ // The move delay in pixels before detecting a drag; 5 by default
+ dragThreshold: 5,
+
+ // betweenThreshold: Integer
+ // Distance from upper/lower edge of node to allow drop to reorder nodes
+ betweenThreshold: 0,
+
+ // Flag used by Avatar.js to signal to generate text node when dragging
+ generateText: true,
+
+ constructor: function(/*dijit/Tree*/ tree, /*dijit/tree/dndSource*/ params){
+ // summary:
+ // a constructor of the Tree DnD Source
+ // tags:
+ // private
+ if(!params){ params = {}; }
+ lang.mixin(this, params);
+ var type = params.accept instanceof Array ? params.accept : ["text", "treeNode"];
+ this.accept = null;
+ if(type.length){
+ this.accept = {};
+ for(var i = 0; i < type.length; ++i){
+ this.accept[type[i]] = 1;
+ }
+ }
+
+ // class-specific variables
+ this.isDragging = false;
+ this.mouseDown = false;
+ this.targetAnchor = null; // DOMNode corresponding to the currently moused over TreeNode
+ this.targetBox = null; // coordinates of this.targetAnchor
+ this.dropPosition = ""; // whether mouse is over/after/before this.targetAnchor
+ this._lastX = 0;
+ this._lastY = 0;
+
+ // states
+ this.sourceState = "";
+ if(this.isSource){
+ domClass.add(this.node, "dojoDndSource");
+ }
+ this.targetState = "";
+ if(this.accept){
+ domClass.add(this.node, "dojoDndTarget");
+ }
+
+ // set up events
+ this.topics = [
+ topic.subscribe("/dnd/source/over", lang.hitch(this, "onDndSourceOver")),
+ topic.subscribe("/dnd/start", lang.hitch(this, "onDndStart")),
+ topic.subscribe("/dnd/drop", lang.hitch(this, "onDndDrop")),
+ topic.subscribe("/dnd/cancel", lang.hitch(this, "onDndCancel"))
+ ];
+ },
+
+ // methods
+ checkAcceptance: function(/*===== source, nodes =====*/){
+ // summary:
+ // Checks if the target can accept nodes from this source
+ // source: dijit/tree/dndSource
+ // The source which provides items
+ // nodes: DOMNode[]
+ // Array of DOM nodes corresponding to nodes being dropped, dijitTreeRow nodes if
+ // source is a dijit/Tree.
+ // tags:
+ // extension
+ return true; // Boolean
+ },
+
+ copyState: function(keyPressed){
+ // summary:
+ // Returns true, if we need to copy items, false to move.
+ // It is separated to be overwritten dynamically, if needed.
+ // keyPressed: Boolean
+ // The "copy" control key was pressed
+ // tags:
+ // protected
+ return this.copyOnly || keyPressed; // Boolean
+ },
+ destroy: function(){
+ // summary:
+ // Prepares the object to be garbage-collected.
+ this.inherited(arguments);
+ var h;
+ while(h = this.topics.pop()){ h.remove(); }
+ this.targetAnchor = null;
+ },
+
+ _onDragMouse: function(e, firstTime){
+ // summary:
+ // Helper method for processing onmousemove/onmouseover events while drag is in progress.
+ // Keeps track of current drop target.
+ // e: Event
+ // The mousemove event.
+ // firstTime: Boolean?
+ // If this flag is set, this is the first mouse move event of the drag, so call m.canDrop() etc.
+ // even if newTarget == null because the user quickly dragged a node in the Tree to a position
+ // over Tree.containerNode but not over any TreeNode (#7971)
+
+ var m = DNDManager.manager(),
+ oldTarget = this.targetAnchor, // the TreeNode corresponding to TreeNode mouse was previously over
+ newTarget = this.current, // TreeNode corresponding to TreeNode mouse is currently over
+ oldDropPosition = this.dropPosition; // the previous drop position (over/before/after)
+
+ // calculate if user is indicating to drop the dragged node before, after, or over
+ // (i.e., to become a child of) the target node
+ var newDropPosition = "Over";
+ if(newTarget && this.betweenThreshold > 0){
+ // If mouse is over a new TreeNode, then get new TreeNode's position and size
+ if(!this.targetBox || oldTarget != newTarget){
+ this.targetBox = domGeometry.position(newTarget.rowNode, true);
+ }
+ if((e.pageY - this.targetBox.y) <= this.betweenThreshold){
+ newDropPosition = "Before";
+ }else if((e.pageY - this.targetBox.y) >= (this.targetBox.h - this.betweenThreshold)){
+ newDropPosition = "After";
+ }
+ }
+
+ if(firstTime || newTarget != oldTarget || newDropPosition != oldDropPosition){
+ if(oldTarget){
+ this._removeItemClass(oldTarget.rowNode, oldDropPosition);
+ }
+ if(newTarget){
+ this._addItemClass(newTarget.rowNode, newDropPosition);
+ }
+
+ // Check if it's ok to drop the dragged node on/before/after the target node.
+ if(!newTarget){
+ m.canDrop(false);
+ }else if(newTarget == this.tree.rootNode && newDropPosition != "Over"){
+ // Can't drop before or after tree's root node; the dropped node would just disappear (at least visually)
+ m.canDrop(false);
+ }else{
+ // Guard against dropping onto yourself (TODO: guard against dropping onto your descendant, #7140)
+ var sameId = false;
+ if(m.source == this){
+ for(var dragId in this.selection){
+ var dragNode = this.selection[dragId];
+ if(dragNode.item === newTarget.item){
+ sameId = true;
+ break;
+ }
+ }
+ }
+ if(sameId){
+ m.canDrop(false);
+ }else if(this.checkItemAcceptance(newTarget.rowNode, m.source, newDropPosition.toLowerCase())
+ && !this._isParentChildDrop(m.source, newTarget.rowNode)){
+ m.canDrop(true);
+ }else{
+ m.canDrop(false);
+ }
+ }
+
+ this.targetAnchor = newTarget;
+ this.dropPosition = newDropPosition;
+ }
+ },
+
+ onMouseMove: function(e){
+ // summary:
+ // Called for any onmousemove/ontouchmove events over the Tree
+ // e: Event
+ // onmousemouse/ontouchmove event
+ // tags:
+ // private
+ if(this.isDragging && this.targetState == "Disabled"){ return; }
+ this.inherited(arguments);
+ var m = DNDManager.manager();
+ if(this.isDragging){
+ this._onDragMouse(e);
+ }else{
+ if(this.mouseDown && this.isSource &&
+ (Math.abs(e.pageX-this._lastX)>=this.dragThreshold || Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){
+ var nodes = this.getSelectedTreeNodes();
+ if(nodes.length){
+ if(nodes.length > 1){
+ //filter out all selected items which has one of their ancestor selected as well
+ var seen = this.selection, i = 0, r = [], n, p;
+ nextitem: while((n = nodes[i++])){
+ for(p = n.getParent(); p && p !== this.tree; p = p.getParent()){
+ if(seen[p.id]){ //parent is already selected, skip this node
+ continue nextitem;
+ }
+ }
+ //this node does not have any ancestors selected, add it
+ r.push(n);
+ }
+ nodes = r;
+ }
+ nodes = array.map(nodes, function(n){return n.domNode});
+ m.startDrag(this, nodes, this.copyState(connect.isCopyKey(e)));
+ this._onDragMouse(e, true); // because this may be the only mousemove event we get before the drop
+ }
+ }
+ }
+ },
+
+ onMouseDown: function(e){
+ // summary:
+ // Event processor for onmousedown/ontouchstart
+ // e: Event
+ // onmousedown/ontouchend event
+ // tags:
+ // private
+ this.mouseDown = true;
+ this.mouseButton = e.button;
+ this._lastX = e.pageX;
+ this._lastY = e.pageY;
+ this.inherited(arguments);
+ },
+
+ onMouseUp: function(e){
+ // summary:
+ // Event processor for onmouseup/ontouchend
+ // e: Event
+ // onmouseup/ontouchend event
+ // tags:
+ // private
+ if(this.mouseDown){
+ this.mouseDown = false;
+ this.inherited(arguments);
+ }
+ },
+
+ onMouseOut: function(){
+ // summary:
+ // Event processor for when mouse is moved away from a TreeNode
+ // tags:
+ // private
+ this.inherited(arguments);
+ this._unmarkTargetAnchor();
+ },
+
+ checkItemAcceptance: function(/*===== target, source, position =====*/){
+ // summary:
+ // Stub function to be overridden if one wants to check for the ability to drop at the node/item level
+ // description:
+ // In the base case, this is called to check if target can become a child of source.
+ // When betweenThreshold is set, position="before" or "after" means that we
+ // are asking if the source node can be dropped before/after the target node.
+ // target: DOMNode
+ // The dijitTreeRoot DOM node inside of the TreeNode that we are dropping on to
+ // Use dijit.getEnclosingWidget(target) to get the TreeNode.
+ // source: dijit/tree/dndSource
+ // The (set of) nodes we are dropping
+ // position: String
+ // "over", "before", or "after"
+ // tags:
+ // extension
+ return true;
+ },
+
+ // topic event processors
+ onDndSourceOver: function(source){
+ // summary:
+ // Topic event processor for /dnd/source/over, called when detected a current source.
+ // source: Object
+ // The dijit/tree/dndSource / dojo/dnd/Source which has the mouse over it
+ // tags:
+ // private
+ if(this != source){
+ this.mouseDown = false;
+ this._unmarkTargetAnchor();
+ }else if(this.isDragging){
+ var m = DNDManager.manager();
+ m.canDrop(false);
+ }
+ },
+ onDndStart: function(source, nodes, copy){
+ // summary:
+ // Topic event processor for /dnd/start, called to initiate the DnD operation
+ // source: Object
+ // The dijit/tree/dndSource / dojo/dnd/Source which is providing the items
+ // nodes: DomNode[]
+ // The list of transferred items, dndTreeNode nodes if dragging from a Tree
+ // copy: Boolean
+ // Copy items, if true, move items otherwise
+ // tags:
+ // private
+
+ if(this.isSource){
+ this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
+ }
+ var accepted = this.checkAcceptance(source, nodes);
+
+ this._changeState("Target", accepted ? "" : "Disabled");
+
+ if(this == source){
+ DNDManager.manager().overSource(this);
+ }
+
+ this.isDragging = true;
+ },
+
+ itemCreator: function(nodes /*===== , target, source =====*/){
+ // summary:
+ // Returns objects passed to `Tree.model.newItem()` based on DnD nodes
+ // dropped onto the tree. Developer must override this method to enable
+ // dropping from external sources onto this Tree, unless the Tree.model's items
+ // happen to look like {id: 123, name: "Apple" } with no other attributes.
+ // description:
+ // For each node in nodes[], which came from source, create a hash of name/value
+ // pairs to be passed to Tree.model.newItem(). Returns array of those hashes.
+ // nodes: DomNode[]
+ // target: DomNode
+ // source: dojo/dnd/Source
+ // returns: __Item[]
+ // Array of name/value hashes for each new item to be added to the Tree
+ // tags:
+ // extension
+
+ // TODO: for 2.0 refactor so itemCreator() is called once per drag node, and
+ // make signature itemCreator(sourceItem, node, target) (or similar).
+
+ return array.map(nodes, function(node){
+ return {
+ "id": node.id,
+ "name": node.textContent || node.innerText || ""
+ };
+ }); // Object[]
+ },
+
+ onDndDrop: function(source, nodes, copy){
+ // summary:
+ // Topic event processor for /dnd/drop, called to finish the DnD operation.
+ // description:
+ // Updates data store items according to where node was dragged from and dropped
+ // to. The tree will then respond to those data store updates and redraw itself.
+ // source: Object
+ // The dijit/tree/dndSource / dojo/dnd/Source which is providing the items
+ // nodes: DomNode[]
+ // The list of transferred items, dndTreeNode nodes if dragging from a Tree
+ // copy: Boolean
+ // Copy items, if true, move items otherwise
+ // tags:
+ // protected
+ if(this.containerState == "Over"){
+ var tree = this.tree,
+ model = tree.model,
+ target = this.targetAnchor;
+
+ this.isDragging = false;
+
+ // Compute the new parent item
+ var newParentItem;
+ var insertIndex;
+ var before; // drop source before (aka previous sibling) of target
+ newParentItem = (target && target.item) || tree.item;
+ if(this.dropPosition == "Before" || this.dropPosition == "After"){
+ // TODO: if there is no parent item then disallow the drop.
+ // Actually this should be checked during onMouseMove too, to make the drag icon red.
+ newParentItem = (target.getParent() && target.getParent().item) || tree.item;
+ // Compute the insert index for reordering
+ insertIndex = target.getIndexInParent();
+ if(this.dropPosition == "After"){
+ insertIndex = target.getIndexInParent() + 1;
+ before = target.getNextSibling() && target.getNextSibling().item;
+ }else{
+ before = target.item;
+ }
+ }else{
+ newParentItem = (target && target.item) || tree.item;
+ }
+
+ // If necessary, use this variable to hold array of hashes to pass to model.newItem()
+ // (one entry in the array for each dragged node).
+ var newItemsParams;
+
+ array.forEach(nodes, function(node, idx){
+ // dojo/dnd/Item representing the thing being dropped.
+ // Don't confuse the use of item here (meaning a DnD item) with the
+ // uses below where item means dojo.data item.
+ var sourceItem = source.getItem(node.id);
+
+ // Information that's available if the source is another Tree
+ // (possibly but not necessarily this tree, possibly but not
+ // necessarily the same model as this Tree)
+ if(array.indexOf(sourceItem.type, "treeNode") != -1){
+ var childTreeNode = sourceItem.data,
+ childItem = childTreeNode.item,
+ oldParentItem = childTreeNode.getParent().item;
+ }
+
+ if(source == this){
+ // This is a node from my own tree, and we are moving it, not copying.
+ // Remove item from old parent's children attribute.
+ // TODO: dijit/tree/dndSelector should implement deleteSelectedNodes()
+ // and this code should go there.
+
+ if(typeof insertIndex == "number"){
+ if(newParentItem == oldParentItem && childTreeNode.getIndexInParent() < insertIndex){
+ insertIndex -= 1;
+ }
+ }
+ model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex, before);
+ }else if(model.isItem(childItem)){
+ // Item from same model
+ // (maybe we should only do this branch if the source is a tree?)
+ model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex, before);
+ }else{
+ // Get the hash to pass to model.newItem(). A single call to
+ // itemCreator() returns an array of hashes, one for each drag source node.
+ if(!newItemsParams){
+ newItemsParams = this.itemCreator(nodes, target.rowNode, source);
+ }
+
+ // Create new item in the tree, based on the drag source.
+ model.newItem(newItemsParams[idx], newParentItem, insertIndex, before);
+ }
+ }, this);
+
+ // Expand the target node (if it's currently collapsed) so the user can see
+ // where their node was dropped. In particular since that node is still selected.
+ this.tree._expandNode(target);
+ }
+ this.onDndCancel();
+ },
+
+ onDndCancel: function(){
+ // summary:
+ // Topic event processor for /dnd/cancel, called to cancel the DnD operation
+ // tags:
+ // private
+ this._unmarkTargetAnchor();
+ this.isDragging = false;
+ this.mouseDown = false;
+ delete this.mouseButton;
+ this._changeState("Source", "");
+ this._changeState("Target", "");
+ },
+
+ // When focus moves in/out of the entire Tree
+ onOverEvent: function(){
+ // summary:
+ // This method is called when mouse is moved over our container (like onmouseenter)
+ // tags:
+ // private
+ this.inherited(arguments);
+ DNDManager.manager().overSource(this);
+ },
+ onOutEvent: function(){
+ // summary:
+ // This method is called when mouse is moved out of our container (like onmouseleave)
+ // tags:
+ // private
+ this._unmarkTargetAnchor();
+ var m = DNDManager.manager();
+ if(this.isDragging){
+ m.canDrop(false);
+ }
+ m.outSource(this);
+
+ this.inherited(arguments);
+ },
+
+ _isParentChildDrop: function(source, targetRow){
+ // summary:
+ // Checks whether the dragged items are parent rows in the tree which are being
+ // dragged into their own children.
+ //
+ // source:
+ // The DragSource object.
+ //
+ // targetRow:
+ // The tree row onto which the dragged nodes are being dropped.
+ //
+ // tags:
+ // private
+
+ // If the dragged object is not coming from the tree this widget belongs to,
+ // it cannot be invalid.
+ if(!source.tree || source.tree != this.tree){
+ return false;
+ }
+
+
+ var root = source.tree.domNode;
+ var ids = source.selection;
+
+ var node = targetRow.parentNode;
+
+ // Iterate up the DOM hierarchy from the target drop row,
+ // checking of any of the dragged nodes have the same ID.
+ while(node != root && !ids[node.id]){
+ node = node.parentNode;
+ }
+
+ return node.id && ids[node.id];
+ },
+
+ _unmarkTargetAnchor: function(){
+ // summary:
+ // Removes hover class of the current target anchor
+ // tags:
+ // private
+ if(!this.targetAnchor){ return; }
+ this._removeItemClass(this.targetAnchor.rowNode, this.dropPosition);
+ this.targetAnchor = null;
+ this.targetBox = null;
+ this.dropPosition = null;
+ },
+
+ _markDndStatus: function(copy){
+ // summary:
+ // Changes source's state based on "copy" status
+ this._changeState("Source", copy ? "Copied" : "Moved");
+ }
+});
+
+/*=====
+dndSource.__Item = __Item;
+=====*/
+
+return dndSource;
+});
diff --git a/lib/dijit/tree/model.js b/lib/dijit/tree/model.js
index 5add44298..69cd9b307 100644
--- a/lib/dijit/tree/model.js
+++ b/lib/dijit/tree/model.js
@@ -1 +1,2 @@
//>>built
+define("dijit/tree/model",["dojo/_base/declare"],function(_1){return _1("dijit.tree.model",null,{destroy:function(){},getRoot:function(_2){},mayHaveChildren:function(_3){},getChildren:function(_4,_5){},isItem:function(_6){},fetchItemByIdentity:function(_7){},getIdentity:function(_8){},getLabel:function(_9){},newItem:function(_a,_b,_c,_d){},pasteItem:function(_e,_f,_10,_11,_12,_13){},onChange:function(_14){},onChildrenChange:function(_15,_16){}});}); \ No newline at end of file
diff --git a/lib/dijit/tree/model.js.uncompressed.js b/lib/dijit/tree/model.js.uncompressed.js
new file mode 100644
index 000000000..cae349890
--- /dev/null
+++ b/lib/dijit/tree/model.js.uncompressed.js
@@ -0,0 +1,150 @@
+define("dijit/tree/model", ["dojo/_base/declare"], function(declare){
+
+return declare(
+ "dijit.tree.model",
+ null,
+{
+ // summary:
+ // Contract for any data provider object for the tree.
+ // description:
+ // Tree passes in values to the constructor to specify the callbacks.
+ // "item" is typically a dojo/data/Item but it's just a black box so
+ // it could be anything.
+ //
+ // This (like `dojo/data/api/Read`) is just documentation, and not meant to be used.
+
+ destroy: function(){
+ // summary:
+ // Destroys this object, releasing connections to the store
+ // tags:
+ // extension
+ },
+
+ // =======================================================================
+ // Methods for traversing hierarchy
+
+ getRoot: function(onItem){
+ // summary:
+ // Calls onItem with the root item for the tree, possibly a fabricated item.
+ // Throws exception on error.
+ // tags:
+ // extension
+ },
+
+ mayHaveChildren: function(item){
+ // summary:
+ // Tells if an item has or may have children. Implementing logic here
+ // avoids showing +/- expando icon for nodes that we know don't have children.
+ // (For efficiency reasons we may not want to check if an element actually
+ // has children until user clicks the expando node)
+ // item: dojo/data/Item
+ // tags:
+ // extension
+ },
+
+ getChildren: function(parentItem, onComplete){
+ // summary:
+ // Calls onComplete() with array of child items of given parent item, all loaded.
+ // Throws exception on error.
+ // parentItem: dojo/data/Item
+ // onComplete: function(items)
+ // tags:
+ // extension
+ },
+
+ // =======================================================================
+ // Inspecting items
+
+ isItem: function(something){
+ // summary:
+ // Returns true if *something* is an item and came from this model instance.
+ // Returns false if *something* is a literal, an item from another model instance,
+ // or is any object other than an item.
+ // tags:
+ // extension
+ },
+
+ fetchItemByIdentity: function(keywordArgs){
+ // summary:
+ // Given the identity of an item, this method returns the item that has
+ // that identity through the onItem callback. Conforming implementations
+ // should return null if there is no item with the given identity.
+ // Implementations of fetchItemByIdentity() may sometimes return an item
+ // from a local cache and may sometimes fetch an item from a remote server.
+ // tags:
+ // extension
+ },
+
+ getIdentity: function(item){
+ // summary:
+ // Returns identity for an item
+ // tags:
+ // extension
+ },
+
+ getLabel: function(item){
+ // summary:
+ // Get the label for an item
+ // tags:
+ // extension
+ },
+
+ // =======================================================================
+ // Write interface
+
+ newItem: function(args, parent, insertIndex, before){
+ // summary:
+ // Creates a new item. See `dojo/data/api/Write` for details on args.
+ // args: dijit/tree/dndSource.__Item
+ // parent: Item
+ // insertIndex: int?
+ // Allows to insert the new item as the n'th child of `parent`.
+ // before: Item?
+ // Insert the new item as the previous sibling of this item. `before` must be a child of `parent`.
+ // tags:
+ // extension
+ },
+
+ pasteItem: function(childItem, oldParentItem, newParentItem, bCopy, insertIndex, before){
+ // summary:
+ // Move or copy an item from one parent item to another.
+ // Used in drag & drop.
+ // If oldParentItem is specified and bCopy is false, childItem is removed from oldParentItem.
+ // If newParentItem is specified, childItem is attached to newParentItem.
+ // childItem: Item
+ // oldParentItem: Item
+ // newParentItem: Item
+ // bCopy: Boolean
+ // insertIndex: int?
+ // Allows to insert the new item as the n'th child of `parent`.
+ // before: Item?
+ // Insert the new item as the previous sibling of this item. `before` must be a child of `parent`.
+ // tags:
+ // extension
+ },
+
+ // =======================================================================
+ // Callbacks
+
+ onChange: function(item){
+ // summary:
+ // Callback whenever an item has changed, so that Tree
+ // can update the label, icon, etc. Note that changes
+ // to an item's children or parent(s) will trigger an
+ // onChildrenChange() so you can ignore those changes here.
+ // item: dojo/data/Item
+ // tags:
+ // callback
+ },
+
+ onChildrenChange: function(parent, newChildrenList){
+ // summary:
+ // Callback to do notifications about new, updated, or deleted items.
+ // parent: dojo/data/Item
+ // newChildrenList: dojo/data/Item[]
+ // tags:
+ // callback
+ }
+});
+
+}); \ No newline at end of file
diff --git a/lib/dijit/typematic.js b/lib/dijit/typematic.js
index a2a017f48..9d33c49b8 100644
--- a/lib/dijit/typematic.js
+++ b/lib/dijit/typematic.js
@@ -1,2 +1,2 @@
//>>built
-define("dijit/typematic",["dojo/_base/array","dojo/_base/connect","dojo/_base/event","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/_base/sniff","."],function(_1,_2,_3,_4,_5,on,_6,_7){var _8=(_7.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);this._currentTimeout=Math.max(this._currentTimeout<0?this._initialDelay:(this._subsequentDelay>1?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay)),this._minDelay);this._timer=setTimeout(_5.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(_9,_a,_b,_c,_d,_e,_f,_10){if(_d!=this._obj){this.stop();this._initialDelay=_f||500;this._subsequentDelay=_e||0.9;this._minDelay=_10||10;this._obj=_d;this._evt=_9;this._node=_b;this._currentTimeout=-1;this._count=-1;this._callback=_5.hitch(_a,_c);this._fireEventAndReload();this._evt=_5.mixin({faux:true},_9);}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(_11,_12,_13,_14,_15,_16,_17){if(_12.keyCode){_12.charOrCode=_12.keyCode;_4.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_12.charCode){_12.charOrCode=String.fromCharCode(_12.charCode);_4.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}var _18=[on(_11,_2._keypress,_5.hitch(this,function(evt){if(evt.charOrCode==_12.charOrCode&&(_12.ctrlKey===undefined||_12.ctrlKey==evt.ctrlKey)&&(_12.altKey===undefined||_12.altKey==evt.altKey)&&(_12.metaKey===undefined||_12.metaKey==(evt.metaKey||false))&&(_12.shiftKey===undefined||_12.shiftKey==evt.shiftKey)){_3.stop(evt);_8.trigger(evt,_13,_11,_14,_12,_15,_16,_17);}else{if(_8._obj==_12){_8.stop();}}})),on(_11,"keyup",_5.hitch(this,function(){if(_8._obj==_12){_8.stop();}}))];return {remove:function(){_1.forEach(_18,function(h){h.remove();});}};},addMouseListener:function(_19,_1a,_1b,_1c,_1d,_1e){var _1f=[on(_19,"mousedown",_5.hitch(this,function(evt){_3.stop(evt);_8.trigger(evt,_1a,_19,_1b,_19,_1c,_1d,_1e);})),on(_19,"mouseup",_5.hitch(this,function(evt){if(this._obj){_3.stop(evt);}_8.stop();})),on(_19,"mouseout",_5.hitch(this,function(evt){_3.stop(evt);_8.stop();})),on(_19,"mousemove",_5.hitch(this,function(evt){evt.preventDefault();})),on(_19,"dblclick",_5.hitch(this,function(evt){_3.stop(evt);if(_6("ie")){_8.trigger(evt,_1a,_19,_1b,_19,_1c,_1d,_1e);setTimeout(_5.hitch(this,_8.stop),50);}}))];return {remove:function(){_1.forEach(_1f,function(h){h.remove();});}};},addListener:function(_20,_21,_22,_23,_24,_25,_26,_27){var _28=[this.addKeyListener(_21,_22,_23,_24,_25,_26,_27),this.addMouseListener(_20,_23,_24,_25,_26,_27)];return {remove:function(){_1.forEach(_28,function(h){h.remove();});}};}});return _8;}); \ No newline at end of file
+define("dijit/typematic",["dojo/_base/array","dojo/_base/connect","dojo/_base/event","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/sniff","./main"],function(_1,_2,_3,_4,_5,on,_6,_7){var _8=(_7.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);this._currentTimeout=Math.max(this._currentTimeout<0?this._initialDelay:(this._subsequentDelay>1?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay)),this._minDelay);this._timer=setTimeout(_5.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(_9,_a,_b,_c,_d,_e,_f,_10){if(_d!=this._obj){this.stop();this._initialDelay=_f||500;this._subsequentDelay=_e||0.9;this._minDelay=_10||10;this._obj=_d;this._node=_b;this._currentTimeout=-1;this._count=-1;this._callback=_5.hitch(_a,_c);this._evt={faux:true};for(var _11 in _9){if(_11!="layerX"&&_11!="layerY"){var v=_9[_11];if(typeof v!="function"&&typeof v!="undefined"){this._evt[_11]=v;}}}this._fireEventAndReload();}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(_12,_13,_14,_15,_16,_17,_18){if(_13.keyCode){_13.charOrCode=_13.keyCode;_4.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_13.charCode){_13.charOrCode=String.fromCharCode(_13.charCode);_4.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}var _19=[on(_12,_2._keypress,_5.hitch(this,function(evt){if(evt.charOrCode==_13.charOrCode&&(_13.ctrlKey===undefined||_13.ctrlKey==evt.ctrlKey)&&(_13.altKey===undefined||_13.altKey==evt.altKey)&&(_13.metaKey===undefined||_13.metaKey==(evt.metaKey||false))&&(_13.shiftKey===undefined||_13.shiftKey==evt.shiftKey)){_3.stop(evt);_8.trigger(evt,_14,_12,_15,_13,_16,_17,_18);}else{if(_8._obj==_13){_8.stop();}}})),on(_12,"keyup",_5.hitch(this,function(){if(_8._obj==_13){_8.stop();}}))];return {remove:function(){_1.forEach(_19,function(h){h.remove();});}};},addMouseListener:function(_1a,_1b,_1c,_1d,_1e,_1f){var _20=[on(_1a,"mousedown",_5.hitch(this,function(evt){evt.preventDefault();_8.trigger(evt,_1b,_1a,_1c,_1a,_1d,_1e,_1f);})),on(_1a,"mouseup",_5.hitch(this,function(evt){if(this._obj){evt.preventDefault();}_8.stop();})),on(_1a,"mouseout",_5.hitch(this,function(evt){if(this._obj){evt.preventDefault();}_8.stop();})),on(_1a,"dblclick",_5.hitch(this,function(evt){evt.preventDefault();if(_6("ie")<9){_8.trigger(evt,_1b,_1a,_1c,_1a,_1d,_1e,_1f);setTimeout(_5.hitch(this,_8.stop),50);}}))];return {remove:function(){_1.forEach(_20,function(h){h.remove();});}};},addListener:function(_21,_22,_23,_24,_25,_26,_27,_28){var _29=[this.addKeyListener(_22,_23,_24,_25,_26,_27,_28),this.addMouseListener(_21,_24,_25,_26,_27,_28)];return {remove:function(){_1.forEach(_29,function(h){h.remove();});}};}});return _8;}); \ No newline at end of file
diff --git a/lib/dijit/typematic.js.uncompressed.js b/lib/dijit/typematic.js.uncompressed.js
new file mode 100644
index 000000000..476b8f0db
--- /dev/null
+++ b/lib/dijit/typematic.js.uncompressed.js
@@ -0,0 +1,201 @@
+define("dijit/typematic", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/connect", // connect.connect
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.mixin, lang.hitch
+ "dojo/on",
+ "dojo/sniff", // has("ie")
+ "./main" // setting dijit.typematic global
+], function(array, connect, event, kernel, lang, on, has, dijit){
+
+// module:
+// dijit/typematic
+
+var typematic = (dijit.typematic = {
+ // summary:
+ // These functions are used to repetitively call a user specified callback
+ // method when a specific key or mouse click over a specific DOM node is
+ // held down for a specific amount of time.
+ // Only 1 such event is allowed to occur on the browser page at 1 time.
+
+ _fireEventAndReload: function(){
+ this._timer = null;
+ this._callback(++this._count, this._node, this._evt);
+
+ // Schedule next event, timer is at most minDelay (default 10ms) to avoid
+ // browser overload (particularly avoiding starving DOH robot so it never gets to send a mouseup)
+ this._currentTimeout = Math.max(
+ this._currentTimeout < 0 ? this._initialDelay :
+ (this._subsequentDelay > 1 ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay)),
+ this._minDelay);
+ this._timer = setTimeout(lang.hitch(this, "_fireEventAndReload"), this._currentTimeout);
+ },
+
+ trigger: function(/*Event*/ evt, /*Object*/ _this, /*DOMNode*/ node, /*Function*/ callback, /*Object*/ obj, /*Number?*/ subsequentDelay, /*Number?*/ initialDelay, /*Number?*/ minDelay){
+ // summary:
+ // Start a timed, repeating callback sequence.
+ // If already started, the function call is ignored.
+ // This method is not normally called by the user but can be
+ // when the normal listener code is insufficient.
+ // evt:
+ // key or mouse event object to pass to the user callback
+ // _this:
+ // pointer to the user's widget space.
+ // node:
+ // the DOM node object to pass the the callback function
+ // callback:
+ // function to call until the sequence is stopped called with 3 parameters:
+ // count:
+ // integer representing number of repeated calls (0..n) with -1 indicating the iteration has stopped
+ // node:
+ // the DOM node object passed in
+ // evt:
+ // key or mouse event object
+ // obj:
+ // user space object used to uniquely identify each typematic sequence
+ // subsequentDelay:
+ // if > 1, the number of milliseconds until the 3->n events occur
+ // or else the fractional time multiplier for the next event's delay, default=0.9
+ // initialDelay:
+ // the number of milliseconds until the 2nd event occurs, default=500ms
+ // minDelay:
+ // the maximum delay in milliseconds for event to fire, default=10ms
+ if(obj != this._obj){
+ this.stop();
+ this._initialDelay = initialDelay || 500;
+ this._subsequentDelay = subsequentDelay || 0.90;
+ this._minDelay = minDelay || 10;
+ this._obj = obj;
+ this._node = node;
+ this._currentTimeout = -1;
+ this._count = -1;
+ this._callback = lang.hitch(_this, callback);
+ this._evt = { faux: true };
+ for(var attr in evt){
+ if(attr != "layerX" && attr != "layerY"){ // prevent WebKit warnings
+ var v = evt[attr];
+ if(typeof v != "function" && typeof v != "undefined"){ this._evt[attr] = v }
+ }
+ }
+ this._fireEventAndReload();
+ }
+ },
+
+ stop: function(){
+ // summary:
+ // Stop an ongoing timed, repeating callback sequence.
+ if(this._timer){
+ clearTimeout(this._timer);
+ this._timer = null;
+ }
+ if(this._obj){
+ this._callback(-1, this._node, this._evt);
+ this._obj = null;
+ }
+ },
+
+ addKeyListener: function(/*DOMNode*/ node, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){
+ // summary:
+ // Start listening for a specific typematic key.
+ // See also the trigger method for other parameters.
+ // keyObject:
+ // an object defining the key to listen for:
+ //
+ // - charOrCode: the printable character (string) or keyCode (number) to listen for.
+ // - keyCode: (deprecated - use charOrCode) the keyCode (number) to listen for (implies charCode = 0).
+ // - charCode: (deprecated - use charOrCode) the charCode (number) to listen for.
+ // - ctrlKey: desired ctrl key state to initiate the callback sequence:
+ // - pressed (true)
+ // - released (false)
+ // - either (unspecified)
+ // - altKey: same as ctrlKey but for the alt key
+ // - shiftKey: same as ctrlKey but for the shift key
+ // returns:
+ // a connection handle
+
+ if(keyObject.keyCode){
+ keyObject.charOrCode = keyObject.keyCode;
+ kernel.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0");
+ }else if(keyObject.charCode){
+ keyObject.charOrCode = String.fromCharCode(keyObject.charCode);
+ kernel.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0");
+ }
+ var handles = [
+ on(node, connect._keypress, lang.hitch(this, function(evt){
+ if(evt.charOrCode == keyObject.charOrCode &&
+ (keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
+ (keyObject.altKey === undefined || keyObject.altKey == evt.altKey) &&
+ (keyObject.metaKey === undefined || keyObject.metaKey == (evt.metaKey || false)) && // IE doesn't even set metaKey
+ (keyObject.shiftKey === undefined || keyObject.shiftKey == evt.shiftKey)){
+ event.stop(evt);
+ typematic.trigger(evt, _this, node, callback, keyObject, subsequentDelay, initialDelay, minDelay);
+ }else if(typematic._obj == keyObject){
+ typematic.stop();
+ }
+ })),
+ on(node, "keyup", lang.hitch(this, function(){
+ if(typematic._obj == keyObject){
+ typematic.stop();
+ }
+ }))
+ ];
+ return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } };
+ },
+
+ addMouseListener: function(/*DOMNode*/ node, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){
+ // summary:
+ // Start listening for a typematic mouse click.
+ // See the trigger method for other parameters.
+ // returns:
+ // a connection handle
+ var handles = [
+ on(node, "mousedown", lang.hitch(this, function(evt){
+ evt.preventDefault();
+ typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay);
+ })),
+ on(node, "mouseup", lang.hitch(this, function(evt){
+ if(this._obj){
+ evt.preventDefault();
+ }
+ typematic.stop();
+ })),
+ on(node, "mouseout", lang.hitch(this, function(evt){
+ if(this._obj){
+ evt.preventDefault();
+ }
+ typematic.stop();
+ })),
+ on(node, "dblclick", lang.hitch(this, function(evt){
+ evt.preventDefault();
+ if(has("ie") < 9){
+ typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay);
+ setTimeout(lang.hitch(this, typematic.stop), 50);
+ }
+ }))
+ ];
+ return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } };
+ },
+
+ addListener: function(/*Node*/ mouseNode, /*Node*/ keyNode, /*Object*/ keyObject, /*Object*/ _this, /*Function*/ callback, /*Number*/ subsequentDelay, /*Number*/ initialDelay, /*Number?*/ minDelay){
+ // summary:
+ // Start listening for a specific typematic key and mouseclick.
+ // This is a thin wrapper to addKeyListener and addMouseListener.
+ // See the addMouseListener and addKeyListener methods for other parameters.
+ // mouseNode:
+ // the DOM node object to listen on for mouse events.
+ // keyNode:
+ // the DOM node object to listen on for key events.
+ // returns:
+ // a connection handle
+ var handles = [
+ this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay, minDelay),
+ this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay, minDelay)
+ ];
+ return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } };
+ }
+});
+
+return typematic;
+
+});