summaryrefslogtreecommitdiff
path: root/lib/dijit
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2012-08-14 18:59:10 +0400
committerAndrew Dolgov <[email protected]>2012-08-14 18:59:18 +0400
commit1354d17270961fff662d40f90521223f8fd0d73b (patch)
treee9266be71587e47c800303446e968a6d3565e2cf /lib/dijit
parentd04f8c826f5283765f52cf6b98b42a1ed8f2d6bc (diff)
update dojo to 1.7.3
Diffstat (limited to 'lib/dijit')
-rw-r--r--lib/dijit/BackgroundIframe.js2
-rw-r--r--lib/dijit/BackgroundIframe.js.uncompressed.js113
-rw-r--r--lib/dijit/Calendar.js611
-rw-r--r--lib/dijit/Calendar.js.uncompressed.js317
-rw-r--r--lib/dijit/CalendarLite.js2
-rw-r--r--lib/dijit/CalendarLite.js.uncompressed.js453
-rw-r--r--lib/dijit/CheckedMenuItem.js56
-rw-r--r--lib/dijit/CheckedMenuItem.js.uncompressed.js59
-rw-r--r--lib/dijit/ColorPalette.js144
-rw-r--r--lib/dijit/ColorPalette.js.uncompressed.js160
-rw-r--r--lib/dijit/Declaration.js108
-rw-r--r--lib/dijit/Declaration.js.uncompressed.js112
-rw-r--r--lib/dijit/Dialog.js613
-rw-r--r--lib/dijit/Dialog.js.uncompressed.js643
-rw-r--r--lib/dijit/DialogUnderlay.js114
-rw-r--r--lib/dijit/DialogUnderlay.js.uncompressed.js110
-rw-r--r--lib/dijit/DropDownMenu.js2
-rw-r--r--lib/dijit/DropDownMenu.js.uncompressed.js64
-rw-r--r--lib/dijit/Editor.js796
-rw-r--r--lib/dijit/Editor.js.uncompressed.js859
-rw-r--r--lib/dijit/InlineEditBox.js591
-rw-r--r--lib/dijit/InlineEditBox.js.uncompressed.js627
-rw-r--r--lib/dijit/Menu.js718
-rw-r--r--lib/dijit/Menu.js.uncompressed.js321
-rw-r--r--lib/dijit/MenuBar.js79
-rw-r--r--lib/dijit/MenuBar.js.uncompressed.js83
-rw-r--r--lib/dijit/MenuBarItem.js31
-rw-r--r--lib/dijit/MenuBarItem.js.uncompressed.js35
-rw-r--r--lib/dijit/MenuItem.js202
-rw-r--r--lib/dijit/MenuItem.js.uncompressed.js211
-rw-r--r--lib/dijit/MenuSeparator.js41
-rw-r--r--lib/dijit/MenuSeparator.js.uncompressed.js43
-rw-r--r--lib/dijit/PopupMenuBarItem.js22
-rw-r--r--lib/dijit/PopupMenuBarItem.js.uncompressed.js23
-rw-r--r--lib/dijit/PopupMenuItem.js76
-rw-r--r--lib/dijit/PopupMenuItem.js.uncompressed.js80
-rw-r--r--lib/dijit/ProgressBar.js170
-rw-r--r--lib/dijit/ProgressBar.js.uncompressed.js177
-rw-r--r--lib/dijit/TitlePane.js259
-rw-r--r--lib/dijit/TitlePane.js.uncompressed.js277
-rw-r--r--lib/dijit/Toolbar.js55
-rw-r--r--lib/dijit/Toolbar.js.uncompressed.js51
-rw-r--r--lib/dijit/ToolbarSeparator.js37
-rw-r--r--lib/dijit/ToolbarSeparator.js.uncompressed.js38
-rw-r--r--lib/dijit/Tooltip.js442
-rw-r--r--lib/dijit/Tooltip.js.uncompressed.js499
-rw-r--r--lib/dijit/TooltipDialog.js148
-rw-r--r--lib/dijit/TooltipDialog.js.uncompressed.js156
-rw-r--r--lib/dijit/Tree.js1636
-rw-r--r--lib/dijit/Tree.js.uncompressed.js1692
-rw-r--r--lib/dijit/WidgetSet.js2
-rw-r--r--lib/dijit/WidgetSet.js.uncompressed.js229
-rw-r--r--lib/dijit/_BidiSupport.js2
-rw-r--r--lib/dijit/_BidiSupport.js.uncompressed.js69
-rw-r--r--lib/dijit/_Calendar.js22
-rw-r--r--lib/dijit/_Calendar.js.uncompressed.js17
-rw-r--r--lib/dijit/_Contained.js78
-rw-r--r--lib/dijit/_Contained.js.uncompressed.js62
-rw-r--r--lib/dijit/_Container.js146
-rw-r--r--lib/dijit/_Container.js.uncompressed.js107
-rw-r--r--lib/dijit/_CssStateMixin.js266
-rw-r--r--lib/dijit/_CssStateMixin.js.uncompressed.js268
-rw-r--r--lib/dijit/_DialogMixin.js82
-rw-r--r--lib/dijit/_DialogMixin.js.uncompressed.js72
-rw-r--r--lib/dijit/_FocusMixin.js2
-rw-r--r--lib/dijit/_FocusMixin.js.uncompressed.js73
-rw-r--r--lib/dijit/_HasDropDown.js445
-rw-r--r--lib/dijit/_HasDropDown.js.uncompressed.js502
-rw-r--r--lib/dijit/_KeyNavContainer.js263
-rw-r--r--lib/dijit/_KeyNavContainer.js.uncompressed.js264
-rw-r--r--lib/dijit/_MenuBase.js2
-rw-r--r--lib/dijit/_MenuBase.js.uncompressed.js391
-rw-r--r--lib/dijit/_OnDijitClickMixin.js2
-rw-r--r--lib/dijit/_OnDijitClickMixin.js.uncompressed.js125
-rw-r--r--lib/dijit/_PaletteMixin.js328
-rw-r--r--lib/dijit/_PaletteMixin.js.uncompressed.js345
-rw-r--r--lib/dijit/_Templated.js353
-rw-r--r--lib/dijit/_Templated.js.uncompressed.js71
-rw-r--r--lib/dijit/_TemplatedMixin.js2
-rw-r--r--lib/dijit/_TemplatedMixin.js.uncompressed.js304
-rw-r--r--lib/dijit/_TimePicker.js483
-rw-r--r--lib/dijit/_TimePicker.js.uncompressed.js506
-rw-r--r--lib/dijit/_Widget.js494
-rw-r--r--lib/dijit/_Widget.js.uncompressed.js351
-rw-r--r--lib/dijit/_WidgetBase.js828
-rw-r--r--lib/dijit/_WidgetBase.js.uncompressed.js1020
-rw-r--r--lib/dijit/_WidgetsInTemplateMixin.js2
-rw-r--r--lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js61
-rw-r--r--lib/dijit/_base.js25
-rw-r--r--lib/dijit/_base.js.uncompressed.js22
-rw-r--r--lib/dijit/_base/focus.js532
-rw-r--r--lib/dijit/_base/focus.js.uncompressed.js319
-rw-r--r--lib/dijit/_base/manager.js495
-rw-r--r--lib/dijit/_base/manager.js.uncompressed.js76
-rw-r--r--lib/dijit/_base/place.js378
-rw-r--r--lib/dijit/_base/place.js.uncompressed.js137
-rw-r--r--lib/dijit/_base/popup.js407
-rw-r--r--lib/dijit/_base/popup.js.uncompressed.js50
-rw-r--r--lib/dijit/_base/scroll.js24
-rw-r--r--lib/dijit/_base/scroll.js.uncompressed.js17
-rw-r--r--lib/dijit/_base/sniff.js23
-rw-r--r--lib/dijit/_base/sniff.js.uncompressed.js6
-rw-r--r--lib/dijit/_base/typematic.js193
-rw-r--r--lib/dijit/_base/typematic.js.uncompressed.js3
-rw-r--r--lib/dijit/_base/wai.js147
-rw-r--r--lib/dijit/_base/wai.js.uncompressed.js105
-rw-r--r--lib/dijit/_base/window.js20
-rw-r--r--lib/dijit/_base/window.js.uncompressed.js13
-rw-r--r--lib/dijit/_editor/RichText.js2098
-rw-r--r--lib/dijit/_editor/RichText.js.uncompressed.js2891
-rw-r--r--lib/dijit/_editor/_Plugin.js291
-rw-r--r--lib/dijit/_editor/_Plugin.js.uncompressed.js294
-rw-r--r--lib/dijit/_editor/html.js195
-rw-r--r--lib/dijit/_editor/html.js.uncompressed.js194
-rw-r--r--lib/dijit/_editor/nls/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/FontChoice.js.uncompressed.js62
-rw-r--r--lib/dijit/_editor/nls/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/LinkDialog.js.uncompressed.js48
-rw-r--r--lib/dijit/_editor/nls/ar/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/ar/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/ar/commands.js3
-rw-r--r--lib/dijit/_editor/nls/ar/commands.js.uncompressed.js54
-rw-r--r--lib/dijit/_editor/nls/az/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js27
-rw-r--r--lib/dijit/_editor/nls/az/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js16
-rw-r--r--lib/dijit/_editor/nls/az/commands.js2
-rw-r--r--lib/dijit/_editor/nls/az/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/ca/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/ca/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js16
-rw-r--r--lib/dijit/_editor/nls/ca/commands.js3
-rw-r--r--lib/dijit/_editor/nls/ca/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/commands.js3
-rw-r--r--lib/dijit/_editor/nls/commands.js.uncompressed.js85
-rw-r--r--lib/dijit/_editor/nls/cs/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/cs/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/cs/commands.js3
-rw-r--r--lib/dijit/_editor/nls/cs/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/da/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/da/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/da/commands.js3
-rw-r--r--lib/dijit/_editor/nls/da/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/de/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/de/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/de/commands.js3
-rw-r--r--lib/dijit/_editor/nls/de/commands.js.uncompressed.js53
-rw-r--r--lib/dijit/_editor/nls/el/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/el/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/el/commands.js3
-rw-r--r--lib/dijit/_editor/nls/el/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/es/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/es/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/es/commands.js3
-rw-r--r--lib/dijit/_editor/nls/es/commands.js.uncompressed.js53
-rw-r--r--lib/dijit/_editor/nls/fi/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/fi/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/fi/commands.js3
-rw-r--r--lib/dijit/_editor/nls/fi/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/fr/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/fr/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/fr/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js16
-rw-r--r--lib/dijit/_editor/nls/fr/commands.js3
-rw-r--r--lib/dijit/_editor/nls/fr/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/he/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/he/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/he/commands.js3
-rw-r--r--lib/dijit/_editor/nls/he/commands.js.uncompressed.js53
-rw-r--r--lib/dijit/_editor/nls/hr/FontChoice.js2
-rw-r--r--lib/dijit/_editor/nls/hr/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/hr/LinkDialog.js2
-rw-r--r--lib/dijit/_editor/nls/hr/LinkDialog.js.uncompressed.js14
-rw-r--r--lib/dijit/_editor/nls/hr/commands.js2
-rw-r--r--lib/dijit/_editor/nls/hr/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/hu/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/hu/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/hu/commands.js3
-rw-r--r--lib/dijit/_editor/nls/hu/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/it/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/it/FontChoice.js.uncompressed.js25
-rw-r--r--lib/dijit/_editor/nls/it/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/it/commands.js3
-rw-r--r--lib/dijit/_editor/nls/it/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/ja/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/ja/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/ja/commands.js3
-rw-r--r--lib/dijit/_editor/nls/ja/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/kk/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/kk/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js16
-rw-r--r--lib/dijit/_editor/nls/kk/commands.js3
-rw-r--r--lib/dijit/_editor/nls/kk/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ko/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/ko/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/ko/commands.js3
-rw-r--r--lib/dijit/_editor/nls/ko/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/nb/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/nb/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/nb/commands.js3
-rw-r--r--lib/dijit/_editor/nls/nb/commands.js.uncompressed.js53
-rw-r--r--lib/dijit/_editor/nls/nl/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/nl/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/nl/commands.js3
-rw-r--r--lib/dijit/_editor/nls/nl/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/pl/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/pl/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/pl/commands.js3
-rw-r--r--lib/dijit/_editor/nls/pl/commands.js.uncompressed.js53
-rw-r--r--lib/dijit/_editor/nls/pt-pt/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/pt-pt/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/pt-pt/commands.js3
-rw-r--r--lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/pt/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/pt/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/pt/commands.js3
-rw-r--r--lib/dijit/_editor/nls/pt/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ro/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js31
-rw-r--r--lib/dijit/_editor/nls/ro/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/ro/commands.js3
-rw-r--r--lib/dijit/_editor/nls/ro/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/ru/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/ru/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/ru/commands.js3
-rw-r--r--lib/dijit/_editor/nls/ru/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/sk/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js31
-rw-r--r--lib/dijit/_editor/nls/sk/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/sk/commands.js3
-rw-r--r--lib/dijit/_editor/nls/sk/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/sl/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js31
-rw-r--r--lib/dijit/_editor/nls/sl/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/sl/commands.js3
-rw-r--r--lib/dijit/_editor/nls/sl/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/sv/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/sv/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/sv/commands.js3
-rw-r--r--lib/dijit/_editor/nls/sv/commands.js.uncompressed.js54
-rw-r--r--lib/dijit/_editor/nls/th/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js31
-rw-r--r--lib/dijit/_editor/nls/th/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/th/commands.js3
-rw-r--r--lib/dijit/_editor/nls/th/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/tr/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/tr/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/tr/commands.js3
-rw-r--r--lib/dijit/_editor/nls/tr/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/nls/zh-tw/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/zh-tw/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/zh-tw/commands.js3
-rw-r--r--lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js51
-rw-r--r--lib/dijit/_editor/nls/zh/FontChoice.js3
-rw-r--r--lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js30
-rw-r--r--lib/dijit/_editor/nls/zh/LinkDialog.js3
-rw-r--r--lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js17
-rw-r--r--lib/dijit/_editor/nls/zh/commands.js3
-rw-r--r--lib/dijit/_editor/nls/zh/commands.js.uncompressed.js52
-rw-r--r--lib/dijit/_editor/plugins/AlwaysShowToolbar.js192
-rw-r--r--lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js199
-rw-r--r--lib/dijit/_editor/plugins/EnterKeyHandling.js606
-rw-r--r--lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js638
-rw-r--r--lib/dijit/_editor/plugins/FontChoice.js585
-rw-r--r--lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js591
-rw-r--r--lib/dijit/_editor/plugins/FullScreen.js443
-rw-r--r--lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js457
-rw-r--r--lib/dijit/_editor/plugins/LinkDialog.js518
-rw-r--r--lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js586
-rw-r--r--lib/dijit/_editor/plugins/NewPage.js83
-rw-r--r--lib/dijit/_editor/plugins/NewPage.js.uncompressed.js83
-rw-r--r--lib/dijit/_editor/plugins/Print.js127
-rw-r--r--lib/dijit/_editor/plugins/Print.js.uncompressed.js129
-rw-r--r--lib/dijit/_editor/plugins/TabIndent.js71
-rw-r--r--lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js69
-rw-r--r--lib/dijit/_editor/plugins/TextColor.js107
-rw-r--r--lib/dijit/_editor/plugins/TextColor.js.uncompressed.js119
-rw-r--r--lib/dijit/_editor/plugins/ToggleDir.js82
-rw-r--r--lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js77
-rw-r--r--lib/dijit/_editor/plugins/ViewSource.js557
-rw-r--r--lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js564
-rw-r--r--lib/dijit/_editor/range.js543
-rw-r--r--lib/dijit/_editor/range.js.uncompressed.js553
-rw-r--r--lib/dijit/_editor/selection.js371
-rw-r--r--lib/dijit/_editor/selection.js.uncompressed.js372
-rw-r--r--lib/dijit/_tree/dndSource.js21
-rw-r--r--lib/dijit/_tree/dndSource.js.uncompressed.js15
-rw-r--r--lib/dijit/a11y.js2
-rw-r--r--lib/dijit/a11y.js.uncompressed.js177
-rw-r--r--lib/dijit/dijit-all.js79
-rw-r--r--lib/dijit/dijit-all.js.uncompressed.js70
-rw-r--r--lib/dijit/dijit.js40
-rw-r--r--lib/dijit/dijit.js.uncompressed.js21
-rw-r--r--lib/dijit/dijit.profile.js39
-rw-r--r--lib/dijit/focus.js2
-rw-r--r--lib/dijit/focus.js.uncompressed.js389
-rw-r--r--lib/dijit/form/Button.js362
-rw-r--r--lib/dijit/form/Button.js.uncompressed.js126
-rw-r--r--lib/dijit/form/CheckBox.js206
-rw-r--r--lib/dijit/form/CheckBox.js.uncompressed.js120
-rw-r--r--lib/dijit/form/ComboBox.js1233
-rw-r--r--lib/dijit/form/ComboBox.js.uncompressed.js34
-rw-r--r--lib/dijit/form/ComboBoxMixin.js2
-rw-r--r--lib/dijit/form/ComboBoxMixin.js.uncompressed.js148
-rw-r--r--lib/dijit/form/ComboButton.js17
-rw-r--r--lib/dijit/form/ComboButton.js.uncompressed.js91
-rw-r--r--lib/dijit/form/CurrencyTextBox.js98
-rw-r--r--lib/dijit/form/CurrencyTextBox.js.uncompressed.js94
-rw-r--r--lib/dijit/form/DataList.js2
-rw-r--r--lib/dijit/form/DataList.js.uncompressed.js63
-rw-r--r--lib/dijit/form/DateTextBox.js42
-rw-r--r--lib/dijit/form/DateTextBox.js.uncompressed.js38
-rw-r--r--lib/dijit/form/DropDownButton.js17
-rw-r--r--lib/dijit/form/DropDownButton.js.uncompressed.js107
-rw-r--r--lib/dijit/form/FilteringSelect.js229
-rw-r--r--lib/dijit/form/FilteringSelect.js.uncompressed.js240
-rw-r--r--lib/dijit/form/Form.js191
-rw-r--r--lib/dijit/form/Form.js.uncompressed.js172
-rw-r--r--lib/dijit/form/HorizontalRule.js76
-rw-r--r--lib/dijit/form/HorizontalRule.js.uncompressed.js76
-rw-r--r--lib/dijit/form/HorizontalRuleLabels.js99
-rw-r--r--lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js99
-rw-r--r--lib/dijit/form/HorizontalSlider.js345
-rw-r--r--lib/dijit/form/HorizontalSlider.js.uncompressed.js359
-rw-r--r--lib/dijit/form/MappedTextBox.js17
-rw-r--r--lib/dijit/form/MappedTextBox.js.uncompressed.js89
-rw-r--r--lib/dijit/form/MultiSelect.js121
-rw-r--r--lib/dijit/form/MultiSelect.js.uncompressed.js118
-rw-r--r--lib/dijit/form/NumberSpinner.js73
-rw-r--r--lib/dijit/form/NumberSpinner.js.uncompressed.js74
-rw-r--r--lib/dijit/form/NumberTextBox.js280
-rw-r--r--lib/dijit/form/NumberTextBox.js.uncompressed.js286
-rw-r--r--lib/dijit/form/RadioButton.js18
-rw-r--r--lib/dijit/form/RadioButton.js.uncompressed.js23
-rw-r--r--lib/dijit/form/RangeBoundTextBox.js17
-rw-r--r--lib/dijit/form/RangeBoundTextBox.js.uncompressed.js143
-rw-r--r--lib/dijit/form/Select.js307
-rw-r--r--lib/dijit/form/Select.js.uncompressed.js347
-rw-r--r--lib/dijit/form/SimpleTextarea.js105
-rw-r--r--lib/dijit/form/SimpleTextarea.js.uncompressed.js100
-rw-r--r--lib/dijit/form/Slider.js25
-rw-r--r--lib/dijit/form/Slider.js.uncompressed.js18
-rw-r--r--lib/dijit/form/TextBox.js429
-rw-r--r--lib/dijit/form/TextBox.js.uncompressed.js175
-rw-r--r--lib/dijit/form/Textarea.js169
-rw-r--r--lib/dijit/form/Textarea.js.uncompressed.js49
-rw-r--r--lib/dijit/form/TimeTextBox.js89
-rw-r--r--lib/dijit/form/TimeTextBox.js.uncompressed.js88
-rw-r--r--lib/dijit/form/ToggleButton.js17
-rw-r--r--lib/dijit/form/ToggleButton.js.uncompressed.js33
-rw-r--r--lib/dijit/form/ValidationTextBox.js488
-rw-r--r--lib/dijit/form/ValidationTextBox.js.uncompressed.js296
-rw-r--r--lib/dijit/form/VerticalRule.js37
-rw-r--r--lib/dijit/form/VerticalRule.js.uncompressed.js34
-rw-r--r--lib/dijit/form/VerticalRuleLabels.js35
-rw-r--r--lib/dijit/form/VerticalRuleLabels.js.uncompressed.js32
-rw-r--r--lib/dijit/form/VerticalSlider.js44
-rw-r--r--lib/dijit/form/VerticalSlider.js.uncompressed.js42
-rw-r--r--lib/dijit/form/_AutoCompleterMixin.js2
-rw-r--r--lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js765
-rw-r--r--lib/dijit/form/_ButtonMixin.js2
-rw-r--r--lib/dijit/form/_ButtonMixin.js.uncompressed.js85
-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.js138
-rw-r--r--lib/dijit/form/_ComboBoxMenuMixin.js2
-rw-r--r--lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js191
-rw-r--r--lib/dijit/form/_DateTimeTextBox.js252
-rw-r--r--lib/dijit/form/_DateTimeTextBox.js.uncompressed.js262
-rw-r--r--lib/dijit/form/_ExpandingTextAreaMixin.js2
-rw-r--r--lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js127
-rw-r--r--lib/dijit/form/_FormMixin.js463
-rw-r--r--lib/dijit/form/_FormMixin.js.uncompressed.js475
-rw-r--r--lib/dijit/form/_FormSelectWidget.js584
-rw-r--r--lib/dijit/form/_FormSelectWidget.js.uncompressed.js595
-rw-r--r--lib/dijit/form/_FormValueMixin.js2
-rw-r--r--lib/dijit/form/_FormValueMixin.js.uncompressed.js95
-rw-r--r--lib/dijit/form/_FormValueWidget.js2
-rw-r--r--lib/dijit/form/_FormValueWidget.js.uncompressed.js58
-rw-r--r--lib/dijit/form/_FormWidget.js379
-rw-r--r--lib/dijit/form/_FormWidget.js.uncompressed.js79
-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.js123
-rw-r--r--lib/dijit/form/_ListMouseMixin.js2
-rw-r--r--lib/dijit/form/_ListMouseMixin.js.uncompressed.js96
-rw-r--r--lib/dijit/form/_RadioButtonMixin.js2
-rw-r--r--lib/dijit/form/_RadioButtonMixin.js.uncompressed.js70
-rw-r--r--lib/dijit/form/_Spinner.js130
-rw-r--r--lib/dijit/form/_Spinner.js.uncompressed.js141
-rw-r--r--lib/dijit/form/_TextBoxMixin.js2
-rw-r--r--lib/dijit/form/_TextBoxMixin.js.uncompressed.js408
-rw-r--r--lib/dijit/form/_ToggleButtonMixin.js2
-rw-r--r--lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js51
-rw-r--r--lib/dijit/form/nls/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ComboBox.js.uncompressed.js40
-rw-r--r--lib/dijit/form/nls/Textarea.js3
-rw-r--r--lib/dijit/form/nls/Textarea.js.uncompressed.js43
-rw-r--r--lib/dijit/form/nls/ar/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/ar/Textarea.js3
-rw-r--r--lib/dijit/form/nls/ar/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/ar/validate.js3
-rw-r--r--lib/dijit/form/nls/ar/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/az/ComboBox.js2
-rw-r--r--lib/dijit/form/nls/az/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/az/Textarea.js2
-rw-r--r--lib/dijit/form/nls/az/Textarea.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/az/validate.js2
-rw-r--r--lib/dijit/form/nls/az/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ca/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ca/Textarea.js3
-rw-r--r--lib/dijit/form/nls/ca/Textarea.js.uncompressed.js12
-rw-r--r--lib/dijit/form/nls/ca/validate.js3
-rw-r--r--lib/dijit/form/nls/ca/validate.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/cs/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/cs/Textarea.js3
-rw-r--r--lib/dijit/form/nls/cs/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/cs/validate.js3
-rw-r--r--lib/dijit/form/nls/cs/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/da/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/da/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/da/Textarea.js3
-rw-r--r--lib/dijit/form/nls/da/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/da/validate.js3
-rw-r--r--lib/dijit/form/nls/da/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/de/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/de/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/de/Textarea.js3
-rw-r--r--lib/dijit/form/nls/de/Textarea.js.uncompressed.js11
-rw-r--r--lib/dijit/form/nls/de/validate.js3
-rw-r--r--lib/dijit/form/nls/de/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/el/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/el/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/el/Textarea.js3
-rw-r--r--lib/dijit/form/nls/el/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/el/validate.js3
-rw-r--r--lib/dijit/form/nls/el/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/es/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/es/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/es/Textarea.js3
-rw-r--r--lib/dijit/form/nls/es/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/es/validate.js3
-rw-r--r--lib/dijit/form/nls/es/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/fi/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/fi/Textarea.js3
-rw-r--r--lib/dijit/form/nls/fi/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/fi/validate.js3
-rw-r--r--lib/dijit/form/nls/fi/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/fr/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/fr/Textarea.js3
-rw-r--r--lib/dijit/form/nls/fr/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/fr/validate.js3
-rw-r--r--lib/dijit/form/nls/fr/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/he/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/he/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/he/Textarea.js3
-rw-r--r--lib/dijit/form/nls/he/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/he/validate.js3
-rw-r--r--lib/dijit/form/nls/he/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/hr/ComboBox.js2
-rw-r--r--lib/dijit/form/nls/hr/ComboBox.js.uncompressed.js6
-rw-r--r--lib/dijit/form/nls/hr/Textarea.js2
-rw-r--r--lib/dijit/form/nls/hr/Textarea.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/hr/validate.js2
-rw-r--r--lib/dijit/form/nls/hr/validate.js.uncompressed.js7
-rw-r--r--lib/dijit/form/nls/hu/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/hu/Textarea.js3
-rw-r--r--lib/dijit/form/nls/hu/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/hu/validate.js3
-rw-r--r--lib/dijit/form/nls/hu/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/it/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/it/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/it/Textarea.js3
-rw-r--r--lib/dijit/form/nls/it/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/it/validate.js3
-rw-r--r--lib/dijit/form/nls/it/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ja/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/ja/Textarea.js3
-rw-r--r--lib/dijit/form/nls/ja/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/ja/validate.js3
-rw-r--r--lib/dijit/form/nls/ja/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/kk/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/kk/Textarea.js3
-rw-r--r--lib/dijit/form/nls/kk/Textarea.js.uncompressed.js12
-rw-r--r--lib/dijit/form/nls/kk/validate.js3
-rw-r--r--lib/dijit/form/nls/kk/validate.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/ko/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/ko/Textarea.js3
-rw-r--r--lib/dijit/form/nls/ko/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/ko/validate.js3
-rw-r--r--lib/dijit/form/nls/ko/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/nb/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/nb/Textarea.js3
-rw-r--r--lib/dijit/form/nls/nb/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/nb/validate.js3
-rw-r--r--lib/dijit/form/nls/nb/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/nl/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/nl/Textarea.js3
-rw-r--r--lib/dijit/form/nls/nl/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/nl/validate.js3
-rw-r--r--lib/dijit/form/nls/nl/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/pl/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/pl/Textarea.js3
-rw-r--r--lib/dijit/form/nls/pl/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/pl/validate.js3
-rw-r--r--lib/dijit/form/nls/pl/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/pt-pt/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/pt-pt/Textarea.js3
-rw-r--r--lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/pt-pt/validate.js3
-rw-r--r--lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/pt/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/pt/Textarea.js3
-rw-r--r--lib/dijit/form/nls/pt/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/pt/validate.js3
-rw-r--r--lib/dijit/form/nls/pt/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ro/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/ro/Textarea.js3
-rw-r--r--lib/dijit/form/nls/ro/Textarea.js.uncompressed.js12
-rw-r--r--lib/dijit/form/nls/ro/validate.js3
-rw-r--r--lib/dijit/form/nls/ro/validate.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/ru/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/ru/Textarea.js3
-rw-r--r--lib/dijit/form/nls/ru/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/ru/validate.js3
-rw-r--r--lib/dijit/form/nls/ru/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/sk/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/sk/Textarea.js3
-rw-r--r--lib/dijit/form/nls/sk/Textarea.js.uncompressed.js12
-rw-r--r--lib/dijit/form/nls/sk/validate.js3
-rw-r--r--lib/dijit/form/nls/sk/validate.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/sl/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/sl/Textarea.js3
-rw-r--r--lib/dijit/form/nls/sl/Textarea.js.uncompressed.js12
-rw-r--r--lib/dijit/form/nls/sl/validate.js3
-rw-r--r--lib/dijit/form/nls/sl/validate.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/sv/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/sv/Textarea.js3
-rw-r--r--lib/dijit/form/nls/sv/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/sv/validate.js3
-rw-r--r--lib/dijit/form/nls/sv/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/th/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/th/ComboBox.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/th/Textarea.js3
-rw-r--r--lib/dijit/form/nls/th/Textarea.js.uncompressed.js12
-rw-r--r--lib/dijit/form/nls/th/validate.js3
-rw-r--r--lib/dijit/form/nls/th/validate.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/tr/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/tr/Textarea.js3
-rw-r--r--lib/dijit/form/nls/tr/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/tr/validate.js3
-rw-r--r--lib/dijit/form/nls/tr/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/validate.js3
-rw-r--r--lib/dijit/form/nls/validate.js.uncompressed.js41
-rw-r--r--lib/dijit/form/nls/zh-tw/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/zh-tw/Textarea.js3
-rw-r--r--lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/zh-tw/validate.js3
-rw-r--r--lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/nls/zh/ComboBox.js3
-rw-r--r--lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js8
-rw-r--r--lib/dijit/form/nls/zh/Textarea.js3
-rw-r--r--lib/dijit/form/nls/zh/Textarea.js.uncompressed.js10
-rw-r--r--lib/dijit/form/nls/zh/validate.js3
-rw-r--r--lib/dijit/form/nls/zh/validate.js.uncompressed.js9
-rw-r--r--lib/dijit/form/templates/Button.html17
-rw-r--r--lib/dijit/form/templates/CheckBox.html7
-rw-r--r--lib/dijit/form/templates/ComboButton.html23
-rw-r--r--lib/dijit/form/templates/DropDownBox.html16
-rw-r--r--lib/dijit/form/templates/DropDownButton.html20
-rw-r--r--lib/dijit/form/templates/HorizontalSlider.html37
-rw-r--r--lib/dijit/form/templates/Select.html14
-rw-r--r--lib/dijit/form/templates/Spinner.html27
-rw-r--r--lib/dijit/form/templates/TextBox.html6
-rw-r--r--lib/dijit/form/templates/ValidationTextBox.html10
-rw-r--r--lib/dijit/form/templates/VerticalSlider.html45
-rw-r--r--lib/dijit/hccss.js2
-rw-r--r--lib/dijit/hccss.js.uncompressed.js52
-rw-r--r--lib/dijit/icons/commonIcons.css11
-rw-r--r--lib/dijit/icons/commonIcons_rtl.css12
-rw-r--r--lib/dijit/icons/editorIcons.css2
-rw-r--r--lib/dijit/layout/AccordionContainer.js500
-rw-r--r--lib/dijit/layout/AccordionContainer.js.uncompressed.js555
-rw-r--r--lib/dijit/layout/AccordionPane.js32
-rw-r--r--lib/dijit/layout/AccordionPane.js.uncompressed.js31
-rw-r--r--lib/dijit/layout/BorderContainer.js529
-rw-r--r--lib/dijit/layout/BorderContainer.js.uncompressed.js556
-rw-r--r--lib/dijit/layout/ContentPane.js595
-rw-r--r--lib/dijit/layout/ContentPane.js.uncompressed.js611
-rw-r--r--lib/dijit/layout/LayoutContainer.js88
-rw-r--r--lib/dijit/layout/LayoutContainer.js.uncompressed.js91
-rw-r--r--lib/dijit/layout/LinkPane.js53
-rw-r--r--lib/dijit/layout/LinkPane.js.uncompressed.js52
-rw-r--r--lib/dijit/layout/ScrollingTabController.js485
-rw-r--r--lib/dijit/layout/ScrollingTabController.js.uncompressed.js514
-rw-r--r--lib/dijit/layout/SplitContainer.js591
-rw-r--r--lib/dijit/layout/SplitContainer.js.uncompressed.js611
-rw-r--r--lib/dijit/layout/StackContainer.js338
-rw-r--r--lib/dijit/layout/StackContainer.js.uncompressed.js368
-rw-r--r--lib/dijit/layout/StackController.js336
-rw-r--r--lib/dijit/layout/StackController.js.uncompressed.js356
-rw-r--r--lib/dijit/layout/TabContainer.js78
-rw-r--r--lib/dijit/layout/TabContainer.js.uncompressed.js79
-rw-r--r--lib/dijit/layout/TabController.js163
-rw-r--r--lib/dijit/layout/TabController.js.uncompressed.js172
-rw-r--r--lib/dijit/layout/_ContentPaneResizeMixin.js262
-rw-r--r--lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js255
-rw-r--r--lib/dijit/layout/_LayoutWidget.js315
-rw-r--r--lib/dijit/layout/_LayoutWidget.js.uncompressed.js197
-rw-r--r--lib/dijit/layout/_TabContainerBase.js147
-rw-r--r--lib/dijit/layout/_TabContainerBase.js.uncompressed.js155
-rw-r--r--lib/dijit/layout/templates/AccordionButton.html10
-rw-r--r--lib/dijit/layout/templates/ScrollingTabController.html22
-rw-r--r--lib/dijit/layout/templates/TabContainer.html5
-rw-r--r--lib/dijit/layout/templates/_ScrollingTabControllerButton.html8
-rw-r--r--lib/dijit/layout/templates/_TabButton.html14
-rw-r--r--lib/dijit/layout/utils.js2
-rw-r--r--lib/dijit/layout/utils.js.uncompressed.js141
-rw-r--r--lib/dijit/lib/main.js20
-rw-r--r--lib/dijit/main.js2
-rw-r--r--lib/dijit/main.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/ar/common.js3
-rw-r--r--lib/dijit/nls/ar/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/ar/loading.js3
-rw-r--r--lib/dijit/nls/ar/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/az/common.js2
-rw-r--r--lib/dijit/nls/az/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/az/loading.js2
-rw-r--r--lib/dijit/nls/az/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ca/common.js3
-rw-r--r--lib/dijit/nls/ca/common.js.uncompressed.js11
-rw-r--r--lib/dijit/nls/ca/loading.js3
-rw-r--r--lib/dijit/nls/ca/loading.js.uncompressed.js9
-rw-r--r--lib/dijit/nls/common.js3
-rw-r--r--lib/dijit/nls/common.js.uncompressed.js42
-rw-r--r--lib/dijit/nls/cs/common.js3
-rw-r--r--lib/dijit/nls/cs/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/cs/loading.js3
-rw-r--r--lib/dijit/nls/cs/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/da/common.js3
-rw-r--r--lib/dijit/nls/da/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/da/loading.js3
-rw-r--r--lib/dijit/nls/da/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/de/common.js3
-rw-r--r--lib/dijit/nls/de/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/de/loading.js3
-rw-r--r--lib/dijit/nls/de/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/el/common.js3
-rw-r--r--lib/dijit/nls/el/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/el/loading.js3
-rw-r--r--lib/dijit/nls/el/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/es/common.js3
-rw-r--r--lib/dijit/nls/es/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/es/loading.js3
-rw-r--r--lib/dijit/nls/es/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/fi/common.js3
-rw-r--r--lib/dijit/nls/fi/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/fi/loading.js3
-rw-r--r--lib/dijit/nls/fi/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/fr/common.js3
-rw-r--r--lib/dijit/nls/fr/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/fr/loading.js3
-rw-r--r--lib/dijit/nls/fr/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/he/common.js3
-rw-r--r--lib/dijit/nls/he/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/he/loading.js3
-rw-r--r--lib/dijit/nls/he/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/hr/common.js2
-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.js3
-rw-r--r--lib/dijit/nls/hu/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/hu/loading.js3
-rw-r--r--lib/dijit/nls/hu/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/it/common.js3
-rw-r--r--lib/dijit/nls/it/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/it/loading.js3
-rw-r--r--lib/dijit/nls/it/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ja/common.js3
-rw-r--r--lib/dijit/nls/ja/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/ja/loading.js3
-rw-r--r--lib/dijit/nls/ja/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/kk/common.js3
-rw-r--r--lib/dijit/nls/kk/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/kk/loading.js3
-rw-r--r--lib/dijit/nls/kk/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ko/common.js3
-rw-r--r--lib/dijit/nls/ko/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/ko/loading.js3
-rw-r--r--lib/dijit/nls/ko/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/loading.js3
-rw-r--r--lib/dijit/nls/loading.js.uncompressed.js40
-rw-r--r--lib/dijit/nls/nb/common.js3
-rw-r--r--lib/dijit/nls/nb/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/nb/loading.js3
-rw-r--r--lib/dijit/nls/nb/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/nl/common.js3
-rw-r--r--lib/dijit/nls/nl/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/nl/loading.js3
-rw-r--r--lib/dijit/nls/nl/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/pl/common.js3
-rw-r--r--lib/dijit/nls/pl/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/pl/loading.js3
-rw-r--r--lib/dijit/nls/pl/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/pt-pt/common.js3
-rw-r--r--lib/dijit/nls/pt-pt/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/pt-pt/loading.js3
-rw-r--r--lib/dijit/nls/pt-pt/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/pt/common.js3
-rw-r--r--lib/dijit/nls/pt/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/pt/loading.js3
-rw-r--r--lib/dijit/nls/pt/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/ro/common.js3
-rw-r--r--lib/dijit/nls/ro/common.js.uncompressed.js11
-rw-r--r--lib/dijit/nls/ro/loading.js3
-rw-r--r--lib/dijit/nls/ro/loading.js.uncompressed.js9
-rw-r--r--lib/dijit/nls/ru/common.js3
-rw-r--r--lib/dijit/nls/ru/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/ru/loading.js3
-rw-r--r--lib/dijit/nls/ru/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/sk/common.js3
-rw-r--r--lib/dijit/nls/sk/common.js.uncompressed.js11
-rw-r--r--lib/dijit/nls/sk/loading.js3
-rw-r--r--lib/dijit/nls/sk/loading.js.uncompressed.js9
-rw-r--r--lib/dijit/nls/sl/common.js3
-rw-r--r--lib/dijit/nls/sl/common.js.uncompressed.js11
-rw-r--r--lib/dijit/nls/sl/loading.js3
-rw-r--r--lib/dijit/nls/sl/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/sv/common.js3
-rw-r--r--lib/dijit/nls/sv/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/sv/loading.js3
-rw-r--r--lib/dijit/nls/sv/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/th/common.js3
-rw-r--r--lib/dijit/nls/th/common.js.uncompressed.js11
-rw-r--r--lib/dijit/nls/th/loading.js3
-rw-r--r--lib/dijit/nls/th/loading.js.uncompressed.js9
-rw-r--r--lib/dijit/nls/tr/common.js3
-rw-r--r--lib/dijit/nls/tr/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/tr/loading.js3
-rw-r--r--lib/dijit/nls/tr/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/zh-tw/common.js3
-rw-r--r--lib/dijit/nls/zh-tw/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/zh-tw/loading.js3
-rw-r--r--lib/dijit/nls/zh-tw/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/nls/zh/common.js3
-rw-r--r--lib/dijit/nls/zh/common.js.uncompressed.js10
-rw-r--r--lib/dijit/nls/zh/loading.js3
-rw-r--r--lib/dijit/nls/zh/loading.js.uncompressed.js8
-rw-r--r--lib/dijit/package.json45
-rw-r--r--lib/dijit/place.js2
-rw-r--r--lib/dijit/place.js.uncompressed.js369
-rw-r--r--lib/dijit/popup.js2
-rw-r--r--lib/dijit/popup.js.uncompressed.js379
-rw-r--r--lib/dijit/registry.js2
-rw-r--r--lib/dijit/registry.js.uncompressed.js174
-rw-r--r--lib/dijit/resources/_modules.js7
-rw-r--r--lib/dijit/robot.js15
-rw-r--r--lib/dijit/robotx.js34
-rw-r--r--lib/dijit/templates/Calendar.html35
-rw-r--r--lib/dijit/templates/CheckedMenuItem.html10
-rw-r--r--lib/dijit/templates/ColorPalette.html5
-rw-r--r--lib/dijit/templates/Dialog.html9
-rw-r--r--lib/dijit/templates/InlineEditBox.html10
-rw-r--r--lib/dijit/templates/Menu.html3
-rw-r--r--lib/dijit/templates/MenuBar.html1
-rw-r--r--lib/dijit/templates/MenuBarItem.html4
-rw-r--r--lib/dijit/templates/MenuItem.html14
-rw-r--r--lib/dijit/templates/MenuSeparator.html10
-rw-r--r--lib/dijit/templates/ProgressBar.html8
-rw-r--r--lib/dijit/templates/TimePicker.html9
-rw-r--r--lib/dijit/templates/TitlePane.html17
-rw-r--r--lib/dijit/templates/Tooltip.html4
-rw-r--r--lib/dijit/templates/TooltipDialog.html6
-rw-r--r--lib/dijit/templates/Tree.html4
-rw-r--r--lib/dijit/templates/TreeNode.html13
-rw-r--r--lib/dijit/themes/claro/Calendar.css74
-rw-r--r--lib/dijit/themes/claro/Calendar.less74
-rw-r--r--lib/dijit/themes/claro/ColorPalette.css8
-rw-r--r--lib/dijit/themes/claro/ColorPalette.less10
-rw-r--r--lib/dijit/themes/claro/Common.css16
-rw-r--r--lib/dijit/themes/claro/Common.less14
-rw-r--r--lib/dijit/themes/claro/Dialog.css8
-rw-r--r--lib/dijit/themes/claro/Dialog.less14
-rw-r--r--lib/dijit/themes/claro/Editor.css4
-rw-r--r--lib/dijit/themes/claro/Editor.less4
-rw-r--r--lib/dijit/themes/claro/InlineEditBox.css4
-rw-r--r--lib/dijit/themes/claro/Menu.css24
-rw-r--r--lib/dijit/themes/claro/Menu.less18
-rw-r--r--lib/dijit/themes/claro/ProgressBar.css12
-rw-r--r--lib/dijit/themes/claro/ProgressBar.less10
-rw-r--r--lib/dijit/themes/claro/README31
-rw-r--r--lib/dijit/themes/claro/TimePicker.css4
-rw-r--r--lib/dijit/themes/claro/TimePicker.less6
-rw-r--r--lib/dijit/themes/claro/TitlePane.css12
-rw-r--r--lib/dijit/themes/claro/TitlePane.less10
-rw-r--r--lib/dijit/themes/claro/Toolbar.css55
-rw-r--r--lib/dijit/themes/claro/Toolbar.less46
-rw-r--r--lib/dijit/themes/claro/Tree.css28
-rw-r--r--lib/dijit/themes/claro/Tree.less17
-rw-r--r--lib/dijit/themes/claro/compile.js16
-rw-r--r--lib/dijit/themes/claro/form/Button.css14
-rw-r--r--lib/dijit/themes/claro/form/Button.less10
-rw-r--r--lib/dijit/themes/claro/form/Checkbox.css8
-rw-r--r--lib/dijit/themes/claro/form/Checkbox.less8
-rw-r--r--lib/dijit/themes/claro/form/Common.css35
-rw-r--r--lib/dijit/themes/claro/form/Common.less30
-rw-r--r--lib/dijit/themes/claro/form/NumberSpinner.css4
-rw-r--r--lib/dijit/themes/claro/form/NumberSpinner.less6
-rw-r--r--lib/dijit/themes/claro/form/RadioButton.css8
-rw-r--r--lib/dijit/themes/claro/form/RadioButton.less8
-rw-r--r--lib/dijit/themes/claro/form/Select.css18
-rw-r--r--lib/dijit/themes/claro/form/Select.less6
-rw-r--r--lib/dijit/themes/claro/form/Slider.css33
-rw-r--r--lib/dijit/themes/claro/form/Slider.less17
-rw-r--r--lib/dijit/themes/claro/layout/AccordionContainer.css21
-rw-r--r--lib/dijit/themes/claro/layout/AccordionContainer.less7
-rw-r--r--lib/dijit/themes/claro/layout/BorderContainer.css8
-rw-r--r--lib/dijit/themes/claro/layout/BorderContainer.less4
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer.css42
-rw-r--r--lib/dijit/themes/claro/layout/TabContainer.less26
-rw-r--r--lib/dijit/themes/claro/variables.less221
-rw-r--r--lib/dijit/themes/dijit.css159
-rw-r--r--lib/dijit/themes/dijit_rtl.css20
-rw-r--r--lib/dijit/themes/nihilo/Calendar.css4
-rw-r--r--lib/dijit/themes/nihilo/Menu.css1
-rw-r--r--lib/dijit/themes/nihilo/form/Button.css4
-rw-r--r--lib/dijit/themes/nihilo/form/Common.css2
-rw-r--r--lib/dijit/themes/nihilo/images/tooltipConnectorRight.pngbin205 -> 363 bytes
-rw-r--r--lib/dijit/themes/soria/Calendar.css4
-rw-r--r--lib/dijit/themes/soria/Menu.css1
-rw-r--r--lib/dijit/themes/soria/form/Button.css4
-rw-r--r--lib/dijit/themes/soria/form/Common.css2
-rw-r--r--lib/dijit/themes/soria/images/tooltipConnectorRight.pngbin1005 -> 363 bytes
-rw-r--r--lib/dijit/themes/tundra/Calendar.css4
-rw-r--r--lib/dijit/themes/tundra/Common.css11
-rw-r--r--lib/dijit/themes/tundra/Menu.css1
-rw-r--r--lib/dijit/themes/tundra/form/Common.css2
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/checkmark.gifbin2060 -> 2060 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/checkmarkNoBorder.gifbin1658 -> 1658 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/checkmarkNoBorder.pngbin4401 -> 4401 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/circleIcon.gifbin204 -> 204 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/circleIcon.pngbin2975 -> 2975 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/dojoTundraGradientBg.gifbin65 -> 65 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/i.gifbin48 -> 48 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/i_half.gifbin63 -> 63 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/loading.gifbin751 -> 751 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/noX.gifbin80 -> 80 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/preciseSliderThumb.gifbin212 -> 212 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/sliderFullFocus.pngbin163 -> 163 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/sliderFullVerticalFocus.pngbin164 -> 164 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/tabClose.gifbin193 -> 193 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/tabCloseHover.gifbin193 -> 193 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/tabHover.gifbin156 -> 156 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/treeExpand_minus.gifbin211 -> 211 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/treeExpand_plus.gifbin216 -> 216 bytes
-rwxr-xr-x[-rw-r--r--]lib/dijit/themes/tundra/images/validationInputBg.gifbin109 -> 109 bytes
-rw-r--r--lib/dijit/tree/ForestStoreModel.js282
-rw-r--r--lib/dijit/tree/ForestStoreModel.js.uncompressed.js285
-rw-r--r--lib/dijit/tree/TreeStoreModel.js383
-rw-r--r--lib/dijit/tree/TreeStoreModel.js.uncompressed.js383
-rw-r--r--lib/dijit/tree/_dndContainer.js189
-rw-r--r--lib/dijit/tree/_dndContainer.js.uncompressed.js150
-rw-r--r--lib/dijit/tree/_dndSelector.js289
-rw-r--r--lib/dijit/tree/_dndSelector.js.uncompressed.js326
-rw-r--r--lib/dijit/tree/dndSource.js546
-rw-r--r--lib/dijit/tree/dndSource.js.uncompressed.js564
-rw-r--r--lib/dijit/tree/model.js136
-rw-r--r--lib/dijit/tree/model.js.uncompressed.js142
-rw-r--r--lib/dijit/typematic.js2
-rw-r--r--lib/dijit/typematic.js.uncompressed.js206
941 files changed, 43755 insertions, 33989 deletions
diff --git a/lib/dijit/BackgroundIframe.js b/lib/dijit/BackgroundIframe.js
new file mode 100644
index 000000000..4823973ad
--- /dev/null
+++ b/lib/dijit/BackgroundIframe.js
@@ -0,0 +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
diff --git a/lib/dijit/BackgroundIframe.js.uncompressed.js b/lib/dijit/BackgroundIframe.js.uncompressed.js
new file mode 100644
index 000000000..15133be6b
--- /dev/null
+++ b/lib/dijit/BackgroundIframe.js.uncompressed.js
@@ -0,0 +1,113 @@
+define("dijit/BackgroundIframe", [
+ "require", // require.toUrl
+ ".", // 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/_base/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
+ // summary:
+ // new dijit.BackgroundIframe(node)
+ // Makes a background iframe as a child of node, that fills
+ // area (and position) of node
+
+ // 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 b092ed797..9c86805d9 100644
--- a/lib/dijit/Calendar.js
+++ b/lib/dijit/Calendar.js
@@ -1,609 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Calendar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Calendar"] = true;
-dojo.provide("dijit.Calendar");
-dojo.require("dojo.cldr.supplemental");
-dojo.require("dojo.date");
-dojo.require("dojo.date.locale");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._CssStateMixin");
-dojo.require("dijit.form.DropDownButton");
-
-
-dojo.declare(
- "dijit.Calendar",
- [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
- {
- // summary:
- // A simple GUI for choosing a date in the context of a monthly calendar.
- //
- // 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.
- //
- // example:
- // | var calendar = new dijit.Calendar({}, dojo.byId("calendarNode"));
- //
- // example:
- // | <div dojoType="dijit.Calendar"></div>
-
- templateString: dojo.cache("dijit", "templates/Calendar.html", "<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\" aria-labelledby=\"${id}_year\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset dijitCalendarArrow' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" role=\"presentation\"/>\n\t\t\t\t<span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th class='dijitReset' colspan=\"5\">\n\t\t\t\t<div dojoType=\"dijit.form.DropDownButton\" dojoAttachPoint=\"monthDropDownButton\"\n\t\t\t\t\tid=\"${id}_mddb\" tabIndex=\"-1\">\n\t\t\t\t</div>\n\t\t\t</th>\n\t\t\t<th class='dijitReset dijitCalendarArrow' dojoAttachPoint=\"incrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarIncrease\" role=\"presentation\"/>\n\t\t\t\t<span dojoAttachPoint=\"increaseArrowNode\" class=\"dijitA11ySideArrow\">+</span>\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<th class=\"dijitReset dijitCalendarDayLabelTemplate\" role=\"columnheader\"><span class=\"dijitCalendarDayLabel\"></span></th>\n\t\t</tr>\n\t</thead>\n\t<tbody dojoAttachEvent=\"onclick: _onDayClick, onmouseover: _onDayMouseOver, onmouseout: _onDayMouseOut, onmousedown: _onDayMouseDown, onmouseup: _onDayMouseUp\" class=\"dijitReset dijitCalendarBodyContainer\">\n\t\t<tr class=\"dijitReset dijitCalendarWeekTemplate\" role=\"row\">\n\t\t\t<td class=\"dijitReset dijitCalendarDateTemplate\" role=\"gridcell\"><span class=\"dijitCalendarDateLabel\"></span></td>\n\t\t</tr>\n\t</tbody>\n\t<tfoot class=\"dijitReset dijitCalendarYearContainer\">\n\t\t<tr>\n\t\t\t<td class='dijitReset' valign=\"top\" colspan=\"7\">\n\t\t\t\t<h3 class=\"dijitCalendarYearLabel\">\n\t\t\t\t\t<span dojoAttachPoint=\"previousYearLabelNode\" class=\"dijitInline dijitCalendarPreviousYear\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"currentYearLabelNode\" class=\"dijitInline dijitCalendarSelectedYear\" id=\"${id}_year\"></span>\n\t\t\t\t\t<span dojoAttachPoint=\"nextYearLabelNode\" class=\"dijitInline dijitCalendarNextYear\"></span>\n\t\t\t\t</h3>\n\t\t\t</td>\n\t\t</tr>\n\t</tfoot>\n</table>\n"),
- widgetsInTemplate: true,
-
- // 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. Uses Gregorian Calendar routines
- // at dojo.date by default.
- datePackage: "dojo.date",
-
- // dayWidth: String
- // How to represent the days of the week in the calendar header. See dojo.date.locale
- dayWidth: "narrow",
-
- // tabIndex: Integer
- // 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",
-
- // Set node classes for various mouse events, see dijit._CssStateMixin for more details
- cssStateNodes: {
- "decrementMonth": "dijitCalendarArrow",
- "incrementMonth": "dijitCalendarArrow",
- "previousYearLabelNode": "dijitCalendarPreviousYear",
- "nextYearLabelNode": "dijitCalendarNextYear"
- },
-
- _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();
- },
-
- setValue: function(/*Date*/ value){
- // summary:
- // Deprecated. Use set('value', ...) instead.
- // tags:
- // deprecated
- dojo.deprecated("dijit.Calendar:setValue() is deprecated. Use set('value', ...) instead.", "", "2.0");
- this.set('value', value);
- },
-
- _getValueAttr: function(){
- // summary:
- // Support get('value')
-
- // this.value is set to 1AM, but return midnight, local time for back-compat
- 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.dateFuncObj.add(value, "hour", 1);
- }
- return value;
- },
-
- _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(value){
- // convert from Number to Date, or make copy of Date object so that setHours() call below
- // doesn't affect original value
- value = new this.dateClassObj(value);
- }
- if(this._isValidDate(value)){
- if(!this._isValidDate(this.value) || this.dateFuncObj.compare(value, this.value)){
- value.setHours(1, 0, 0, 0); // round to nearest day (1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
-
- if(!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, showing the new selected value (and possibly
- // new month/year).
- this.set("currentFocus", value);
-
- if(priorityChange || typeof priorityChange == "undefined"){
- this.onChange(this.get('value'));
- this.onValueSelected(this.get('value')); // remove in 2.0
- }
- }
- }
- }else{
- // clear value, and repopulate grid (to deselect the previously selected day) without changing currentFocus
- this._set("value", null);
- this.set("currentFocus", this.currentFocus);
- }
- },
-
- _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(dojo.doc.createTextNode(text));
- },
-
- _populateGrid: function(){
- // summary:
- // Fills in the calendar grid with each day (1-31)
- // tags:
- // private
-
- var month = new this.dateClassObj(this.currentFocus);
- month.setDate(1);
-
- var firstDay = month.getDay(),
- daysInMonth = this.dateFuncObj.getDaysInMonth(month),
- daysInPreviousMonth = this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(month, "month", -1)),
- today = new this.dateClassObj(),
- dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
- if(dayOffset > firstDay){ dayOffset -= 7; }
-
- // Iterate through dates in the calendar and fill in date numbers and style info
- dojo.query(".dijitCalendarDateTemplate", this.domNode).forEach(function(template, i){
- i += 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.dateFuncObj.add(date, "month", adj);
- }
- date.setDate(number);
-
- if(!this.dateFuncObj.compare(date, today, "date")){
- clazz = "dijitCalendarCurrentDate " + clazz;
- }
-
- if(this._isSelectedDate(date, this.lang)){
- clazz = "dijitCalendarSelectedDate " + clazz;
- }
-
- if(this.isDisabledDate(date, this.lang)){
- clazz = "dijitCalendarDisabledDate " + clazz;
- }
-
- var clazz2 = this.getClassForDate(date, this.lang);
- if(clazz2){
- clazz = clazz2 + " " + clazz;
- }
-
- template.className = clazz + "Month dijitCalendarDateTemplate";
- template.dijitDateValue = date.valueOf(); // original code
- dojo.attr(template, "dijitDateValue", date.valueOf()); // so I can dojo.query() it
- var label = dojo.query(".dijitCalendarDateLabel", template)[0],
- text = date.getDateLocalized ? date.getDateLocalized(this.lang) : date.getDate();
- this._setText(label, text);
- }, this);
-
- // Repopulate month drop down list based on current year.
- // Need to do this to hide leap months in Hebrew calendar.
- var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang, month);
- this.monthDropDownButton.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.monthDropDownButton.containerNode.innerHTML =
- (dojo.isIE == 6 ? "" : "<div class='dijitSpacer'>" + this.monthDropDownButton.dropDown.domNode.innerHTML + "</div>") +
- "<div class='dijitCalendarMonthLabel dijitCalendarCurrentMonthLabel'>" + monthNames[month.getMonth()] + "</div>";
-
- // Fill in localized prev/current/next years
- var y = month.getFullYear() - 1;
- var d = new this.dateClassObj();
- dojo.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(/*Object*/args){
- var dateClass = (args.datePackage && (args.datePackage != "dojo.date"))? args.datePackage + ".Date" : "Date";
- this.dateClassObj = dojo.getObject(dateClass, false);
- this.datePackage = args.datePackage || this.datePackage;
- this.dateFuncObj = dojo.getObject(this.datePackage, false);
- this.dateLocaleModule = dojo.getObject(this.datePackage + ".locale", false);
- },
-
- postMixInProperties: function(){
- // Parser.instantiate sometimes passes in NaN for IE. Use default value in prototype instead.
- // TODO: remove this for 2.0 (thanks to #11511)
- if(isNaN(this.value)){ delete this.value; }
-
- this.inherited(arguments);
- },
-
- buildRendering: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
-
- var cloneClass = dojo.hitch(this, function(clazz, n){
- var template = dojo.query(clazz, this.domNode)[0];
- for(var i=0; i<n; i++){
- template.parentNode.appendChild(template.cloneNode(true));
- }
- });
-
- // clone the day label and calendar day templates 6 times to make 7 columns
- cloneClass(".dijitCalendarDayLabelTemplate", 6);
- cloneClass(".dijitCalendarDateTemplate", 6);
-
- // now make 6 week rows
- cloneClass(".dijitCalendarWeekTemplate", 5);
-
- // insert localized day names in the header
- var dayNames = this.dateLocaleModule.getNames('days', this.dayWidth, 'standAlone', this.lang);
- var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
- dojo.query(".dijitCalendarDayLabel", this.domNode).forEach(function(label, i){
- this._setText(label, dayNames[(i + dayOffset) % 7]);
- }, this);
-
- var dateObj = new this.dateClassObj(this.currentFocus);
-
- this.monthDropDownButton.dropDown = new dijit.Calendar._MonthDropDown({
- id: this.id + "_mdd",
- onChange: dojo.hitch(this, "_onMonthSelect")
- });
-
- this.set('currentFocus', dateObj, false); // draw the grid to the month specified by currentFocus
-
- // Set up repeating mouse behavior for increment/decrement of months/years
- var _this = this;
- var typematic = function(nodeProp, dateProp, adj){
- _this._connects.push(
- dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
- if(count >= 0){ _this._adjustDisplay(dateProp, adj); }
- }, 0.8, 500)
- );
- };
- typematic("incrementMonth", "month", 1);
- typematic("decrementMonth", "month", -1);
- typematic("nextYearLabelNode", "year", 1);
- typematic("previousYearLabelNode", "year", -1);
- },
-
- _adjustDisplay: function(/*String*/ part, /*int*/ amount){
- // summary:
- // Moves calendar forwards or backwards by months or years
- // part:
- // "month" or "year"
- // amount:
- // Number of months or years
- // tags:
- // private
- this._setCurrentFocusAttr(this.dateFuncObj.add(this.currentFocus, part, amount));
- },
-
- _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.
- // forceFocus:
- // If true, will focus() the cell even if calendar itself doesn't have focus
-
- var oldFocus = this.currentFocus,
- oldCell = oldFocus ? dojo.query("[dijitDateValue=" + oldFocus.valueOf() + "]", this.domNode)[0] : null;
-
- // round specified value to nearest day (1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
- date = new this.dateClassObj(date);
- date.setHours(1, 0, 0, 0);
-
- this._set("currentFocus", date);
-
- // TODO: only re-populate grid when month/year has changed
- this._populateGrid();
-
- // set tabIndex=0 on new cell, and focus it (but only if Calendar itself is focused)
- var newCell = dojo.query("[dijitDateValue=" + date.valueOf() + "]", this.domNode)[0];
- newCell.setAttribute("tabIndex", this.tabIndex);
- if(this._focused || forceFocus){
- newCell.focus();
- }
-
- // set tabIndex=-1 on old focusable cell
- if(oldCell && oldCell != newCell){
- if(dojo.isWebKit){ // 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);
- },
-
- _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: dec 31 --> jan 28, not jan 31)
- this.currentFocus = this.dateFuncObj.add(this.currentFocus, "month",
- newMonth - this.currentFocus.getMonth());
- this._populateGrid();
- },
-
- _onDayClick: function(/*Event*/ evt){
- // summary:
- // Handler for day clicks, selects the date if appropriate
- // tags:
- // protected
- dojo.stopEvent(evt);
- for(var node = evt.target; node && !node.dijitDateValue; node = node.parentNode);
- if(node && !dojo.hasClass(node, "dijitCalendarDisabledDate")){
- this.set('value', node.dijitDateValue);
- }
- },
-
- _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 =
- dojo.hasClass(evt.target, "dijitCalendarDateLabel") ?
- evt.target.parentNode :
- evt.target;
-
- if(node && (node.dijitDateValue || node == this.previousYearLabelNode || node == this.nextYearLabelNode) ){
- dojo.addClass(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(dojo.hasClass(this._currentNode, "dijitCalendarActiveDate")) {
- cls += " dijitCalendarActiveDate";
- }
- dojo.removeClass(this._currentNode, cls);
- this._currentNode = null;
- },
-
- _onDayMouseDown: function(/*Event*/ evt){
- var node = evt.target.parentNode;
- if(node && node.dijitDateValue){
- dojo.addClass(node, "dijitCalendarActiveDate");
- this._currentNode = node;
- }
- },
-
- _onDayMouseUp: function(/*Event*/ evt){
- var node = evt.target.parentNode;
- if(node && node.dijitDateValue){
- dojo.removeClass(node, "dijitCalendarActiveDate");
- }
- },
-
-//TODO: use typematic
- handleKey: function(/*Event*/ evt){
- // summary:
- // Provides keyboard navigation of calendar.
- // description:
- // Called from _onKeyPress() to handle keypress on a stand alone Calendar,
- // and also from `dijit.form._DateTimeTextBox` to pass a keypress 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 propogated
- // tags:
- // protected
- var dk = dojo.keys,
- increment = -1,
- interval,
- newValue = this.currentFocus;
- switch(evt.keyCode){
- case dk.RIGHT_ARROW:
- increment = 1;
- //fallthrough...
- case dk.LEFT_ARROW:
- interval = "day";
- if(!this.isLeftToRight()){ increment *= -1; }
- break;
- case dk.DOWN_ARROW:
- increment = 1;
- //fallthrough...
- case dk.UP_ARROW:
- interval = "week";
- break;
- case dk.PAGE_DOWN:
- increment = 1;
- //fallthrough...
- case dk.PAGE_UP:
- interval = evt.ctrlKey || evt.altKey ? "year" : "month";
- break;
- case dk.END:
- // go to the next month
- newValue = this.dateFuncObj.add(newValue, "month", 1);
- // subtract a day from the result when we're done
- interval = "day";
- //fallthrough...
- case dk.HOME:
- newValue = new this.dateClassObj(newValue);
- newValue.setDate(1);
- break;
- case dk.ENTER:
- case dk.SPACE:
- this.set("value", this.currentFocus);
- break;
- default:
- return true;
- }
-
- if(interval){
- newValue = this.dateFuncObj.add(newValue, interval, increment);
- }
-
- this._setCurrentFocusAttr(newValue);
-
- return false;
- },
-
- _onKeyPress: function(/*Event*/ evt){
- // summary:
- // For handling keypress events on a stand alone calendar
- if(!this.handleKey(evt)){
- dojo.stopEvent(evt);
- }
- },
-
- onValueSelected: function(/*Date*/ date){
- // summary:
- // 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(/*Date*/ date){
- // summary:
- // Called only when the selected date has changed
- },
-
- _isSelectedDate: function(/*Date*/ dateObject, /*String?*/ locale){
- // summary:
- // Extension point so developers can subclass Calendar to
- // support multiple (concurrently) selected dates
- // tags:
- // protected extension
- return this._isValidDate(this.value) && !this.dateFuncObj.compare(dateObject, this.value, "date")
- },
-
- isDisabledDate: function(/*Date*/ dateObject, /*String?*/ locale){
- // summary:
- // May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
- // tags:
- // extension
-/*=====
- return false; // Boolean
-=====*/
- },
-
- getClassForDate: function(/*Date*/ dateObject, /*String?*/ 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.
- // tags:
- // extension
-
-/*=====
- return ""; // String
-=====*/
- }
- }
-);
-
-dojo.declare("dijit.Calendar._MonthDropDown", [dijit._Widget, dijit._Templated], {
- // summary:
- // The month drop down
-
- // 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' " +
- "dojoAttachEvent='onclick:_onClick,onmouseover:_onMenuHover,onmouseout:_onMenuHover'></div>",
-
- _setMonthsAttr: function(/*String[]*/ months){
- this.domNode.innerHTML = dojo.map(months, function(month, idx){
- return month ? "<div class='dijitCalendarMonthLabel' month='" + idx +"'>" + month + "</div>" : "";
- }).join("");
- },
-
- _onClick: function(/*Event*/ evt){
- this.onChange(dojo.attr(evt.target, "month"));
- },
-
- onChange: function(/*Number*/ month){
- // summary:
- // Callback when month is selected from drop down
- },
-
- _onMenuHover: function(evt){
- dojo.toggleClass(evt.target, "dijitCalendarMonthLabelHover", evt.type == "mouseover");
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/Calendar.js.uncompressed.js b/lib/dijit/Calendar.js.uncompressed.js
new file mode 100644
index 000000000..fd383b439
--- /dev/null
+++ b/lib/dijit/Calendar.js.uncompressed.js
@@ -0,0 +1,317 @@
+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/_base/sniff", // has("ie")
+ "./CalendarLite",
+ "./_Widget",
+ "./_CssStateMixin",
+ "./_TemplatedMixin",
+ "./form/DropDownButton",
+ "./hccss" // not used directly, but sets CSS class on <body>
+], function(array, date, local, declare, domAttr, domClass, event, kernel, keys, lang, has,
+ CalendarLite, _Widget, _CssStateMixin, _TemplatedMixin, DropDownButton){
+
+/*=====
+ var CalendarLite = dijit.CalendarLite;
+ var _CssStateMixin = dijit._CssStateMixin;
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var DropDownButton = dijit.form.DropDownButton;
+=====*/
+
+ // module:
+ // dijit/Calendar
+ // summary:
+ // A simple GUI for choosing a date in the context of a monthly 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);
+ },
+
+ buildRendering: function(){
+ this.inherited(arguments);
+
+ // Events specific to Calendar, not used in CalendarLite
+ 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(/*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: dec 31 --> jan 28, not jan 31)
+ this._setCurrentFocusAttr(this.dateFuncObj.add(this.currentFocus, "month",
+ newMonth - this.currentFocus.getMonth()));
+ },
+
+ _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 _onKeyPress() to handle keypress on a stand alone Calendar,
+ // and also from `dijit.form._DateTimeTextBox` to pass a keypress 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 propogated
+ // tags:
+ // protected
+ var increment = -1,
+ interval,
+ newValue = this.currentFocus;
+ switch(evt.charOrCode){
+ 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.dateFuncObj.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 " ":
+ this.set("value", this.currentFocus);
+ break;
+ default:
+ return true;
+ }
+
+ if(interval){
+ newValue = this.dateFuncObj.add(newValue, interval, increment);
+ }
+
+ this._setCurrentFocusAttr(newValue);
+
+ return false;
+ },
+
+ _onKeyPress: 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
new file mode 100644
index 000000000..bd84f6d87
--- /dev/null
+++ b/lib/dijit/CalendarLite.js
@@ -0,0 +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
diff --git a/lib/dijit/CalendarLite.js.uncompressed.js b/lib/dijit/CalendarLite.js.uncompressed.js
new file mode 100644
index 000000000..0187c2b42
--- /dev/null
+++ b/lib/dijit/CalendarLite.js.uncompressed.js
@@ -0,0 +1,453 @@
+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", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/cldr/supplemental", // cldrSupplemental.getFirstDayOfWeek
+ "dojo/date", // date
+ "dojo/date/locale",
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-class", // domClass.contains
+ "dojo/_base/event", // event.stop
+ "dojo/_base/lang", // lang.getObject, lang.hitch
+ "dojo/_base/sniff", // has("ie") has("webkit")
+ "dojo/string", // string.substitute
+ "dojo/_base/window", // win.doc.createTextNode
+ "./_WidgetBase",
+ "./_TemplatedMixin",
+ "dojo/text!./templates/Calendar.html"
+], function(array, declare, cldrSupplemental, date, local, dom, domClass, event, lang, has, string, win,
+ _WidgetBase, _TemplatedMixin, template){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/CalendarLite
+ // summary:
+ // Lightweight version of Calendar widget aimed towards mobile use
+
+ 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 object containing Calendar functions. Uses Gregorian Calendar routines
+ // from dojo.date by default.
+ datePackage: date,
+
+ // dayWidth: String
+ // How to represent the days of the week in the calendar header. See locale
+ dayWidth: "narrow",
+
+ // tabIndex: Integer
+ // 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.dateFuncObj.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(value){
+ // convert from Number to Date, or make copy of Date object so that setHours() call below
+ // doesn't affect original value
+ value = new this.dateClassObj(value);
+ }
+ if(this._isValidDate(value)){
+ if(!this._isValidDate(this.value) || this.dateFuncObj.compare(value, this.value)){
+ value.setHours(1, 0, 0, 0); // round to nearest day (1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
+
+ if(!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, showing the new selected value (and possibly
+ // new month/year).
+ this.set("currentFocus", value);
+
+ if(priorityChange || typeof priorityChange == "undefined"){
+ this.onChange(this.get('value'));
+ }
+ }
+ }
+ }else{
+ // clear value, and repopulate grid (to deselect the previously selected day) without changing currentFocus
+ this._set("value", null);
+ this.set("currentFocus", this.currentFocus);
+ }
+ },
+
+ _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(win.doc.createTextNode(text));
+ },
+
+ _populateGrid: function(){
+ // summary:
+ // Fills in the calendar grid with each day (1-31)
+ // tags:
+ // private
+
+ var month = new this.dateClassObj(this.currentFocus);
+ month.setDate(1);
+
+ var firstDay = month.getDay(),
+ daysInMonth = this.dateFuncObj.getDaysInMonth(month),
+ daysInPreviousMonth = this.dateFuncObj.getDaysInMonth(this.dateFuncObj.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.dateFuncObj.add(date, "month", adj);
+ }
+ date.setDate(number);
+
+ if(!this.dateFuncObj.compare(date, today, "date")){
+ clazz = "dijitCalendarCurrentDate " + clazz;
+ }
+
+ if(this._isSelectedDate(date, this.lang)){
+ clazz = "dijitCalendarSelectedDate " + clazz;
+ template.setAttribute("aria-selected", true);
+ }else{
+ template.setAttribute("aria-selected", false);
+ }
+
+ if(this.isDisabledDate(date, this.lang)){
+ clazz = "dijitCalendarDisabledDate " + clazz;
+ template.setAttribute("aria-disabled", true);
+ }else{
+ clazz = "dijitCalendarEnabledDate " + clazz;
+ template.removeAttribute("aria-disabled");
+ }
+
+ 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);
+
+ // set name of this month
+ this.monthWidget.set("month", month);
+
+ // Fill in localized prev/current/next years
+ 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(/*Object*/args){
+ this.datePackage = args.datePackage || this.datePackage;
+ this.dateFuncObj = typeof this.datePackage == "string" ?
+ lang.getObject(this.datePackage, false) :// "string" part for back-compat, remove for 2.0
+ this.datePackage;
+ this.dateClassObj = this.dateFuncObj.Date || Date;
+ this.dateLocaleModule = lang.getObject("locale", false, this.dateFuncObj);
+ },
+
+ _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._supportingWidgets.push(this.monthWidget = this._createMonthWidget());
+
+ this.set('currentFocus', dateObj, false); // draw the grid to the month specified by currentFocus
+
+ // Set up connects for increment/decrement of months/years
+ var connect = lang.hitch(this, function(nodeProp, part, amount){
+ this.connect(this[nodeProp], "onclick", function(){
+ this._setCurrentFocusAttr(this.dateFuncObj.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.
+ // forceFocus:
+ // If true, will focus() the cell even if calendar itself doesn't have focus
+
+ var oldFocus = this.currentFocus,
+ oldCell = oldFocus && this._date2cell ? this._date2cell[oldFocus.valueOf()] : null;
+
+ // round specified value to nearest day (1am to avoid issues when DST shift occurs at midnight, see #8521, #9366)
+ date = new this.dateClassObj(date);
+ date.setHours(1, 0, 0, 0);
+
+ this._set("currentFocus", date);
+
+ // TODO: only re-populate grid when month/year has changed
+ this._populateGrid();
+
+ // set tabIndex=0 on new cell, and focus it (but only if Calendar itself is focused)
+ var newCell = this._date2cell[date.valueOf()];
+ 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);
+ }
+ },
+
+ onChange: function(/*Date*/ /*===== date =====*/){
+ // summary:
+ // Called only when the selected date has changed
+ },
+
+ _isSelectedDate: function(dateObject /*===== , locale =====*/){
+ // summary:
+ // Extension point so developers can subclass Calendar to
+ // support multiple (concurrently) selected dates
+ // dateObject: Date
+ // locale: String?
+ // tags:
+ // protected extension
+ return this._isValidDate(this.value) && !this.dateFuncObj.compare(dateObject, this.value, "date")
+ },
+
+ 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 dijit.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 ab24dfb95..30ea390dc 100644
--- a/lib/dijit/CheckedMenuItem.js
+++ b/lib/dijit/CheckedMenuItem.js
@@ -1,54 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.CheckedMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.CheckedMenuItem"] = true;
-dojo.provide("dijit.CheckedMenuItem");
-dojo.require("dijit.MenuItem");
-
-
-dojo.declare("dijit.CheckedMenuItem",
- dijit.MenuItem,
- {
- // summary:
- // A checkbox-like menu item for toggling on and off
-
- templateString: dojo.cache("dijit", "templates/CheckedMenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">&#10003;</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">&nbsp;</td>\n</tr>\n"),
-
- // 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.
- dojo.toggleClass(this.domNode, "dijitCheckedMenuItemChecked", checked);
- dijit.setWaiState(this.domNode, "checked", checked);
- this._set("checked", checked);
- },
-
- onChange: function(/*Boolean*/ checked){
- // summary:
- // User defined function to handle check/uncheck events
- // tags:
- // callback
- },
-
- _onClick: function(/*Event*/ e){
- // summary:
- // Clicking this item just toggles its state
- // tags:
- // private
- if(!this.disabled){
- this.set("checked", !this.checked);
- this.onChange(this.checked);
- }
- this.inherited(arguments);
- }
- });
-
-}
+//>>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
diff --git a/lib/dijit/CheckedMenuItem.js.uncompressed.js b/lib/dijit/CheckedMenuItem.js.uncompressed.js
new file mode 100644
index 000000000..caa3bc7bf
--- /dev/null
+++ b/lib/dijit/CheckedMenuItem.js.uncompressed.js
@@ -0,0 +1,59 @@
+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", // declare
+ "dojo/dom-class", // domClass.toggle
+ "./MenuItem",
+ "dojo/text!./templates/CheckedMenuItem.html",
+ "./hccss"
+], function(declare, domClass, MenuItem, template){
+
+/*=====
+ var MenuItem = dijit.MenuItem;
+=====*/
+
+ // module:
+ // dijit/CheckedMenuItem
+ // summary:
+ // A checkbox-like menu item for toggling on and off
+
+ 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);
+ this._set("checked", checked);
+ },
+
+ iconClass: "", // override dijitNoIcon
+
+ onChange: function(/*Boolean*/ /*===== checked =====*/){
+ // summary:
+ // User defined function to handle check/uncheck events
+ // tags:
+ // callback
+ },
+
+ _onClick: function(/*Event*/ e){
+ // summary:
+ // Clicking this item just toggles its state
+ // tags:
+ // private
+ if(!this.disabled){
+ this.set("checked", !this.checked);
+ this.onChange(this.checked);
+ }
+ this.inherited(arguments);
+ }
+ });
+});
diff --git a/lib/dijit/ColorPalette.js b/lib/dijit/ColorPalette.js
index 62c9d8df6..22e4e3a81 100644
--- a/lib/dijit/ColorPalette.js
+++ b/lib/dijit/ColorPalette.js
@@ -1,142 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.ColorPalette"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.ColorPalette"] = true;
-dojo.provide("dijit.ColorPalette");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dojo.colors");
-dojo.require("dojo.i18n");
-dojo.require("dojo.string");
-dojo.require("dijit._PaletteMixin");
-dojo.requireLocalization("dojo", "colors", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit.ColorPalette",
- [dijit._Widget, dijit._Templated, dijit._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 dojoType="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: dojo.cache("dijit", "templates/ColorPalette.html", "<div class=\"dijitInline dijitColorPalette\">\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),
-
- baseClass: "dijitColorPalette",
-
- buildRendering: function(){
- // Instantiate the template, which makes a skeleton into which we'll insert a bunch of
- // <img> nodes
- this.inherited(arguments);
-
- // Creates <img> nodes in each cell of the template.
- // Pass in "customized" dijit._Color constructor for specified palette and high-contrast vs. normal mode
- this._preparePalette(
- this._palettes[this.palette],
- dojo.i18n.getLocalization("dojo", "colors", this.lang),
- dojo.declare(dijit._Color, {
- hc: dojo.hasClass(dojo.body(), "dijit_a11y"),
- palette: this.palette
- })
- );
- }
-});
-
-dojo.declare("dijit._Color", dojo.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}' 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}' 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": dojo.moduleUrl("dijit.themes", "a11y/colors7x10.png"),
- "3x4": dojo.moduleUrl("dijit.themes", "a11y/colors3x4.png")
- },
-
- constructor: function(/*String*/alias, /*Number*/ row, /*Number*/ col){
- this._alias = alias;
- this._row = row;
- this._col = col;
- this.setColor(dojo.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 = dojo.string.substitute(this.hc ? this.hcTemplate : this.template, {
- // substitution variables for normal mode
- color: this.toHex(),
- blankGif: blankGif,
- alt: this._alias,
-
- // 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"
- });
-
- dojo.place(html, cell);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/ColorPalette.js.uncompressed.js b/lib/dijit/ColorPalette.js.uncompressed.js
new file mode 100644
index 000000000..b8c99a057
--- /dev/null
+++ b/lib/dijit/ColorPalette.js.uncompressed.js
@@ -0,0 +1,160 @@
+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",
+ "./_TemplatedMixin",
+ "./_PaletteMixin",
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/Color", // dojo.Color dojo.Color.named
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.contains
+ "dojo/dom-construct", // domConstruct.place
+ "dojo/_base/window", // win.body
+ "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, i18n, Color,
+ declare, domClass, domConstruct, win, string){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _PaletteMixin = dijit._PaletteMixin;
+=====*/
+
+// module:
+// dijit/ColorPalette
+// summary:
+// A keyboard accessible color-picking widget
+
+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){
+ // Overrides _PaletteMixin._dyeFactory().
+ return new this._dyeClass(value, row, col);
+ },
+
+ 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, {
+ hc: domClass.contains(win.body(), "dijit_a11y"),
+ 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}' 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}' 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(/*String*/alias, /*Number*/ row, /*Number*/ col){
+ this._alias = alias;
+ 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(this.hc ? this.hcTemplate : this.template, {
+ // substitution variables for normal mode
+ color: this.toHex(),
+ blankGif: blankGif,
+ alt: this._alias,
+
+ // 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 1cfa8ecad..833489d99 100644
--- a/lib/dijit/Declaration.js
+++ b/lib/dijit/Declaration.js
@@ -1,106 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Declaration"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Declaration"] = true;
-dojo.provide("dijit.Declaration");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-
-
-dojo.declare(
- "dijit.Declaration",
- dijit._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 = dojo.query("> script[type^='dojo/method']", src).orphan(),
- connects = dojo.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).
- dojo.forEach(methods, function(s){
- var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event"),
- func = dojo.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 dojo.map(this.mixins, dojo.getObject) doesn't work because it passes
- // a bogus third argument to getObject(), confusing it)
- this.mixins = this.mixins.length ?
- dojo.map(this.mixins, function(name){ return dojo.getObject(name); } ) :
- [ dijit._Widget, dijit._Templated ];
-
- propList.widgetsInTemplate = true;
- propList._skipNodeCache = true;
- propList.templateString = "<"+srcType+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint") || '')+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent") || '')+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
-
- // strip things so we don't create stuff under us in the initial setup phase
- dojo.query("[dojoType]", src).forEach(function(node){
- node.removeAttribute("dojoType");
- });
-
- // create the new widget class
- var wc = dojo.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_.
- dojo.forEach(connects, function(s){
- var evt = s.getAttribute("event") || s.getAttribute("data-dojo-event") || "postscript",
- func = dojo.parser._functionFromScript(s);
- dojo.connect(wc.prototype, evt, func);
- });
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/Declaration.js.uncompressed.js b/lib/dijit/Declaration.js.uncompressed.js
new file mode 100644
index 000000000..7d06f328d
--- /dev/null
+++ b/lib/dijit/Declaration.js.uncompressed.js
@@ -0,0 +1,112 @@
+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){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin;
+=====*/
+
+ // module:
+ // dijit/Declaration
+ // summary:
+ // The Declaration widget allows a developer to declare new widget
+ // classes directly from a snippet of markup.
+
+ 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)
+ this.mixins = this.mixins.length ?
+ array.map(this.mixins, function(name){ return lang.getObject(name); } ) :
+ [ _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/Dialog.js b/lib/dijit/Dialog.js
index 22d2dbedf..919f4b551 100644
--- a/lib/dijit/Dialog.js
+++ b/lib/dijit/Dialog.js
@@ -1,611 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Dialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Dialog"] = true;
-dojo.provide("dijit.Dialog");
-dojo.require("dojo.dnd.move");
-dojo.require("dojo.dnd.TimedMoveable");
-dojo.require("dojo.fx");
-dojo.require("dojo.window");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._CssStateMixin");
-dojo.require("dijit.form._FormMixin");
-dojo.require("dijit._DialogMixin");
-dojo.require("dijit.DialogUnderlay");
-dojo.require("dijit.layout.ContentPane");
-dojo.requireLocalization("dijit", "common", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.require("dijit.TooltipDialog");
-
-
-// dijit/TooltipDialog required for back-compat. TODO: remove in 2.0
-
-/*=====
-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.
-};
-=====*/
-dojo.declare(
- "dijit._DialogBase",
- [dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin, dijit._CssStateMixin],
- {
- // 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 dojoType="dijit.Dialog" href="test.html"></div>
- //
- // example:
- // | var foo = new dijit.Dialog({ title: "test dialog", content: "test content" };
- // | dojo.body().appendChild(foo.domNode);
- // | foo.startup();
-
- templateString: dojo.cache("dijit", "templates/Dialog.html", "<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"),
-
- baseClass: "dijitDialog",
-
- cssStateNodes: {
- closeButtonNode: "dijitDialogCloseIcon"
- },
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- title: [
- { node: "titleNode", type: "innerHTML" },
- { node: "titleBar", type: "attribute" }
- ],
- "aria-describedby":""
- }),
-
- // 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: dijit.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,
-
- //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 dojoType="dijit.Dialog" aria-describedby="intro" .....>
- // <div id="intro">Introductory text</div>
- // <div>rest of dialog contents</div>
- // </div>
- "aria-describedby":"",
-
- postMixInProperties: function(){
- var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
- dojo.mixin(this, _nlsResources);
- this.inherited(arguments);
- },
-
- postCreate: function(){
- dojo.style(this.domNode, {
- display: "none",
- position:"absolute"
- });
- dojo.body().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 && dijit._DialogLevelManager.isTop(this)){
- this._getFocusItems(this.domNode);
- dijit.focus(this._firstFocusItem);
- }
- this.inherited(arguments);
- },
-
- _endDrag: function(e){
- // summary:
- // Called after dragging the Dialog. Saves the position of the dialog in the viewport.
- // tags:
- // private
- if(e && e.node && e.node === this.domNode){
- this._relativePosition = dojo.position(e.node);
- }
- },
-
- _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 = (dojo.isIE == 6) ?
- new dojo.dnd.TimedMoveable(node, { handle: this.titleBar }) : // prevent overload, see #5285
- new dojo.dnd.Moveable(node, { handle: this.titleBar, timeout: 0 });
- this._dndListener = dojo.subscribe("/dnd/move/stop",this,"_endDrag");
- }else{
- dojo.addClass(node,"dijitDialogFixed");
- }
-
- this.underlayAttrs = {
- dialogId: this.id,
- "class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
- };
- },
-
- _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 dojo.marginBox(this.domNode) call below.
- if(this._singleChild){
- if(this._singleChildOriginalStyle){
- this._singleChild.domNode.style.cssText = this._singleChildOriginalStyle;
- }
- delete this._singleChildOriginalStyle;
- }else{
- dojo.style(this.containerNode, {
- width:"auto",
- height:"auto"
- });
- }
-
- var mb = dojo._getMarginSize(this.domNode);
- var viewport = dojo.window.getBox();
- if(mb.w >= viewport.w || mb.h >= viewport.h){
- // Reduce size of dialog contents so that dialog fits in viewport
-
- var w = Math.min(mb.w, Math.floor(viewport.w * 0.75)),
- h = Math.min(mb.h, Math.floor(viewport.h * 0.75));
-
- if(this._singleChild && this._singleChild.resize){
- this._singleChildOriginalStyle = this._singleChild.domNode.style.cssText;
- this._singleChild.resize({w: w, h: h});
- }else{
- dojo.style(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.
- // tags:
- // private
- if(!dojo.hasClass(dojo.body(),"dojoMove")){
- var node = this.domNode,
- viewport = dojo.window.getBox(),
- p = this._relativePosition,
- bb = p ? null : dojo._getBorderBox(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))
- ;
- dojo.style(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 dk = dojo.keys;
- var node = evt.target;
- if(evt.charOrCode === dk.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 === dk.TAB){
- if(!singleFocusItem){
- dijit.focus(this._lastFocusItem); // send focus to last item in dialog
- }
- dojo.stopEvent(evt);
- }else if(node == this._lastFocusItem && evt.charOrCode === dk.TAB && !evt.shiftKey){
- if(!singleFocusItem){
- dijit.focus(this._firstFocusItem); // send focus to first item in dialog
- }
- dojo.stopEvent(evt);
- }else{
- // see if the key is for the dialog
- while(node){
- if(node == this.domNode || dojo.hasClass(node, "dijitPopup")){
- if(evt.charOrCode == dk.ESCAPE){
- this.onCancel();
- }else{
- return; // just let it go
- }
- }
- node = node.parentNode;
- }
- // this key is for the disabled document window
- if(evt.charOrCode !== dk.TAB){ // allow tabbing into the dialog for a11y
- dojo.stopEvent(evt);
- // opera won't tab to a div
- }else if(!dojo.isOpera){
- try{
- this._firstFocusItem.focus();
- }catch(e){ /*squelch*/ }
- }
- }
- }
- },
-
- show: function(){
- // summary:
- // Display the dialog
- // returns: dojo.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();
- }
-
- this._modalconnects.push(dojo.connect(window, "onscroll", this, "layout"));
- this._modalconnects.push(dojo.connect(window, "onresize", this, function(){
- // IE gives spurious resize events and can actually get stuck
- // in an infinite loop if we don't ignore them
- var viewport = dojo.window.getBox();
- if(!this._oldViewport ||
- viewport.h != this._oldViewport.h ||
- viewport.w != this._oldViewport.w){
- this.layout();
- this._oldViewport = viewport;
- }
- }));
- this._modalconnects.push(dojo.connect(this.domNode, "onkeypress", this, "_onKey"));
-
- dojo.style(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 dojo.Deferred(dojo.hitch(this, function(){
- fadeIn.stop();
- delete this._fadeInDeferred;
- }));
-
- fadeIn = dojo.fadeIn({
- node: this.domNode,
- duration: this.duration,
- beforeBegin: dojo.hitch(this, function(){
- dijit._DialogLevelManager.show(this, this.underlayAttrs);
- }),
- onEnd: dojo.hitch(this, function(){
- if(this.autofocus && dijit._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);
- dijit.focus(this._firstFocusItem);
- }
- this._fadeInDeferred.callback(true);
- delete this._fadeInDeferred;
- })
- }).play();
-
- return this._fadeInDeferred;
- },
-
- hide: function(){
- // summary:
- // Hide the dialog
- // returns: dojo.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
- if(!this._alreadyInitialized){
- return;
- }
- if(this._fadeInDeferred){
- this._fadeInDeferred.cancel();
- }
-
- // fade-in Animation object, setup below
- var fadeOut;
-
- this._fadeOutDeferred = new dojo.Deferred(dojo.hitch(this, function(){
- fadeOut.stop();
- delete this._fadeOutDeferred;
- }));
-
- fadeOut = dojo.fadeOut({
- node: this.domNode,
- duration: this.duration,
- onEnd: dojo.hitch(this, function(){
- this.domNode.style.display = "none";
- dijit._DialogLevelManager.hide(this);
- this.onHide();
- this._fadeOutDeferred.callback(true);
- delete this._fadeOutDeferred;
- })
- }).play();
-
- if(this._scrollConnected){
- this._scrollConnected = false;
- }
- dojo.forEach(this._modalconnects, dojo.disconnect);
- this._modalconnects = [];
-
- if(this._relativePosition){
- delete this._relativePosition;
- }
- this._set("open", false);
-
- return this._fadeOutDeferred;
- },
-
- layout: function(){
- // summary:
- // Position the Dialog and the underlay
- // tags:
- // private
- if(this.domNode.style.display != "none"){
- if(dijit._underlay){ // avoid race condition during show()
- dijit._underlay.layout();
- }
- this._position();
- }
- },
-
- destroy: function(){
- if(this._fadeInDeferred){
- this._fadeInDeferred.cancel();
- }
- if(this._fadeOutDeferred){
- this._fadeOutDeferred.cancel();
- }
- if(this._moveable){
- this._moveable.destroy();
- }
- if(this._dndListener){
- dojo.unsubscribe(this._dndListener);
- }
- dojo.forEach(this._modalconnects, dojo.disconnect);
-
- dijit._DialogLevelManager.hide(this);
-
- this.inherited(arguments);
- }
- }
-);
-
-dojo.declare(
- "dijit.Dialog",
- [dijit.layout.ContentPane, dijit._DialogBase],
- {}
-);
-
-dijit._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.
-
- show: function(/*dijit._Widget*/ 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.
-
- var ds = dijit._dialogStack;
-
- // Save current focus
- ds[ds.length-1].focus = dijit.getFocus(dialog);
-
- // Display the underlay, or if already displayed then adjust for this new dialog
- var underlay = dijit._underlay;
- if(!underlay || underlay._destroyed){
- underlay = dijit._underlay = new dijit.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 : 950;
- if(ds.length == 1){ // first dialog
- underlay.show();
- }
- dojo.style(dijit._underlay.domNode, 'zIndex', zIndex - 1);
-
- // Dialog
- dojo.style(dialog.domNode, 'zIndex', zIndex);
-
- ds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex});
- },
-
- hide: function(/*dijit._Widget*/ 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.
-
- var ds = dijit._dialogStack;
-
- 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
- if(ds.length == 1){
- // Returning to original page.
- // Hide the underlay, unless the underlay widget has already been destroyed
- // because we are being called during page unload (when all widgets are destroyed)
- if(!dijit._underlay._destroyed){
- dijit._underlay.hide();
- }
- }else{
- // Popping back to previous dialog, adjust underlay
- dojo.style(dijit._underlay.domNode, 'zIndex', pd.zIndex - 1);
- dijit._underlay.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(!focus || (pd.dialog && !dojo.isDescendant(focus.node, pd.dialog.domNode))){
- pd.dialog._getFocusItems(pd.dialog.domNode);
- focus = pd.dialog._firstFocusItem;
- }
-
- try{
- dijit.focus(focus);
- }catch(e){
- /* focus() will fail if user opened the dialog by clicking a non-focusable element */
- }
- }
- }else{
- // Removing a dialog out of order (#9944, #10705).
- // Don't need to mess with underlay or z-index or anything.
- var idx = dojo.indexOf(dojo.map(ds, function(elem){return elem.dialog}), dialog);
- if(idx != -1){
- ds.splice(idx, 1);
- }
- }
- },
-
- isTop: function(/*dijit._Widget*/ dialog){
- // summary:
- // Returns true if specified Dialog is the top in the task
- var ds = dijit._dialogStack;
- 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)
-// }
-dijit._dialogStack = [
- {dialog: null, focus: null, underlayAttrs: null} // entry for stuff at z-index: 0
-];
-
-}
+//>>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
diff --git a/lib/dijit/Dialog.js.uncompressed.js b/lib/dijit/Dialog.js.uncompressed.js
new file mode 100644
index 000000000..aa763b074
--- /dev/null
+++ b/lib/dijit/Dialog.js.uncompressed.js
@@ -0,0 +1,643 @@
+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", // 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/_base/kernel", // kernel.isAsync
+ "dojo/keys",
+ "dojo/_base/lang", // lang.mixin lang.hitch
+ "dojo/on",
+ "dojo/ready",
+ "dojo/_base/sniff", // has("ie") has("opera")
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.getBox
+ "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",
+ ".", // 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, kernel, keys, lang, on, ready, has, win, winUtils,
+ Moveable, TimedMoveable, focus, manager, _Widget, _TemplatedMixin, _CssStateMixin, _FormMixin, _DialogMixin,
+ DialogUnderlay, ContentPane, template, dijit){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _CssStateMixin = dijit._CssStateMixin;
+ var _FormMixin = dijit.form._FormMixin;
+ var _DialogMixin = dijit._DialogMixin;
+=====*/
+
+
+ // module:
+ // dijit/Dialog
+ // summary:
+ // A modal dialog Widget
+
+
+ /*=====
+ 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], {
+ // 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 dijit.Dialog({ title: "test dialog", content: "test content" };
+ // | dojo.body().appendChild(foo.domNode);
+ // | foo.startup();
+
+ 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,
+
+ //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":"",
+
+ 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"
+ });
+ win.body().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);
+ },
+
+ _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();
+ 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(" ")
+ };
+ },
+
+ _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(this._singleChildOriginalStyle){
+ 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);
+ var viewport = winUtils.getBox();
+ if(bb.w >= viewport.w || bb.h >= viewport.h){
+ // Reduce size of dialog contents so that dialog fits in viewport
+
+ var w = Math.min(bb.w, Math.floor(viewport.w * 0.75)),
+ h = Math.min(bb.h, Math.floor(viewport.h * 0.75));
+
+ if(this._singleChild && this._singleChild.resize){
+ 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(win.body(), "dojoMove")){ // don't do anything if called during auto-scroll
+ var node = this.domNode,
+ viewport = winUtils.getBox(),
+ 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.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();
+ }
+
+ this._modalconnects.push(on(window, "scroll", lang.hitch(this, "layout")));
+ this._modalconnects.push(on(window, "resize", lang.hitch(this, function(){
+ // IE gives spurious resize events and can actually get stuck
+ // in an infinite loop if we don't ignore them
+ var viewport = winUtils.getBox();
+ if(!this._oldViewport ||
+ viewport.h != this._oldViewport.h ||
+ viewport.w != this._oldViewport.w){
+ this.layout();
+ this._oldViewport = viewport;
+ }
+ })));
+ 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.callback(true);
+ delete this._fadeInDeferred;
+ })
+ }).play();
+
+ return this._fadeInDeferred;
+ },
+
+ hide: function(){
+ // summary:
+ // Hide the dialog
+ // returns: dojo.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
+ if(!this._alreadyInitialized){
+ 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.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(){
+ // summary:
+ // Position the Dialog and the underlay
+ // tags:
+ // private
+ if(this.domNode.style.display != "none"){
+ if(dijit._underlay){ // avoid race condition during show()
+ dijit._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();
+ }
+
+ DialogLevelManager.hide(this);
+
+ this.inherited(arguments);
+ }
+ });
+
+ var Dialog = declare("dijit.Dialog", [ContentPane, _DialogBase], {});
+ Dialog._DialogBase = _DialogBase; // for monkey patching
+
+ 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._Widget*/ 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
+ var underlay = dijit._underlay;
+ if(!underlay || underlay._destroyed){
+ underlay = dijit._underlay = 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(dijit._underlay.domNode, 'zIndex', zIndex - 1);
+
+ // Dialog
+ domStyle.set(dialog.domNode, 'zIndex', zIndex);
+
+ ds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex});
+ },
+
+ hide: function(/*dijit._Widget*/ 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
+ if(ds.length == 1){
+ // Returning to original page.
+ // Hide the underlay, unless the underlay widget has already been destroyed
+ // because we are being called during page unload (when all widgets are destroyed)
+ if(!dijit._underlay._destroyed){
+ dijit._underlay.hide();
+ }
+ }else{
+ // Popping back to previous dialog, adjust underlay
+ domStyle.set(dijit._underlay.domNode, 'zIndex', pd.zIndex - 1);
+ dijit._underlay.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._Widget*/ 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(!kernel.isAsync){
+ 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 72557800d..0321e512c 100644
--- a/lib/dijit/DialogUnderlay.js
+++ b/lib/dijit/DialogUnderlay.js
@@ -1,112 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.DialogUnderlay"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.DialogUnderlay"] = true;
-dojo.provide("dijit.DialogUnderlay");
-dojo.require("dojo.window");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-
-
-dojo.declare(
- "dijit.DialogUnderlay",
- [dijit._Widget, dijit._Templated],
- {
- // 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' dojoAttachPoint='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": "",
-
- attributeMap: { id: "domNode" },
-
- _setDialogIdAttr: function(id){
- dojo.attr(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
- dojo.body().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 = dojo.window.getBox();
- 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 dijit.BackgroundIframe(this.domNode);
- },
-
- hide: function(){
- // summary:
- // Hides the dialog underlay
- this.bgIframe.destroy();
- delete this.bgIframe;
- this.domNode.style.display = "none";
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/DialogUnderlay.js.uncompressed.js b/lib/dijit/DialogUnderlay.js.uncompressed.js
new file mode 100644
index 000000000..13d2817b6
--- /dev/null
+++ b/lib/dijit/DialogUnderlay.js.uncompressed.js
@@ -0,0 +1,110 @@
+define("dijit/DialogUnderlay", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.getBox
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./BackgroundIframe"
+], function(declare, domAttr, win, winUtils, _Widget, _TemplatedMixin, BackgroundIframe){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/DialogUnderlay
+ // summary:
+ // The component that blocks the screen behind a `dijit.Dialog`
+
+ 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
+ win.body().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();
+ 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
new file mode 100644
index 000000000..b58d9ae4a
--- /dev/null
+++ b/lib/dijit/DropDownMenu.js
@@ -0,0 +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
diff --git a/lib/dijit/DropDownMenu.js.uncompressed.js b/lib/dijit/DropDownMenu.js.uncompressed.js
new file mode 100644
index 000000000..a1f9041c8
--- /dev/null
+++ b/lib/dijit/DropDownMenu.js.uncompressed.js
@@ -0,0 +1,64 @@
+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", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/text!./templates/Menu.html",
+ "./_OnDijitClickMixin",
+ "./_MenuBase"
+], function(declare, event, keys, template, _OnDijitClickMixin, _MenuBase){
+
+/*=====
+ var _MenuBase = dijit._MenuBase;
+ var _OnDijitClickMixin = dijit._OnDijitClickMixin;
+=====*/
+
+ // module:
+ // dijit/DropDownMenu
+ // summary:
+ // dijit.DropDownMenu widget
+
+ return declare("dijit.DropDownMenu", [_MenuBase, _OnDijitClickMixin], {
+ // summary:
+ // A menu, without features for context menu (Meaning, drop down menu)
+
+ templateString: template,
+
+ baseClass: "dijitMenu",
+
+ postCreate: function(){
+ 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 b77dd7165..8ad9b2b4a 100644
--- a/lib/dijit/Editor.js
+++ b/lib/dijit/Editor.js
@@ -1,794 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Editor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Editor"] = true;
-dojo.provide("dijit.Editor");
-dojo.require("dijit._editor.RichText");
-dojo.require("dijit.Toolbar");
-dojo.require("dijit.ToolbarSeparator");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit._editor.plugins.EnterKeyHandling");
-dojo.require("dijit._editor.range");
-dojo.require("dijit._Container");
-dojo.require("dojo.i18n");
-dojo.require("dijit.layout._LayoutWidget");
-dojo.requireLocalization("dijit._editor", "commands", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare(
- "dijit.Editor",
- 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(){
- // summary:
- // Runs on widget initialization to setup arrays etc.
- // tags:
- // private
-
- if(!dojo.isArray(this.plugins)){
- this.plugins=["undo","redo","|","cut","copy","paste","|","bold","italic","underline","strikethrough","|",
- "insertOrderedList","insertUnorderedList","indent","outdent","|","justifyLeft","justifyRight","justifyCenter","justifyFull",
- "dijit._editor.plugins.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 equivelent 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(dojo.isIE){
- 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 dojo.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(dojo.isArray(this.extraPlugins)){
- this.plugins=this.plugins.concat(this.extraPlugins);
- }
-
- this.inherited(arguments);
-
- this.commands = dojo.i18n.getLocalization("dijit._editor", "commands", this.lang);
-
- if(!this.toolbar){
- // if we haven't been assigned a toolbar, create one
- this.toolbar = new dijit.Toolbar({
- dir: this.dir,
- lang: this.lang
- });
- this.header.appendChild(this.toolbar.domNode);
- }
-
- dojo.forEach(this.plugins, this.addPlugin, this);
-
- // Okay, denote the value can now be set.
- this.setValueDeferred.callback(true);
-
- dojo.addClass(this.iframe.parentNode, "dijitEditorIFrameContainer");
- dojo.addClass(this.iframe, "dijitEditorIFrame");
- dojo.attr(this.iframe, "allowTransparency", true);
-
- if(dojo.isWebKit){
- // Disable selecting the entire editor by inadvertant double-clicks.
- // on buttons, title bar, etc. Otherwise clicking too fast on
- // a button such as undo/redo selects the entire editor.
- dojo.style(this.domNode, "KhtmlUserSelect", "none");
- }
- this.toolbar.startup();
- this.onNormalizedDisplayChanged(); //update toolbar button status
- },
- destroy: function(){
- dojo.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*/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 or plugin instance
- //
- // args:
- // This object will be passed to the plugin constructor
- //
- // index: Integer
- // 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=dojo.isString(plugin)?{name:plugin}:plugin;
- if(!args.setEditor){
- var o={"args":args,"plugin":null,"editor":this};
- dojo.publish(dijit._scopeName + ".Editor.getPlugin",[o]);
- if(!o.plugin){
- var pc = dojo.getObject(args.name);
- if(pc){
- o.plugin=new pc(args);
- }
- }
- if(!o.plugin){
- console.warn('Cannot find plugin',plugin);
- return;
- }
- plugin=o.plugin;
- }
- if(arguments.length > 1){
- this._plugins[index] = plugin;
- }else{
- this._plugins.push(plugin);
- }
- plugin.setEditor(this);
- if(dojo.isFunction(plugin.setToolbar)){
- plugin.setToolbar(this.toolbar);
- }
- },
- //the following 3 functions are required to make the editor play nice under a layout widget, see #4070
- startup: function(){
- // summary:
- // Exists to make Editor work as a child of a layout widget.
- // Developers don't need to call this method.
- // tags:
- // protected
- //console.log('startup',arguments);
- },
- 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
- dijit.layout._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() +
- dojo._getPadBorderExtents(this.iframe.parentNode).h +
- dojo._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.
- bodyDir = b.dir ? b.dir.toLowerCase() : "";
- if(bodyDir != "rtl"){
- 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"){
- setTimeout(dojo.hitch(this, "placeCursorAtEnd"), 0);
- }
- this.inherited(arguments);
- }
- },
- onBeforeActivate: function(e){
- 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){
- clearTimeout(this._editTimer);
- }
- this._editTimer = setTimeout(dojo.hitch(this, this.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;
- var isClipboard = /copy|cut|paste/.test(cmd);
- try{
- r = this.inherited(arguments);
- if(dojo.isWebKit && isClipboard && !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 */ && isClipboard){
- // Warn user of platform limitation. Cannot programmatically access clipboard. See ticket #4136
- var sub = dojo.string.substitute,
- accel = {cut:'X', copy:'C', paste:'V'};
- alert(sub(this.commands.systemShortcut,
- [this.commands[cmd], sub(this.commands[dojo.isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
- }
- r = false;
- }
- if(this.customUndo){
- this._endEditing();
- }
- 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(dojo.isIE < 9){
- if(dojo.isArray(mark)){
- //IE CONTROL, have to use the native bookmark.
- bookmark = [];
- dojo.forEach(mark,function(n){
- bookmark.push(dijit.range.getNode(n,this.editNode));
- },this);
- dojo.withGlobal(this.window,'moveToBookmark',dijit,[{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 = dijit.range.getSelection(this.window);
- if(sel && sel.removeAllRanges){
- sel.removeAllRanges();
- r = dijit.range.create(this.window);
- sNode = dijit.range.getNode(mark.startContainer,this.editNode);
- eNode = dijit.range.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 = dijit.range.getSelection(this.window);
- if(sel && sel.removeAllRanges){
- sel.removeAllRanges();
- r = dijit.range.create(this.window);
- sNode = dijit.range.getNode(mark.startContainer,this.editNode);
- eNode = dijit.range.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
- //console.log('undo');
- 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
- //console.log('redo');
- 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){
- clearTimeout(this._editTimer);
- }
- if(this._inEditing){
- this._endEditing(ignore_caret);
- this._inEditing=false;
- }
- },
-
- _getBookmark: function(){
- // summary:
- // Get the currently selected text
- // tags:
- // protected
- var b=dojo.withGlobal(this.window,dijit.getBookmark);
- var tmp=[];
- if(b && b.mark){
- var mark = b.mark;
- if(dojo.isIE < 9){
- // Try to use the pseudo range API on IE for better accuracy.
- var sel = dijit.range.getSelection(this.window);
- if(!dojo.isArray(mark)){
- if(sel){
- var range;
- if(sel.rangeCount){
- range = sel.getRangeAt(0);
- }
- if(range){
- b.mark = range.cloneRange();
- }else{
- b.mark = dojo.withGlobal(this.window,dijit.getBookmark);
- }
- }
- }else{
- // Control ranges (img, table, etc), handle differently.
- dojo.forEach(b.mark,function(n){
- tmp.push(dijit.range.getIndex(n,this.editNode).o);
- },this);
- b.mark = tmp;
- }
- }
- try{
- if(b.mark && b.mark.startContainer){
- tmp=dijit.range.getIndex(b.mark.startContainer,this.editNode).o;
- b.mark={startContainer:tmp,
- startOffset:b.mark.startOffset,
- endContainer:b.mark.endContainer===b.mark.startContainer?tmp:dijit.range.getIndex(b.mark.endContainer,this.editNode).o,
- endOffset:b.mark.endOffset};
- }
- }catch(e){
- b.mark = null;
- }
- }
- return b;
- },
- _beginEditing: function(cmd){
- // 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':dijit._editor.getChildrenHtml(this.editNode),'bookmark':this._getBookmark()});
- }
- },
- _endEditing: function(ignore_caret){
- // 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 = dijit._editor.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(!dojo.isIE && !this.iframe && e.keyCode == dojo.keys.TAB && !this.tabIndent){
- this._saveSelection();
- }
- if(!this.customUndo){
- this.inherited(arguments);
- return;
- }
- var k = e.keyCode, ks = dojo.keys;
- 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
- dojo.stopEvent(e);
- this.undo();
- return;
- }else if(k == 89 || k == 121){ //y
- dojo.stopEvent(e);
- this.redo();
- return;
- }
- }
- this.inherited(arguments);
-
- switch(k){
- case ks.ENTER:
- case ks.BACKSPACE:
- case ks.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');
- //use timeout to trigger after the cut is complete
- setTimeout(dojo.hitch(this, this.endEditing), 1);
- }else{
- this.beginEditing('paste');
- //use timeout to trigger after the paste is complete
- setTimeout(dojo.hitch(this, this.endEditing), 1);
- }
- break;
- }
- //pass through
- default:
- if(!e.ctrlKey && !e.altKey && !e.metaKey && (e.keyCode<dojo.keys.F1 || e.keyCode>dojo.keys.F15)){
- this.beginEditing();
- break;
- }
- //pass through
- case ks.ALT:
- this.endEditing();
- break;
- case ks.UP_ARROW:
- case ks.DOWN_ARROW:
- case ks.LEFT_ARROW:
- case ks.RIGHT_ARROW:
- case ks.HOME:
- case ks.END:
- case ks.PAGE_UP:
- case ks.PAGE_DOWN:
- this.endEditing(true);
- break;
- //maybe ctrl+backspace/delete, so don't endEditing when ctrl is pressed
- case ks.CTRL:
- case ks.SHIFT:
- case ks.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 simultaniously. */}
- },
- _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(dojo.withGlobal(this.window,'isCollapsed',dijit)){
- 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 maintainence.
- // tags:
- // protected
- if(!this.customUndo){
- this.inherited(arguments);
- }else{
- if(this.isClosed){
- this.setValue(html);
- }else{
- this.beginEditing();
- if(!html){
- html = "&nbsp;"
- }
- this.setValue(html);
- this.endEditing();
- }
- }
- },
-
- _setDisabledAttr: function(/*Boolean*/ value){
- var disableFunc = dojo.hitch(this, function(){
- if((!this.disabled && value) || (!this._buttonEnabledPlugins && value)){
- // Disable editor: disable all enabled buttons and remember that list
- dojo.forEach(this._plugins, function(p){
- p.set("disabled", true);
- });
- }else if(this.disabled && !value){
- // Restore plugins to being active.
- dojo.forEach(this._plugins, function(p){
- p.set("disabled", false);
- });
- }
- });
- this.setValueDeferred.addCallback(disableFunc);
- 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){
- dojo.style(this.document.body, "color", dojo.style(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
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- var args = o.args, p;
- var _p = dijit._editor._Plugin;
- var name = args.name;
- switch(name){
- case "undo": case "redo": case "cut": case "copy": case "paste": case "insertOrderedList":
- case "insertUnorderedList": case "indent": case "outdent": case "justifyCenter":
- case "justifyFull": case "justifyLeft": case "justifyRight": case "delete":
- case "selectAll": case "removeFormat": case "unlink":
- case "insertHorizontalRule":
- p = new _p({ command: name });
- break;
-
- case "bold": case "italic": case "underline": case "strikethrough":
- case "subscript": case "superscript":
- p = new _p({ buttonClass: dijit.form.ToggleButton, command: name });
- break;
- case "|":
- p = new _p({ button: new dijit.ToolbarSeparator(), setEditor: function(editor) {this.editor = editor;} });
- }
-// console.log('name',name,p);
- o.plugin=p;
-});
-
-}
+//>>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
diff --git a/lib/dijit/Editor.js.uncompressed.js b/lib/dijit/Editor.js.uncompressed.js
new file mode 100644
index 000000000..2ac7a238e
--- /dev/null
+++ b/lib/dijit/Editor.js.uncompressed.js
@@ -0,0 +1,859 @@
+define("dijit/Editor", [
+ "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/_base/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",
+ ".", // dijit._scopeName
+ "dojo/i18n!./_editor/nls/commands"
+], function(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
+ // summary:
+ // A rich text Editing widget
+
+ 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(){
+ // summary:
+ // Runs on widget initialization to setup arrays etc.
+ // tags:
+ // private
+
+ 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({
+ 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.callback(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: Integer
+ // 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){
+ var pc = args.ctor || lang.getObject(args.name);
+ if(pc){
+ o.plugin=new pc(args);
+ }
+ }
+ if(!o.plugin){
+ console.warn('Cannot find plugin',plugin);
+ return;
+ }
+ 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"){
+ setTimeout(lang.hitch(this, "placeCursorAtEnd"), 0);
+ }
+ 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){
+ clearTimeout(this._editTimer);
+ }
+ this._editTimer = setTimeout(lang.hitch(this, this.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 */){
+ // 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',dijit,[{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
+ //console.log('undo');
+ 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
+ //console.log('redo');
+ 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){
+ clearTimeout(this._editTimer);
+ }
+ 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');
+ //use timeout to trigger after the cut is complete
+ setTimeout(lang.hitch(this, this.endEditing), 1);
+ }else{
+ this.beginEditing('paste');
+ //use timeout to trigger after the paste is complete
+ setTimeout(lang.hitch(this, this.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',dijit)){
+ 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){
+ var disableFunc = 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.setValueDeferred.addCallback(disableFunc);
+ 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({ button: new ToolbarSeparator(), setEditor: function(editor){this.editor = editor;}});
+ }
+ });
+
+ return Editor;
+});
diff --git a/lib/dijit/InlineEditBox.js b/lib/dijit/InlineEditBox.js
index 1f569efbe..58f842efb 100644
--- a/lib/dijit/InlineEditBox.js
+++ b/lib/dijit/InlineEditBox.js
@@ -1,589 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.InlineEditBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.InlineEditBox"] = true;
-dojo.provide("dijit.InlineEditBox");
-dojo.require("dojo.i18n");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Container");
-dojo.require("dijit.form.Button");
-dojo.require("dijit.form.TextBox");
-dojo.requireLocalization("dijit", "common", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit.InlineEditBox",
- dijit._Widget,
- {
- // summary:
- // An element with in-line edit capabilites
- //
- // 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
- // Class name (or reference to the Class) for Editor widget
- editor: "dijit.form.TextBox",
-
- // editorWrapper: String|Function
- // Class name (or reference to the Class) for widget that wraps the editor widget, displaying save/cancel
- // buttons.
- editorWrapper: "dijit._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: dojo.isIE <= 6 ? // font-family needed on IE6 but it messes up IE8
- "<span style='font-family: wingdings; text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>" :
- "<span style='text-decoration: underline;'>&nbsp;&nbsp;&nbsp;&nbsp;&#x270d;&nbsp;&nbsp;&nbsp;&nbsp;</span>",
-
- constructor: function(){
- // summary:
- // Sets up private arrays etc.
- // tags:
- // private
- 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]);
- }
- dijit.setWaiRole(this.displayNode, "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 = dojo.trim(this.renderAsHtml ? this.displayNode.innerHTML :
- (this.displayNode.innerText||this.displayNode.textContent||""));
- }
- if(!this.value){
- this.displayNode.innerHTML = this.noValueIndicator;
- }
-
- dojo.addClass(this.displayNode, 'dijitInlineEditBoxDisplayMode');
- },
-
- setDisabled: function(/*Boolean*/ disabled){
- // summary:
- // Deprecated. Use set('disabled', ...) instead.
- // tags:
- // deprecated
- dojo.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.
- dijit.setWaiState(this.domNode, "disabled", disabled);
- if(disabled){
- this.displayNode.removeAttribute("tabIndex");
- }else{
- this.displayNode.setAttribute("tabIndex", 0);
- }
- dojo.toggleClass(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled);
- this._set("disabled", disabled);
- },
-
- _onMouseOver: function(){
- // summary:
- // Handler for onmouseover and onfocus event.
- // tags:
- // private
- if(!this.disabled){
- dojo.addClass(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
- }
- },
-
- _onMouseOut: function(){
- // summary:
- // Handler for onmouseout and onblur event.
- // tags:
- // private
- dojo.removeClass(this.displayNode, "dijitInlineEditBoxDisplayModeHover");
- },
-
- _onClick: function(/*Event*/ e){
- // summary:
- // Handler for onclick event.
- // tags:
- // private
- if(this.disabled){ return; }
- if(e){ dojo.stopEvent(e); }
- this._onMouseOut();
-
- // Since FF gets upset if you move a node while in an event handler for that node...
- setTimeout(dojo.hitch(this, "edit"), 0);
- },
-
- edit: function(){
- // summary:
- // Display the editor widget in place of the original (read only) markup.
- // tags:
- // private
-
- if(this.disabled || this.editing){ return; }
- this.editing = true;
-
- // save some display node values that can be restored later
- this._savedPosition = dojo.style(this.displayNode, "position") || "static";
- this._savedOpacity = dojo.style(this.displayNode, "opacity") || "1";
- this._savedTabIndex = dojo.attr(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 = dojo.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" ? dojo.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: dojo.getComputedStyle(this.displayNode),
- save: dojo.hitch(this, "save"),
- cancel: dojo.hitch(this, "cancel")
- }, placeholder);
- if(!this._started){
- this.startup();
- }
- }
- var ww = this.wrapperWidget;
-
- if(dojo.isIE){
- dijit.focus(dijit.getFocus()); // IE (at least 8) needs help with tab order changes
- }
- // 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
- // visiblity:hidden removes focus outline
-
- dojo.style(this.displayNode, { position: "absolute", opacity: "0", display: "none" }); // makes display node invisible, display style used for focus-ability
- dojo.style(ww.domNode, { position: this._savedPosition, visibility: "visible", opacity: "1" });
- dojo.attr(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode
-
- // Replace the display widget with edit widget, leaving them both displayed for a brief time so that
- // focus can be shifted without incident. (browser may needs some time to render the editor.)
- setTimeout(dojo.hitch(this, function(){
- ww.focus(); // both nodes are showing, so we can switch focus safely
- ww._resetValue = ww.getValue();
- }), 0);
- },
-
- _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...
- setTimeout(dojo.hitch(this, function(){
- if(this.wrapperWidget){
- this.wrapperWidget.destroy();
- delete this.wrapperWidget;
- }
- }), 0);
- */
- }
- },
-
- 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;
- dojo.style(ww.domNode, { position: "absolute", visibility: "hidden", opacity: "0" }); // hide the editor from mouse/keyboard events
- dojo.style(this.displayNode, { position: this._savedPosition, opacity: this._savedOpacity, display: "" }); // make the original text visible
- dojo.attr(this.displayNode, "tabIndex", this._savedTabIndex);
- if(focus){
- dijit.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.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
- dojo.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 = dojo.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
- setTimeout(dojo.hitch(this, "onChange", val), 0); // setTimeout prevents browser freeze for long-running event handlers
- }
- },
-
- getValue: function(){
- // summary:
- // Deprecated. Use get('value') instead.
- // tags:
- // deprecated
- dojo.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.editing = false;
-
- // tell the world that we have no changes
- setTimeout(dojo.hitch(this, "onCancel"), 0); // setTimeout prevents browser freeze for long-running event handlers
-
- this._showText(focus);
- }
-});
-
-dojo.declare(
- "dijit._InlineEditor",
- [dijit._Widget, dijit._Templated],
-{
- // 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: dojo.cache("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"),
- widgetsInTemplate: true,
-
- postMixInProperties: function(){
- this.inherited(arguments);
- this.messages = dojo.i18n.getLocalization("dijit", "common", this.lang);
- dojo.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
- var cls = typeof this.editor == "string" ? dojo.getObject(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 = dojo.getComputedStyle(this.domNode);
- dojo.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);
- dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], 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 = dojo.delegate(this.inlineEditBox.editorParams, {
- style: editStyle,
- dir: this.dir,
- lang: this.lang
- });
- 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
- dojo.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);
- }
- }
- },
-
- _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 == dojo.keys.ESCAPE){
- dojo.stopEvent(e);
- this.cancel(true); // sets editing=false which short-circuits _onBlur processing
- }else if(e.charOrCode == dojo.keys.ENTER && e.target.tagName == "INPUT"){
- dojo.stopEvent(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()){
- dojo.style(this.inlineEditBox.displayNode, { display: "" });
- dijit.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();
- setTimeout(dojo.hitch(this, function(){
- if(this.editWidget.focusNode && this.editWidget.focusNode.tagName == "INPUT"){
- dijit.selectInputText(this.editWidget.focusNode);
- }
- }), 0);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/InlineEditBox.js.uncompressed.js b/lib/dijit/InlineEditBox.js.uncompressed.js
new file mode 100644
index 000000000..415c9bdba
--- /dev/null
+++ b/lib/dijit/InlineEditBox.js.uncompressed.js
@@ -0,0 +1,627 @@
+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", // 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/_base/sniff", // has("ie")
+ "./focus",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_WidgetsInTemplateMixin",
+ "./_Container",
+ "./form/Button",
+ "./form/_TextBoxMixin",
+ "./form/TextBox",
+ "dojo/text!./templates/InlineEditBox.html",
+ "dojo/i18n!./nls/common"
+], function(array, declare, domAttr, domClass, domConstruct, domStyle, event, i18n, kernel, keys, lang, has,
+ fm, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _Container, Button, _TextBoxMixin, TextBox, template){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin;
+ var _Container = dijit._Container;
+ var Button = dijit.form.Button;
+ var TextBox = dijit.form.TextBox;
+=====*/
+
+// module:
+// dijit/InlineEditBox
+// summary:
+// An element with in-line edit capabilities
+
+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
+ var cls = typeof this.editor == "string" ? lang.getObject(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"], 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);
+ }
+ }
+ },
+
+ _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();
+ setTimeout(lang.hitch(this, function(){
+ if(this.editWidget.focusNode && this.editWidget.focusNode.tagName == "INPUT"){
+ _TextBoxMixin.selectInputText(this.editWidget.focusNode);
+ }
+ }), 0);
+ }
+});
+
+
+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
+ // Class name (or reference to the Class) 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(){
+ // summary:
+ // Sets up private arrays etc.
+ // tags:
+ // private
+ 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);
+ 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...
+ setTimeout(lang.hitch(this, "edit"), 0);
+ },
+
+ 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._savedPosition = domStyle.get(this.displayNode, "position") || "static";
+ this._savedOpacity = domStyle.get(this.displayNode, "opacity") || "1";
+ 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._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
+ // visiblity:hidden removes focus outline
+
+ domStyle.set(this.displayNode, { position: "absolute", opacity: "0" }); // makes display node invisible, display style used for focus-ability
+ domStyle.set(ww.domNode, { position: this._savedPosition, visibility: "visible", opacity: "1" });
+ domAttr.set(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode
+
+ // Replace the display widget with edit widget, leaving them both displayed for a brief time so that
+ // focus can be shifted without incident. (browser may needs some time to render the editor.)
+ setTimeout(lang.hitch(ww, function(){
+ this.focus(); // both nodes are showing, so we can switch focus safely
+ this._resetValue = this.getValue();
+ }), 0);
+ },
+
+ _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...
+ setTimeout(lang.hitch(this, function(){
+ if(this.wrapperWidget){
+ this.wrapperWidget.destroy();
+ delete this.wrapperWidget;
+ }
+ }), 0);
+ */
+ }
+ },
+
+ 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, { position: "absolute", visibility: "hidden", opacity: "0" }); // hide the editor from mouse/keyboard events
+ domStyle.set(this.displayNode, { position: this._savedPosition, opacity: this._savedOpacity }); // make the original text visible
+ 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
+ setTimeout(lang.hitch(this, "onChange", val), 0); // setTimeout 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
+ setTimeout(lang.hitch(this, "onCancel"), 0); // setTimeout 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/Menu.js b/lib/dijit/Menu.js
index c5a48660e..a576da5c3 100644
--- a/lib/dijit/Menu.js
+++ b/lib/dijit/Menu.js
@@ -1,716 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Menu"] = true;
-dojo.provide("dijit.Menu");
-dojo.require("dojo.window");
-dojo.require("dijit._Widget");
-dojo.require("dijit._KeyNavContainer");
-dojo.require("dijit._Templated");
-dojo.require("dijit.MenuItem");
-dojo.require("dijit.PopupMenuItem");
-dojo.require("dijit.CheckedMenuItem");
-dojo.require("dijit.MenuSeparator");
-
-
-// "dijit/MenuItem", "dijit/PopupMenuItem", "dijit/CheckedMenuItem", "dijit/MenuSeparator" for Back-compat (TODO: remove in 2.0)
-
-dojo.declare("dijit._MenuBase",
- [dijit._Widget, dijit._Templated, dijit._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,
-
- startup: function(){
- if(this._started){ return; }
-
- dojo.forEach(this.getChildren(), function(child){ child.startup(); });
- this.startupKeyNavChildren();
-
- 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.focusedChild._onClick(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 = setTimeout(dojo.hitch(this, "_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;
- },
-
- _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 = setTimeout(function(){
- itemPopup._pendingClose_timer = null;
- if(itemPopup.parentMenu){
- itemPopup.parentMenu.currentPopup = null;
- }
- dijit.popup.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; }
- },
-
- _stopPopupTimer: function(){
- // summary:
- // Cancels the popup timer because the user has stop hovering
- // on the MenuItem, etc.
- // tags:
- // private
- if(this.hover_timer){
- clearTimeout(this.hover_timer);
- this.hover_timer = null;
- }
- },
-
- _stopPendingCloseTimer: function(/*dijit._Widget*/ popup){
- // summary:
- // Cancels the pending-close timer because the close has been preempted
- // tags:
- // private
- if(popup._pendingClose_timer){
- clearTimeout(popup._pendingClose_timer);
- popup._pendingClose_timer = null;
- }
- },
-
- _stopFocusTimer: function(){
- // summary:
- // Cancels the pending-focus timer because the menu was closed before focus occured
- // tags:
- // private
- if(this._focus_timer){
- clearTimeout(this._focus_timer);
- this._focus_timer = null;
- }
- },
-
- _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._Widget*/ 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();
- }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(evt);
- }
- },
-
- _openPopup: function(){
- // summary:
- // Open the popup to the side of/underneath the current menu 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){ return; }
- if(this.currentPopup){
- this._stopPendingCloseTimer(this.currentPopup);
- dijit.popup.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;
- dijit.popup.open({
- parent: this,
- popup: popup,
- around: from_item.domNode,
- orient: this._orient || (this.isLeftToRight() ?
- {'TR': 'TL', 'TL': 'TR', 'BR': 'BL', 'BL': 'BR'} :
- {'TL': 'TR', 'TR': 'TL', 'BL': 'BR', 'BR': 'BL'}),
- 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: dojo.hitch(this, "_cleanUp")
- });
-
- this.currentPopup = popup;
- // detect mouseovers to handle lazy mouse movements that temporarily focus other menu items
- popup.connect(popup.domNode, "onmouseenter", dojo.hitch(self, "_onPopupHover")); // cleaned up when the popped-up widget is destroyed on close
-
- if(popup.focus){
- // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar),
- // if the cursor happens to collide with the popup, it will generate an onmouseover event
- // even though the mouse wasn't moved. Use a setTimeout() to call popup.focus so that
- // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742)
- popup._focus_timer = setTimeout(dojo.hitch(popup, function(){
- this._focus_timer = null;
- this.focus();
- }), 0);
- }
- },
-
- _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;
- dojo.replaceClass(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
- dojo.replaceClass(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();
-
- var fromItem = this.focusedChild && this.focusedChild.from_item;
-
- if(this.currentPopup){
- // If focus is on my child menu then move focus to me,
- // because IE doesn't like it when you display:none a node with focus
- if(dijit._curFocus && dojo.isDescendant(dijit._curFocus, this.currentPopup.domNode)){
- this.focusedChild.focusNode.focus();
- }
- // Close all popups that are open and descendants of this menu
- dijit.popup.close(this.currentPopup);
- this.currentPopup = null;
- }
-
- if(this.focusedChild){ // unhighlight the focused item
- this.focusedChild._setSelected(false);
- this.focusedChild._onUnhover();
- 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._hoveredChild._onUnhover(); // 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();
- }
- }
-});
-
-dojo.declare("dijit.Menu",
- dijit._MenuBase,
- {
- // summary
- // A context menu you can assign to multiple elements
-
- // TODO: most of the code in here is just for context menu (right-click menu)
- // support. In retrospect that should have been a separate class (dijit.ContextMenu).
- // Split them for 2.0
-
- constructor: function(){
- this._bindings = [];
- },
-
- templateString: dojo.cache("dijit", "templates/Menu.html", "<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),
-
- baseClass: "dijitMenu",
-
- // 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: [],
-
- // 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, similiar 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(dojo.body());
- }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)
- dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
- }
- var k = dojo.keys, l = this.isLeftToRight();
- this._openSubMenuKey = l ? k.RIGHT_ARROW : k.LEFT_ARROW;
- this._closeSubMenuKey = l ? k.LEFT_ARROW : k.RIGHT_ARROW;
- this.connectKeyNavHandlers([k.UP_ARROW], [k.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);
- dojo.stopEvent(evt);
- break;
- case this._closeSubMenuKey:
- if(this.parentMenu){
- if(this.parentMenu._isMenuBar){
- this.parentMenu.focusPrev();
- }else{
- this.onCancel(false);
- }
- }else{
- dojo.stopEvent(evt);
- }
- break;
- }
- },
-
- // thanks burstlib!
- _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
- // summary:
- // Returns the window reference of the passed iframe
- // tags:
- // private
- var win = dojo.window.get(this._iframeContentDocument(iframe_el)) ||
- // Moz. TODO: is this available when defaultView isn't?
- this._iframeContentDocument(iframe_el)['__parent__'] ||
- (iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
- return win; // Window
- },
-
- _iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
- // summary:
- // Returns a reference to the document object inside iframe_el
- // tags:
- // protected
- var doc = iframe_el.contentDocument // W3
- || (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE
- || (iframe_el.name && dojo.doc.frames[iframe_el.name] && dojo.doc.frames[iframe_el.name].document)
- || null;
- return doc; // HTMLDocument
- },
-
- bindDomNode: function(/*String|DomNode*/ node){
- // summary:
- // Attach menu to given node
- node = dojo.byId(node);
-
- 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,
- win = this._iframeContentWindow(iframe);
- cn = dojo.withGlobal(win, dojo.body);
- }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 == dojo.body() ? dojo.doc.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.
- dojo.attr(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 = dojo.hitch(this, function(cn){
- return [
- // TODO: when leftClickToOpen is true then shouldn't space/enter key trigger the menu,
- // rather than shift-F10?
- dojo.connect(cn, this.leftClickToOpen ? "onclick" : "oncontextmenu", this, function(evt){
- // Schedule context menu to be opened unless it's already been scheduled from onkeydown handler
- dojo.stopEvent(evt);
- this._scheduleOpen(evt.target, iframe, {x: evt.pageX, y: evt.pageY});
- }),
- dojo.connect(cn, "onkeydown", this, function(evt){
- if(evt.shiftKey && evt.keyCode == dojo.keys.F10){
- dojo.stopEvent(evt);
- this._scheduleOpen(evt.target, 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 dojo.connect(), see #9609.
-
- binding.onloadHandler = dojo.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 win = this._iframeContentWindow(iframe);
- cn = dojo.withGlobal(win, dojo.body);
- 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 = dojo.byId(nodeName);
- }catch(e){
- // On IE the dojo.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 && dojo.hasAttr(node, attrName)){
- var bid = dojo.attr(node, attrName)-1, b = this._bindings[bid];
- dojo.forEach(b.connects, dojo.disconnect);
-
- // 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);
- }
- }
-
- dojo.removeAttr(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 dojo.stopEvent(e). (Shift-F10 on windows doesn't generate the
- // oncontextmenu event.)
-
- if(!this._openTimer){
- this._openTimer = setTimeout(dojo.hitch(this, 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;
-
- // 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 od = target.ownerDocument,
- ifc = dojo.position(iframe, true),
- win = this._iframeContentWindow(iframe),
- scroll = dojo.withGlobal(win, "_docScroll", dojo);
-
- var cs = dojo.getComputedStyle(iframe),
- tp = dojo._toPixelValue,
- left = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingLeft)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderLeftWidth) : 0),
- top = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingTop)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderTopWidth) : 0);
-
- coords.x += ifc.x + left - scroll.x;
- coords.y += ifc.y + top - scroll.y;
- }
- }else{
- coords = dojo.position(target, true);
- coords.x += 10;
- coords.y += 10;
- }
-
- var self=this;
- var savedFocus = dijit.getFocus(this);
- function closeAndRestoreFocus(){
- // user has clicked on a menu or popup
- if(self.refocus){
- dijit.focus(savedFocus);
- }
- dijit.popup.close(self);
- }
- dijit.popup.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
- dijit.popup.close(this);
- // don't try to restore focus; user has clicked another part of the screen
- // and set focus there
- };
- },
-
- uninitialize: function(){
- dojo.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this);
- this.inherited(arguments);
- }
-}
-);
-
-}
+//>>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
diff --git a/lib/dijit/Menu.js.uncompressed.js b/lib/dijit/Menu.js.uncompressed.js
new file mode 100644
index 000000000..d8d78bd76
--- /dev/null
+++ b/lib/dijit/Menu.js.uncompressed.js
@@ -0,0 +1,321 @@
+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/_base/kernel",
+ "dojo/keys", // keys.F10
+ "dojo/_base/lang", // lang.hitch
+ "dojo/on",
+ "dojo/_base/sniff", // has("ie"), has("quirks")
+ "dojo/_base/window", // win.body win.doc.documentElement win.doc.frames win.withGlobal
+ "dojo/window", // winUtils.get
+ "./popup",
+ "./DropDownMenu",
+ "dojo/ready"
+], function(require, array, declare, event, dom, domAttr, domGeometry, domStyle, kernel, keys, lang, on,
+ has, win, winUtils, pm, DropDownMenu, ready){
+
+/*=====
+ var DropDownMenu = dijit.DropDownMenu;
+=====*/
+
+// module:
+// dijit/Menu
+// summary:
+// Includes dijit.Menu widget and base class dijit._MenuBase
+
+// Back compat w/1.6, remove for 2.0
+if(!kernel.isAsync){
+ 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(){
+ 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: [],
+
+ // 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(win.body());
+ }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);
+
+ 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.withGlobal(window, win.body);
+ }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() ? win.doc.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){
+ return [
+ // TODO: when leftClickToOpen is true then shouldn't space/enter key trigger the menu,
+ // rather than shift-F10?
+ on(cn, this.leftClickToOpen ? "click" : "contextmenu", lang.hitch(this, function(evt){
+ // Schedule context menu to be opened unless it's already been scheduled from onkeydown handler
+ event.stop(evt);
+ this._scheduleOpen(evt.target, iframe, {x: evt.pageX, y: evt.pageY});
+ })),
+ on(cn, "keydown", lang.hitch(this, function(evt){
+ if(evt.shiftKey && evt.keyCode == keys.F10){
+ event.stop(evt);
+ this._scheduleOpen(evt.target, 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.withGlobal(window, win.body);
+ 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);
+ }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 = setTimeout(lang.hitch(this, 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;
+
+ // 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 = win.withGlobal(window, "_docScroll", dojo);
+
+ 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
+ };
+ },
+
+ uninitialize: 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 06d236b66..b6a1dfebe 100644
--- a/lib/dijit/MenuBar.js
+++ b/lib/dijit/MenuBar.js
@@ -1,77 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.MenuBar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuBar"] = true;
-dojo.provide("dijit.MenuBar");
-dojo.require("dijit.Menu");
-
-
-dojo.declare("dijit.MenuBar", dijit._MenuBase, {
- // summary:
- // A menu bar, listing menu choices horizontally, like the "File" menu in most desktop applications
-
- templateString: dojo.cache("dijit", "templates/MenuBar.html", "<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\" role=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n"),
-
- baseClass: "dijitMenuBar",
-
- // _isMenuBar: [protected] Boolean
- // This is a MenuBar widget, not a (vertical) Menu widget.
- _isMenuBar: true,
-
- postCreate: function(){
- var k = dojo.keys, l = this.isLeftToRight();
- this.connectKeyNavHandlers(
- l ? [k.LEFT_ARROW] : [k.RIGHT_ARROW],
- l ? [k.RIGHT_ARROW] : [k.LEFT_ARROW]
- );
-
- // parameter to dijit.popup.open() about where to put popup (relative to this.domNode)
- this._orient = this.isLeftToRight() ? {BL: 'TL'} : {BR: 'TR'};
- },
-
- 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(); // 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 dojo.keys.DOWN_ARROW:
- this._moveToPopup(evt);
- dojo.stopEvent(evt);
- }
- },
-
- onItemClick: function(/*dijit._Widget*/ item, /*Event*/ evt){
- // summary:
- // Handle clicks on an item. Cancels a dropdown if already open.
- // tags:
- // private
- if(item.popup && item.popup.isShowingNow){
- item.popup.onCancel();
- }else{
- this.inherited(arguments);
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/MenuBar.js.uncompressed.js b/lib/dijit/MenuBar.js.uncompressed.js
new file mode 100644
index 000000000..b271b214a
--- /dev/null
+++ b/lib/dijit/MenuBar.js.uncompressed.js
@@ -0,0 +1,83 @@
+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){
+
+/*=====
+ var _MenuBase = dijit._MenuBase;
+=====*/
+
+// module:
+// dijit/MenuBar
+// summary:
+// A menu bar, listing menu choices horizontally, like the "File" menu in most desktop applications
+
+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(){
+ 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"];
+ },
+
+ 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(); // 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._Widget*/ item, /*Event*/ evt){
+ // summary:
+ // Handle clicks on an item. Cancels a dropdown if already open.
+ // tags:
+ // private
+ if(item.popup && item.popup.isShowingNow){
+ item.popup.onCancel();
+ }else{
+ this.inherited(arguments);
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/MenuBarItem.js b/lib/dijit/MenuBarItem.js
index 2c7372dcd..27038e623 100644
--- a/lib/dijit/MenuBarItem.js
+++ b/lib/dijit/MenuBarItem.js
@@ -1,29 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.MenuBarItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuBarItem"] = true;
-dojo.provide("dijit.MenuBarItem");
-dojo.require("dijit.MenuItem");
-
-
-dojo.declare("dijit._MenuBarItemMixin", null, {
- templateString: dojo.cache("dijit", "templates/MenuBarItem.html", "<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n"),
-
- // overriding attributeMap because we don't have icon
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- label: { node: "containerNode", type: "innerHTML" }
- })
-});
-
-dojo.declare("dijit.MenuBarItem", [dijit.MenuItem, dijit._MenuBarItemMixin], {
- // summary:
- // Item in a MenuBar that's clickable, and doesn't spawn a submenu when pressed (or hovered)
-
-});
-
-}
+//>>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
diff --git a/lib/dijit/MenuBarItem.js.uncompressed.js b/lib/dijit/MenuBarItem.js.uncompressed.js
new file mode 100644
index 000000000..1369cf381
--- /dev/null
+++ b/lib/dijit/MenuBarItem.js.uncompressed.js
@@ -0,0 +1,35 @@
+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", // declare
+ "./MenuItem",
+ "dojo/text!./templates/MenuBarItem.html"
+], function(declare, MenuItem, template){
+
+/*=====
+ var MenuItem = dijit.MenuItem;
+=====*/
+
+ // module:
+ // dijit/MenuBarItem
+ // summary:
+ // Item in a MenuBar that's clickable, and doesn't spawn a submenu when pressed (or hovered)
+
+
+ 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 966b2b46b..d68ed0557 100644
--- a/lib/dijit/MenuItem.js
+++ b/lib/dijit/MenuItem.js
@@ -1,200 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.MenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuItem"] = true;
-dojo.provide("dijit.MenuItem");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._Contained");
-dojo.require("dijit._CssStateMixin");
-
-
-dojo.declare("dijit.MenuItem",
- [dijit._Widget, dijit._Templated, dijit._Contained, dijit._CssStateMixin],
- {
- // summary:
- // A line item in a Menu Widget
-
- // Make 3 columns
- // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
- templateString: dojo.cache("dijit", "templates/MenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div dojoAttachPoint=\"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"),
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- label: { node: "containerNode", type: "innerHTML" },
- iconClass: { node: "iconNode", type: "class" }
- }),
-
- baseClass: "dijitMenuItem",
-
- // label: String
- // Menu text
- label: '',
-
- // iconClass: String
- // Class to apply to DOMNode to make it display an icon.
- iconClass: "",
-
- // 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";
- dojo.attr(this.containerNode, "id", label);
- if(this.accelKeyNode){
- dojo.attr(this.accelKeyNode, "id", this.id + "_accel");
- label += " " + this.id + "_accel";
- }
- dijit.setWaiState(this.domNode, "labelledby", label);
- dojo.setSelectable(this.domNode, false);
- },
-
- _onHover: function(){
- // summary:
- // Handler when mouse is moved onto menu item
- // tags:
- // protected
- this.getParent().onItemHover(this);
- },
-
- _onUnhover: function(){
- // summary:
- // Handler when mouse is moved off of menu item,
- // possibly to a child menu, or maybe to a sibling
- // menuitem or somewhere else entirely.
- // tags:
- // protected
-
- // if we are unhovering the currently selected item
- // then unselect it
- this.getParent().onItemUnhover(this);
-
- // When menu is hidden (collapsed) due to clicking a MenuItem and having it execute,
- // FF and IE don't generate an onmouseout event for the MenuItem.
- // So, help out _CssStateMixin in this case.
- this._set("hovering", false);
- },
-
- _onClick: function(evt){
- // summary:
- // Internal handler for click events on MenuItem.
- // tags:
- // private
- this.getParent().onItemClick(this, evt);
- dojo.stopEvent(evt);
- },
-
- onClick: function(/*Event*/ evt){
- // summary:
- // User defined function to handle clicks
- // tags:
- // callback
- },
-
- focus: function(){
- // summary:
- // Focus on this MenuItem
- try{
- if(dojo.isIE == 8){
- // needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275)
- this.containerNode.focus();
- }
- dijit.focus(this.focusNode);
- }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()
- */
-
- dojo.toggleClass(this.domNode, "dijitMenuItemSelected", selected);
- },
-
- setLabel: function(/*String*/ content){
- // summary:
- // Deprecated. Use set('label', ...) instead.
- // tags:
- // deprecated
- dojo.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
- dojo.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.
-
- dijit.setWaiState(this.focusNode, '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
- dojo.attr(this.containerNode,'colSpan',value?"1":"2");
-
- this._set("accelKey", value);
- }
- });
-
-}
+//>>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
diff --git a/lib/dijit/MenuItem.js.uncompressed.js b/lib/dijit/MenuItem.js.uncompressed.js
new file mode 100644
index 000000000..c167d75ab
--- /dev/null
+++ b/lib/dijit/MenuItem.js.uncompressed.js
@@ -0,0 +1,211 @@
+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", // declare
+ "dojo/dom", // dom.setSelectable
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.toggle
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/sniff", // has("ie")
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_Contained",
+ "./_CssStateMixin",
+ "dojo/text!./templates/MenuItem.html"
+], function(declare, dom, domAttr, domClass, event, kernel, has,
+ _Widget, _TemplatedMixin, _Contained, _CssStateMixin, template){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _Contained = dijit._Contained;
+ var _CssStateMixin = dijit._CssStateMixin;
+=====*/
+
+ // module:
+ // dijit/MenuItem
+ // summary:
+ // A line item in a Menu Widget
+
+
+ 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: { node: "containerNode", type: "innerHTML" },
+
+ // 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);
+ },
+
+ _onHover: function(){
+ // summary:
+ // Handler when mouse is moved onto menu item
+ // tags:
+ // protected
+ this.getParent().onItemHover(this);
+ },
+
+ _onUnhover: function(){
+ // summary:
+ // Handler when mouse is moved off of menu item,
+ // possibly to a child menu, or maybe to a sibling
+ // menuitem or somewhere else entirely.
+ // tags:
+ // protected
+
+ // if we are unhovering the currently selected item
+ // then unselect it
+ this.getParent().onItemUnhover(this);
+
+ // When menu is hidden (collapsed) due to clicking a MenuItem and having it execute,
+ // FF and IE don't generate an onmouseout event for the MenuItem.
+ // So, help out _CssStateMixin in this case.
+ this._set("hovering", false);
+ },
+
+ _onClick: function(evt){
+ // summary:
+ // Internal handler for click events on MenuItem.
+ // tags:
+ // private
+ this.getParent().onItemClick(this, evt);
+ event.stop(evt);
+ },
+
+ 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);
+ }
+ });
+});
diff --git a/lib/dijit/MenuSeparator.js b/lib/dijit/MenuSeparator.js
index e532d9320..45814a088 100644
--- a/lib/dijit/MenuSeparator.js
+++ b/lib/dijit/MenuSeparator.js
@@ -1,39 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.MenuSeparator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuSeparator"] = true;
-dojo.provide("dijit.MenuSeparator");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._Contained");
-
-
-dojo.declare("dijit.MenuSeparator",
- [dijit._Widget, dijit._Templated, dijit._Contained],
- {
- // summary:
- // A line between two menu items
-
- templateString: dojo.cache("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>\n"),
-
- buildRendering: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
- },
-
- isFocusable: function(){
- // summary:
- // Override to always return false
- // tags:
- // protected
-
- return false; // Boolean
- }
- });
-
-}
+//>>built
+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","dojo/dom","./_WidgetBase","./_TemplatedMixin","./_Contained","dojo/text!./templates/MenuSeparator.html"],function(_1,_2,_3,_4,_5,_6){return _1("dijit.MenuSeparator",[_3,_4,_5],{templateString:_6,buildRendering:function(){this.inherited(arguments);_2.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}); \ No newline at end of file
diff --git a/lib/dijit/MenuSeparator.js.uncompressed.js b/lib/dijit/MenuSeparator.js.uncompressed.js
new file mode 100644
index 000000000..f2f68bff9
--- /dev/null
+++ b/lib/dijit/MenuSeparator.js.uncompressed.js
@@ -0,0 +1,43 @@
+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){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _Contained = dijit._Contained;
+=====*/
+
+ // module:
+ // dijit/MenuSeparator
+ // summary:
+ // A line between two menu items
+
+ 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 b/lib/dijit/PopupMenuBarItem.js
index 38a5edd9b..6c31d0142 100644
--- a/lib/dijit/PopupMenuBarItem.js
+++ b/lib/dijit/PopupMenuBarItem.js
@@ -1,20 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.PopupMenuBarItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.PopupMenuBarItem"] = true;
-dojo.provide("dijit.PopupMenuBarItem");
-dojo.require("dijit.PopupMenuItem");
-dojo.require("dijit.MenuBarItem");
-
-
-dojo.declare("dijit.PopupMenuBarItem", [dijit.PopupMenuItem, dijit._MenuBarItemMixin], {
- // summary:
- // Item in a MenuBar like "File" or "Edit", that spawns a submenu when pressed (or hovered)
-});
-
-}
+//>>built
+define("dijit/PopupMenuBarItem",["dojo/_base/declare","./PopupMenuItem","./MenuBarItem"],function(_1,_2,_3){var _4=_3._MenuBarItemMixin;return _1("dijit.PopupMenuBarItem",[_2,_4],{});}); \ No newline at end of file
diff --git a/lib/dijit/PopupMenuBarItem.js.uncompressed.js b/lib/dijit/PopupMenuBarItem.js.uncompressed.js
new file mode 100644
index 000000000..e5edbd066
--- /dev/null
+++ b/lib/dijit/PopupMenuBarItem.js.uncompressed.js
@@ -0,0 +1,23 @@
+define("dijit/PopupMenuBarItem", [
+ "dojo/_base/declare", // declare
+ "./PopupMenuItem",
+ "./MenuBarItem"
+], function(declare, PopupMenuItem, MenuBarItem){
+
+ // module:
+ // dijit/PopupMenuBarItem
+ // summary:
+ // Item in a MenuBar like "File" or "Edit", that spawns a submenu when pressed (or hovered)
+
+ var _MenuBarItemMixin = MenuBarItem._MenuBarItemMixin;
+
+/*=====
+ var PopupMenuItem = dijit.PopupMenuItem;
+ var _MenuBarItemMixin = dijit._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 da44a23f7..296da1a2e 100644
--- a/lib/dijit/PopupMenuItem.js
+++ b/lib/dijit/PopupMenuItem.js
@@ -1,74 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.PopupMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.PopupMenuItem"] = true;
-dojo.provide("dijit.PopupMenuItem");
-dojo.require("dijit.MenuItem");
-
-
-dojo.declare("dijit.PopupMenuItem",
- dijit.MenuItem,
- {
- _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 dojoType="dijit.PopupMenuItem">
- // | <span>pick me</span>
- // | <popup> ... </popup>
- // | </div>
- // tags:
- // protected
-
- if(this.srcNodeRef){
- var nodes = dojo.query("*", this.srcNodeRef);
- dijit.PopupMenuItem.superclass._fillContent.call(this, 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 dojo.doc.body.
- if(!this.popup){
- var node = dojo.query("[widgetId]", this.dropDownContainer)[0];
- this.popup = dijit.byNode(node);
- }
- dojo.body().appendChild(this.popup.domNode);
- this.popup.startup();
-
- this.popup.domNode.style.display="none";
- if(this.arrowWrapper){
- dojo.style(this.arrowWrapper, "visibility", "");
- }
- dijit.setWaiState(this.focusNode, "haspopup", "true");
- },
-
- destroyDescendants: function(){
- 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();
- }
- delete this.popup;
- }
- this.inherited(arguments);
- }
- });
-
-}
+//>>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
diff --git a/lib/dijit/PopupMenuItem.js.uncompressed.js b/lib/dijit/PopupMenuItem.js.uncompressed.js
new file mode 100644
index 000000000..201574225
--- /dev/null
+++ b/lib/dijit/PopupMenuItem.js.uncompressed.js
@@ -0,0 +1,80 @@
+define("dijit/PopupMenuItem", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-style", // domStyle.set
+ "dojo/query", // query
+ "dojo/_base/window", // win.body
+ "./registry", // registry.byNode
+ "./MenuItem",
+ "./hccss"
+], function(declare, domStyle, query, win, registry, MenuItem){
+
+/*=====
+ var MenuItem = dijit.MenuItem;
+=====*/
+
+ // module:
+ // dijit/PopupMenuItem
+ // summary:
+ // An item in a Menu that spawn a drop down (usually a drop down menu)
+
+ 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);
+ }
+ win.body().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 3b4532060..ff60e1da1 100644
--- a/lib/dijit/ProgressBar.js
+++ b/lib/dijit/ProgressBar.js
@@ -1,168 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.ProgressBar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.ProgressBar"] = true;
-dojo.provide("dijit.ProgressBar");
-dojo.require("dojo.fx");
-dojo.require("dojo.number");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-
-
-dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
- // summary:
- // A progress indication widget, showing the amount completed
- // (often the percentage completed) of a task.
- //
- // example:
- // | <div dojoType="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: dojo.cache("dijit", "templates/ProgressBar.html", "<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\" role=\"presentation\"></div\n\t\t><span style=\"visibility:hidden\">&nbsp;</span\n\t></div\n\t><div dojoAttachPoint=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"),
-
- // _indeterminateHighContrastImagePath: [private] dojo._URL
- // URL to image to use for indeterminate progress bar when display is in high contrast mode
- _indeterminateHighContrastImagePath:
- dojo.moduleUrl("dijit", "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(/*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
-
- dojo.mixin(this, attributes || {});
- var tip = this.internalProgress, ap = this.domNode;
- var percent = 1;
- if(this.indeterminate){
- dijit.removeWaiState(ap, "valuenow");
- dijit.removeWaiState(ap, "valuemin");
- dijit.removeWaiState(ap, "valuemax");
- }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.progress / this.maximum;
- }
-
- dijit.setWaiState(ap, "describedby", this.labelNode.id);
- dijit.setWaiState(ap, "valuenow", this.progress);
- dijit.setWaiState(ap, "valuemin", 0);
- dijit.setWaiState(ap, "valuemax", this.maximum);
- }
- this.labelNode.innerHTML = this.report(percent);
-
- dojo.toggleClass(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 ? "&nbsp;" : dojo.number.format(percent, { type: "percent", places: this.places, locale: this.lang }));
- },
-
- onChange: function(){
- // summary:
- // Callback fired when progress updates.
- // tags:
- // extension
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/ProgressBar.js.uncompressed.js b/lib/dijit/ProgressBar.js.uncompressed.js
new file mode 100644
index 000000000..70b31f0b6
--- /dev/null
+++ b/lib/dijit/ProgressBar.js.uncompressed.js
@@ -0,0 +1,177 @@
+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){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+// module:
+// dijit/ProgressBar
+// summary:
+// A progress indication widget, showing the amount completed
+// (often the percentage completed) of a task.
+
+
+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);
+ 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(/*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");
+ ap.removeAttribute("aria-valuemin");
+ ap.removeAttribute("aria-valuemax");
+ }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-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(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 c29ac02f2..917af039d 100644
--- a/lib/dijit/TitlePane.js
+++ b/lib/dijit/TitlePane.js
@@ -1,257 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.TitlePane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.TitlePane"] = true;
-dojo.provide("dijit.TitlePane");
-dojo.require("dojo.fx");
-dojo.require("dijit._Templated");
-dojo.require("dijit.layout.ContentPane");
-dojo.require("dijit._CssStateMixin");
-
-
-dojo.declare(
- "dijit.TitlePane",
- [dijit.layout.ContentPane, dijit._Templated, dijit._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 dojoType="dijit.TitlePane" href="foobar.html" title="Title"></div>
- //
- // example:
- // | <!-- markup with inline data -->
- // | <div dojoType="dijit.TitlePane" title="Title">
- // | <p>I am content</p>
- // | </div>
-
- // title: String
- // Title of the pane
- title: "",
-
- // 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: dijit.defaultDuration,
-
- // baseClass: [protected] String
- // The root className to be placed on this widget's domNode.
- baseClass: "dijitTitlePane",
-
- templateString: dojo.cache("dijit", "templates/TitlePane.html", "<div>\n\t<div dojoAttachEvent=\"onclick:_onTitleClick, onkeypress:_onTitleKey\"\n\t\t\tclass=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode\">\n\t\t<div class=\"dijitTitlePaneTitleFocus\" dojoAttachPoint=\"focusNode\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"arrowNode\" class=\"dijitArrowNode\" role=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"arrowNodeInner\" class=\"dijitArrowNodeInner\"></span\n\t\t\t><span dojoAttachPoint=\"titleNode\" class=\"dijitTitlePaneTextNode\"></span>\n\t\t</div>\n\t</div>\n\t<div class=\"dijitTitlePaneContentOuter\" dojoAttachPoint=\"hideNode\" role=\"presentation\">\n\t\t<div class=\"dijitReset\" dojoAttachPoint=\"wipeNode\" role=\"presentation\">\n\t\t\t<div class=\"dijitTitlePaneContentInner\" dojoAttachPoint=\"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"),
-
- attributeMap: dojo.delegate(dijit.layout.ContentPane.prototype.attributeMap, {
- title: { node: "titleNode", type: "innerHTML" },
- tooltip: {node: "focusNode", type: "attribute", attribute: "title"}, // focusNode spans the entire width, titleNode doesn't
- id:""
- }),
-
- buildRendering: function(){
- this.inherited(arguments);
- dojo.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 = dojo.fx.wipeIn({
- node: this.wipeNode,
- duration: this.duration,
- beforeBegin: function(){
- hideNode.style.display="";
- }
- });
- this._wipeOut = dojo.fx.wipeOut({
- node: this.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.
-
- dojo.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.arrowNodeInner.innerHTML = open ? "-" : "+";
-
- dijit.setWaiState(this.containerNode,"hidden", open ? "false" : "true");
- dijit.setWaiState(this.focusNode, "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.
-
- dijit.setWaiRole(this.focusNode, canToggle ? "button" : "heading");
- if(canToggle){
- // TODO: if canToggle is switched from true to false shouldn't we remove this setting?
- dijit.setWaiState(this.focusNode, "controls", this.id+"_pane");
- dojo.attr(this.focusNode, "tabIndex", this.tabIndex);
- }else{
- dojo.removeAttr(this.focusNode, "tabIndex");
- }
-
- 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
- dojo.marginBox(this.wipeNode, { h: dojo.marginBox(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");
- dojo.replaceClass(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.charOrCode == dojo.keys.ENTER || e.charOrCode == ' '){
- if(this.toggleable){
- this.toggle();
- }
- dojo.stopEvent(e);
- }else if(e.charOrCode == dojo.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
- dojo.deprecated("dijit.TitlePane.setTitle() is deprecated. Use set('title', ...) instead.", "", "2.0");
- this.set("title", title);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/TitlePane.js.uncompressed.js b/lib/dijit/TitlePane.js.uncompressed.js
new file mode 100644
index 000000000..1f3630c21
--- /dev/null
+++ b/lib/dijit/TitlePane.js.uncompressed.js
@@ -0,0 +1,277 @@
+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", // 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){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _CssStateMixin = dijit._CssStateMixin;
+ var ContentPane = dijit.layout.ContentPane;
+=====*/
+
+// module:
+// dijit/TitlePane
+// summary:
+// A pane with a title on top, that can be expanded or collapsed.
+
+
+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.arrowNodeInner.innerHTML = open ? "-" : "+";
+
+ 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){
+ // TODO: if canToggle is switched from true to false shouldn't we remove this setting?
+ this.focusNode.setAttribute("aria-controls", this.id+"_pane");
+ domAttr.set(this.focusNode, "tabIndex", this.tabIndex);
+ }else{
+ domAttr.remove(this.focusNode, "tabIndex");
+ }
+
+ 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.charOrCode == keys.ENTER || e.charOrCode == ' '){
+ if(this.toggleable){
+ this.toggle();
+ }
+ event.stop(e);
+ }else if(e.charOrCode == 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 94184f989..e0904f0a2 100644
--- a/lib/dijit/Toolbar.js
+++ b/lib/dijit/Toolbar.js
@@ -1,53 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Toolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Toolbar"] = true;
-dojo.provide("dijit.Toolbar");
-dojo.require("dijit._Widget");
-dojo.require("dijit._KeyNavContainer");
-dojo.require("dijit._Templated");
-dojo.require("dijit.ToolbarSeparator");
-
-
-// Note: require of ToolbarSeparator is for back-compat, remove for 2.0
-
-dojo.declare("dijit.Toolbar",
- [dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
- {
- // summary:
- // A Toolbar widget, used to hold things like `dijit.Editor` buttons
-
- templateString:
- '<div class="dijit" role="toolbar" tabIndex="${tabIndex}" dojoAttachPoint="containerNode">' +
- // '<table style="table-layout: fixed" class="dijitReset dijitToolbarTable">' + // factor out style
- // '<tr class="dijitReset" dojoAttachPoint="containerNode"></tr>'+
- // '</table>' +
- '</div>',
-
- baseClass: "dijitToolbar",
-
- postCreate: function(){
- this.inherited(arguments);
-
- this.connectKeyNavHandlers(
- this.isLeftToRight() ? [dojo.keys.LEFT_ARROW] : [dojo.keys.RIGHT_ARROW],
- this.isLeftToRight() ? [dojo.keys.RIGHT_ARROW] : [dojo.keys.LEFT_ARROW]
- );
- },
-
- startup: function(){
- if(this._started){ return; }
-
- this.startupKeyNavChildren();
-
- this.inherited(arguments);
- }
-}
-);
-
-}
+//>>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
diff --git a/lib/dijit/Toolbar.js.uncompressed.js b/lib/dijit/Toolbar.js.uncompressed.js
new file mode 100644
index 000000000..d70e61de4
--- /dev/null
+++ b/lib/dijit/Toolbar.js.uncompressed.js
@@ -0,0 +1,51 @@
+define("dijit/Toolbar", [
+ "require",
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel",
+ "dojo/keys", // keys.LEFT_ARROW keys.RIGHT_ARROW
+ "dojo/ready",
+ "./_Widget",
+ "./_KeyNavContainer",
+ "./_TemplatedMixin"
+], function(require, declare, kernel, keys, ready, _Widget, _KeyNavContainer, _TemplatedMixin){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _KeyNavContainer = dijit._KeyNavContainer;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/Toolbar
+ // summary:
+ // A Toolbar widget, used to hold things like `dijit.Editor` buttons
+
+
+ // Back compat w/1.6, remove for 2.0
+ if(!kernel.isAsync){
+ 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 b/lib/dijit/ToolbarSeparator.js
index 39a29d50b..205a87bce 100644
--- a/lib/dijit/ToolbarSeparator.js
+++ b/lib/dijit/ToolbarSeparator.js
@@ -1,35 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.ToolbarSeparator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.ToolbarSeparator"] = true;
-dojo.provide("dijit.ToolbarSeparator");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-
-
-dojo.declare("dijit.ToolbarSeparator",
- [ dijit._Widget, dijit._Templated ],
- {
- // summary:
- // A spacer between two `dijit.Toolbar` items
- templateString: '<div class="dijitToolbarSeparator dijitInline" role="presentation"></div>',
- buildRendering: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.domNode, false);
- },
- isFocusable: function(){
- // summary:
- // This widget isn't focusable, so pass along that fact.
- // tags:
- // protected
- return false;
- }
-
- });
-
-}
+//>>built
+define("dijit/ToolbarSeparator",["dojo/_base/declare","dojo/dom","./_Widget","./_TemplatedMixin"],function(_1,_2,_3,_4){return _1("dijit.ToolbarSeparator",[_3,_4],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\" role=\"presentation\"></div>",buildRendering:function(){this.inherited(arguments);_2.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}); \ No newline at end of file
diff --git a/lib/dijit/ToolbarSeparator.js.uncompressed.js b/lib/dijit/ToolbarSeparator.js.uncompressed.js
new file mode 100644
index 000000000..1b67d30c2
--- /dev/null
+++ b/lib/dijit/ToolbarSeparator.js.uncompressed.js
@@ -0,0 +1,38 @@
+define("dijit/ToolbarSeparator", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.setSelectable
+ "./_Widget",
+ "./_TemplatedMixin"
+], function(declare, dom, _Widget, _TemplatedMixin){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/ToolbarSeparator
+ // summary:
+ // A spacer between two `dijit.Toolbar` items
+
+
+ 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 46b3a3805..94a8d1c15 100644
--- a/lib/dijit/Tooltip.js
+++ b/lib/dijit/Tooltip.js
@@ -1,440 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Tooltip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Tooltip"] = true;
-dojo.provide("dijit.Tooltip");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-
-
-dojo.declare(
- "dijit._MasterTooltip",
- [dijit._Widget, dijit._Templated],
- {
- // 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: dijit.defaultDuration,
-
- templateString: dojo.cache("dijit", "templates/Tooltip.html", "<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" dojoAttachPoint=\"connectorNode\"></div\n></div>\n"),
-
- postCreate: function(){
- dojo.body().appendChild(this.domNode);
-
- this.bgIframe = new dijit.BackgroundIframe(this.domNode);
-
- // Setup fade-in and fade-out functions.
- this.fadeIn = dojo.fadeIn({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onShow") });
- this.fadeOut = dojo.fadeOut({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onHide") });
- },
-
- show: function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position, /*Boolean*/ rtl){
- // 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)
-
- if(this.aroundNode && this.aroundNode === aroundNode){
- return;
- }
-
- // reset width; it may have been set by orient() on a previous tooltip show()
- this.domNode.width = "auto";
-
- 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;
-
- var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, dijit.getPopupAroundAlignment((position && position.length) ? position : dijit.Tooltip.defaultPosition, !rtl), dojo.hitch(this, "orient"));
-
- // show it
- dojo.style(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
-
- //Adjust the spaceAvailable width, without changing the spaceAvailable object
- var tooltipSpaceAvaliableWidth = spaceAvailable.w - this.connectorNode.offsetWidth;
-
- node.className = "dijitTooltip " +
- {
- "BL-TL": "dijitTooltipBelow dijitTooltipABLeft",
- "TL-BL": "dijitTooltipAbove dijitTooltipABLeft",
- "BR-TR": "dijitTooltipBelow dijitTooltipABRight",
- "TR-BR": "dijitTooltipAbove dijitTooltipABRight",
- "BR-BL": "dijitTooltipRight",
- "BL-BR": "dijitTooltipLeft"
- }[aroundCorner + "-" + tooltipCorner];
-
- // reduce tooltip's width to the amount of width available, so that it doesn't overflow screen
- this.domNode.style.width = "auto";
- var size = dojo.contentBox(this.domNode);
-
- var width = Math.min((Math.max(tooltipSpaceAvaliableWidth,1)), size.w);
- var widthWasReduced = width < size.w;
-
- this.domNode.style.width = width+"px";
-
- //Adjust width for tooltips that have a really long word or a nowrap setting
- if(widthWasReduced){
- this.containerNode.style.overflow = "auto"; //temp change to overflow to detect if our tooltip needs to be wider to support the content
- var scrollWidth = this.containerNode.scrollWidth;
- this.containerNode.style.overflow = "visible"; //change it back
- if(scrollWidth > width){
- scrollWidth = scrollWidth + dojo.style(this.domNode,"paddingLeft") + dojo.style(this.domNode,"paddingRight");
- this.domNode.style.width = scrollWidth + "px";
- }
- }
-
- // Reposition the tooltip connector.
- if(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){
- var mb = dojo.marginBox(node);
- var tooltipConnectorHeight = this.connectorNode.offsetHeight;
- if(mb.h > spaceAvailable.h){
- // The tooltip starts at the top of the page and will extend past the aroundNode
- var aroundNodePlacement = spaceAvailable.h - (aroundNodeCoords.h / 2) - (tooltipConnectorHeight / 2);
- 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),
- mb.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 - tooltipSpaceAvaliableWidth);
- },
-
- _onShow: function(){
- // summary:
- // Called at end of fade-in operation
- // tags:
- // protected
- if(dojo.isIE){
- // 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;
- }
- }
-
- }
-);
-
-dijit.showTooltip = function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position, /*Boolean*/ rtl){
- // summary:
- // 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.
- if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
- return dijit._masterTT.show(innerHTML, aroundNode, position, rtl);
-};
-
-dijit.hideTooltip = function(aroundNode){
- // summary:
- // Hide the tooltip
- if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); }
- return dijit._masterTT.hide(aroundNode);
-};
-
-dojo.declare(
- "dijit.Tooltip",
- dijit._Widget,
- {
- // summary:
- // Pops up a tooltip (a help message) when you hover over a node.
-
- // 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[]
- // Id of domNode(s) to attach the tooltip to.
- // When user hovers over specified dom node, the tooltip will appear.
- connectId: [],
-
- // position: String[]
- // See description of `dijit.Tooltip.defaultPosition` for details on position parameter.
- position: [],
-
- _setConnectIdAttr: function(/*String*/ newId){
- // summary:
- // Connect to node(s) (specified by id)
-
- // Remove connections to old nodes (if there are any)
- dojo.forEach(this._connections || [], function(nested){
- dojo.forEach(nested, dojo.hitch(this, "disconnect"));
- }, this);
-
- // Make connections to nodes in newIds.
- var ary = dojo.isArrayLike(newId) ? newId : (newId ? [newId] : []);
- this._connections = dojo.map(ary, function(id){
- var node = dojo.byId(id);
- return node ? [
- this.connect(node, "onmouseenter", "_onTargetMouseEnter"),
- this.connect(node, "onmouseleave", "_onTargetMouseLeave"),
- this.connect(node, "onfocus", "_onTargetFocus"),
- this.connect(node, "onblur", "_onTargetBlur")
- ] : [];
- }, this);
-
- this._set("connectId", newId);
-
- this._connectIds = ary; // save as array
- },
-
- addTarget: function(/*DOMNODE || 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(dojo.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 = dojo.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);
- dojo.addClass(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;
- dojo.forEach(dojo.isArrayLike(ids) ? ids : [ids], this.addTarget, this);
- },
-
- _onTargetMouseEnter: function(/*Event*/ e){
- // summary:
- // Handler for mouseenter event on the target node
- // tags:
- // private
- this._onHover(e);
- },
-
- _onTargetMouseLeave: function(/*Event*/ e){
- // summary:
- // Handler for mouseleave event on the target node
- // tags:
- // private
- this._onUnHover(e);
- },
-
- _onTargetFocus: function(/*Event*/ e){
- // summary:
- // Handler for focus event on the target node
- // tags:
- // private
-
- this._focus = true;
- this._onHover(e);
- },
-
- _onTargetBlur: function(/*Event*/ e){
- // summary:
- // Handler for blur event on the target node
- // tags:
- // private
-
- this._focus = false;
- this._onUnHover(e);
- },
-
- _onHover: function(/*Event*/ e){
- // 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){
- var target = e.target;
- this._showTimer = setTimeout(dojo.hitch(this, function(){this.open(target)}), this.showDelay);
- }
- },
-
- _onUnHover: function(/*Event*/ e){
- // summary:
- // Despite the name of this method, it actually handles both mouseleave and blur
- // events on the target node, hiding the tooltip.
- // tags:
- // private
-
- // keep a tooltip open if the associated element still has focus (even though the
- // mouse moved away)
- if(this._focus){ return; }
-
- if(this._showTimer){
- clearTimeout(this._showTimer);
- delete this._showTimer;
- }
- this.close();
- },
-
- open: function(/*DomNode*/ target){
- // summary:
- // Display the tooltip; usually not called directly.
- // tags:
- // private
-
- if(this._showTimer){
- clearTimeout(this._showTimer);
- delete this._showTimer;
- }
- dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position, !this.isLeftToRight());
-
- this._connectNode = target;
- 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
- dijit.hideTooltip(this._connectNode);
- delete this._connectNode;
- this.onHide();
- }
- if(this._showTimer){
- // if tooltip is scheduled to be shown (after a brief delay)
- clearTimeout(this._showTimer);
- 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
- },
-
- uninitialize: function(){
- this.close();
- this.inherited(arguments);
- }
- }
-);
-
-// dijit.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 following values:
-//
-// * before: places tooltip to the left of the target node/widget, or to the right in
-// the case of RTL scripts like Hebrew and Arabic
-// * after: places tooltip to the right of the target node/widget, or to the left in
-// the case of RTL scripts like Hebrew and Arabic
-// * above: tooltip goes above target node
-// * below: tooltip goes below target 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" 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.
-dijit.Tooltip.defaultPosition = ["after", "before"];
-
-}
+//>>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
diff --git a/lib/dijit/Tooltip.js.uncompressed.js b/lib/dijit/Tooltip.js.uncompressed.js
new file mode 100644
index 000000000..2063f2a4b
--- /dev/null
+++ b/lib/dijit/Tooltip.js.uncompressed.js
@@ -0,0 +1,499 @@
+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.getMarginBox domGeometry.position
+ "dojo/dom-style", // domStyle.set, domStyle.get
+ "dojo/_base/lang", // lang.hitch lang.isArrayLike
+ "dojo/_base/sniff", // has("ie")
+ "dojo/_base/window", // win.body
+ "./_base/manager", // manager.defaultDuration
+ "./place",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./BackgroundIframe",
+ "dojo/text!./templates/Tooltip.html",
+ "." // sets dijit.showTooltip etc. for back-compat
+], function(array, declare, fx, dom, domClass, domGeometry, domStyle, lang, has, win,
+ manager, place, _Widget, _TemplatedMixin, BackgroundIframe, template, dijit){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var BackgroundIframe = dijit.BackgroundIframe;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/Tooltip
+ // summary:
+ // Defines dijit.Tooltip widget (to display a tooltip), showTooltip()/hideTooltip(), and _MasterTooltip
+
+
+ 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(){
+ win.body().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.__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;
+ }
+
+ // reset width; it may have been set by orient() on a previous tooltip show()
+ this.domNode.width = "auto";
+
+ 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;
+
+ 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";
+ }
+
+ // 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
+
+ //Adjust the spaceAvailable width, without changing the spaceAvailable object
+ var tooltipSpaceAvaliableWidth = spaceAvailable.w - this.connectorNode.offsetWidth;
+
+ 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];
+
+ // reduce tooltip's width to the amount of width available, so that it doesn't overflow screen
+ this.domNode.style.width = "auto";
+ var size = domGeometry.getContentBox(this.domNode);
+
+ var width = Math.min((Math.max(tooltipSpaceAvaliableWidth,1)), size.w);
+ var widthWasReduced = width < size.w;
+
+ this.domNode.style.width = width+"px";
+
+ //Adjust width for tooltips that have a really long word or a nowrap setting
+ if(widthWasReduced){
+ this.containerNode.style.overflow = "auto"; //temp change to overflow to detect if our tooltip needs to be wider to support the content
+ var scrollWidth = this.containerNode.scrollWidth;
+ this.containerNode.style.overflow = "visible"; //change it back
+ if(scrollWidth > width){
+ scrollWidth = scrollWidth + domStyle.get(this.domNode,"paddingLeft") + domStyle.get(this.domNode,"paddingRight");
+ this.domNode.style.width = scrollWidth + "px";
+ }
+ }
+
+ // Reposition the tooltip connector.
+ if(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){
+ var mb = domGeometry.getMarginBox(node);
+ var tooltipConnectorHeight = this.connectorNode.offsetHeight;
+ if(mb.h > spaceAvailable.h){
+ // The tooltip starts at the top of the page and will extend past the aroundNode
+ var aroundNodePlacement = spaceAvailable.h - ((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),
+ mb.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 - tooltipSpaceAvaliableWidth);
+ },
+
+ _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", typeof textDir != 'undefined'? 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: dijit.__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 they used to, so for back-compat convert them to after-centered, before-centered
+ 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.
+
+ // 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[]
+ // Id of domNode(s) to attach the tooltip to.
+ // When user hovers over specified dom node, the tooltip will appear.
+ connectId: [],
+
+ // position: String[]
+ // See description of `dijit.Tooltip.defaultPosition` for details on position parameter.
+ position: [],
+
+ _setConnectIdAttr: function(/*String|String[]*/ 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, lang.hitch(this, "disconnect"));
+ }, 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); });
+
+ // Make connections
+ this._connections = array.map(this._connectIds, function(id){
+ var node = dom.byId(id);
+ return [
+ this.connect(node, "onmouseenter", "_onHover"),
+ this.connect(node, "onmouseleave", "_onUnHover"),
+ this.connect(node, "onfocus", "_onHover"),
+ this.connect(node, "onblur", "_onUnHover")
+ ];
+ }, this);
+
+ this._set("connectId", newId);
+ },
+
+ addTarget: function(/*DOMNODE || 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);
+ },
+
+ _onHover: function(/*Event*/ e){
+ // 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){
+ var target = e.target;
+ this._showTimer = setTimeout(lang.hitch(this, function(){this.open(target)}), this.showDelay);
+ }
+ },
+
+ _onUnHover: function(/*Event*/ /*===== e =====*/){
+ // summary:
+ // Despite the name of this method, it actually handles both mouseleave and blur
+ // events on the target node, hiding the tooltip.
+ // tags:
+ // private
+
+ // keep a tooltip open if the associated element still has focus (even though the
+ // mouse moved away)
+ if(this._focus){ return; }
+
+ if(this._showTimer){
+ clearTimeout(this._showTimer);
+ delete this._showTimer;
+ }
+ this.close();
+ },
+
+ open: function(/*DomNode*/ target){
+ // summary:
+ // Display the tooltip; usually not called directly.
+ // tags:
+ // private
+
+ if(this._showTimer){
+ clearTimeout(this._showTimer);
+ delete this._showTimer;
+ }
+ Tooltip.show(this.label || this.domNode.innerHTML, target, this.position, !this.isLeftToRight(), this.textDir);
+
+ this._connectNode = target;
+ 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)
+ clearTimeout(this._showTimer);
+ 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
+ },
+
+ uninitialize: function(){
+ this.close();
+ 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
+
+ // dijit.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.
+ Tooltip.defaultPosition = ["after-centered", "before-centered"];
+
+
+ return Tooltip;
+});
diff --git a/lib/dijit/TooltipDialog.js b/lib/dijit/TooltipDialog.js
index 38d551048..df4d9893e 100644
--- a/lib/dijit/TooltipDialog.js
+++ b/lib/dijit/TooltipDialog.js
@@ -1,146 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.TooltipDialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.TooltipDialog"] = true;
-dojo.provide("dijit.TooltipDialog");
-dojo.require("dijit.layout.ContentPane");
-dojo.require("dijit._Templated");
-dojo.require("dijit.form._FormMixin");
-dojo.require("dijit._DialogMixin");
-
-
-dojo.declare(
- "dijit.TooltipDialog",
- [dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._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: dojo.cache("dijit", "templates/TooltipDialog.html", "<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\"></div>\n</div>\n"),
-
- _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*/ corner){
- // 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
- var newC = "dijitTooltipAB" + (corner.charAt(1) == 'L' ? "Left" : "Right")
- + " dijitTooltip"
- + (corner.charAt(0) == 'T' ? "Below" : "Above");
-
- dojo.replaceClass(this.domNode, newC, this._currentOrientClass || "");
- this._currentOrientClass = newC;
- },
-
- focus: function(){
- // summary:
- // Focus on first field
- this._getFocusItems(this.containerNode);
- dijit.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);
- this._onShow(); // lazy load trigger
- },
-
- 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;
- var dk = dojo.keys;
- if(evt.charOrCode === dk.TAB){
- this._getFocusItems(this.containerNode);
- }
- var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
- if(evt.charOrCode == dk.ESCAPE){
- // Use setTimeout to avoid crash on IE, see #10396.
- setTimeout(dojo.hitch(this, "onCancel"), 0);
- dojo.stopEvent(evt);
- }else if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === dk.TAB){
- if(!singleFocusItem){
- dijit.focus(this._lastFocusItem); // send focus to last item in dialog
- }
- dojo.stopEvent(evt);
- }else if(node == this._lastFocusItem && evt.charOrCode === dk.TAB && !evt.shiftKey){
- if(!singleFocusItem){
- dijit.focus(this._firstFocusItem); // send focus to first item in dialog
- }
- dojo.stopEvent(evt);
- }else if(evt.charOrCode === dk.TAB){
- // we want the browser's default tab handling to move focus
- // but we don't want the tab to propagate upwards
- evt.stopPropagation();
- }
- }
- }
- );
-
-}
+//>>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
diff --git a/lib/dijit/TooltipDialog.js.uncompressed.js b/lib/dijit/TooltipDialog.js.uncompressed.js
new file mode 100644
index 000000000..35d97c380
--- /dev/null
+++ b/lib/dijit/TooltipDialog.js.uncompressed.js
@@ -0,0 +1,156 @@
+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", // 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",
+ "." // exports methods to dijit global
+], function(declare, domClass, event, keys, lang,
+ focus, ContentPane, _DialogMixin, _FormMixin, _TemplatedMixin, template, dijit){
+
+/*=====
+ var ContentPane = dijit.layout.ContentPane;
+ var _DialogMixin = dijit._DialogMixin;
+ var _FormMixin = dijit.form._FormMixin;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+ // module:
+ // dijit/TooltipDialog
+ // summary:
+ // Pops up a dialog that appears like a Tooltip
+
+
+ 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*/ corner){
+ // 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
+ var newC = "dijitTooltipAB" + (corner.charAt(1) == 'L' ? "Left" : "Right")
+ + " dijitTooltip"
+ + (corner.charAt(0) == 'T' ? "Below" : "Above");
+
+ domClass.replace(this.domNode, newC, this._currentOrientClass || "");
+ this._currentOrientClass = newC;
+ },
+
+ 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);
+ this._onShow(); // lazy load trigger
+ },
+
+ 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 setTimeout to avoid crash on IE, see #10396.
+ setTimeout(lang.hitch(this, "onCancel"), 0);
+ 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 d702a3b94..25c44568a 100644
--- a/lib/dijit/Tree.js
+++ b/lib/dijit/Tree.js
@@ -1,1634 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.Tree"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Tree"] = true;
-dojo.provide("dijit.Tree");
-dojo.require("dojo.fx");
-dojo.require("dojo.DeferredList");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._Container");
-dojo.require("dijit._Contained");
-dojo.require("dijit._CssStateMixin");
-dojo.require("dojo.cookie");
-dojo.require("dijit.tree.TreeStoreModel");
-dojo.require("dijit.tree.ForestStoreModel");
-dojo.require("dijit.tree._dndSelector");
-
-
-dojo.declare(
- "dijit._TreeNode",
- [dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained, dijit._CssStateMixin],
-{
- // summary:
- // Single node within a tree. This class is used internally
- // by Tree and should not be accessed directly.
- // tags:
- // private
-
- // item: [const] dojo.data.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: "",
-
- // 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: dojo.cache("dijit", "templates/TreeNode.html", "<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n"),
-
- baseClass: "dijitTreeNode",
-
- // For hover effect for tree node, and focus effect for label
- cssStateNodes: {
- rowNode: "dijitTreeRow",
- labelNode: "dijitTreeLabel"
- },
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- label: {node: "labelNode", type: "innerText"},
- tooltip: {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){
- dijit.setWaiState(this.labelNode, "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";
-
- dojo.style(this.domNode, "backgroundPosition", pixels + " 0px");
- dojo.style(this.rowNode, this.isLeftToRight() ? "paddingLeft" : "paddingRight", pixels);
-
- dojo.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");
- },
-
- _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);
- dojo.replaceClass(this[nodeName], this[clsName] || "", oldCls || "");
-
- dojo.style(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.style.display == "none"){
- /* if we are hiding the root node then make every first level child look like a root node */
- dojo.addClass(this.domNode, "dijitTreeIsRoot");
- }else{
- dojo.toggleClass(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
- dojo.replaceClass(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.Deferred
- }
-
- // cancel in progress collapse operation
- this._wipeOut && this._wipeOut.stop();
-
- // All the state information for when a node is expanded, maybe this should be
- // set when the animation completes instead
- this.isExpanded = true;
- dijit.setWaiState(this.labelNode, "expanded", "true");
- if(this.tree.showRoot || this !== this.tree.rootNode){
- dijit.setWaiRole(this.containerNode, "group");
- }
- dojo.addClass(this.contentNode,'dijitTreeContentExpanded');
- this._setExpando();
- this._updateItemClasses(this.item);
- if(this == this.tree.rootNode){
- dijit.setWaiState(this.tree.domNode, "expanded", "true");
- }
-
- var def,
- wipeIn = dojo.fx.wipeIn({
- node: this.containerNode, duration: dijit.defaultDuration,
- onEnd: function(){
- def.callback(true);
- }
- });
-
- // Deferred that fires when expand is complete
- def = (this._expandDeferred = new dojo.Deferred(function(){
- // Canceller
- wipeIn.stop();
- }));
-
- wipeIn.play();
-
- return def; // dojo.Deferred
- },
-
- collapse: function(){
- // summary:
- // Collapse this node (if it's expanded)
-
- if(!this.isExpanded){ return; }
-
- // cancel in progress expand operation
- if(this._expandDeferred){
- this._expandDeferred.cancel();
- delete this._expandDeferred;
- }
-
- this.isExpanded = false;
- dijit.setWaiState(this.labelNode, "expanded", "false");
- if(this == this.tree.rootNode){
- dijit.setWaiState(this.tree.domNode, "expanded", "false");
- }
- dojo.removeClass(this.contentNode,'dijitTreeContentExpanded');
- this._setExpando();
- this._updateItemClasses(this.item);
-
- if(!this._wipeOut){
- this._wipeOut = dojo.fx.wipeOut({
- node: this.containerNode, duration: dijit.defaultDuration
- });
- }
- this._wipeOut.play();
- },
-
- // 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.
- dojo.forEach(this.getChildren(), function(child){
- dijit._Container.prototype.removeChild.call(this, child);
- }, this);
-
- 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
- dojo.forEach(items, function(item){
- 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),
- dir: tree.dir,
- lang: tree.lang,
- 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(item)){
- defs.push(tree._expandNode(node));
- }
- }, this);
-
- // note that updateLayout() needs to be called on each child after
- // _all_ the children exist
- dojo.forEach(this.getChildren(), function(child, idx){
- 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");
- }
- }
-
- return new dojo.DeferredList(defs); // dojo.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();
- }
-
- dojo.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);
- },
-
- _onLabelFocus: function(evt){
- // summary:
- // Called when this row is focused (possibly programatically)
- // Note that we aren't using _onFocus() builtin to dijit
- // because it's called when focus is moved to a descendant TreeNode.
- // tags:
- // private
- this.tree._onNodeFocus(this);
- },
-
- 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).
- dijit.setWaiState(this.labelNode, "selected", selected);
- dojo.toggleClass(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");
- },
-
- _onClick: function(evt){
- // summary:
- // Handler for onclick event on a node
- // tags:
- // private
- this.tree._onClick(this, evt);
- },
- _onDblClick: function(evt){
- // summary:
- // Handler for ondblclick event on a node
- // tags:
- // private
- this.tree._onDblClick(this, evt);
- },
-
- _onMouseEnter: function(evt){
- // summary:
- // Handler for onmouseenter event on a node
- // tags:
- // private
- this.tree._onNodeMouseEnter(this, evt);
- },
-
- _onMouseLeave: function(evt){
- // summary:
- // Handler for onmouseenter event on a node
- // tags:
- // private
- this.tree._onNodeMouseLeave(this, evt);
- }
-});
-
-dojo.declare(
- "dijit.Tree",
- [dijit._Widget, dijit._Templated],
-{
- // 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 ofwaiting 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: dojo.cache("dijit", "templates/Tree.html", "<div class=\"dijitTree dijitTreeContainer\" role=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"),
-
- // 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] String
- // Class name to use as as the dnd controller. Specifying this class enables DnD.
- // Generally you should specify this as "dijit.tree.dndSource".
- // Default of "dijit.tree._dndSelector" handles selection only (no actual DnD).
- dndController: "dijit.tree._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: 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[]
- // 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 [{}];
- },
- =====*/
- itemCreator: null,
-
- // 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 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; // 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
- dojo.publish(this.id, [dojo.mixin({tree: this, event: topicName}, message || {})]);
- },
-
- 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.cookieName = this.id + "SaveStateCookie";
- }
-
- this._loadDeferred = new dojo.Deferred();
-
- this.inherited(arguments);
- },
-
- postCreate: function(){
- this._initState();
-
- // 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._load();
-
- this.inherited(arguments);
-
- if(this.dndController){
- if(dojo.isString(this.dndController)){
- this.dndController = dojo.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);
- }
- },
-
- _store2model: function(){
- // summary:
- // User specified a store&query rather than model, so create model from store/query
- this._v10Compat = true;
- dojo.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 = dojo.hitch(this, "mayHaveChildren");
- }
-
- if(this.params.getItemChildren){
- modelParams.getChildren = dojo.hitch(this, function(item, onComplete, onError){
- this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError);
- });
- }
- this.model = new dijit.tree.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(
- dojo.hitch(this, function(item){
- var rn = (this.rootNode = this.tree._createTreeNode({
- item: item,
- tree: this,
- isExpandable: true,
- label: this.label || this.getLabel(item),
- 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
- dijit.setWaiRole(this.domNode, 'presentation');
-
- dijit.setWaiRole(rn.labelNode, 'presentation');
- dijit.setWaiRole(rn.containerNode, 'tree');
- }
- 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 then fire onLoad() event
- this._expandNode(rn).addCallback(dojo.hitch(this, function(){
- this._loadDeferred.callback(true);
- this.onLoad();
- }));
- }),
- function(err){
- console.error(this, ": error loading root: ", err);
- }
- );
- },
-
- getNodesByItem: function(/*dojo.data.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 = dojo.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(/*dojo.data.Item or id*/ item){
- this.set('selectedItems', [item]);
- },
-
- _setSelectedItemsAttr: function(/*dojo.data.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;
- this._loadDeferred.addCallback( dojo.hitch(this, function(){
- var identities = dojo.map(items, function(item){
- return (!item || dojo.isString(item)) ? item : tree.model.getIdentity(item);
- });
- var nodes = [];
- dojo.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;
-
- // We may need to wait for some nodes to expand, so setting
- // each path will involve a Deferred. We bring those deferreds
- // together witha DeferredList.
- return new dojo.DeferredList(dojo.map(paths, function(path){
- var d = new dojo.Deferred();
-
- // normalize path to use identity
- path = dojo.map(path, function(item){
- return dojo.isString(item) ? item : tree.model.getIdentity(item);
- });
-
- if(path.length){
- // Wait for the tree to load, if it hasn't already.
- tree._loadDeferred.addCallback(function(){ selectPath(path, [tree.rootNode], d); });
- }else{
- d.errback("Empty path");
- }
- return d;
- })).addCallback(setNodes);
-
- function selectPath(path, nodes, def){
- // Traverse path; the next path component should be among "nodes".
- var nextPath = path.shift();
- var nextNode = dojo.filter(nodes, function(node){
- return node.getIdentity() == nextPath;
- })[0];
- if(!!nextNode){
- if(path.length){
- tree._expandNode(nextNode).addCallback(function(){ selectPath(path, nextNode.getChildren(), def); });
- }else{
- //Successfully reached the end of this path
- def.callback(nextNode);
- }
- } else {
- def.errback("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", dojo.map(
- dojo.filter(newNodes,function(x){return x[0];}),
- function(x){return x[1];}));
- }
- },
-
- _setSelectedNodeAttr: function(node){
- this.set('selectedNodes', [node]);
- },
- _setSelectedNodesAttr: function(nodes){
- this._loadDeferred.addCallback( dojo.hitch(this, function(){
- this.dndController.setSelection(nodes);
- }));
- },
-
-
- ////////////// 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(/*dojo.data.Item*/ parentItem, /*function(items)*/ 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(/*dojo.data.Item*/ item, /*Boolean*/ opened){
- // summary:
- // Overridable function to return CSS class name to display label
- // tags:
- // extension
- },
-
- getRowClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
- // summary:
- // Overridable function to return CSS class name to display row
- // tags:
- // extension
- },
-
- getIconStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
- // summary:
- // Overridable function to return CSS styles to display icon
- // returns:
- // Object suitable for input to dojo.style() like {backgroundImage: "url(...)"}
- // tags:
- // extension
- },
-
- getLabelStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
- // summary:
- // Overridable function to return CSS styles to display label
- // returns:
- // Object suitable for input to dojo.style() like {color: "red", background: "green"}
- // tags:
- // extension
- },
-
- getRowStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
- // summary:
- // Overridable function to return CSS styles to display row
- // 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(/*Event*/ e){
- // summary:
- // Translates keypress events into commands for the controller
- if(e.altKey){ return; }
- var dk = dojo.keys;
- var treeNode = dijit.getEnclosingWidget(e.target);
- if(!treeNode){ return; }
-
- var key = e.charOrCode;
- if(typeof key == "string" && key != " "){ // handle printables (letter navigation)
- // Check for key navigation.
- if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
- this._onLetterKeyNav( { node: treeNode, key: key.toLowerCase() } );
- dojo.stopEvent(e);
- }
- }else{ // handle non-printables (arrow keys)
- // 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){
- clearTimeout(this._curSearch.timer);
- delete this._curSearch;
- }
-
- var map = this._keyHandlerMap;
- if(!map){
- // setup table mapping keys to events
- map = {};
- map[dk.ENTER]="_onEnterKey";
- //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.
- map[dk.SPACE]= map[" "] = "_onEnterKey";
- map[this.isLeftToRight() ? dk.LEFT_ARROW : dk.RIGHT_ARROW]="_onLeftArrow";
- map[this.isLeftToRight() ? dk.RIGHT_ARROW : dk.LEFT_ARROW]="_onRightArrow";
- map[dk.UP_ARROW]="_onUpArrow";
- map[dk.DOWN_ARROW]="_onDownArrow";
- map[dk.HOME]="_onHomeKey";
- map[dk.END]="_onEndKey";
- this._keyHandlerMap = map;
- }
- if(this._keyHandlerMap[key]){
- this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item, evt: e } );
- dojo.stopEvent(e);
- }
- }
- },
-
- _onEnterKey: function(/*Object*/ message){
- this._publish("execute", { item: message.item, node: message.node } );
- this.dndController.userSelect(message.node, dojo.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(/*Object*/ message){
- // 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;
- clearTimeout(cs.timer);
- }else{
- // We are starting a new search
- cs = this._curSearch = {
- pattern: message.key,
- startNode: message.node
- };
- }
-
- // set/reset timer to forget recent keystrokes
- var self = this;
- cs.timer = setTimeout(function(){
- delete self._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 dojo.isDescendant(node, widget.expandoNode);
- },
- _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);
- }
- dojo.stopEvent(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);
- }
- dojo.stopEvent(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(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){
- // summary:
- // Callback when a tree node is clicked
- // tags:
- // callback
- },
- onDblClick: function(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){
- // summary:
- // Callback when a tree node is double-clicked
- // tags:
- // callback
- },
- onOpen: function(/* dojo.data */ item, /*TreeNode*/ node){
- // summary:
- // Callback when a node is opened
- // tags:
- // callback
- },
- onClose: function(/* dojo.data */ item, /*TreeNode*/ node){
- // summary:
- // Callback when a node is closed
- // 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
-
- if(node._expandNodeDeferred){
- delete node._expandNodeDeferred;
- }
-
- if(node.isExpandable){
- if(node.state == "LOADING"){
- // ignore clicks while we are in the process of loading data
- return;
- }
-
- node.collapse();
- this.onClose(node.item, node);
-
- if(node.item){
- this._state(node.item,false);
- this._saveState();
- }
- }
- },
-
- _expandNode: function(/*_TreeNode*/ node, /*Boolean?*/ recursive){
- // summary:
- // Called when the user has requested to expand the node
- // recursive:
- // Internal flag used when _expandNode() calls itself, don't set.
- // returns:
- // Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants
- // that were previously opened too
-
- if(node._expandNodeDeferred && !recursive){
- // there's already an expand in progress (or completed), so just return
- return node._expandNodeDeferred; // dojo.Deferred
- }
-
- var model = this.model,
- item = node.item,
- _this = this;
-
- switch(node.state){
- case "UNCHECKED":
- // need to load all the children, and then expand
- 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.
- var def = (node._expandNodeDeferred = new dojo.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.
- var scid = node.setChildItems(items);
-
- // Call _expandNode() again but this time it will just to do the animation (default branch).
- // The returned Deferred will fire when the animation completes.
- // TODO: seems like I can avoid recursion and just use a deferred to sequence the events?
- var ed = _this._expandNode(node, true);
-
- // After the above two tasks (setChildItems() and recursive _expandNode()) finish,
- // signal that I am done.
- scid.addCallback(function(){
- ed.addCallback(function(){
- def.callback();
- })
- });
- },
- function(err){
- console.error(_this, ": error loading root children: ", err);
- }
- );
- break;
-
- default: // "LOADED"
- // data is already loaded; just expand node
- def = (node._expandNodeDeferred = node.expand());
-
- this.onOpen(node.item, node);
-
- if(item){
- this._state(item, true);
- this._saveState();
- }
- }
-
- return def; // dojo.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
- dijit.focus(node.labelNode);
- },
-
- _onNodeFocus: function(/*dijit._Widget*/ 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._Widget*/ node){
- // summary:
- // Called when mouse is over a node (onmouseenter event),
- // this is monitored by the DND code
- },
-
- _onNodeMouseLeave: function(/*dijit._Widget*/ 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);
- dojo.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){
- dojo.forEach(parentNodes,function(parentNode){
- parentNode.setChildItems(newChildrenList);
- });
- }
- },
-
- _onItemDelete: function(/*Item*/ item){
- // summary:
- // Processes notification of a deletion of an item
- var model = this.model,
- identity = model.getIdentity(item),
- nodes = this._itemNodesMap[identity];
-
- if(nodes){
- dojo.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
- if(this.persist){
- var cookie = dojo.cookie(this.cookieName);
- this._openedItemIds = {};
- if(cookie){
- dojo.forEach(cookie.split(','), function(item){
- this._openedItemIds[item] = true;
- }, this);
- }
- }
- },
- _state: function(item,expanded){
- // summary:
- // Query or set expanded state for an item,
- if(!this.persist){
- return false;
- }
- var id=this.model.getIdentity(item);
- if(arguments.length === 1){
- return this._openedItemIds[id];
- }
- if(expanded){
- this._openedItemIds[id] = true;
- }else{
- delete this._openedItemIds[id];
- }
- },
- _saveState: function(){
- // summary:
- // Create and save a cookie with the currently expanded nodes identifiers
- if(!this.persist){
- return;
- }
- var ary = [];
- for(var id in this._openedItemIds){
- ary.push(id);
- }
- dojo.cookie(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 && !dojo.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){
- dojo.marginBox(this.domNode, changeSize);
- }
-
- // The only 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)
- this._nodePixelIndent = dojo._getMarginSize(this.tree.indentDetector).w;
-
- if(this.tree.rootNode){
- // If tree has already loaded, then reset indent for all the nodes
- this.tree.rootNode.set('indent', this.showRoot ? 0 : -1);
- }
- },
-
- _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 dijit._TreeNode(args);
- }
-});
-
-// For back-compat. TODO: remove in 2.0
-
-}
+//>>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
diff --git a/lib/dijit/Tree.js.uncompressed.js b/lib/dijit/Tree.js.uncompressed.js
new file mode 100644
index 000000000..3bd8161af
--- /dev/null
+++ b/lib/dijit/Tree.js.uncompressed.js
@@ -0,0 +1,1692 @@
+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", // array.filter array.forEach array.map
+ "dojo/_base/connect", // connect.isCopyKey()
+ "dojo/cookie", // cookie
+ "dojo/_base/declare", // declare
+ "dojo/_base/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/fx", // fxUtils.wipeIn fxUtils.wipeOut
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/keys", // arrows etc.
+ "dojo/_base/lang", // lang.getObject lang.mixin lang.hitch
+ "dojo/topic",
+ "./focus",
+ "./registry", // registry.getEnclosingWidget(), manager.defaultDuration
+ "./_base/manager", // manager.getEnclosingWidget(), 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, fxUtils, kernel, keys, lang, topic,
+ focus, registry, manager, _Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin,
+ treeNodeTemplate, treeTemplate, TreeStoreModel, ForestStoreModel, _dndSelector){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _CssStateMixin = dijit._CssStateMixin;
+ var _Container = dijit._Container;
+ var _Contained = dijit._Contained;
+=====*/
+
+// module:
+// dijit/Tree
+// summary:
+// dijit.Tree widget, and internal dijit._TreeNode widget
+
+
+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",
+ labelNode: "dijitTreeLabel"
+ },
+
+ // 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");
+ domStyle.set(this.rowNode, 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");
+ },
+
+ _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.Deferred
+ }
+
+ // cancel in progress collapse operation
+ this._wipeOut && this._wipeOut.stop();
+
+ // 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.domNode.setAttribute("aria-expanded", "true");
+ }
+
+ var def,
+ wipeIn = fxUtils.wipeIn({
+ node: this.containerNode, duration: manager.defaultDuration,
+ onEnd: function(){
+ def.callback(true);
+ }
+ });
+
+ // Deferred that fires when expand is complete
+ def = (this._expandDeferred = new Deferred(function(){
+ // Canceller
+ wipeIn.stop();
+ }));
+
+ wipeIn.play();
+
+ return def; // dojo.Deferred
+ },
+
+ collapse: function(){
+ // summary:
+ // Collapse this node (if it's expanded)
+
+ if(!this.isExpanded){ return; }
+
+ // 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.domNode.setAttribute("aria-expanded", "false");
+ }
+ domClass.remove(this.contentNode,'dijitTreeContentExpanded');
+ this._setExpando();
+ this._updateItemClasses(this.item);
+
+ if(!this._wipeOut){
+ this._wipeOut = fxUtils.wipeOut({
+ node: this.containerNode, duration: manager.defaultDuration
+ });
+ }
+ this._wipeOut.play();
+ },
+
+ // 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.
+ array.forEach(this.getChildren(), function(child){
+ _Container.prototype.removeChild.call(this, child);
+ }, this);
+
+ 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){
+ 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),
+ 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");
+ }
+ }
+
+ return new DeferredList(defs); // dojo.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);
+ },
+
+ _onLabelFocus: function(){
+ // summary:
+ // Called when this row is focused (possibly programatically)
+ // Note that we aren't using _onFocus() builtin to dijit
+ // because it's called when focus is moved to a descendant TreeNode.
+ // tags:
+ // private
+ this.tree._onNodeFocus(this);
+ },
+
+ 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);
+ 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");
+ },
+
+ _onClick: function(evt){
+ // summary:
+ // Handler for onclick event on a node
+ // tags:
+ // private
+ this.tree._onClick(this, evt);
+ },
+ _onDblClick: function(evt){
+ // summary:
+ // Handler for ondblclick event on a node
+ // tags:
+ // private
+ this.tree._onDblClick(this, evt);
+ },
+
+ _onMouseEnter: function(evt){
+ // summary:
+ // Handler for onmouseenter event on a node
+ // tags:
+ // private
+ this.tree._onNodeMouseEnter(this, evt);
+ },
+
+ _onMouseLeave: function(evt){
+ // summary:
+ // Handler for onmouseenter event on a node
+ // tags:
+ // private
+ this.tree._onNodeMouseLeave(this, evt);
+ },
+
+ _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 ofwaiting 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: 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[]
+ // 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 [{}];
+ },
+ =====*/
+ itemCreator: null,
+
+ // 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 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; // 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";
+ }
+
+ this._loadDeferred = new Deferred();
+
+ this.inherited(arguments);
+ },
+
+ postCreate: function(){
+ this._initState();
+
+ // 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._load();
+
+ 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);
+ }
+ },
+
+ _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");
+
+ rn.labelNode.setAttribute("role", "presentation");
+ rn.containerNode.setAttribute("role", "tree");
+ }
+ 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 then fire onLoad() event
+ this._expandNode(rn).addCallback(lang.hitch(this, function(){
+ this._loadDeferred.callback(true);
+ this.onLoad();
+ }));
+ }),
+ 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;
+ this._loadDeferred.addCallback( 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;
+
+ // We may need to wait for some nodes to expand, so setting
+ // each path will involve a Deferred. We bring those deferreds
+ // together witha 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.
+ tree._loadDeferred.addCallback(function(){ selectPath(path, [tree.rootNode], d); });
+ }else{
+ d.errback("Empty path");
+ }
+ return d;
+ })).addCallback(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).addCallback(function(){ selectPath(path, nextNode.getChildren(), def); });
+ }else{
+ //Successfully reached the end of this path
+ def.callback(nextNode);
+ }
+ }else{
+ def.errback("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){
+ this._loadDeferred.addCallback( lang.hitch(this, function(){
+ this.dndController.setSelection(nodes);
+ }));
+ },
+
+
+ ////////////// 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(/*Event*/ e){
+ // summary:
+ // Translates keypress events into commands for the controller
+ if(e.altKey){ return; }
+ var treeNode = registry.getEnclosingWidget(e.target);
+ if(!treeNode){ return; }
+
+ var key = e.charOrCode;
+ if(typeof key == "string" && key != " "){ // handle printables (letter navigation)
+ // Check for key navigation.
+ if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
+ this._onLetterKeyNav( { node: treeNode, key: key.toLowerCase() } );
+ event.stop(e);
+ }
+ }else{ // handle non-printables (arrow keys)
+ // 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){
+ clearTimeout(this._curSearch.timer);
+ delete this._curSearch;
+ }
+
+ var map = this._keyHandlerMap;
+ if(!map){
+ // setup table mapping keys to events
+ map = {};
+ map[keys.ENTER]="_onEnterKey";
+ //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.
+ 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]){
+ 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;
+ clearTimeout(cs.timer);
+ }else{
+ // We are starting a new search
+ cs = this._curSearch = {
+ pattern: message.key,
+ startNode: message.node
+ };
+ }
+
+ // set/reset timer to forget recent keystrokes
+ var self = this;
+ cs.timer = setTimeout(function(){
+ delete self._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);
+ },
+ _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: dojo.data.Item
+ // node: TreeNode
+ // evt: Event
+ // tags:
+ // callback
+ },
+ onDblClick: function(/*===== item, node, evt =====*/){
+ // summary:
+ // Callback when a tree node is double-clicked
+ // item: dojo.data.Item
+ // node: TreeNode
+ // evt: 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: dojo.data.Item
+ // node: TreeNode
+ // 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
+
+ if(node._expandNodeDeferred){
+ delete node._expandNodeDeferred;
+ }
+
+ if(node.isExpandable){
+ if(node.state == "LOADING"){
+ // ignore clicks while we are in the process of loading data
+ return;
+ }
+
+ node.collapse();
+ this.onClose(node.item, node);
+
+ this._state(node, false);
+ }
+ },
+
+ _expandNode: function(/*_TreeNode*/ node, /*Boolean?*/ recursive){
+ // summary:
+ // Called when the user has requested to expand the node
+ // recursive:
+ // Internal flag used when _expandNode() calls itself, don't set.
+ // returns:
+ // Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants
+ // that were previously opened too
+
+ if(node._expandNodeDeferred && !recursive){
+ // there's already an expand in progress (or completed), so just return
+ return node._expandNodeDeferred; // dojo.Deferred
+ }
+
+ var model = this.model,
+ item = node.item,
+ _this = this;
+
+ switch(node.state){
+ case "UNCHECKED":
+ // need to load all the children, and then expand
+ 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.
+ var def = (node._expandNodeDeferred = 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.
+ var scid = node.setChildItems(items);
+
+ // Call _expandNode() again but this time it will just to do the animation (default branch).
+ // The returned Deferred will fire when the animation completes.
+ // TODO: seems like I can avoid recursion and just use a deferred to sequence the events?
+ var ed = _this._expandNode(node, true);
+
+ // After the above two tasks (setChildItems() and recursive _expandNode()) finish,
+ // signal that I am done.
+ scid.addCallback(function(){
+ ed.addCallback(function(){
+ def.callback();
+ })
+ });
+ },
+ function(err){
+ console.error(_this, ": error loading root children: ", err);
+ }
+ );
+ break;
+
+ default: // "LOADED"
+ // data is already loaded; just expand node
+ def = (node._expandNodeDeferred = node.expand());
+
+ this.onOpen(node.item, node);
+
+ this._state(node, true);
+ }
+
+ return def; // dojo.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._Widget*/ 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._Widget*/ /*===== node =====*/){
+ // summary:
+ // Called when mouse is over a node (onmouseenter event),
+ // this is monitored by the DND code
+ },
+
+ _onNodeMouseLeave: function(/*dijit._Widget*/ /*===== 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
+ 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];
+ }
+ var ary = [];
+ for(var id in this._openedNodes){
+ ary.push(id);
+ }
+ cookie(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 && !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 only 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)
+ this._nodePixelIndent = domGeometry.position(this.tree.indentDetector).w;
+
+ if(this.tree.rootNode){
+ // If tree has already loaded, then reset indent for all the nodes
+ this.tree.rootNode.set('indent', this.showRoot ? 0 : -1);
+ }
+ },
+
+ _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._TreeNode = TreeNode; // for monkey patching
+
+return Tree;
+});
diff --git a/lib/dijit/WidgetSet.js b/lib/dijit/WidgetSet.js
new file mode 100644
index 000000000..bb3a98353
--- /dev/null
+++ b/lib/dijit/WidgetSet.js
@@ -0,0 +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
diff --git a/lib/dijit/WidgetSet.js.uncompressed.js b/lib/dijit/WidgetSet.js.uncompressed.js
new file mode 100644
index 000000000..bc38c1e08
--- /dev/null
+++ b/lib/dijit/WidgetSet.js.uncompressed.js
@@ -0,0 +1,229 @@
+define("dijit/WidgetSet", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/_base/window", // win.global
+ "./registry" // to add functions to dijit.registry
+], function(array, declare, win, registry){
+
+ // module:
+ // dijit/WidgetSet
+ // summary:
+ // Legacy registry code. New modules should just use registry.
+ // Will be removed in 2.0.
+
+ var WidgetSet = declare("dijit.WidgetSet", null, {
+ // summary:
+ // A set of widgets indexed by id. A default instance of this class is
+ // available as `dijit.registry`
+ //
+ // example:
+ // Create a small list of widgets:
+ // | var ws = new dijit.WidgetSet();
+ // | ws.add(dijit.byId("one"));
+ // | ws.add(dijit.byId("two"));
+ // | // destroy both:
+ // | ws.forEach(function(w){ w.destroy(); });
+ //
+ // example:
+ // Using dijit.registry:
+ // | dijit.registry.forEach(function(w){ /* do something */ });
+
+ constructor: function(){
+ this._hash = {};
+ this.length = 0;
+ },
+
+ add: function(/*dijit._Widget*/ widget){
+ // summary:
+ // Add a widget to this list. If a duplicate ID is detected, a error is thrown.
+ //
+ // widget: dijit._Widget
+ // Any dijit._Widget 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:
+ // | dijit.registry.forEach(function(widget){
+ // | console.log(widget.declaredClass);
+ // | });
+ //
+ // returns:
+ // Returns self, in order to allow for further chaining.
+
+ thisObj = thisObj || win.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
+ // | dijit.registry.filter(function(w, i){
+ // | return i % 2 == 0;
+ // | }).forEach(function(w){ /* odd ones */ });
+
+ thisObj = thisObj || win.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
+ // | var ws = new dijit.WidgetSet();
+ // | ws.add(dijit.byId("bar"));
+ // | var t = ws.byId("bar") // returns a widget
+ // | var x = ws.byId("foo"); // returns undefined
+
+ return this._hash[id]; // dijit._Widget
+ },
+
+ 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:
+ // | dijit.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
+ // | array.map(dijit.registry.toArray(), function(w){ return w.domNode; });
+
+ var ar = [];
+ for(var id in this._hash){
+ ar.push(this._hash[id]);
+ }
+ return ar; // dijit._Widget[]
+ },
+
+ map: function(/* Function */func, /* Object? */thisObj){
+ // summary:
+ // Create a new Array from this WidgetSet, following the same rules as `array.map`
+ // example:
+ // | var nodes = dijit.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 || win.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 || win.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
new file mode 100644
index 000000000..e64895551
--- /dev/null
+++ b/lib/dijit/_BidiSupport.js
@@ -0,0 +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
diff --git a/lib/dijit/_BidiSupport.js.uncompressed.js b/lib/dijit/_BidiSupport.js.uncompressed.js
new file mode 100644
index 000000000..ef43a158c
--- /dev/null
+++ b/lib/dijit/_BidiSupport.js.uncompressed.js
@@ -0,0 +1,69 @@
+define("dijit/_BidiSupport", ["./_WidgetBase"], function(_WidgetBase){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+====*/
+
+ // module:
+ // dijit/_BidiSupport
+ // 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;
+ }
+ }
+ });
+
+ return _WidgetBase;
+});
diff --git a/lib/dijit/_Calendar.js b/lib/dijit/_Calendar.js
index b159d6ed9..2e4d78e3e 100644
--- a/lib/dijit/_Calendar.js
+++ b/lib/dijit/_Calendar.js
@@ -1,20 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._Calendar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._Calendar"] = true;
-dojo.provide("dijit._Calendar");
-dojo.require("dijit.Calendar");
-
-
-dojo.deprecated("dijit._Calendar is deprecated", "dijit._Calendar moved to dijit.Calendar", 1.5);
-
-// dijit._Calendar had an underscore all this time merely because it did
-// not satisfy dijit's a11y policy.
-dijit._Calendar = dijit.Calendar;
-
-}
+//>>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
diff --git a/lib/dijit/_Calendar.js.uncompressed.js b/lib/dijit/_Calendar.js.uncompressed.js
new file mode 100644
index 000000000..c01d7bfd7
--- /dev/null
+++ b/lib/dijit/_Calendar.js.uncompressed.js
@@ -0,0 +1,17 @@
+define("dijit/_Calendar", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "./Calendar",
+ "." // for exporting dijit.Calendar
+], function(kernel, Calendar, dijit){
+
+ // module:
+ // dijit/_Calendar
+ // 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 b/lib/dijit/_Contained.js
index fcefca1f8..047e0d591 100644
--- a/lib/dijit/_Contained.js
+++ b/lib/dijit/_Contained.js
@@ -1,76 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._Contained"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._Contained"] = true;
-dojo.provide("dijit._Contained");
-
-
-dojo.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
- // | dojo.declare("my.customClass",[dijit._Widget,dijit._Contained],{});
-
- getParent: function(){
- // summary:
- // Returns the parent widget of this widget, assuming the parent
- // specifies isContainer
- var parent = dijit.getEnclosingWidget(this.domNode.parentNode);
- return parent && parent.isContainer ? parent : null;
- },
-
- _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 && dijit.byNode(node); // dijit._Widget
- },
-
- 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._Widget
- },
-
- 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._Widget
- },
-
- 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
- }
- }
- );
-
-}
+//>>built
+define("dijit/_Contained",["dojo/_base/declare","./registry"],function(_1,_2){return _1("dijit._Contained",null,{_getSibling:function(_3){var _4=this.domNode;do{_4=_4[_3+"Sibling"];}while(_4&&_4.nodeType!=1);return _4&&_2.byNode(_4);},getPreviousSibling:function(){return this._getSibling("previous");},getNextSibling:function(){return this._getSibling("next");},getIndexInParent:function(){var p=this.getParent();if(!p||!p.getIndexOfChild){return -1;}return p.getIndexOfChild(this);}});}); \ No newline at end of file
diff --git a/lib/dijit/_Contained.js.uncompressed.js b/lib/dijit/_Contained.js.uncompressed.js
new file mode 100644
index 000000000..0bffb113b
--- /dev/null
+++ b/lib/dijit/_Contained.js.uncompressed.js
@@ -0,0 +1,62 @@
+define("dijit/_Contained", [
+ "dojo/_base/declare", // declare
+ "./registry" // registry.getEnclosingWidget(), registry.byNode()
+], function(declare, registry){
+
+ // module:
+ // dijit/_Contained
+ // summary:
+ // Mixin for widgets that are children of a container widget
+
+ 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._Widget
+ },
+
+ 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._Widget
+ },
+
+ 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._Widget
+ },
+
+ 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 23962688f..bbe597fcb 100644
--- a/lib/dijit/_Container.js
+++ b/lib/dijit/_Container.js
@@ -1,144 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._Container"] = true;
-dojo.provide("dijit._Container");
-
-
-dojo.declare("dijit._Container",
- null,
- {
- // summary:
- // Mixin for widgets that contain a set of widget children.
- // description:
- // Use this mixin for widgets that needs to know about and
- // keep track of their widget children. Suitable for widgets like BorderContainer
- // and TabContainer which contain (only) a set of child widgets.
- //
- // It's not suitable for widgets like ContentPane
- // which contains mixed HTML (plain DOM nodes in addition to widgets),
- // and where contained widgets are not necessarily directly below
- // this.containerNode. In that case calls like addChild(node, position)
- // wouldn't make sense.
-
- // isContainer: [protected] Boolean
- // Indicates that this widget acts as a "parent" to the descendant widgets.
- // When the parent is started it will call startup() on the child widgets.
- // See also `isLayoutContainer`.
- isContainer: true,
-
- buildRendering: function(){
- this.inherited(arguments);
- if(!this.containerNode){
- // all widgets with descendants must set containerNode
- this.containerNode = this.domNode;
- }
- },
-
- addChild: function(/*dijit._Widget*/ 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).
-
- 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";
- }
- }
- dojo.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 or 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
-
- 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 children, i.e. if this.containerNode contains something.
- return this.getChildren().length > 0; // Boolean
- },
-
- destroyDescendants: function(/*Boolean*/ preserveDom){
- // summary:
- // Destroys all the widgets inside this.containerNode,
- // but not this widget itself
- dojo.forEach(this.getChildren(), function(child){ child.destroyRecursive(preserveDom); });
- },
-
- _getSiblingOfChild: function(/*dijit._Widget*/ 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 node = child.domNode,
- which = (dir>0 ? "nextSibling" : "previousSibling");
- do{
- node = node[which];
- }while(node && (node.nodeType != 1 || !dijit.byNode(node)));
- return node && dijit.byNode(node); // dijit._Widget
- },
-
- getIndexOfChild: function(/*dijit._Widget*/ child){
- // summary:
- // Gets the index of the child in this container or -1 if not found
- return dojo.indexOf(this.getChildren(), child); // int
- },
-
- startup: function(){
- // summary:
- // Called after all the widgets have been instantiated and their
- // dom nodes have been inserted somewhere under dojo.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; }
-
- // Startup all children of this widget
- dojo.forEach(this.getChildren(), function(child){ child.startup(); });
-
- this.inherited(arguments);
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/_Container.js.uncompressed.js b/lib/dijit/_Container.js.uncompressed.js
new file mode 100644
index 000000000..a79c38262
--- /dev/null
+++ b/lib/dijit/_Container.js.uncompressed.js
@@ -0,0 +1,107 @@
+define("dijit/_Container", [
+ "dojo/_base/array", // array.forEach array.indexOf
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.place
+ "./registry" // registry.byNode()
+], function(array, declare, domConstruct, registry){
+
+ // module:
+ // dijit/_Container
+ // summary:
+ // Mixin for widgets that contain a set of widget children.
+
+ return declare("dijit._Container", null, {
+ // summary:
+ // Mixin for widgets that contain a set of widget children.
+ // description:
+ // Use this mixin for widgets that needs to know about and
+ // keep track of their widget children. Suitable for widgets like BorderContainer
+ // and TabContainer which contain (only) a set of child widgets.
+ //
+ // It's not suitable for widgets like ContentPane
+ // which contains mixed HTML (plain DOM nodes in addition to widgets),
+ // and where contained widgets are not necessarily directly below
+ // this.containerNode. In that case calls like addChild(node, position)
+ // wouldn't make sense.
+
+ buildRendering: function(){
+ this.inherited(arguments);
+ if(!this.containerNode){
+ // all widgets with descendants must set containerNode
+ this.containerNode = this.domNode;
+ }
+ },
+
+ addChild: function(/*dijit._Widget*/ 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).
+
+ 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
+
+ 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 children, i.e. if this.containerNode contains something.
+ return this.getChildren().length > 0; // Boolean
+ },
+
+ _getSiblingOfChild: function(/*dijit._Widget*/ 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 node = child.domNode,
+ which = (dir>0 ? "nextSibling" : "previousSibling");
+ do{
+ node = node[which];
+ }while(node && (node.nodeType != 1 || !registry.byNode(node)));
+ return node && registry.byNode(node); // dijit._Widget
+ },
+
+ getIndexOfChild: function(/*dijit._Widget*/ 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 2fdecdcdf..f3e686b41 100644
--- a/lib/dijit/_CssStateMixin.js
+++ b/lib/dijit/_CssStateMixin.js
@@ -1,264 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._CssStateMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._CssStateMixin"] = true;
-dojo.provide("dijit._CssStateMixin");
-
-
-dojo.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);
-
- // Automatically monitor mouse events (essentially :hover and :active) on this.domNode
- dojo.forEach(["onmouseenter", "onmouseleave", "onmousedown"], function(e){
- this.connect(this.domNode, e, "_cssMouseEvent");
- }, this);
-
- // Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node
- dojo.forEach(["disabled", "readOnly", "checked", "selected", "focused", "state", "hovering", "active"], function(attr){
- this.watch(attr, dojo.hitch(this, "_setStateClass"));
- }, this);
-
- // Events on sub nodes within the widget
- for(var ap in this.cssStateNodes){
- this._trackMouseState(this[ap], this.cssStateNodes[ap]);
- }
- // 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:
- // 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 "mouseenter":
- case "mouseover": // generated on non-IE browsers even though we connected to mouseenter
- this._set("hovering", true);
- this._set("active", this._mouseDown);
- break;
-
- case "mouseleave":
- case "mouseout": // generated on non-IE browsers even though we connected to mouseleave
- this._set("hovering", false);
- this._set("active", false);
- break;
-
- case "mousedown" :
- this._set("active", true);
- this._mouseDown = true;
- // Set a global event to handle mouseup, so it fires properly
- // even if the cursor leaves this.domNode before the mouse up event.
- // Alternately could set active=false on mouseout.
- var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){
- this._mouseDown = false;
- this._set("active", false);
- this.disconnect(mouseUpConnector);
- });
- 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(dojo.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");
- }
-
- if(this.checked){
- multiply("Checked");
- }
- if(this.state){
- multiply(this.state);
- }
- if(this.selected){
- multiply("Selected");
- }
-
- 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
-
- dojo.forEach(tn.className.split(" "), function(c){ classHash[c] = true; });
-
- if("_stateClasses" in this){
- dojo.forEach(this._stateClasses, function(c){ delete classHash[c]; });
- }
-
- dojo.forEach(newStateClasses, function(c){ classHash[c] = true; });
-
- var newClasses = [];
- for(var c in classHash){
- newClasses.push(c);
- }
- tn.className = newClasses.join(" ");
-
- this._stateClasses = newStateClasses;
- },
-
- _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).
-
- // Current state of node (initially false)
- // NB: setting specifically to false because dojo.toggleClass() needs true boolean as third arg
- var hovering=false, active=false, focused=false;
-
- var self = this,
- cn = dojo.hitch(this, "connect", node);
-
- function setClass(){
- var disabled = ("disabled" in self && self.disabled) || ("readonly" in self && self.readonly);
- dojo.toggleClass(node, clazz+"Hover", hovering && !active && !disabled);
- dojo.toggleClass(node, clazz+"Active", active && !disabled);
- dojo.toggleClass(node, clazz+"Focused", focused && !disabled);
- }
-
- // Mouse
- cn("onmouseenter", function(){
- hovering = true;
- setClass();
- });
- cn("onmouseleave", function(){
- hovering = false;
- active = false;
- setClass();
- });
- cn("onmousedown", function(){
- active = true;
- setClass();
- });
- cn("onmouseup", function(){
- active = false;
- setClass();
- });
-
- // Focus
- cn("onfocus", function(){
- focused = true;
- setClass();
- });
- cn("onblur", function(){
- focused = false;
- setClass();
- });
-
- // Just in case widget is enabled/disabled while it has focus/hover/active state.
- // Maybe this is overkill.
- this.watch("disabled", setClass);
- this.watch("readOnly", setClass);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/_CssStateMixin.js.uncompressed.js b/lib/dijit/_CssStateMixin.js.uncompressed.js
new file mode 100644
index 000000000..876dbaf09
--- /dev/null
+++ b/lib/dijit/_CssStateMixin.js.uncompressed.js
@@ -0,0 +1,268 @@
+define("dijit/_CssStateMixin", [
+ "dojo/touch",
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.toggle
+ "dojo/_base/lang", // lang.hitch
+ "dojo/_base/window" // win.body
+], function(touch, array, declare, domClass, lang, win){
+
+// module:
+// 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.
+
+return 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);
+
+ // Automatically monitor mouse events (essentially :hover and :active) on this.domNode
+ array.forEach(["onmouseenter", "onmouseleave", touch.press], function(e){
+ this.connect(this.domNode, e, "_cssMouseEvent");
+ }, this);
+
+ // Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node
+ array.forEach(["disabled", "readOnly", "checked", "selected", "focused", "state", "hovering", "active"], function(attr){
+ this.watch(attr, lang.hitch(this, "_setStateClass"));
+ }, this);
+
+ // Events on sub nodes within the widget
+ for(var ap in this.cssStateNodes){
+ this._trackMouseState(this[ap], this.cssStateNodes[ap]);
+ }
+ // 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:
+ // 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 "mouseenter":
+ case "mouseover": // generated on non-IE browsers even though we connected to mouseenter
+ this._set("hovering", true);
+ this._set("active", this._mouseDown);
+ break;
+
+ case "mouseleave":
+ case "mouseout": // generated on non-IE browsers even though we connected to mouseleave
+ this._set("hovering", false);
+ this._set("active", false);
+ break;
+
+ case "mousedown":
+ case "touchpress":
+ this._set("active", true);
+ this._mouseDown = true;
+ // Set a global event to handle mouseup, so it fires properly
+ // even if the cursor leaves this.domNode before the mouse up event.
+ // Alternately could set active=false on mouseout.
+ var mouseUpConnector = this.connect(win.body(), touch.release, function(){
+ this._mouseDown = false;
+ this._set("active", false);
+ this.disconnect(mouseUpConnector);
+ });
+ 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.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;
+ },
+
+ _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).
+
+ // Current state of node (initially false)
+ // NB: setting specifically to false because domClass.toggle() needs true boolean as third arg
+ var hovering=false, active=false, focused=false;
+
+ var self = this,
+ cn = lang.hitch(this, "connect", node);
+
+ function setClass(){
+ var disabled = ("disabled" in self && self.disabled) || ("readonly" in self && self.readonly);
+ domClass.toggle(node, clazz+"Hover", hovering && !active && !disabled);
+ domClass.toggle(node, clazz+"Active", active && !disabled);
+ domClass.toggle(node, clazz+"Focused", focused && !disabled);
+ }
+
+ // Mouse
+ cn("onmouseenter", function(){
+ hovering = true;
+ setClass();
+ });
+ cn("onmouseleave", function(){
+ hovering = false;
+ active = false;
+ setClass();
+ });
+ cn(touch.press, function(){
+ active = true;
+ setClass();
+ });
+ cn(touch.release, function(){
+ active = false;
+ setClass();
+ });
+
+ // Focus
+ cn("onfocus", function(){
+ focused = true;
+ setClass();
+ });
+ cn("onblur", function(){
+ focused = false;
+ setClass();
+ });
+
+ // Just in case widget is enabled/disabled while it has focus/hover/active state.
+ // Maybe this is overkill.
+ this.watch("disabled", setClass);
+ this.watch("readOnly", setClass);
+ }
+});
+});
diff --git a/lib/dijit/_DialogMixin.js b/lib/dijit/_DialogMixin.js
index 0c3024a8a..1de17e124 100644
--- a/lib/dijit/_DialogMixin.js
+++ b/lib/dijit/_DialogMixin.js
@@ -1,80 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._DialogMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._DialogMixin"] = true;
-dojo.provide("dijit._DialogMixin");
-dojo.require("dijit._Widget");
-
-
-dojo.declare("dijit._DialogMixin", null,
- {
- // summary:
- // This provides functions useful to Dialog and TooltipDialog
-
- attributeMap: dijit._Widget.prototype.attributeMap,
-
- 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 = dijit._getTabNavigable(this.containerNode);
- this._firstFocusItem = elems.lowest || elems.first || this.closeButtonNode || this.domNode;
- this._lastFocusItem = elems.last || elems.highest || this._firstFocusItem;
- }
- }
-);
-
-}
+//>>built
+define("dijit/_DialogMixin",["dojo/_base/declare","./a11y"],function(_1,_2){return _1("dijit._DialogMixin",null,{execute:function(){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(){var _3=_2._getTabNavigable(this.containerNode);this._firstFocusItem=_3.lowest||_3.first||this.closeButtonNode||this.domNode;this._lastFocusItem=_3.last||_3.highest||this._firstFocusItem;}});}); \ No newline at end of file
diff --git a/lib/dijit/_DialogMixin.js.uncompressed.js b/lib/dijit/_DialogMixin.js.uncompressed.js
new file mode 100644
index 000000000..efb2f66b0
--- /dev/null
+++ b/lib/dijit/_DialogMixin.js.uncompressed.js
@@ -0,0 +1,72 @@
+define("dijit/_DialogMixin", [
+ "dojo/_base/declare", // declare
+ "./a11y" // _getTabNavigable
+], function(declare, a11y){
+
+ // module:
+ // dijit/_DialogMixin
+ // summary:
+ // _DialogMixin provides functions useful to Dialog and TooltipDialog
+
+ 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 b/lib/dijit/_FocusMixin.js
new file mode 100644
index 000000000..6d8e50d80
--- /dev/null
+++ b/lib/dijit/_FocusMixin.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/_FocusMixin",["./focus","./_WidgetBase","dojo/_base/declare","dojo/_base/lang"],function(_1,_2,_3,_4){_4.extend(_2,{focused:false,onFocus:function(){},onBlur:function(){},_onFocus:function(){this.onFocus();},_onBlur:function(){this.onBlur();}});return _3("dijit._FocusMixin",null,{_focusManager:_1});}); \ No newline at end of file
diff --git a/lib/dijit/_FocusMixin.js.uncompressed.js b/lib/dijit/_FocusMixin.js.uncompressed.js
new file mode 100644
index 000000000..0759329e4
--- /dev/null
+++ b/lib/dijit/_FocusMixin.js.uncompressed.js
@@ -0,0 +1,73 @@
+define("dijit/_FocusMixin", [
+ "./focus",
+ "./_WidgetBase",
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang" // lang.extend
+], function(focus, _WidgetBase, declare, lang){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+=====*/
+
+ // module:
+ // dijit/_FocusMixin
+ // summary:
+ // Mixin to widget to provide _onFocus() and _onBlur() methods that
+ // fire when a widget or it's descendants get/lose focus
+
+ // 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 it's 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 e1e9c1ca2..bed09ec07 100644
--- a/lib/dijit/_HasDropDown.js
+++ b/lib/dijit/_HasDropDown.js
@@ -1,443 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._HasDropDown"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._HasDropDown"] = true;
-dojo.provide("dijit._HasDropDown");
-dojo.require("dijit._Widget");
-
-
-dojo.declare("dijit._HasDropDown",
- null,
- {
- // 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 dojoAttachPoint 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 dojoAttachPoint 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 dojoAttachPoint 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 dojoAttachPoint 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 subwidget
- _stopClickEvents: true,
-
- _onDropDownMouseDown: function(/*Event*/ e){
- // summary:
- // Callback when the user mousedown's on the arrow icon
-
- if(this.disabled || this.readOnly){ return; }
-
- dojo.stopEvent(e);
-
- this._docHandler = this.connect(dojo.doc, "onmouseup", "_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 is a simple menu and the mouse is over the menu, we execute it, otherwise, we focus our
- // dropDown node. 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 = dojo.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(dojo.hasClass(t, "dijitPopup")){
- overMenu = true;
- }else{
- t = t.parentNode;
- }
- }
- if(overMenu){
- t = e.target;
- if(dropDown.onItemClick){
- var menuItem;
- while(t && !(menuItem = dijit.byNode(t))){
- t = t.parentNode;
- }
- if(menuItem && menuItem.onClick && menuItem.getParent){
- menuItem.getParent().onItemClick(menuItem, e);
- }
- }
- return;
- }
- }
- }
- if(this._opened && dropDown.focus && dropDown.autoFocus !== false){
- // Focus the dropdown widget - do it on a delay so that we
- // don't steal our own focus.
- window.setTimeout(dojo.hitch(dropDown, "focus"), 1);
- }
- },
-
- _onDropDownClick: function(/*Event*/ e){
- // the drop down was already opened on mousedown/keydown; just need to call stopEvent()
- if(this._stopClickEvents){
- dojo.stopEvent(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";
- dojo.addClass(this._arrowWrapperNode || this._buttonNode, "dijit" + defaultPos + "ArrowButton");
- },
-
- postCreate: function(){
- // summary:
- // set up nodes and connect our mouse and keypress events
-
- this.inherited(arguments);
-
- this.connect(this._buttonNode, "onmousedown", "_onDropDownMouseDown");
- this.connect(this._buttonNode, "onclick", "_onDropDownClick");
- this.connect(this.focusNode, "onkeypress", "_onKey");
- this.connect(this.focusNode, "onkeyup", "_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 */
- dojo.stopEvent(e);
- return;
- }
- }
- if(d && this._opened && e.charOrCode == dojo.keys.ESCAPE){
- this.closeDropDown();
- dojo.stopEvent(e);
- }else if(!this._opened &&
- (e.charOrCode == dojo.keys.DOWN_ARROW ||
- ( (e.charOrCode == dojo.keys.ENTER || e.charOrCode == " ") &&
- //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;
- dojo.stopEvent(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){
- setTimeout(dojo.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 = dijit._curFocus && this.dropDown && dojo.isDescendant(dijit._curFocus, this.dropDown.domNode);
-
- this.closeDropDown(focusMe);
-
- this.inherited(arguments);
- },
-
- isLoaded: function(){
- // summary:
- // Returns whether or not the dropdown is loaded. This can
- // be overridden in order to force a call to loadDropDown().
- // tags:
- // protected
-
- return true;
- },
-
- loadDropDown: function(/* Function */ loadCallback){
- // summary:
- // Loads the data for the dropdown, and at some point, calls
- // the given callback. This is basically a callback when the
- // user presses the down arrow button to open the drop down.
- // tags:
- // protected
-
- loadCallback();
- },
-
- 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){
- // If we aren't loaded, load it first so there isn't a flicker
- if(!this.isLoaded()){
- this.loadDropDown(dojo.hitch(this, "openDropDown"));
- return;
- }else{
- this.openDropDown();
- }
- }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 = "";
- }
- dojo.style(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 = dojo.window.getBox(),
- position = dojo.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
- if(dropDown.startup && !dropDown._started){
- dropDown.startup();
- }
-
- dijit.popup.moveOffScreen(dropDown);
- // Get size of drop down, and determine if vertical scroll bar needed
- var mb = dojo._getMarginSize(ddNode);
- var overHeight = (maxHeight && mb.h > maxHeight);
- dojo.style(ddNode, {
- overflowX: "hidden",
- overflowY: overHeight ? "auto" : "hidden"
- });
- 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(dojo.isFunction(dropDown.resize)){
- dropDown.resize(mb);
- }else{
- dojo.marginBox(ddNode, mb);
- }
- }
-
- var retVal = dijit.popup.open({
- parent: this,
- popup: dropDown,
- around: aroundNode,
- orient: dijit.getPopupAroundAlignment((this.dropDownPosition && this.dropDownPosition.length) ? this.dropDownPosition : ["below"],this.isLeftToRight()),
- onExecute: function(){
- self.closeDropDown(true);
- },
- onCancel: function(){
- self.closeDropDown(true);
- },
- onClose: function(){
- dojo.attr(self._popupStateNode, "popupActive", false);
- dojo.removeClass(self._popupStateNode, "dijitHasDropDownOpen");
- self._opened = false;
- }
- });
- dojo.attr(this._popupStateNode, "popupActive", "true");
- dojo.addClass(self._popupStateNode, "dijitHasDropDownOpen");
- this._opened=true;
-
- // TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
- 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._opened){
- if(focus){ this.focus(); }
- dijit.popup.close(this.dropDown);
- this._opened = false;
- }
- }
-
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/_HasDropDown.js.uncompressed.js b/lib/dijit/_HasDropDown.js.uncompressed.js
new file mode 100644
index 000000000..06f8a7154
--- /dev/null
+++ b/lib/dijit/_HasDropDown.js.uncompressed.js
@@ -0,0 +1,502 @@
+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",
+ "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE
+ "dojo/_base/lang", // lang.hitch lang.isFunction
+ "dojo/touch",
+ "dojo/_base/window", // win.doc
+ "dojo/window", // winUtils.getBox
+ "./registry", // registry.byNode()
+ "./focus",
+ "./popup",
+ "./_FocusMixin"
+], function(declare, Deferred, event,dom, domAttr, domClass, domGeometry, domStyle, has, keys, lang, touch,
+ win, winUtils, registry, focus, popup, _FocusMixin){
+
+/*=====
+ var _FocusMixin = dijit._FocusMixin;
+=====*/
+
+ // module:
+ // dijit/_HasDropDown
+ // summary:
+ // Mixin for widgets that need drop down ability.
+
+ 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 subwidget
+ _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 propogation, so that:
+ // 1. TimeTextBox etc. can focusthe <input> on mousedown
+ // 2. dropDownButtonActive class applied by _CssStateMixin (on button depress)
+ // 3. user defined onMouseDown handler fires
+ e.preventDefault();
+
+ this._docHandler = this.connect(win.doc, touch.release, "_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 our own focus.
+ window.setTimeout(lang.hitch(dropDown, "focus"), 1);
+ }
+ }else{
+ // The drop down arrow icon probably can't receive focus, but widget itself should get focus.
+ // setTimeout() needed to make it work on IE (test DateTextBox)
+ setTimeout(lang.hitch(this, "focus"), 0);
+ }
+
+ if(has("ios")){
+ this._justGotMouseUp = true;
+ setTimeout(lang.hitch(this, function(){
+ this._justGotMouseUp = false;
+ }), 0);
+ }
+ },
+
+ _onDropDownClick: function(/*Event*/ e){
+ if(has("ios") && !this._justGotMouseUp){
+ // This branch fires on iPhone for ComboBox, because the button node is an <input> and doesn't
+ // generate touchstart/touchend events. Pretend we just got a mouse down / mouse up.
+ // The if(has("ios") 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 keypress events
+
+ this.inherited(arguments);
+
+ this.connect(this._buttonNode, touch.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){
+ // 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.charOrCode == keys.ESCAPE){
+ this.closeDropDown();
+ event.stop(e);
+ }else if(!this._opened &&
+ (e.charOrCode == keys.DOWN_ARROW ||
+ ( (e.charOrCode == keys.ENTER || e.charOrCode == " ") &&
+ //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){
+ setTimeout(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(),
+ 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
+ var mb = domGeometry.getMarginSize(ddNode);
+ var overHeight = (maxHeight && mb.h > maxHeight);
+ domStyle.set(ddNode, {
+ overflowX: "hidden",
+ overflowY: overHeight ? "auto" : "hidden"
+ });
+ 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._opened = false;
+ }
+ });
+ domAttr.set(this._popupStateNode, "popupActive", "true");
+ domClass.add(self._popupStateNode, "dijitHasDropDownOpen");
+ this._opened=true;
+
+ // TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
+ 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._opened){
+ if(focus){ this.focus(); }
+ popup.close(this.dropDown);
+ this._opened = false;
+ }
+ }
+
+ });
+});
diff --git a/lib/dijit/_KeyNavContainer.js b/lib/dijit/_KeyNavContainer.js
index aa1bcad4b..4d0a2e12c 100644
--- a/lib/dijit/_KeyNavContainer.js
+++ b/lib/dijit/_KeyNavContainer.js
@@ -1,261 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._KeyNavContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._KeyNavContainer"] = true;
-dojo.provide("dijit._KeyNavContainer");
-dojo.require("dijit._Container");
-
-
-dojo.declare("dijit._KeyNavContainer",
- dijit._Container,
- {
-
- // summary:
- // A _Container with keyboard navigation of its children.
- // description:
- // To use this mixin, call connectKeyNavHandlers() in
- // postCreate() and call startupKeyNavChildren() in startup().
- // 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: Integer
- // 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",
-
- _keyNavCodes: {},
-
- connectKeyNavHandlers: function(/*dojo.keys[]*/ prevKeyCodes, /*dojo.keys[]*/ nextKeyCodes){
- // summary:
- // Call in postCreate() to attach the keyboard handlers
- // to the container.
- // preKeyCodes: dojo.keys[]
- // Key codes for navigating to the previous child.
- // nextKeyCodes: dojo.keys[]
- // Key codes for navigating to the next child.
- // tags:
- // protected
-
- var keyCodes = (this._keyNavCodes = {});
- var prev = dojo.hitch(this, this.focusPrev);
- var next = dojo.hitch(this, this.focusNext);
- dojo.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev; });
- dojo.forEach(nextKeyCodes, function(code){ keyCodes[code] = next; });
- keyCodes[dojo.keys.HOME] = dojo.hitch(this, "focusFirstChild");
- keyCodes[dojo.keys.END] = dojo.hitch(this, "focusLastChild");
- this.connect(this.domNode, "onkeypress", "_onContainerKeypress");
- this.connect(this.domNode, "onfocus", "_onContainerFocus");
- },
-
- startupKeyNavChildren: function(){
- // summary:
- // Call in startup() to set child tabindexes to -1
- // tags:
- // protected
- dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
- },
-
- addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
- // summary:
- // Add a child to our _Container
- dijit._KeyNavContainer.superclass.addChild.apply(this, 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
- var child = this._getFirstFocusableChild();
- if(child){ // edge case: Menu could be empty or hidden
- this.focusChild(child);
- }
- },
-
- focusLastChild: function(){
- // summary:
- // Focus the last focusable child in the container.
- // tags:
- // protected
- var child = this._getLastFocusableChild();
- if(child){ // edge case: Menu could be empty or hidden
- this.focusChild(child);
- }
- },
-
- focusNext: function(){
- // summary:
- // Focus the next widget
- // tags:
- // protected
- var child = this._getNextFocusableChild(this.focusedChild, 1);
- this.focusChild(child);
- },
-
- 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
- var child = this._getNextFocusableChild(this.focusedChild, -1);
- this.focusChild(child, true);
- },
-
- focusChild: function(/*dijit._Widget*/ widget, /*Boolean*/ last){
- // summary:
- // Focus 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(this.focusedChild && widget !== this.focusedChild){
- this._onChildBlur(this.focusedChild);
- }
- 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._Widget*/ 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)
-
- // focus bubbles on Firefox,
- // so just make sure that focus has really gone to the container
- if(evt.target !== this.domNode){ 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
- dojo.attr(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){
- dojo.attr(this.domNode, "tabIndex", this.tabIndex);
- }
- 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();
- dojo.stopEvent(evt);
- }
- },
-
- _onChildBlur: function(/*dijit._Widget*/ widget){
- // summary:
- // Called when focus leaves a child widget to go
- // to a sibling widget.
- // tags:
- // protected
- },
-
- _getFirstFocusableChild: function(){
- // summary:
- // Returns first child that can be focused
- return this._getNextFocusableChild(null, 1); // dijit._Widget
- },
-
- _getLastFocusableChild: function(){
- // summary:
- // Returns last child that can be focused
- return this._getNextFocusableChild(null, -1); // dijit._Widget
- },
-
- _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._Widget
- }
- child = this._getSiblingOfChild(child, dir);
- }
- // no focusable child found
- return null; // dijit._Widget
- }
- }
-);
-
-}
+//>>built
+define("dijit/_KeyNavContainer",["dojo/_base/kernel","./_Container","./_FocusMixin","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/_base/event","dojo/dom-attr","dojo/_base/lang"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){return _6("dijit._KeyNavContainer",[_3,_2],{tabIndex:"0",connectKeyNavHandlers:function(_a,_b){var _c=(this._keyNavCodes={});var _d=_9.hitch(this,"focusPrev");var _e=_9.hitch(this,"focusNext");_4.forEach(_a,function(_f){_c[_f]=_d;});_4.forEach(_b,function(_10){_c[_10]=_e;});_c[_5.HOME]=_9.hitch(this,"focusFirstChild");_c[_5.END]=_9.hitch(this,"focusLastChild");this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){_1.deprecated("startupKeyNavChildren() call no longer needed","","2.0");},startup:function(){this.inherited(arguments);_4.forEach(this.getChildren(),_9.hitch(this,"_startupChild"));},addChild:function(_11,_12){this.inherited(arguments);this._startupChild(_11);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){this.focusChild(this._getFirstFocusableChild());},focusLastChild:function(){this.focusChild(this._getLastFocusableChild());},focusNext:function(){this.focusChild(this._getNextFocusableChild(this.focusedChild,1));},focusPrev:function(){this.focusChild(this._getNextFocusableChild(this.focusedChild,-1),true);},focusChild:function(_13,_14){if(!_13){return;}if(this.focusedChild&&_13!==this.focusedChild){this._onChildBlur(this.focusedChild);}_13.set("tabIndex",this.tabIndex);_13.focus(_14?"end":"start");this._set("focusedChild",_13);},_startupChild:function(_15){_15.set("tabIndex","-1");this.connect(_15,"_onFocus",function(){_15.set("tabIndex",this.tabIndex);});this.connect(_15,"_onBlur",function(){_15.set("tabIndex","-1");});},_onContainerFocus:function(evt){if(evt.target!==this.domNode||this.focusedChild){return;}this.focusFirstChild();_8.set(this.domNode,"tabIndex","-1");},_onBlur:function(evt){if(this.tabIndex){_8.set(this.domNode,"tabIndex",this.tabIndex);}this.focusedChild=null;this.inherited(arguments);},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var _16=this._keyNavCodes[evt.charOrCode];if(_16){_16();_7.stop(evt);}},_onChildBlur:function(){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getLastFocusableChild:function(){return this._getNextFocusableChild(null,-1);},_getNextFocusableChild:function(_17,dir){if(_17){_17=this._getSiblingOfChild(_17,dir);}var _18=this.getChildren();for(var i=0;i<_18.length;i++){if(!_17){_17=_18[(dir>0)?0:(_18.length-1)];}if(_17.isFocusable()){return _17;}_17=this._getSiblingOfChild(_17,dir);}return null;}});}); \ No newline at end of file
diff --git a/lib/dijit/_KeyNavContainer.js.uncompressed.js b/lib/dijit/_KeyNavContainer.js.uncompressed.js
new file mode 100644
index 000000000..19f98f91f
--- /dev/null
+++ b/lib/dijit/_KeyNavContainer.js.uncompressed.js
@@ -0,0 +1,264 @@
+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){
+
+/*=====
+ var _FocusMixin = dijit._FocusMixin;
+ var _Container = dijit._Container;
+=====*/
+
+ // module:
+ // dijit/_KeyNavContainer
+ // summary:
+ // A _Container with keyboard navigation of its children.
+
+ 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: Integer
+ // 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._Widget*/ 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._Widget*/ 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._Widget*/ 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._Widget*/ /*===== 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._Widget
+ },
+
+ _getLastFocusableChild: function(){
+ // summary:
+ // Returns last child that can be focused
+ return this._getNextFocusableChild(null, -1); // dijit._Widget
+ },
+
+ _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._Widget
+ }
+ child = this._getSiblingOfChild(child, dir);
+ }
+ // no focusable child found
+ return null; // dijit._Widget
+ }
+ });
+});
diff --git a/lib/dijit/_MenuBase.js b/lib/dijit/_MenuBase.js
new file mode 100644
index 000000000..3e459f994
--- /dev/null
+++ b/lib/dijit/_MenuBase.js
@@ -0,0 +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
diff --git a/lib/dijit/_MenuBase.js.uncompressed.js b/lib/dijit/_MenuBase.js.uncompressed.js
new file mode 100644
index 000000000..ab4f115c4
--- /dev/null
+++ b/lib/dijit/_MenuBase.js.uncompressed.js
@@ -0,0 +1,391 @@
+define("dijit/_MenuBase", [
+ "./popup",
+ "dojo/window",
+ "./_Widget",
+ "./_KeyNavContainer",
+ "./_TemplatedMixin",
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.isDescendant domClass.replace
+ "dojo/dom-attr",
+ "dojo/dom-class", // domClass.replace
+ "dojo/_base/lang", // lang.hitch
+ "dojo/_base/array" // array.indexOf
+], function(pm, winUtils, _Widget, _KeyNavContainer, _TemplatedMixin,
+ declare, dom, domAttr, domClass, lang, array){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _KeyNavContainer = dijit._KeyNavContainer;
+=====*/
+
+// module:
+// dijit/_MenuBase
+// summary:
+// Base class for Menu and MenuBar
+
+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,
+
+ 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.focusedChild._onClick(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 = setTimeout(lang.hitch(this, "_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;
+ },
+
+ _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 = setTimeout(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; }
+ },
+
+ _stopPopupTimer: function(){
+ // summary:
+ // Cancels the popup timer because the user has stop hovering
+ // on the MenuItem, etc.
+ // tags:
+ // private
+ if(this.hover_timer){
+ clearTimeout(this.hover_timer);
+ this.hover_timer = null;
+ }
+ },
+
+ _stopPendingCloseTimer: function(/*dijit._Widget*/ popup){
+ // summary:
+ // Cancels the pending-close timer because the close has been preempted
+ // tags:
+ // private
+ if(popup._pendingClose_timer){
+ clearTimeout(popup._pendingClose_timer);
+ popup._pendingClose_timer = null;
+ }
+ },
+
+ _stopFocusTimer: function(){
+ // summary:
+ // Cancels the pending-focus timer because the menu was closed before focus occured
+ // tags:
+ // private
+ if(this._focus_timer){
+ clearTimeout(this._focus_timer);
+ this._focus_timer = null;
+ }
+ },
+
+ _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._Widget*/ 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();
+ }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(evt);
+ }
+ },
+
+ _openPopup: function(){
+ // summary:
+ // Open the popup to the side of/underneath the current menu 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){ return; }
+ 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(popup.focus){
+ // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar),
+ // if the cursor happens to collide with the popup, it will generate an onmouseover event
+ // even though the mouse wasn't moved. Use a setTimeout() to call popup.focus so that
+ // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742)
+ popup._focus_timer = setTimeout(lang.hitch(popup, function(){
+ this._focus_timer = null;
+ this.focus();
+ }), 0);
+ }
+ },
+
+ _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.focusedChild._onUnhover();
+ 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._hoveredChild._onUnhover(); // 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
new file mode 100644
index 000000000..d4d8c966d
--- /dev/null
+++ b/lib/dijit/_OnDijitClickMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/_OnDijitClickMixin.js.uncompressed.js b/lib/dijit/_OnDijitClickMixin.js.uncompressed.js
new file mode 100644
index 000000000..8cc9a98c6
--- /dev/null
+++ b/lib/dijit/_OnDijitClickMixin.js.uncompressed.js
@@ -0,0 +1,125 @@
+define("dijit/_OnDijitClickMixin", [
+ "dojo/on",
+ "dojo/_base/array", // array.forEach
+ "dojo/keys", // keys.ENTER keys.SPACE
+ "dojo/_base/declare", // declare
+ "dojo/_base/sniff", // has("ie")
+ "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/_OnDijitClickMixin
+ // summary:
+ // Mixin so you can pass "ondijitclick" to this.connect() method,
+ // as a way to handle clicks by mouse, or by keyboard (SPACE/ENTER key)
+
+
+ // 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("ie")){
+ (function(){
+ var keydownCallback = function(evt){
+ lastKeyDownNode = evt.srcElement;
+ };
+ win.doc.attachEvent('onkeydown', keydownCallback);
+ unload.addOnWindowUnload(function(){
+ win.doc.detachEvent('onkeydown', keydownCallback);
+ });
+ })();
+ }else{
+ win.doc.addEventListener('keydown', function(evt){
+ lastKeyDownNode = evt.target;
+ }, true);
+ }
+
+ // Custom a11yclick (a.k.a. ondijitclick) event
+ var a11yclick = function(node, listener){
+ 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.
+
+ function clickKey(/*Event*/ e){
+ return (e.keyCode == keys.ENTER || e.keyCode == keys.SPACE) &&
+ !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey;
+ }
+ var handles = [
+ on(node, "keypress", 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)
+ // Do this onkeypress rather than onkeydown because onkeydown.preventDefault() will
+ // suppress the onkeypress event, breaking _HasDropDown
+ 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;
+ listener.call(this, e);
+ }
+ }),
+
+ on(node, "click", function(e){
+ // and connect for mouse clicks too (or touch-clicks on mobile)
+ listener.call(this, e);
+ })
+ ];
+
+ return {
+ remove: function(){
+ array.forEach(handles, function(h){ h.remove(); });
+ }
+ };
+ }
+ };
+
+ return 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 dijit.form.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]);
+ }
+ });
+});
diff --git a/lib/dijit/_PaletteMixin.js b/lib/dijit/_PaletteMixin.js
index 1511433eb..22b66fa81 100644
--- a/lib/dijit/_PaletteMixin.js
+++ b/lib/dijit/_PaletteMixin.js
@@ -1,326 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._PaletteMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._PaletteMixin"] = true;
-dojo.provide("dijit._PaletteMixin");
-dojo.require("dijit._CssStateMixin");
-
-
-dojo.declare("dijit._PaletteMixin",
- [dijit._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
- // < 1.0 means that each typematic event fires at an increasing faster rate
- timeoutChangeRate: 0.90,
-
- // value: String
- // Currently selected color/emoticon/etc.
- value: null,
-
- // _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] String
- // Name of javascript class for Object created for each cell of the palette.
- // dyeClass should implements dijit.Dye interface
- dyeClass: '',
-
- _preparePalette: function(choices, titles, dyeClassObj) {
- // 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
- // dyeClassObj: Constructor?
- // If specified, use this constructor rather than this.dyeClass
-
- this._cells = [];
- var url = this._blankGif;
-
- dyeClassObj = dyeClassObj || dojo.getObject(this.dyeClass);
-
- for(var row=0; row < choices.length; row++){
- var rowNode = dojo.create("tr", {tabIndex: "-1"}, this.gridNode);
- for(var col=0; col < choices[row].length; col++){
- var value = choices[row][col];
- if(value){
- var cellObject = new dyeClassObj(value, row, col);
-
- var cellNode = dojo.create("td", {
- "class": this.cellClass,
- tabIndex: "-1",
- title: titles[value]
- });
-
- // prepare cell inner structure
- cellObject.fillCell(cellNode, url);
-
- this.connect(cellNode, "ondijitclick", "_onCellClick");
- this._trackMouseState(cellNode, this.cellClass);
-
- dojo.place(cellNode, rowNode);
-
- cellNode.index = 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._connects.push(
- dijit.typematic.addKeyListener(
- this.domNode,
- {charOrCode:dojo.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
- dijit.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.currentTarget,
- 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.
- // Use setTimeout because IE doesn't like changing focus inside of an event handler.
- this._setCurrent(target);
- setTimeout(dojo.hitch(this, function(){
- dijit.focus(target);
- this._setValueAttr(value, true);
- }));
-
- // workaround bug where hover class is not removed on popup because the popup is
- // closed and then there's no onblur event on the cell
- dojo.removeClass(target, "dijitPaletteCellHover");
-
- dojo.stopEvent(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
- dojo.attr(this._currentFocus, "tabIndex", "-1");
- }
-
- // Set tabIndex of new cell
- this._currentFocus = node;
- if(node){
- dojo.attr(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:
- // Optional parameter used to tell the select whether or not to fire
- // onChange event.
-
- // clear old selected cell
- if(this._selectedCell >= 0){
- dojo.removeClass(this._cells[this._selectedCell].node, "dijitPaletteCellSelected");
- }
- 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;
- dojo.addClass(this._cells[i].node, "dijitPaletteCellSelected");
- 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.index + 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 setTimeout because IE doesn't like changing focus inside of an event handler
- setTimeout(dojo.hitch(dijit, "focus", focusNode), 0);
- }
- },
-
- _getDye: function(/*DomNode*/ cell){
- // summary:
- // Get JS object for given cell DOMNode
-
- return this._cells[cell.index].dye;
- }
-});
-
-/*=====
-dojo.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
- }
- }
-);
-=====*/
-
-}
+//>>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
diff --git a/lib/dijit/_PaletteMixin.js.uncompressed.js b/lib/dijit/_PaletteMixin.js.uncompressed.js
new file mode 100644
index 000000000..fa93b6feb
--- /dev/null
+++ b/lib/dijit/_PaletteMixin.js.uncompressed.js
@@ -0,0 +1,345 @@
+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){
+
+/*=====
+ var _CssStateMixin = dijit._CssStateMixin;
+=====*/
+
+// module:
+// dijit/_PaletteMixin
+// summary:
+// A keyboard accessible palette, for picking a color/emoticon/etc.
+
+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
+ // < 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] String
+ // Name of javascript class for Object created for each cell of the palette.
+ // dyeClass should implements dijit.Dye interface
+ dyeClass: '',
+
+ // summary: String
+ // Localized summary for the palette table
+ summary: '',
+ _setSummaryAttr: "paletteTableNode",
+
+ _dyeFactory: function(value /*===== , row, col =====*/){
+ // summary:
+ // Return instance of dijit.Dye for specified cell of palette
+ // tags:
+ // extension
+ var dyeClassObj = lang.getObject(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);
+
+ var cellNode = domConstruct.create("td", {
+ "class": this.cellClass,
+ tabIndex: "-1",
+ title: titles[value],
+ role: "gridcell"
+ });
+
+ // prepare cell inner structure
+ cellObject.fillCell(cellNode, url);
+
+ domConstruct.place(cellNode, rowNode);
+
+ cellNode.index = 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._connects.push(
+ 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:
+ // 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.index + 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 setTimeout because IE doesn't like changing focus inside of an event handler
+ setTimeout(lang.hitch(dijit, "focus", focusNode), 0);
+ }
+ },
+
+ _getDye: function(/*DomNode*/ cell){
+ // summary:
+ // Get JS object for given cell DOMNode
+
+ return this._cells[cell.index].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 b/lib/dijit/_Templated.js
index 2e8d6b72f..f21df3a16 100644
--- a/lib/dijit/_Templated.js
+++ b/lib/dijit/_Templated.js
@@ -1,351 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._Templated"] = true;
-dojo.provide("dijit._Templated");
-dojo.require("dijit._Widget");
-dojo.require("dojo.string");
-dojo.require("dojo.parser");
-dojo.require("dojo.cache");
-
-
-dojo.declare("dijit._Templated",
- null,
- {
- // summary:
- // Mixin for widgets that are instantiated from a template
-
- // templateString: [protected] String
- // A string that represents the widget template. Pre-empts the
- // templatePath. In builds that have their strings "interned", the
- // templatePath is converted to an inline templateString, thereby
- // preventing a synchronous network call.
- //
- // 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 dojo.cache() instead.
- templatePath: null,
-
- // widgetsInTemplate: [protected] Boolean
- // Should we parse the template to find widgets that might be
- // declared in markup inside it? False by default.
- widgetsInTemplate: false,
-
- // skipNodeCache: [protected] Boolean
- // If using a cached widget template node 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 dojoAttachPoint=... in the
- // template, ex: ["containerNode", "labelNode"]
- _attachPoints: [],
- =====*/
-
-/*=====
- // _attachEvents: [private] Handle[]
- // List of connections associated with dojoAttachEvent=... in the
- // template
- _attachEvents: [],
- =====*/
-
- constructor: function(){
- 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 dojo.string.substitute(tmpl, this, function(value, key){
- if(key.charAt(0) == '!'){ value = dojo.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
-
- // 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 = dijit._Templated.getCachedTemplate(this.templatePath, this.templateString, this._skipNodeCache);
-
- var node;
- if(dojo.isString(cached)){
- node = dojo._toDom(this._stringRepl(cached));
- 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 attributeMap
- 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);
-
- if(this.widgetsInTemplate){
- // Store widgets that we need to start at a later point in time
- var cw = (this._startupWidgets = dojo.parser.parse(node, {
- noStart: !this._earlyTemplatedStartup,
- template: true,
- inherited: {dir: this.dir, lang: this.lang},
- 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
- }));
-
- this._supportingWidgets = dijit.findWidgets(node);
-
- this._attachTemplateNodes(cw, function(n,p){
- return n[p];
- });
- }
-
- this._fillContent(this.srcNodeRef);
- },
-
- _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 dojoAttachPoint
- // 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
- // * dojoAttachEvent
- // * waiRole
- // * waiState
- // rootNode: DomNode|Array[Widgets]
- // 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
-
- getAttrFunc = getAttrFunc || function(n,p){ return n.getAttribute(p); };
-
- var nodes = dojo.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*"));
- var x = dojo.isArray(rootNode) ? 0 : -1;
- for(; x<nodes.length; x++){
- var baseNode = (x == -1) ? rootNode : nodes[x];
- if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){
- continue;
- }
- // Process dojoAttachPoint
- 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(dojo.isArray(this[point])){
- this[point].push(baseNode);
- }else{
- this[point]=baseNode;
- }
- this._attachPoints.push(point);
- }
- }
-
- // Process dojoAttachEvent
- 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 = dojo.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;
- }
- this._attachEvents.push(this.connect(baseNode, event, thisFunc));
- }
- }
- }
-
- // waiRole, waiState
- // TODO: remove this in 2.0, templates are now using role=... and aria-XXX=... attributes directicly
- var role = getAttrFunc(baseNode, "waiRole");
- if(role){
- dijit.setWaiRole(baseNode, role);
- }
- var values = getAttrFunc(baseNode, "waiState");
- if(values){
- dojo.forEach(values.split(/\s*,\s*/), function(stateValue){
- if(stateValue.indexOf('-') != -1){
- var pair = stateValue.split('-');
- dijit.setWaiState(baseNode, pair[0], pair[1]);
- }
- });
- }
- }
- },
-
- startup: function(){
- dojo.forEach(this._startupWidgets, function(w){
- if(w && !w._started && w.startup){
- w.startup();
- }
- });
- this.inherited(arguments);
- },
-
- destroyRendering: function(){
- // Delete all attach points to prevent IE6 memory leaks.
- dojo.forEach(this._attachPoints, function(point){
- delete this[point];
- }, this);
- this._attachPoints = [];
-
- // And same for event handlers
- dojo.forEach(this._attachEvents, this.disconnect, this);
- this._attachEvents = [];
-
- this.inherited(arguments);
- }
- }
-);
-
-// key is either templatePath or templateString; object is either string or DOM tree
-dijit._Templated._templateCache = {};
-
-dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwaysUseString){
- // summary:
- // Static method to get a template based on the templatePath or
- // templateString key
- // templatePath: String||dojo.uri.Uri
- // The URL to get the template from.
- // templateString: String?
- // a string to use in lieu of fetching the template from a URL. Takes precedence
- // over templatePath
- // 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 = dijit._Templated._templateCache;
- var key = templateString || templatePath;
- 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 == dojo.doc){
- // string or node of the same document
- return cached;
- }
- }catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded
- dojo.destroy(cached);
- }
-
- // If necessary, load template string from template path
- if(!templateString){
- templateString = dojo.cache(templatePath, {sanitize: true});
- }
- templateString = dojo.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 = dojo._toDom(templateString);
- if(node.nodeType != 1){
- throw new Error("Invalid template: " + templateString);
- }
- return (tmplts[key] = node); //Node
- }
-};
-
-if(dojo.isIE){
- dojo.addOnWindowUnload(function(){
- var cache = dijit._Templated._templateCache;
- for(var key in cache){
- var value = cache[key];
- if(typeof value == "object"){ // value is either a string or a DOM node template
- dojo.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.)
-dojo.extend(dijit._Widget,{
- dojoAttachEvent: "",
- dojoAttachPoint: "",
- waiRole: "",
- waiState:""
-});
-
-}
+//>>built
+define("dijit/_Templated",["./_WidgetBase","./_TemplatedMixin","./_WidgetsInTemplateMixin","dojo/_base/array","dojo/_base/declare","dojo/_base/lang","dojo/_base/kernel"],function(_1,_2,_3,_4,_5,_6,_7){_6.extend(_1,{waiRole:"",waiState:""});return _5("dijit._Templated",[_2,_3],{widgetsInTemplate:false,constructor:function(){_7.deprecated(this.declaredClass+": dijit._Templated deprecated, use dijit._TemplatedMixin and if necessary dijit._WidgetsInTemplateMixin","","2.0");},_attachTemplateNodes:function(_8,_9){this.inherited(arguments);var _a=_6.isArray(_8)?_8:(_8.all||_8.getElementsByTagName("*"));var x=_6.isArray(_8)?0:-1;for(;x<_a.length;x++){var _b=(x==-1)?_8:_a[x];var _c=_9(_b,"waiRole");if(_c){_b.setAttribute("role",_c);}var _d=_9(_b,"waiState");if(_d){_4.forEach(_d.split(/\s*,\s*/),function(_e){if(_e.indexOf("-")!=-1){var _f=_e.split("-");_b.setAttribute("aria-"+_f[0],_f[1]);}});}}}});}); \ No newline at end of file
diff --git a/lib/dijit/_Templated.js.uncompressed.js b/lib/dijit/_Templated.js.uncompressed.js
new file mode 100644
index 000000000..1f0d772be
--- /dev/null
+++ b/lib/dijit/_Templated.js.uncompressed.js
@@ -0,0 +1,71 @@
+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){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin;
+=====*/
+
+ // module:
+ // dijit/_Templated
+ // summary:
+ // Deprecated mixin for widgets that are instantiated from a template.
+
+ // 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.)
+ 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
new file mode 100644
index 000000000..683bb8f20
--- /dev/null
+++ b/lib/dijit/_TemplatedMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/_TemplatedMixin.js.uncompressed.js b/lib/dijit/_TemplatedMixin.js.uncompressed.js
new file mode 100644
index 000000000..bbc544b4f
--- /dev/null
+++ b/lib/dijit/_TemplatedMixin.js.uncompressed.js
@@ -0,0 +1,304 @@
+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/_base/sniff", // has("ie")
+ "dojo/_base/unload", // unload.addOnWindowUnload
+ "dojo/_base/window" // win.doc
+], function(lang, touch, _WidgetBase, string, cache, array, declare, domConstruct, has, unload, win) {
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+=====*/
+
+ // module:
+ // dijit/_TemplatedMixin
+ // summary:
+ // Mixin for widgets that are instantiated from a template
+
+ 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(){
+ 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);
+
+ var node;
+ if(lang.isString(cached)){
+ node = domConstruct.toDom(this._stringRepl(cached));
+ 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<nodes.length; x++){
+ 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){
+ // 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
+ // 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 == win.doc){
+ // 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);
+ 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.)
+ lang.extend(_WidgetBase,{
+ dojoAttachEvent: "",
+ dojoAttachPoint: ""
+ });
+
+ return _TemplatedMixin;
+});
diff --git a/lib/dijit/_TimePicker.js b/lib/dijit/_TimePicker.js
index 678223c45..9a4cd100c 100644
--- a/lib/dijit/_TimePicker.js
+++ b/lib/dijit/_TimePicker.js
@@ -1,481 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._TimePicker"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._TimePicker"] = true;
-dojo.provide("dijit._TimePicker");
-dojo.require("dijit.form._FormWidget");
-dojo.require("dojo.date.locale");
-
-
-/*=====
-dojo.declare(
- "dijit._TimePicker.__Constraints",
- dojo.date.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"
- }
-);
-=====*/
-
-dojo.declare("dijit._TimePicker",
- [dijit._Widget, dijit._Templated],
- {
- // 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: dojo.cache("dijit", "templates/TimePicker.html", "<div id=\"widget_${id}\" class=\"dijitMenu\"\n ><div dojoAttachPoint=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" dojoAttachEvent=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&nbsp;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9650;</div></div\n ><div dojoAttachPoint=\"timeMenu,focusNode\" dojoAttachEvent=\"onclick:_onOptionSelected,onmouseover,onmouseout\"></div\n ><div dojoAttachPoint=\"downArrow\" class=\"dijitButtonNode dijitDownArrowButton\" dojoAttachEvent=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" role=\"presentation\">&nbsp;</div\n\t\t><div class=\"dijitArrowButtonChar\">&#9660;</div></div\n></div>\n"),
-
- // 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: dijit._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: dojo.date.stamp.toISOString,
-
-/*=====
- // filterString: string
- // The string to filter by
- filterString: "",
-=====*/
-
- setValue: function(/*Date*/ value){
- // summary:
- // Deprecated. Used set('value') instead.
- // tags:
- // deprecated
- dojo.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(/*Date*/ dateObject, /*String?*/ locale){
- // summary:
- // May be overridden to disable certain dates in the TimePicker e.g. `isDisabledDate=dojo.date.locale.isWeekend`
- // 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 = 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 = 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 = dojo.date.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 % (visibleIncrementSeconds*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>.
- after = this._getFilteredNodes(0, Math.min(this._totalIncrements >> 1, 10) - 1),
- before = this._getFilteredNodes(0, Math.min(this._totalIncrements, 10) - after.length, true, after[0]);
- dojo.forEach(before.concat(after), function(n){this.timeMenu.appendChild(n);}, this);
- },
-
- constructor: function(){
- this.constraints = {}; // create instance object
- },
-
- 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.
- dojo.mixin(this, constraints);
-
- // dojo.date.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, dojo.isIE ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
- this._connects.push(dijit.typematic.addMouseListener(this.upArrow, this, "_onArrowUp", 33, 250));
- this._connects.push(dijit.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"
- dojo.toggleClass(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.setHours(date.getHours() + incrementDate.getHours() * index,
- date.getMinutes() + incrementDate.getMinutes() * index,
- date.getSeconds() + incrementDate.getSeconds() * index);
- if(this.constraints.selector == "time"){
- date.setFullYear(1970,0,1); // make sure each time is for the same date
- }
- var dateString = dojo.date.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 = dojo.create("div", {"class": this.baseClass+"Item"});
- div.date = date;
- div.index = index;
- dojo.create('div',{
- "class": this.baseClass + "ItemInner",
- innerHTML: dateString
- }, div);
-
- if(index%this._visibleIncrement<1 && index%this._visibleIncrement>-1){
- dojo.addClass(div, this.baseClass+"Marker");
- }else if(!(index%this._clickableIncrement)){
- dojo.addClass(div, this.baseClass+"Tick");
- }
-
- if(this.isDisabledDate(date)){
- // set disabled
- dojo.addClass(div, this.baseClass+"ItemDisabled");
- }
- if(this.value && !dojo.date.compare(this.value, date, this.constraints.selector)){
- div.selected = true;
- dojo.addClass(div, this.baseClass+"ItemSelected");
- if(dojo.hasClass(div, this.baseClass+"Marker")){
- dojo.addClass(div, this.baseClass+"MarkerSelected");
- }else{
- dojo.addClass(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;
- }
- dojo.toggleClass(node, this.baseClass+"ItemHover", highlight);
- if(dojo.hasClass(node, this.baseClass+"Marker")){
- dojo.toggleClass(node, this.baseClass+"MarkerHover", highlight);
- }else{
- dojo.toggleClass(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(!dojo.hasClass(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;
- dojo.stopEvent(e);
- // we're not _measuring_ the scroll amount, just direction
- var scrollAmount = (dojo.isIE ? e.wheelDelta : -e.detail);
- this[(scrollAmount>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(typeof count == "number" && count == -1){ return; } // typematic end
- if(!this.timeMenu.childNodes.length){ return; }
- var index = this.timeMenu.childNodes[0].index;
- 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(typeof count == "number" && count == -1){ return; } // typematic end
- if(!this.timeMenu.childNodes.length){ return; }
- var index = this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1].index + 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
- var dk = dojo.keys;
- if(e.charOrCode == dk.DOWN_ARROW || e.charOrCode == dk.UP_ARROW){
- dojo.stopEvent(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 || dojo.query("." + this.baseClass + "ItemSelected", timeMenu)[0];
- if(!tgt){
- tgt = timeMenu.childNodes[0];
- }else if(timeMenu.childNodes.length){
- if(e.charOrCode == dk.DOWN_ARROW && !tgt.nextSibling){
- this._onArrowDown();
- }else if(e.charOrCode == dk.UP_ARROW && !tgt.previousSibling){
- this._onArrowUp();
- }
- if(e.charOrCode == dk.DOWN_ARROW){
- tgt = tgt.nextSibling;
- }else{
- tgt = tgt.previousSibling;
- }
- }
- this._highlightOption(tgt, true);
- this._keyboardSelected = tgt;
- return false;
- }else if(e.charOrCode == dk.ENTER || e.charOrCode === dk.TAB){
- // mouse hover followed by TAB is NO selection
- if(!this._keyboardSelected && e.charOrCode === dk.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.charOrCode === dk.TAB;
- }
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/_TimePicker.js.uncompressed.js b/lib/dijit/_TimePicker.js.uncompressed.js
new file mode 100644
index 000000000..2a89f9eed
--- /dev/null
+++ b/lib/dijit/_TimePicker.js.uncompressed.js
@@ -0,0 +1,506 @@
+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/_base/sniff", // has("ie")
+ "dojo/query", // query
+ "dijit/typematic",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./form/_FormValueWidget",
+ "dojo/text!./templates/TimePicker.html"
+], function(array, ddate, locale, stamp, declare, domClass, domConstruct, event, kernel, keys, lang, has, query,
+ typematic, _Widget, _TemplatedMixin, _FormValueWidget, template){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _FormValueWidget = dijit.form._FormValueWidget;
+=====*/
+
+ // module:
+ // dijit/_TimePicker
+ // summary:
+ // A graphical time picker.
+
+
+ /*=====
+ declare(
+ "dijit._TimePicker.__Constraints",
+ 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 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: dijit._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.length, estBeforeLength - before.length, false, after[after.length-1]);
+ }
+ array.forEach(before.concat(after, moreAfter), function(n){ this.timeMenu.appendChild(n); }, this);
+ },
+
+ constructor: function(){
+ this.constraints = {}; // create instance object
+ },
+
+ 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, has("ie") ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+ this._connects.push(typematic.addMouseListener(this.upArrow, this, "_onArrowUp", 33, 250));
+ this._connects.push(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.setHours(date.getHours() + incrementDate.getHours() * index,
+ date.getMinutes() + incrementDate.getMinutes() * index,
+ date.getSeconds() + incrementDate.getSeconds() * index);
+ 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 = domConstruct.create("div", {"class": this.baseClass+"Item"});
+ div.date = date;
+ div.index = 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
+ var scrollAmount = (has("ie") ? e.wheelDelta : -e.detail);
+ this[(scrollAmount>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(typeof count == "number" && count == -1){ return; } // typematic end
+ if(!this.timeMenu.childNodes.length){ return; }
+ var index = this.timeMenu.childNodes[0].index;
+ 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(typeof count == "number" && count == -1){ return; } // typematic end
+ if(!this.timeMenu.childNodes.length){ return; }
+ var index = this.timeMenu.childNodes[this.timeMenu.childNodes.length - 1].index + 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.charOrCode == keys.DOWN_ARROW || e.charOrCode == 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.charOrCode == keys.DOWN_ARROW && !tgt.nextSibling){
+ this._onArrowDown();
+ }else if(e.charOrCode == keys.UP_ARROW && !tgt.previousSibling){
+ this._onArrowUp();
+ }
+ if(e.charOrCode == keys.DOWN_ARROW){
+ tgt = tgt.nextSibling;
+ }else{
+ tgt = tgt.previousSibling;
+ }
+ }
+ this._highlightOption(tgt, true);
+ this._keyboardSelected = tgt;
+ return false;
+ }else if(e.charOrCode == keys.ENTER || e.charOrCode === keys.TAB){
+ // mouse hover followed by TAB is NO selection
+ if(!this._keyboardSelected && e.charOrCode === 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.charOrCode === keys.TAB;
+ }
+ return undefined;
+ }
+ });
+});
diff --git a/lib/dijit/_Widget.js b/lib/dijit/_Widget.js
index f2f5afcf9..be231b370 100644
--- a/lib/dijit/_Widget.js
+++ b/lib/dijit/_Widget.js
@@ -1,492 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._Widget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._Widget"] = true;
-dojo.provide("dijit._Widget");
-dojo.require("dijit._WidgetBase");
-dojo.require("dijit._base");
-
-
-
-////////////////// DEFERRED CONNECTS ///////////////////
-
-// This code is to assist deferring dojo.connect() calls in widgets (connecting to events on the widgets'
-// DOM nodes) until someone actually needs to monitor that event.
-dojo.connect(dojo, "_connect",
- function(/*dijit._Widget*/ widget, /*String*/ event){
- if(widget && dojo.isFunction(widget._onConnect)){
- widget._onConnect(event);
- }
- });
-
-dijit._connectOnUseEventHandler = function(/*Event*/ event){};
-
-////////////////// ONDIJITCLICK SUPPORT ///////////////////
-
-// 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
-dijit._lastKeyDownNode = null;
-if(dojo.isIE){
- (function(){
- var keydownCallback = function(evt){
- dijit._lastKeyDownNode = evt.srcElement;
- };
- dojo.doc.attachEvent('onkeydown', keydownCallback);
- dojo.addOnWindowUnload(function(){
- dojo.doc.detachEvent('onkeydown', keydownCallback);
- });
- })();
-}else{
- dojo.doc.addEventListener('keydown', function(evt){
- dijit._lastKeyDownNode = evt.target;
- }, true);
-}
-
-(function(){
-
-dojo.declare("dijit._Widget", dijit._WidgetBase, {
- // summary:
- // Base class for all Dijit widgets.
- //
- // Extends _WidgetBase, adding support for:
- // - deferred connections
- // A call like dojo.connect(myWidget, "onMouseMove", func)
- // will essentially do a dojo.connect(myWidget.domNode, "onMouseMove", func)
- // - ondijitclick
- // Support new dojoAttachEvent="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 id 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 ///////////////////
-
- // _deferredConnects: [protected] Object
- // attributeMap addendum for event handlers that should be connected only on first use
- _deferredConnects: {
- onClick: "",
- onDblClick: "",
- onKeyDown: "",
- onKeyPress: "",
- onKeyUp: "",
- onMouseMove: "",
- onMouseDown: "",
- onMouseOut: "",
- onMouseOver: "",
- onMouseLeave: "",
- onMouseEnter: "",
- onMouseUp: ""
- },
-
- onClick: dijit._connectOnUseEventHandler,
- /*=====
- onClick: function(event){
- // summary:
- // Connect to this function to receive notifications of mouse click events.
- // event:
- // mouse Event
- // tags:
- // callback
- },
- =====*/
- onDblClick: dijit._connectOnUseEventHandler,
- /*=====
- onDblClick: function(event){
- // summary:
- // Connect to this function to receive notifications of mouse double click events.
- // event:
- // mouse Event
- // tags:
- // callback
- },
- =====*/
- onKeyDown: dijit._connectOnUseEventHandler,
- /*=====
- onKeyDown: function(event){
- // summary:
- // Connect to this function to receive notifications of keys being pressed down.
- // event:
- // key Event
- // tags:
- // callback
- },
- =====*/
- onKeyPress: dijit._connectOnUseEventHandler,
- /*=====
- onKeyPress: function(event){
- // summary:
- // Connect to this function to receive notifications of printable keys being typed.
- // event:
- // key Event
- // tags:
- // callback
- },
- =====*/
- onKeyUp: dijit._connectOnUseEventHandler,
- /*=====
- onKeyUp: function(event){
- // summary:
- // Connect to this function to receive notifications of keys being released.
- // event:
- // key Event
- // tags:
- // callback
- },
- =====*/
- onMouseDown: dijit._connectOnUseEventHandler,
- /*=====
- 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: dijit._connectOnUseEventHandler,
- /*=====
- 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: dijit._connectOnUseEventHandler,
- /*=====
- 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: dijit._connectOnUseEventHandler,
- /*=====
- 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: dijit._connectOnUseEventHandler,
- /*=====
- 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: dijit._connectOnUseEventHandler,
- /*=====
- 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: dijit._connectOnUseEventHandler,
- /*=====
- onMouseUp: function(event){
- // summary:
- // Connect to this function to receive notifications of when the mouse button is released.
- // event:
- // mouse Event
- // tags:
- // callback
- },
- =====*/
-
- create: function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){
- // To avoid double-connects, remove entries from _deferredConnects
- // that have been setup manually by a subclass (ex, by dojoAttachEvent).
- // If a subclass has redefined a callback (ex: onClick) then assume it's being
- // connected to manually.
- this._deferredConnects = dojo.clone(this._deferredConnects);
- for(var attr in this.attributeMap){
- delete this._deferredConnects[attr]; // can't be in both attributeMap and _deferredConnects
- }
- for(attr in this._deferredConnects){
- if(this[attr] !== dijit._connectOnUseEventHandler){
- delete this._deferredConnects[attr]; // redefined, probably dojoAttachEvent exists
- }
- }
-
- this.inherited(arguments);
-
- if(this.domNode){
- // If the developer has specified a handler as a widget parameter
- // (ex: new Button({onClick: ...})
- // then naturally need to connect from DOM node to that handler immediately,
- for(attr in this.params){
- this._onConnect(attr);
- }
- }
- },
-
- _onConnect: function(/*String*/ event){
- // summary:
- // Called when someone connects to one of my handlers.
- // "Turn on" that handler if it isn't active yet.
- //
- // This is also called for every single initialization parameter
- // so need to do nothing for parameters like "id".
- // tags:
- // private
- if(event in this._deferredConnects){
- var mapNode = this[this._deferredConnects[event] || 'domNode'];
- this.connect(mapNode, event.toLowerCase(), event);
- delete this._deferredConnects[event];
- }
- },
-
- ////////////////// FOCUS RELATED ///////////////////
- // _onFocus() and _onBlur() are called by the focus manager
-
- // focused: [readonly] Boolean
- // This widget or a widget it contains has focus, or is "active" because
- // it was recently clicked.
- focused: false,
-
- isFocusable: function(){
- // summary:
- // Return true if this widget can currently be focused
- // and false if not
- return this.focus && (dojo.style(this.domNode, "display") != "none");
- },
-
- 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(e){
- // 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();
- },
-
- ////////////////// DEPRECATED METHODS ///////////////////
-
- setAttribute: function(/*String*/ attr, /*anything*/ value){
- // summary:
- // Deprecated. Use set() instead.
- // tags:
- // deprecated
- dojo.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(dojo.config.isDebug){
- var alreadyCalledHash = arguments.callee._ach || (arguments.callee._ach = {}),
- caller = (arguments.callee.caller || "unknown caller").toString();
- if(!alreadyCalledHash[caller]){
- dojo.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);
- }
- },
-
- ////////////////// ONDIJITCLICK SUPPORT ///////////////////
-
- // nodesWithKeyClick: [private] String[]
- // List of nodes that correctly handle click events via native browser support,
- // and don't need dijit's help
- nodesWithKeyClick: ["input", "button"],
-
- 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 dojo.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 dijit.form.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
-
- var d = dojo,
- dc = d._connect,
- handles = this.inherited(arguments, [obj, event == "ondijitclick" ? "onclick" : event, method]);
-
- if(event == "ondijitclick"){
- // add key based click activation for unsupported nodes.
- // do all processing onkey up to prevent spurious clicks
- // for details see comments at top of this file where _lastKeyDownNode is defined
- if(d.indexOf(this.nodesWithKeyClick, obj.nodeName.toLowerCase()) == -1){ // is NOT input or button
- var m = d.hitch(this, method);
- handles.push(
- dc(obj, "onkeydown", this, function(e){
- //console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
- if((e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
- !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
- // needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work
- dijit._lastKeyDownNode = e.target;
-
- // Stop event to prevent scrolling on space key in IE.
- // But don't do this for _HasDropDown because it surpresses the onkeypress
- // event needed to open the drop down when the user presses the SPACE key.
- if(!("openDropDown" in this && obj == this._buttonNode)){
- e.preventDefault();
- }
- }
- }),
- dc(obj, "onkeyup", this, function(e){
- //console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
- if( (e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
- e.target == dijit._lastKeyDownNode && // === breaks greasemonkey
- !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
- //need reset here or have problems in FF when focus returns to trigger element after closing popup/alert
- dijit._lastKeyDownNode = null;
- return m(e);
- }
- })
- );
- }
- }
-
- return handles; // _Widget.Handle
- },
-
- ////////////////// 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
- }
-});
-
-})();
-
-}
+//>>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
diff --git a/lib/dijit/_Widget.js.uncompressed.js b/lib/dijit/_Widget.js.uncompressed.js
new file mode 100644
index 000000000..e588a62cf
--- /dev/null
+++ b/lib/dijit/_Widget.js.uncompressed.js
@@ -0,0 +1,351 @@
+define("dijit/_Widget", [
+ "dojo/aspect", // aspect.around
+ "dojo/_base/config", // config.isDebug
+ "dojo/_base/connect", // connect.connect
+ "dojo/_base/declare", // declare
+ "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, kernel, lang, query, ready,
+ registry, _WidgetBase, _OnDijitClickMixin, _FocusMixin){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _OnDijitClickMixin = dijit._OnDijitClickMixin;
+ var _FocusMixin = dijit._FocusMixin;
+=====*/
+
+
+// module:
+// dijit/_Widget
+// summary:
+// Old base for widgets. New widgets should extend _WidgetBase instead
+
+
+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:
+ // Base class for all 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 id 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){
+ // 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*/ type, /*Function*/ func){
+ if(this[this._onMap(type)] === connectToDomNode){
+ // Use connect.connect() rather than on() to get handling for "onmouseenter" on non-IE, etc.
+ // Also, need to specify context as "this" rather than the default context of the DOMNode
+ 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._Widget[]
+ },
+
+ ////////////////// 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(!kernel.isAsync){
+ 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 868ce6a91..d96bf4fe0 100644
--- a/lib/dijit/_WidgetBase.js
+++ b/lib/dijit/_WidgetBase.js
@@ -1,826 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._WidgetBase"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._WidgetBase"] = true;
-dojo.provide("dijit._WidgetBase");
-dojo.require("dijit._base.manager");
-dojo.require("dojo.Stateful");
-
-
-(function(){
-
-dojo.declare("dijit._WidgetBase", dojo.Stateful, {
- // summary:
- // Future base class for all Dijit widgets.
- // _Widget extends this class adding support for various features needed by desktop.
-
- // 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: "",
-
- // 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: "",
-
- // 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: "",
-
- // class: String
- // HTML class attribute
- "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 dojoAttachPoint 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 dojoType=myWidget>
- // | <b> here's a plain DOM node
- // | <span dojoType=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 dojoType=subWidget>and a widget</span>
- // | <i> and another plain DOM node </i>
- //
- // In templated widgets, "containerNode" is set via a
- // dojoAttachPoint 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,
-
-/*=====
- // _started: Boolean
- // startup() has completed.
- _started: false,
-=====*/
-
- // attributeMap: [protected] Object
- // 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: {id:"", dir:"", lang:"", "class":"", style:"", title:""},
-
- // _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: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")).toString(),
-
- //////////// INITIALIZATION METHODS ///////////////////////////////////////
-
- postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
- // summary:
- // Kicks off widget instantiation. See create() for details.
- // tags:
- // private
- this.create(params, srcNodeRef);
- },
-
- create: function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){
- // summary:
- // Kick off the life-cycle of a widget
- // params:
- // Hash of initialization parameters for widget, including
- // scalar values (like title, duration etc.) and functions,
- // typically callbacks like onClick.
- // srcNodeRef:
- // 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
- // description:
- // Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate,
- // etc.), some of which of you'll want to override. See http://docs.dojocampus.org/dijit/_Widget
- // 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.
- // tags:
- // private
-
- // store pointer to original DOM tree
- this.srcNodeRef = dojo.byId(srcNodeRef);
-
- // For garbage collection. An array of handles returned by Widget.connect()
- // Each handle returned from Widget.connect() is an array of handles from dojo.connect()
- this._connects = [];
-
- // For garbage collection. An array of handles returned by Widget.subscribe()
- // The handle returned from Widget.subscribe() is the handle returned from dojo.subscribe()
- this._subscribes = [];
-
- // mix in our passed parameters
- if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; }
- if(params){
- this.params = params;
- dojo._mixin(this, params);
- }
- this.postMixInProperties();
-
- // generate an id for the widget if one wasn't specified
- // (be sure to do this before buildRendering() because that function might
- // expect the id to be there.)
- if(!this.id){
- this.id = dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
- }
- dijit.registry.add(this);
-
- this.buildRendering();
-
- 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);
- }
- }
-
- if(this.domNode){
- // 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.
- if(this.srcNodeRef && !this.srcNodeRef.parentNode){
- delete this.srcNodeRef;
- }
-
- this._created = true;
- },
-
- _applyAttributes: function(){
- // summary:
- // Step during widget creation to copy all widget attributes to the
- // DOM as per attributeMap and _setXXXAttr functions.
- // description:
- // 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.
- //
- // It processes the attributes in the attribute map first, and then
- // it goes through and processes the attributes for the _setXXXAttr
- // functions that have been specified
- // tags:
- // private
- var condAttrApply = function(attr, scope){
- if((scope.params && attr in scope.params) || scope[attr]){
- scope.set(attr, scope[attr]);
- }
- };
-
- // Do the attributes in attributeMap
- for(var attr in this.attributeMap){
- condAttrApply(attr, this);
- }
-
- // And also any attributes with custom setters
- dojo.forEach(this._getSetterAttributes(), function(a){
- if(!(a in this.attributeMap)){
- condAttrApply(a, this);
- }
- }, this);
- },
-
- _getSetterAttributes: function(){
- // summary:
- // Returns list of attributes with custom setters for this widget
- var ctor = this.constructor;
- if(!ctor._setterAttrs){
- var r = (ctor._setterAttrs = []),
- attrs,
- proto = ctor.prototype;
- for(var fxName in proto){
- if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
- r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
- }
- }
- }
- return ctor._setterAttrs; // String[]
- },
-
- 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
- // description:
- // Most widgets will mixin `dijit._Templated`, which implements this
- // method.
- // tags:
- // protected
-
- if(!this.domNode){
- // Create root node if it wasn't created by _Templated
- this.domNode = this.srcNodeRef || dojo.create('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( dojo.map(classes, function(name){ return name+"Rtl"; }));
- }
- dojo.addClass(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.
- this._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();
- var d = dojo,
- dfe = d.forEach,
- dun = d.unsubscribe;
- dfe(this._connects, function(array){
- dfe(array, d.disconnect);
- });
- dfe(this._subscribes, function(handle){
- dun(handle);
- });
-
- // destroy widgets created as part of template, etc.
- dfe(this._supportingWidgets || [], function(w){
- if(w.destroyRecursive){
- w.destroyRecursive();
- }else if(w.destroy){
- w.destroy();
- }
- });
-
- this.destroyRendering(preserveDom);
- dijit.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){
- dojo.removeAttr(this.domNode, "widgetId");
- }else{
- dojo.destroy(this.domNode);
- }
- delete this.domNode;
- }
-
- if(this.srcNodeRef){
- if(!preserveDom){
- dojo.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
- dojo.forEach(this.getChildren(), function(widget){
- if(widget.destroyRecursive){
- widget.destroyRecursive(preserveDom);
- }
- });
- },
-
- uninitialize: function(){
- // summary:
- // Stub function. Override to implement custom widget tear-down
- // behavior.
- // tags:
- // protected
- return false;
- },
-
- ////////////////// GET/SET, CUSTOM SETTERS, ETC. ///////////////////
-
- _setClassAttr: function(/*String*/ value){
- // summary:
- // Custom setter for the CSS "class" attribute
- // tags:
- // protected
- var mapNode = this[this.attributeMap["class"] || 'domNode'];
- dojo.replaceClass(mapNode, value, this["class"]);
- this._set("class", value);
- },
-
- _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[this.attributeMap.style || '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(dojo.isObject(value)){
- dojo.style(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){
- // summary:
- // Reflect a widget attribute (title, tabIndex, duration etc.) to
- // the widget DOM, as specified in attributeMap.
- // Note some attributes like "type"
- // cannot be processed this way as they are not mutable.
- //
- // tags:
- // private
-
- var commands = this.attributeMap[attr];
- dojo.forEach(dojo.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(dojo.isFunction(value)){ // functions execute in the context of the widget
- value = dojo.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);
-
- dojo.attr(mapNode, attrName, value);
- break;
- case "innerText":
- mapNode.innerHTML = "";
- mapNode.appendChild(dojo.doc.createTextNode(value));
- break;
- case "innerHTML":
- mapNode.innerHTML = value;
- break;
- case "class":
- dojo.replaceClass(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 a properties "foo"
- // and "bar" and a method named "_getFooAttr", calling:
- // | myWidget.get("foo");
- // would be equivalent to writing:
- // | widget._getFooAttr();
- // and:
- // | myWidget.get("bar");
- // would be equivalent to writing:
- // | widget.bar;
- 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 a properties "foo"
- // and "bar" and a method named "_setFooAttr", calling:
- // | myWidget.set("foo", "Howdy!");
- // would be equivalent to writing:
- // | widget._setFooAttr("Howdy!");
- // and:
- // | myWidget.set("bar", 3);
- // would be equivalent to writing:
- // | 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);
- if(this[names.s]){
- // use the explicit setter
- var result = this[names.s].apply(this, Array.prototype.slice.call(arguments, 1));
- }else{
- // if param is specified as DOM node attribute, copy it
- if(name in this.attributeMap){
- this._attrToDom(name, value);
- }
- 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.charAt(0).toUpperCase() + name.substr(1);
- return (apn[name] = {
- n: name+"Node",
- s: "_set"+uc+"Attr",
- g: "_get"+uc+"Attr"
- });
- },
-
- _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._watchCallbacks && this._created && value !== oldValue){
- this._watchCallbacks(name, oldValue, value);
- }
- },
-
- 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
- },
-
- 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.
-
- return this.containerNode ? dojo.query('[widgetId]', this.containerNode).map(dijit.byNode) : []; // dijit._Widget[]
- },
-
- 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 ? dijit.findWidgets(this.containerNode) : []; // dijit._Widget[]
- },
-
- 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 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 dijit.form.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
-
- var handles = [dojo._connect(obj, event, this, method)];
- this._connects.push(handles);
- return handles; // _Widget.Handle
- },
-
- disconnect: function(/* _Widget.Handle */ handles){
- // summary:
- // Disconnects handle created by `connect`.
- // Also removes handle from this widget's list of connects.
- // tags:
- // protected
- for(var i=0; i<this._connects.length; i++){
- if(this._connects[i] == handles){
- dojo.forEach(handles, dojo.disconnect);
- this._connects.splice(i, 1);
- return;
- }
- }
- },
-
- subscribe: function(
- /*String*/ topic,
- /*String|Function*/ method){
- // summary:
- // Subscribes to the specified topic and calls the specified method
- // of this object and registers for unsubscribe() on widget destroy.
- // description:
- // Provide widget-specific analog to dojo.subscribe, except with the
- // implicit use of this widget as the target object.
- // example:
- // | var btn = new dijit.form.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);
- // | });
- var handle = dojo.subscribe(topic, this, method);
-
- // return handles for Any widget that may need them
- this._subscribes.push(handle);
- return handle;
- },
-
- unsubscribe: function(/*Object*/ handle){
- // summary:
- // Unsubscribes handle created by this.subscribe.
- // Also removes handle from this widget's list of subscriptions
- for(var i=0; i<this._subscribes.length; i++){
- if(this._subscribes[i] == handle){
- dojo.unsubscribe(handle);
- this._subscribes.splice(i, 1);
- return;
- }
- }
- },
-
- 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") : dojo._isBodyLtr(); //Boolean
- },
-
- placeAt: function(/* String|DomNode|_Widget */reference, /* String?|Int? */position){
- // summary:
- // Place this widget's domNode reference somewhere in the DOM based
- // on standard dojo.place conventions, or passing a Widget reference that
- // contains and addChild member.
- //
- // 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:
- // The String id of a domNode, a domNode reference, or a reference to a Widget posessing
- // an addChild method.
- //
- // position:
- // If passed a string or domNode reference, the position argument
- // accepts a string just as dojo.place does, one of: "first", "last",
- // "before", or "after".
- //
- // If passed a _Widget reference, and that widget reference has an ".addChild" method,
- // it will be called passing this widget instance into that method, supplying the optional
- // position index passed.
- //
- // returns:
- // dijit._Widget
- // 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 dijit.form.Button({ label:"click" }).placeAt(dojo.body());
- // | // now, 'button' is still the widget reference to the newly created button
- // | dojo.connect(button, "onClick", 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 dijit.form.Button({},"src").placeAt("wrapper");
- //
- // example:
- // | // place a new button as the first element of some div
- // | var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first");
- //
- // example:
- // | // create a contentpane and add it to a TabContainer
- // | var tc = dijit.byId("myTabs");
- // | new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc)
-
- if(reference.declaredClass && reference.addChild){
- reference.addChild(this, position);
- }else{
- dojo.place(this.domNode, reference, position);
- }
- return this;
- }
-});
-
-})();
-
-}
+//>>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
diff --git a/lib/dijit/_WidgetBase.js.uncompressed.js b/lib/dijit/_WidgetBase.js.uncompressed.js
new file mode 100644
index 000000000..b8dbe83b4
--- /dev/null
+++ b/lib/dijit/_WidgetBase.js.uncompressed.js
@@ -0,0 +1,1020 @@
+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.create domConstruct.destroy domConstruct.place
+ "dojo/dom-geometry", // isBodyLtr
+ "dojo/dom-style", // domStyle.set, domStyle.get
+ "dojo/_base/kernel",
+ "dojo/_base/lang", // mixin(), isArray(), etc.
+ "dojo/on",
+ "dojo/ready",
+ "dojo/Stateful", // Stateful
+ "dojo/topic",
+ "dojo/_base/window", // win.doc.createTextNode
+ "./registry" // registry.getUniqueId(), registry.findWidgets()
+], function(require, array, aspect, config, connect, declare,
+ dom, domAttr, domClass, domConstruct, domGeometry, domStyle, kernel,
+ lang, on, ready, Stateful, topic, win, registry){
+
+/*=====
+var Stateful = dojo.Stateful;
+=====*/
+
+// module:
+// dijit/_WidgetBase
+// summary:
+// Future base class for all Dijit widgets.
+
+// For back-compat, remove in 2.0.
+if(!kernel.isAsync){
+ 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, {
+ // 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,
+
+/*=====
+ // _started: 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 ///////////////////////////////////////
+
+ postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){
+ // summary:
+ // Kicks off widget instantiation. See create() for details.
+ // tags:
+ // private
+ this.create(params, srcNodeRef);
+ },
+
+ create: function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){
+ // summary:
+ // Kick off the life-cycle of a widget
+ // params:
+ // Hash of initialization parameters for widget, including
+ // scalar values (like title, duration etc.) and functions,
+ // typically callbacks like onClick.
+ // srcNodeRef:
+ // 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
+ // 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.
+ // tags:
+ // private
+
+ // store pointer to original DOM tree
+ this.srcNodeRef = dom.byId(srcNodeRef);
+
+ // For garbage collection. An array of listener handles returned by this.connect() / this.subscribe()
+ this._connects = [];
+
+ // For widgets internal to this widget, invisible to calling code
+ 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
+ // (be sure to do this before buildRendering() because that function might
+ // expect the id to be there.)
+ if(!this.id){
+ this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+ }
+ registry.add(this);
+
+ this.buildRendering();
+
+ 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);
+ }
+ }
+
+ if(this.domNode){
+ // 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.
+ if(this.srcNodeRef && !this.srcNodeRef.parentNode){
+ 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.
+ 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 attribute that was either specified as parameter to constructor,
+ // or was found above and has a default non-null value. For correlated attributes like value and displayedValue, the one
+ // specified as a parameter should take precedence, so apply attributes in this.params last.
+ // Particularly important for new DateTextBox({displayedValue: ...}) since DateTextBox's default value is
+ // NaN and thus is not ignored like a default value of "".
+ array.forEach(list, function(attr){
+ if(this.params && attr in this.params){
+ // skip this one, do it below
+ }else if(this[attr]){
+ this.set(attr, this[attr]);
+ }
+ }, this);
+ for(var param in this.params){
+ this.set(param, this[param]);
+ }
+ },
+
+ 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 || domConstruct.create('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();
+
+ // remove this.connect() and this.subscribe() listeners
+ var c;
+ while((c = this._connects.pop())){
+ c.remove();
+ }
+
+ // destroy widgets created as part of template, etc.
+ var w;
+ while((w = this._supportingWidgets.pop())){
+ if(w.destroyRecursive){
+ w.destroyRecursive();
+ }else if(w.destroy){
+ w.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:
+ // Stub function. Override 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.
+ //
+ // 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);
+
+ domAttr.set(mapNode, attrName, value);
+ break;
+ case "innerText":
+ mapNode.innerHTML = "";
+ mapNode.appendChild(win.doc.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 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._watchCallbacks && this._created && value !== oldValue){
+ this._watchCallbacks(name, oldValue, value);
+ }
+ },
+
+ on: function(/*String*/ type, /*Function*/ func){
+ // summary:
+ // Call specified function when event occurs, ex: myWidget.on("click", function(){ ... }).
+ // 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))`.
+
+ return aspect.after(this, this._onMap(type), func, true);
+ },
+
+ _onMap: function(/*String*/ type){
+ // summary:
+ // Maps on() type parameter (ex: "mousemove") to method name (ex: "onMouseMove")
+ 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[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._Widget[]
+ },
+
+ 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:
+ // Connects specified obj/event to specified method of this object
+ // and registers for disconnect() on widget destroy.
+ // description:
+ // 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 dijit.form.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
+
+ var handle = connect.connect(obj, event, this, method);
+ this._connects.push(handle);
+ return handle; // _Widget.Handle
+ },
+
+ disconnect: function(handle){
+ // summary:
+ // Disconnects handle created by `connect`.
+ // Also removes handle from this widget's list of connects.
+ // tags:
+ // protected
+ var i = array.indexOf(this._connects, handle);
+ if(i != -1){
+ handle.remove();
+ this._connects.splice(i, 1);
+ }
+ },
+
+ subscribe: function(t, method){
+ // summary:
+ // Subscribes to the specified topic and calls the specified method
+ // of this object and registers for unsubscribe() on widget destroy.
+ // description:
+ // 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 dijit.form.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
+ var handle = topic.subscribe(t, lang.hitch(this, method));
+ this._connects.push(handle);
+ return handle; // _Widget.Handle
+ },
+
+ unsubscribe: function(/*Object*/ handle){
+ // summary:
+ // Unsubscribes handle created by this.subscribe.
+ // Also removes handle from this widget's list of subscriptions
+ // tags:
+ // protected
+ this.disconnect(handle);
+ },
+
+ 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(); //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's domNode reference somewhere in the DOM based
+ // on standard domConstruct.place conventions, or passing a Widget reference that
+ // contains and addChild member.
+ //
+ // 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:
+ // The String id of a domNode, a domNode reference, or a reference to a Widget possessing
+ // an addChild method.
+ //
+ // position:
+ // If passed a string or domNode reference, the position argument
+ // accepts a string just as domConstruct.place does, one of: "first", "last",
+ // "before", or "after".
+ //
+ // If passed a _Widget reference, and that widget reference has an ".addChild" method,
+ // it will be called passing this widget instance into that method, supplying the optional
+ // position index passed.
+ //
+ // returns:
+ // dijit._Widget
+ // 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 dijit.form.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 dijit.form.Button({},"src").placeAt("wrapper");
+ //
+ // example:
+ // | // place a new button as the first element of some div
+ // | var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first");
+ //
+ // example:
+ // | // create a contentpane and add it to a TabContainer
+ // | var tc = dijit.byId("myTabs");
+ // | new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc)
+
+ if(reference.declaredClass && reference.addChild){
+ reference.addChild(this, position);
+ }else{
+ domConstruct.place(this.domNode, reference, position);
+ }
+ 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
new file mode 100644
index 000000000..bea9c9ffe
--- /dev/null
+++ b/lib/dijit/_WidgetsInTemplateMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js b/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js
new file mode 100644
index 000000000..af7e5d221
--- /dev/null
+++ b/lib/dijit/_WidgetsInTemplateMixin.js.uncompressed.js
@@ -0,0 +1,61 @@
+define("dijit/_WidgetsInTemplateMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/parser", // parser.parse
+ "dijit/registry" // registry.findWidgets
+], function(array, declare, parser, registry){
+
+ // module:
+ // dijit/_WidgetsInTemplateMixin
+ // summary:
+ // Mixin to supplement _TemplatedMixin when template contains widgets
+
+ 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
+ }));
+
+ this._supportingWidgets = registry.findWidgets(node);
+
+ 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 3b1695c8b..f85f7809e 100644
--- a/lib/dijit/_base.js
+++ b/lib/dijit/_base.js
@@ -1,23 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base"] = true;
-dojo.provide("dijit._base");
-dojo.require("dijit._base.focus");
-dojo.require("dijit._base.manager");
-dojo.require("dijit._base.place");
-dojo.require("dijit._base.popup");
-dojo.require("dijit._base.scroll");
-dojo.require("dijit._base.sniff");
-dojo.require("dijit._base.typematic");
-dojo.require("dijit._base.wai");
-dojo.require("dijit._base.window");
-
-
-
-}
+//>>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
diff --git a/lib/dijit/_base.js.uncompressed.js b/lib/dijit/_base.js.uncompressed.js
new file mode 100644
index 000000000..8f67ac521
--- /dev/null
+++ b/lib/dijit/_base.js.uncompressed.js
@@ -0,0 +1,22 @@
+define("dijit/_base", [
+ ".",
+ "./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
+ // 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 55c5b682d..840329992 100644
--- a/lib/dijit/_base/focus.js
+++ b/lib/dijit/_base/focus.js
@@ -1,530 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.focus"] = true;
-dojo.provide("dijit._base.focus");
-dojo.require("dojo.window");
-dojo.require("dijit._base.manager");
-
-
-// summary:
-// These functions are used to query or set the focus and selection.
-//
-// Also, they trace when widgets become activated/deactivated,
-// so that the widget can fire _onFocus/_onBlur events.
-// "Active" here means something similar to "focused", but
-// "focus" isn't quite the right word because we keep track of
-// a whole stack of "active" widgets. Example: ComboButton --> Menu -->
-// MenuItem. The onBlur event for ComboButton doesn't fire due to focusing
-// on the Menu or a MenuItem, since they are considered part of the
-// ComboButton widget. It only happens when focus is shifted
-// somewhere completely different.
-
-dojo.mixin(dijit, {
- // _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 = dojo.doc.selection, cf = dijit._curFocus;
-
- if(dojo.global.getSelection){
- //W3C Range API for selections.
- sel = dojo.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 = dojo.doc,
- mark = bookmark.mark;
- if(mark){
- if(dojo.global.getSelection){
- //W3C Rangi API (FF, WebKit, Opera, etc)
- var sel = dojo.global.getSelection();
- if(sel && sel.removeAllRanges){
- if(mark.pRange){
- var r = mark;
- var n = r.node;
- n.selectionStart = r.start;
- n.selectionEnd = r.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(dojo.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
- dojo.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._Widget or {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 = !dijit._curFocus || (menu && dojo.isDescendant(dijit._curFocus, menu.domNode)) ? dijit._prevFocus : dijit._curFocus;
- return {
- node: node,
- bookmark: (node == dijit._curFocus) && dojo.withGlobal(openedForWindow || dojo.global, dijit.getBookmark),
- openedForWindow: openedForWindow
- }; // Object
- },
-
- 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*/}
- }
- dijit._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 && dojo.withGlobal(openedForWindow || dojo.global, dijit.isCollapsed) && !collapsed){
- if(openedForWindow){
- openedForWindow.focus();
- }
- try{
- dojo.withGlobal(openedForWindow || dojo.global, dijit.moveToBookmark, null, [bookmark]);
- }catch(e2){
- /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
- }
- }
- },
-
- // _activeStack: dijit._Widget[]
- // 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 dijit.registerWin(iframe.contentWindow, 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()
-
- dijit.unregisterWin(handle);
- },
-
- 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()
-
- // TODO: make this function private in 2.0; Editor/users should call registerIframe(),
-
- var mousedownListener = function(evt){
- dijit._justMouseDowned = true;
- setTimeout(function(){ dijit._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(dojo.isIE && evt && evt.srcElement && evt.srcElement.parentNode == null){
- return;
- }
-
- dijit._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse");
- };
- //dojo.connect(targetWindow, "onscroll", ???);
-
- // Listen for blur and focus events on targetWindow's document.
- // IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble
- // through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers
- // fire.
- // 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 = dojo.isIE ? targetWindow.document.documentElement : targetWindow.document;
- if(doc){
- if(dojo.isIE){
- targetWindow.document.body.attachEvent('onmousedown', mousedownListener);
- var activateListener = function(evt){
- // IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,
- // Should consider those more like a mouse-click than a focus....
- if(evt.srcElement.tagName.toLowerCase() != "#document" &&
- dijit.isTabNavigable(evt.srcElement)){
- dijit._onFocusNode(effectiveNode || evt.srcElement);
- }else{
- dijit._onTouchNode(effectiveNode || evt.srcElement);
- }
- };
- doc.attachEvent('onactivate', activateListener);
- var deactivateListener = function(evt){
- dijit._onBlurNode(effectiveNode || evt.srcElement);
- };
- doc.attachEvent('ondeactivate', deactivateListener);
-
- return function(){
- targetWindow.document.detachEvent('onmousedown', mousedownListener);
- doc.detachEvent('onactivate', activateListener);
- doc.detachEvent('ondeactivate', deactivateListener);
- doc = null; // prevent memory leak (apparent circular reference via closure)
- };
- }else{
- doc.body.addEventListener('mousedown', mousedownListener, true);
- var focusListener = function(evt){
- dijit._onFocusNode(effectiveNode || evt.target);
- };
- doc.addEventListener('focus', focusListener, true);
- var blurListener = function(evt){
- dijit._onBlurNode(effectiveNode || evt.target);
- };
- doc.addEventListener('blur', blurListener, true);
-
- return function(){
- doc.body.removeEventListener('mousedown', mousedownListener, true);
- doc.removeEventListener('focus', focusListener, true);
- doc.removeEventListener('blur', blurListener, true);
- doc = null; // prevent memory leak (apparent circular reference via closure)
- };
- }
- }
- },
-
- 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.
-
- // Currently our handle is actually a function
- handle && handle();
- },
-
- _onBlurNode: function(/*DomNode*/ node){
- // summary:
- // Called when focus leaves a node.
- // Usually ignored, _unless_ it *isn't* follwed by touching another node,
- // which indicates that we tabbed off the last field on the page,
- // in which case every widget is marked inactive
- dijit._prevFocus = dijit._curFocus;
- dijit._curFocus = null;
-
- if(dijit._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 event then mark all widgets as inactive.
- if(dijit._clearActiveWidgetsTimer){
- clearTimeout(dijit._clearActiveWidgetsTimer);
- }
- dijit._clearActiveWidgetsTimer = setTimeout(function(){
- delete dijit._clearActiveWidgetsTimer;
- dijit._setStack([]);
- dijit._prevFocus = null;
- }, 100);
- },
-
- _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(dijit._clearActiveWidgetsTimer){
- clearTimeout(dijit._clearActiveWidgetsTimer);
- delete dijit._clearActiveWidgetsTimer;
- }
-
- // compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)
- var newStack=[];
- try{
- while(node){
- var popupParent = dojo.attr(node, "dijitPopupParent");
- if(popupParent){
- node=dijit.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 === dojo.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=dojo.window.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 && dijit.byId(id);
- if(widget && !(by == "mouse" && widget.get("disabled"))){
- newStack.unshift(id);
- }
- node=node.parentNode;
- }
- }
- }catch(e){ /* squelch */ }
-
- dijit._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;
- }
-
- dijit._onTouchNode(node);
-
- if(node == dijit._curFocus){ return; }
- if(dijit._curFocus){
- dijit._prevFocus = dijit._curFocus;
- }
- dijit._curFocus = node;
- dojo.publish("focusNode", [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 = dijit._activeStack;
- dijit._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, send blur event
- for(var i=oldStack.length-1; i>=nCommon; i--){
- widget = dijit.byId(oldStack[i]);
- if(widget){
- widget._focused = false;
- widget.set("focused", false);
- widget._hasBeenBlurred = true;
- if(widget._onBlur){
- widget._onBlur(by);
- }
- dojo.publish("widgetBlur", [widget, by]);
- }
- }
-
- // for all element that have come into focus, send focus event
- for(i=nCommon; i<newStack.length; i++){
- widget = dijit.byId(newStack[i]);
- if(widget){
- widget._focused = true;
- widget.set("focused", true);
- if(widget._onFocus){
- widget._onFocus(by);
- }
- dojo.publish("widgetFocus", [widget, by]);
- }
- }
- }
-});
-
-// register top window and all the iframes it contains
-dojo.addOnLoad(function(){
- var handle = dijit.registerWin(window);
- if(dojo.isIE){
- dojo.addOnWindowUnload(function(){
- dijit.unregisterWin(handle);
- handle = null;
- })
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/_base/focus.js.uncompressed.js b/lib/dijit/_base/focus.js.uncompressed.js
new file mode 100644
index 000000000..a82e17f13
--- /dev/null
+++ b/lib/dijit/_base/focus.js.uncompressed.js
@@ -0,0 +1,319 @@
+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",
+ ".." // for exporting symbols to dijit
+], function(array, dom, lang, topic, win, focus, dijit){
+
+ // module:
+ // dijit/_base/focus
+ // summary:
+ // Deprecated module to monitor currently focused node and stack of currently focused widgets.
+ // New code should access dijit/focus directly.
+
+ lang.mixin(dijit, {
+ // _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._Widget or {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._Widget[]
+ // 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
+ });
+
+ return dijit;
+});
diff --git a/lib/dijit/_base/manager.js b/lib/dijit/_base/manager.js
index e5f745622..db80c9890 100644
--- a/lib/dijit/_base/manager.js
+++ b/lib/dijit/_base/manager.js
@@ -1,493 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.manager"] = true;
-dojo.provide("dijit._base.manager");
-
-
-dojo.declare("dijit.WidgetSet", null, {
- // summary:
- // A set of widgets indexed by id. A default instance of this class is
- // available as `dijit.registry`
- //
- // example:
- // Create a small list of widgets:
- // | var ws = new dijit.WidgetSet();
- // | ws.add(dijit.byId("one"));
- // | ws.add(dijit.byId("two"));
- // | // destroy both:
- // | ws.forEach(function(w){ w.destroy(); });
- //
- // example:
- // Using dijit.registry:
- // | dijit.registry.forEach(function(w){ /* do something */ });
-
- constructor: function(){
- this._hash = {};
- this.length = 0;
- },
-
- add: function(/*dijit._Widget*/ widget){
- // summary:
- // Add a widget to this list. If a duplicate ID is detected, a error is thrown.
- //
- // widget: dijit._Widget
- // Any dijit._Widget 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 `dojo.forEach`.
- //
- // thisObj:
- // An optional scope parameter
- //
- // example:
- // Using the default `dijit.registry` instance:
- // | dijit.registry.forEach(function(widget){
- // | console.log(widget.declaredClass);
- // | });
- //
- // returns:
- // Returns self, in order to allow for further chaining.
-
- thisObj = thisObj || dojo.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 `dojo.filter` and `dojo.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
- // | dijit.registry.filter(function(w, i){
- // | return i % 2 == 0;
- // | }).forEach(function(w){ /* odd ones */ });
-
- thisObj = thisObj || dojo.global;
- var res = new dijit.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
- // | var ws = new dijit.WidgetSet();
- // | ws.add(dijit.byId("bar"));
- // | var t = ws.byId("bar") // returns a widget
- // | var x = ws.byId("foo"); // returns undefined
-
- return this._hash[id]; // dijit._Widget
- },
-
- 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:
- // | dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
-
- var res = new dijit.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
- // | dojo.map(dijit.registry.toArray(), function(w){ return w.domNode; });
-
- var ar = [];
- for(var id in this._hash){
- ar.push(this._hash[id]);
- }
- return ar; // dijit._Widget[]
-},
-
- map: function(/* Function */func, /* Object? */thisObj){
- // summary:
- // Create a new Array from this WidgetSet, following the same rules as `dojo.map`
- // example:
- // | var nodes = dijit.registry.map(function(w){ return w.domNode; });
- //
- // returns:
- // A new array of the returned values.
- return dojo.map(this.toArray(), func, thisObj); // Array
- },
-
- every: function(func, thisObj){
- // summary:
- // A synthetic clone of `dojo.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 || dojo.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 `dojo.some` acting explictly 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 || dojo.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
- }
-
-});
-
-(function(){
-
- /*=====
- dijit.registry = {
- // summary:
- // A list of widgets on a page.
- // description:
- // Is an instance of `dijit.WidgetSet`
- };
- =====*/
- dijit.registry = new dijit.WidgetSet();
-
- var hash = dijit.registry._hash,
- attr = dojo.attr,
- hasAttr = dojo.hasAttr,
- style = dojo.style;
-
- dijit.byId = function(/*String|dijit._Widget*/ id){
- // summary:
- // Returns a widget by it's id, or if passed a widget, no-op (like dojo.byId())
- return typeof id == "string" ? hash[id] : id; // dijit._Widget
- };
-
- var _widgetTypeCtr = {};
- dijit.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
- };
-
- dijit.findWidgets = function(/*DomNode*/ root){
- // summary:
- // Search subtree under root returning widgets found.
- // Doesn't search for nested widgets (ie, widgets inside other widgets).
-
- 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{
- getChildrenHelper(node);
- }
- }
- }
- }
-
- getChildrenHelper(root);
- return outAry;
- };
-
- dijit._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
- dojo.forEach(dijit.findWidgets(dojo.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();
- }
- }
- });
- };
-
- if(dojo.isIE){
- // Only run _destroyAll() for IE because we think it's only necessary in that case,
- // and because it causes problems on FF. See bug #3531 for details.
- dojo.addOnWindowUnload(function(){
- dijit._destroyAll();
- });
- }
-
- dijit.byNode = function(/*DOMNode*/ node){
- // summary:
- // Returns the widget corresponding to the given DOMNode
- return hash[node.getAttribute("widgetId")]; // dijit._Widget
- };
-
- dijit.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.getAttribute && node.getAttribute("widgetId");
- if(id){
- return hash[id];
- }
- node = node.parentNode;
- }
- return null;
- };
-
- var shown = (dijit._isElementShown = function(/*Element*/ elem){
- var s = style(elem);
- return (s.visibility != "hidden")
- && (s.visibility != "collapsed")
- && (s.display != "none")
- && (attr(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 hasAttr(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.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(attr(elem, "disabled")){
- return false;
- }else if(hasAttr(elem, "tabIndex")){
- // Explicit tab index setting
- return attr(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){
- dojo.query("> *", parent).forEach(function(child){
- // Skip 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((dojo.isIE && child.scopeName!=="HTML") || !shown(child)){
- return;
- }
-
- if(isTabNavigable(child)){
- var tabindex = attr(child, "tabIndex");
- if(!hasAttr(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(dojo.attr(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){
- // summary:
- // Finds the descendant of the specified root node
- // that is first in the tabbing order
- var elems = dijit._getTabNavigable(dojo.byId(root));
- return elems.lowest ? elems.lowest : elems.first; // DomNode
- };
-
- dijit.getLastInTabbingOrder = function(/*String|DOMNode*/ root){
- // summary:
- // Finds the descendant of the specified root node
- // that is last in the tabbing order
- var elems = dijit._getTabNavigable(dojo.byId(root));
- return elems.last ? elems.last : elems.highest; // DomNode
- };
-
- /*=====
- dojo.mixin(dijit, {
- // defaultDuration: Integer
- // The default animation speed (in ms) to use for all Dijit
- // transitional animations, unless otherwise specified
- // on a per-instance basis. Defaults to 200, overrided by
- // `djConfig.defaultDuration`
- defaultDuration: 200
- });
- =====*/
-
- dijit.defaultDuration = dojo.config["defaultDuration"] || 200;
-
-})();
-
-}
+//>>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
diff --git a/lib/dijit/_base/manager.js.uncompressed.js b/lib/dijit/_base/manager.js.uncompressed.js
new file mode 100644
index 000000000..fb48af5a6
--- /dev/null
+++ b/lib/dijit/_base/manager.js.uncompressed.js
@@ -0,0 +1,76 @@
+define("dijit/_base/manager", [
+ "dojo/_base/array",
+ "dojo/_base/config", // defaultDuration
+ "../registry",
+ ".." // for setting exports to dijit namespace
+], function(array, config, registry, dijit){
+
+ // module:
+ // dijit/_base/manager
+ // summary:
+ // Shim to methods on registry, plus a few other declarations.
+ // New code should access dijit/registry directly when possible.
+
+ /*=====
+ dijit.byId = function(id){
+ // summary:
+ // Returns a widget by it's id, or if passed a widget, no-op (like dom.byId())
+ // id: String|dijit._Widget
+ return registry.byId(id); // dijit._Widget
+ };
+
+ dijit.getUniqueId = function(widgetType){
+ // summary:
+ // Generates a unique id for a given widgetType
+ // widgetType: String
+ return registry.getUniqueId(widgetType); // String
+ };
+
+ dijit.findWidgets = function(root){
+ // summary:
+ // Search subtree under root returning widgets found.
+ // Doesn't search for nested widgets (ie, widgets inside other widgets).
+ // root: DOMNode
+ return registry.findWidgets(root);
+ };
+
+ dijit._destroyAll = function(){
+ // summary:
+ // Code to destroy all widgets and do other cleanup on page unload
+
+ return registry._destroyAll();
+ };
+
+ dijit.byNode = function(node){
+ // summary:
+ // Returns the widget corresponding to the given DOMNode
+ // node: DOMNode
+ return registry.byNode(node); // dijit._Widget
+ };
+
+ dijit.getEnclosingWidget = function(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
+ // node: DOMNode
+ return registry.getEnclosingWidget(node);
+ };
+ =====*/
+ array.forEach(["byId", "getUniqueId", "findWidgets", "_destroyAll", "byNode", "getEnclosingWidget"], function(name){
+ dijit[name] = registry[name];
+ });
+
+ /*=====
+ dojo.mixin(dijit, {
+ // 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: 200
+ });
+ =====*/
+ dijit.defaultDuration = config["defaultDuration"] || 200;
+
+ return dijit;
+});
diff --git a/lib/dijit/_base/place.js b/lib/dijit/_base/place.js
index a098f2fa4..8bdd09f80 100644
--- a/lib/dijit/_base/place.js
+++ b/lib/dijit/_base/place.js
@@ -1,376 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.place"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.place"] = true;
-dojo.provide("dijit._base.place");
-dojo.require("dojo.window");
-dojo.require("dojo.AdapterRegistry");
-
-
-dijit.getViewport = function(){
- // summary:
- // Returns the dimensions and scroll position of the viewable area of a browser window
-
- return dojo.window.getBox();
-};
-
-/*=====
-dijit.__Position = function(){
- // x: Integer
- // horizontal coordinate in pixels, relative to document body
- // y: Integer
- // vertical coordinate in pixels, relative to document body
-
- thix.x = x;
- this.y = y;
-}
-=====*/
-
-
-dijit.placeOnScreen = function(
- /* DomNode */ node,
- /* dijit.__Position */ pos,
- /* String[] */ corners,
- /* dijit.__Position? */ 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.
- // pos:
- // Object like {x: 10, y: 20}
- // corners:
- // 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:
- // 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).
- // | placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
-
- var choices = dojo.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 dijit._place(node, choices);
-}
-
-dijit._place = function(/*DomNode*/ node, choices, layoutNode, /*Object*/ 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 = dojo.window.getBox();
-
- // This won't work if the node is inside a <div style="position: relative">,
- // so reattach it to dojo.doc.body. (Otherwise, the positioning will be wrong
- // and also it might get cutoff)
- if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){
- dojo.body().appendChild(node);
- }
-
- var best = null;
- dojo.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: corner.charAt(1) == 'L' ? (view.l + view.w) - pos.x : pos.x - view.l,
- h: corner.charAt(1) == 'T' ? (view.t + view.h) - pos.y : pos.y - view.t
- };
-
- // 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;
- style.visibility = "hidden";
- style.display = "";
- var mb = dojo.marginBox(node);
- style.display = oldDisplay;
- style.visibility = oldVis;
-
- // coordinates and size of node with specified corner placed at pos,
- // and clipped by viewport
- var startX = Math.max(view.l, corner.charAt(1) == 'L' ? pos.x : (pos.x - mb.w)),
- startY = Math.max(view.t, corner.charAt(0) == 'T' ? pos.y : (pos.y - mb.h)),
- endX = Math.min(view.l + view.w, corner.charAt(1) == 'L' ? (startX + mb.w) : pos.x),
- endY = Math.min(view.t + view.h, corner.charAt(0) == 'T' ? (startY + mb.h) : pos.y),
- width = endX - startX,
- height = endY - startY;
-
- overflow += (mb.w - width) + (mb.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 = dojo._isBodyLtr(),
- s = node.style;
- s.top = best.y + "px";
- s[l ? "left" : "right"] = (l ? best.x : view.w - best.x - best.w) + "px";
-
- return best;
-}
-
-dijit.placeOnScreenAroundNode = function(
- /* DomNode */ node,
- /* DomNode */ aroundNode,
- /* Object */ aroundCorners,
- /* Function? */ layoutNode){
-
- // summary:
- // Position node adjacent or kitty-corner to aroundNode
- // 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.
- //
- // aroundCorners:
- // Ordered list of pairs of corners to try matching up.
- // Each pair of corners is represented as a key/value in the hash,
- // where the key corresponds to the aroundNode's corner, and
- // the value corresponds to the node's corner:
- //
- // | { aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2, ...}
- //
- // The following strings are used to represent the four corners:
- // * "BL" - bottom left
- // * "BR" - bottom right
- // * "TL" - top left
- // * "TR" - top right
- //
- // 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.
- //
- // example:
- // | dijit.placeOnScreenAroundNode(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)
- //
-
- // get coordinates of aroundNode
- aroundNode = dojo.byId(aroundNode);
- var aroundNodePos = dojo.position(aroundNode, true);
-
- // place the node around the calculated rectangle
- return dijit._placeOnScreenAroundRect(node,
- aroundNodePos.x, aroundNodePos.y, aroundNodePos.w, aroundNodePos.h, // rectangle
- aroundCorners, layoutNode);
-};
-
-/*=====
-dijit.__Rectangle = function(){
- // x: Integer
- // horizontal offset in pixels, relative to document body
- // y: Integer
- // vertical offset in pixels, relative to document body
- // width: Integer
- // width in pixels
- // height: Integer
- // height in pixels
-
- this.x = x;
- this.y = y;
- this.width = width;
- this.height = height;
-}
-=====*/
-
-
-dijit.placeOnScreenAroundRectangle = function(
- /* DomNode */ node,
- /* dijit.__Rectangle */ aroundRect,
- /* Object */ aroundCorners,
- /* Function */ 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.
-
- return dijit._placeOnScreenAroundRect(node,
- aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height, // rectangle
- aroundCorners, layoutNode);
-};
-
-dijit._placeOnScreenAroundRect = function(
- /* DomNode */ node,
- /* Number */ x,
- /* Number */ y,
- /* Number */ width,
- /* Number */ height,
- /* Object */ aroundCorners,
- /* Function */ layoutNode){
-
- // summary:
- // Like dijit.placeOnScreenAroundNode(), except it accepts coordinates
- // of a rectangle to place node adjacent to.
-
- // TODO: combine with placeOnScreenAroundRectangle()
-
- // Generate list of possible positions for node
- var choices = [];
- for(var nodeCorner in aroundCorners){
- choices.push( {
- aroundCorner: nodeCorner,
- corner: aroundCorners[nodeCorner],
- pos: {
- x: x + (nodeCorner.charAt(1) == 'L' ? 0 : width),
- y: y + (nodeCorner.charAt(0) == 'T' ? 0 : height)
- }
- });
- }
-
- return dijit._place(node, choices, layoutNode, {w: width, h: height});
-};
-
-dijit.placementRegistry= new dojo.AdapterRegistry();
-dijit.placementRegistry.register("node",
- function(n, x){
- return typeof x == "object" &&
- typeof x.offsetWidth != "undefined" && typeof x.offsetHeight != "undefined";
- },
- dijit.placeOnScreenAroundNode);
-dijit.placementRegistry.register("rect",
- function(n, x){
- return typeof x == "object" &&
- "x" in x && "y" in x && "width" in x && "height" in x;
- },
- dijit.placeOnScreenAroundRectangle);
-
-dijit.placeOnScreenAroundElement = function(
- /* DomNode */ node,
- /* Object */ aroundElement,
- /* Object */ aroundCorners,
- /* Function */ layoutNode){
-
- // summary:
- // Like dijit.placeOnScreenAroundNode(), except it accepts an arbitrary object
- // for the "around" argument and finds a proper processor to place a node.
-
- return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments);
-};
-
-dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
- // summary:
- // Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.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 = {};
- dojo.forEach(position, function(pos){
- 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":
- leftToRight = !leftToRight;
- // fall through
- case "below":
- // first try to align left borders, next try to align right borders (or reverse for RTL mode)
- align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
- align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
- break;
- case "above-alt":
- leftToRight = !leftToRight;
- // fall through
- case "above":
- default:
- // first try to align left borders, next try to align right borders (or reverse for RTL mode)
- align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
- align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
- break;
- }
- });
- return align;
-};
-
-}
+//>>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
diff --git a/lib/dijit/_base/place.js.uncompressed.js b/lib/dijit/_base/place.js.uncompressed.js
new file mode 100644
index 000000000..b8deaf03f
--- /dev/null
+++ b/lib/dijit/_base/place.js.uncompressed.js
@@ -0,0 +1,137 @@
+define("dijit/_base/place", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/lang", // lang.isArray
+ "dojo/window", // windowUtils.getBox
+ "../place",
+ ".." // export to dijit namespace
+], function(array, lang, windowUtils, place, dijit){
+
+ // module:
+ // dijit/_base/place
+ // summary:
+ // Back compatibility module, new code should use dijit/place directly instead of using this module.
+
+ dijit.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();
+ };
+
+ /*=====
+ dijit.placeOnScreen = function(node, pos, corners, padding){
+ // summary:
+ // Positions one of the node's corners at specified position
+ // such that node is fully visible in viewport.
+ // Deprecated, new code should use dijit.place.at() instead.
+ };
+ =====*/
+ dijit.placeOnScreen = place.at;
+
+ /*=====
+ dijit.placeOnScreenAroundElement = function(node, aroundElement, 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.
+ };
+ ====*/
+ dijit.placeOnScreenAroundElement = function(node, aroundNode, aroundCorners, layoutNode){
+ // 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);
+ };
+
+ /*=====
+ dijit.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.
+ };
+ =====*/
+ dijit.placeOnScreenAroundNode = dijit.placeOnScreenAroundElement;
+
+ /*=====
+ dijit.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.
+ };
+ =====*/
+ dijit.placeOnScreenAroundRectangle = dijit.placeOnScreenAroundElement;
+
+ dijit.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.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;
+ };
+
+ return dijit;
+});
diff --git a/lib/dijit/_base/popup.js b/lib/dijit/_base/popup.js
index e6fa6a5ed..2a38c810e 100644
--- a/lib/dijit/_base/popup.js
+++ b/lib/dijit/_base/popup.js
@@ -1,405 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.popup"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.popup"] = true;
-dojo.provide("dijit._base.popup");
-dojo.require("dijit._base.focus");
-dojo.require("dijit._base.place");
-dojo.require("dijit._base.window");
-
-
-/*=====
-dijit.popup.__OpenArgs = function(){
- // 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 an
- // ordered list of tuples of the form (around-node-corner, popup-node-corner).
- // dijit.popup.open() tries to position the popup according to each tuple in the list, in order,
- // until the popup appears fully within the viewport.
- //
- // The default value is {BL:'TL', TL:'BL'}, which represents a list of two tuples:
- // 1. (BL, TL)
- // 2. (TL, BL)
- // where BL means "bottom left" and "TL" means "top left".
- // So by default, it first tries putting the popup below the around node, left-aligning them,
- // and then tries to put it above the around node, still left-aligning them. Note that the
- // default is horizontally reversed when in RTL mode.
- //
- // 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: dijit.__Position
- // adding a buffer around the opening position. This is only useful when around is not set.
- this.popup = popup;
- this.parent = parent;
- this.around = around;
- this.x = x;
- this.y = y;
- this.orient = orient;
- this.onCancel = onCancel;
- this.onClose = onClose;
- this.onExecute = onExecute;
- this.padding = padding;
-}
-=====*/
-
-dijit.popup = {
- // summary:
- // This singleton is used to show/hide widgets as popups.
-
- // _stack: dijit._Widget[]
- // 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 || DomNode*/ 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.declaredClass ? widget._popupWrapper : (widget.parentNode && dojo.hasClass(widget.parentNode, "dijitPopup")),
- node = widget.domNode || widget;
-
- 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 = dojo.create("div",{
- "class":"dijitPopup",
- style:{ display: "none"},
- role: "presentation"
- }, dojo.body());
- wrapper.appendChild(node);
-
- var s = node.style;
- s.display = "";
- s.visibility = "";
- s.position = "";
- s.top = "0px";
-
- if(widget.declaredClass){ // TODO: in 2.0 change signature to always take widget, then remove if()
- widget._popupWrapper = wrapper;
- dojo.connect(widget, "destroy", function(){
- dojo.destroy(wrapper);
- delete widget._popupWrapper;
- });
- }
- }
-
- return wrapper;
- },
-
- moveOffScreen: function(/*Widget || DomNode*/ 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);
-
- dojo.style(wrapper, {
- visibility: "hidden",
- top: "-9999px", // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
- display: ""
- });
- },
-
- hide: function(/*dijit._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);
-
- dojo.style(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(/*dijit.popup.__OpenArgs*/ args){
- // summary:
- // Popup the widget at the specified position
- //
- // example:
- // opening at the mouse position
- // | dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY});
- //
- // example:
- // opening the widget as a dropdown
- // | dijit.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 || (
- (args.parent ? args.parent.isLeftToRight() : dojo._isBodyLtr()) ?
- {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'} :
- {'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'}
- ),
- 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 || !dojo.isDescendant(args.parent.domNode, stack[stack.length-1].widget.domNode))){
- dijit.popup.close(stack[stack.length-1].widget);
- }
-
- // Get pointer to popup wrapper, and create wrapper if it doesn't exist
- var wrapper = this._createWrapper(widget);
-
-
- dojo.attr(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(dojo.isIE || dojo.isMoz){
- if(!widget.bgIframe){
- // setting widget.bgIframe triggers cleanup in _Widget.destroy()
- widget.bgIframe = new dijit.BackgroundIframe(wrapper);
- }
- }
-
- // position the wrapper node and make it visible
- var best = around ?
- dijit.placeOnScreenAroundElement(wrapper, around, orient, widget.orient ? dojo.hitch(widget, "orient") : null) :
- dijit.placeOnScreen(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(dojo.connect(wrapper, "onkeypress", this, function(evt){
- if(evt.charOrCode == dojo.keys.ESCAPE && args.onCancel){
- dojo.stopEvent(evt);
- args.onCancel();
- }else if(evt.charOrCode === dojo.keys.TAB){
- dojo.stopEvent(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){
- handlers.push(dojo.connect(widget, "onCancel", args.onCancel));
- }
-
- handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", 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(/*dijit._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 && dojo.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();
- }
- dojo.forEach(top.handlers, dojo.disconnect);
-
- // 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();
- }
- }
- }
-};
-
-// TODO: remove dijit._frames, it isn't being used much, since popups never release their
-// iframes (see [22236])
-dijit._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(dojo.isIE < 9){
- var burl = dojo.config["dojoBlankHtmlUrl"] || (dojo.moduleUrl("dojo", "resources/blank.html")+"") || "javascript:\"\"";
- var html="<iframe src='" + burl + "'"
- + " style='position: absolute; left: 0px; top: 0px;"
- + "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
- iframe = dojo.doc.createElement(html);
- }else{
- iframe = dojo.create("iframe");
- iframe.src = 'javascript:""';
- iframe.className = "dijitBackgroundIframe";
- dojo.style(iframe, "opacity", 0.1);
- }
- iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.
- dijit.setWaiRole(iframe,"presentation");
- }
- 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(dojo.isIE || dojo.isMoz){
- var iframe = (this.iframe = dijit._frames.pop());
- node.appendChild(iframe);
- if(dojo.isIE<7 || dojo.isQuirks){
- this.resize(node);
- this._conn = dojo.connect(node, 'onresize', this, function(){
- this.resize(node);
- });
- }else{
- dojo.style(iframe, {
- width: '100%',
- height: '100%'
- });
- }
- }
-};
-
-dojo.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){
- dojo.style(this.iframe, {
- width: node.offsetWidth + 'px',
- height: node.offsetHeight + 'px'
- });
- }
- },
- destroy: function(){
- // summary:
- // destroy the iframe
- if(this._conn){
- dojo.disconnect(this._conn);
- this._conn = null;
- }
- if(this.iframe){
- dijit._frames.push(this.iframe);
- delete this.iframe;
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/_base/popup.js.uncompressed.js b/lib/dijit/_base/popup.js.uncompressed.js
new file mode 100644
index 000000000..bf8e6b104
--- /dev/null
+++ b/lib/dijit/_base/popup.js.uncompressed.js
@@ -0,0 +1,50 @@
+define("dijit/_base/popup", [
+ "dojo/dom-class", // domClass.contains
+ "../popup",
+ "../BackgroundIframe" // just loading for back-compat, in case client code is referencing it
+], function(domClass, popup){
+
+// module:
+// dijit/_base/popup
+// summary:
+// 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(){}
+ };
+ }
+ return origCreateWrapper.call(this, widget);
+};
+
+// Support old format of orient parameter
+var origOpen = popup.open;
+popup.open = function(/*dijit.popup.__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 1010a4fca..dd7027147 100644
--- a/lib/dijit/_base/scroll.js
+++ b/lib/dijit/_base/scroll.js
@@ -1,22 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.scroll"] = true;
-dojo.provide("dijit._base.scroll");
-dojo.require("dojo.window");
-
-
-dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
- // summary:
- // Scroll the passed node into view, if it is not already.
- // Deprecated, use `dojo.window.scrollIntoView` instead.
-
- dojo.window.scrollIntoView(node, pos);
-};
-
-}
+//>>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
diff --git a/lib/dijit/_base/scroll.js.uncompressed.js b/lib/dijit/_base/scroll.js.uncompressed.js
new file mode 100644
index 000000000..6de65e593
--- /dev/null
+++ b/lib/dijit/_base/scroll.js.uncompressed.js
@@ -0,0 +1,17 @@
+define("dijit/_base/scroll", [
+ "dojo/window", // windowUtils.scrollIntoView
+ ".." // export symbol to dijit
+], function(windowUtils, dijit){
+ // module:
+ // dijit/_base/scroll
+ // 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 b/lib/dijit/_base/sniff.js
index c7c6b94d8..43df2eaed 100644
--- a/lib/dijit/_base/sniff.js
+++ b/lib/dijit/_base/sniff.js
@@ -1,21 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.sniff"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.sniff"] = true;
-dojo.provide("dijit._base.sniff");
-dojo.require("dojo.uacss");
-
-
-// summary:
-// Applies pre-set CSS classes to the top-level HTML node, see
-// `dojo.uacss` for details.
-//
-// Simply doing a require on this module will
-// establish this CSS. Modified version of Morris' CSS hack.
-
-}
+//>>built
+define("dijit/_base/sniff",["dojo/uacss"],function(){}); \ No newline at end of file
diff --git a/lib/dijit/_base/sniff.js.uncompressed.js b/lib/dijit/_base/sniff.js.uncompressed.js
new file mode 100644
index 000000000..e2afeb12e
--- /dev/null
+++ b/lib/dijit/_base/sniff.js.uncompressed.js
@@ -0,0 +1,6 @@
+define("dijit/_base/sniff", [ "dojo/uacss" ], function(){
+ // module:
+ // dijit/_base/sniff
+ // summary:
+ // Back compatibility module, new code should require dojo/uacss directly instead of this module.
+});
diff --git a/lib/dijit/_base/typematic.js b/lib/dijit/_base/typematic.js
index f424b71d5..fd36073db 100644
--- a/lib/dijit/_base/typematic.js
+++ b/lib/dijit/_base/typematic.js
@@ -1,191 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.typematic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.typematic"] = true;
-dojo.provide("dijit._base.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(dojo.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 (optional):
- // 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 (optional):
- // the number of milliseconds until the 2nd event occurs, default=500ms
- // minDelay (optional):
- // 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._evt = evt;
- this._node = node;
- this._currentTimeout = -1;
- this._count = -1;
- this._callback = dojo.hitch(_this, callback);
- this._fireEventAndReload();
- this._evt = dojo.mixin({faux: true}, evt);
- }
- },
-
- 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:
- // an array of dojo.connect handles
- if(keyObject.keyCode){
- keyObject.charOrCode = keyObject.keyCode;
- dojo.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);
- dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0");
- }
- return [
- dojo.connect(node, "onkeypress", 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)){
- dojo.stopEvent(evt);
- dijit.typematic.trigger(evt, _this, node, callback, keyObject, subsequentDelay, initialDelay, minDelay);
- }else if(dijit.typematic._obj == keyObject){
- dijit.typematic.stop();
- }
- }),
- dojo.connect(node, "onkeyup", this, function(evt){
- if(dijit.typematic._obj == keyObject){
- dijit.typematic.stop();
- }
- })
- ];
- },
-
- 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:
- // an array of dojo.connect handles
- var dc = dojo.connect;
- return [
- dc(node, "mousedown", this, function(evt){
- dojo.stopEvent(evt);
- dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay);
- }),
- dc(node, "mouseup", this, function(evt){
- dojo.stopEvent(evt);
- dijit.typematic.stop();
- }),
- dc(node, "mouseout", this, function(evt){
- dojo.stopEvent(evt);
- dijit.typematic.stop();
- }),
- dc(node, "mousemove", this, function(evt){
- evt.preventDefault();
- }),
- dc(node, "dblclick", this, function(evt){
- dojo.stopEvent(evt);
- if(dojo.isIE){
- dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay);
- setTimeout(dojo.hitch(this, dijit.typematic.stop), 50);
- }
- })
- ];
- },
-
- 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:
- // an array of dojo.connect handles
- return this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay, minDelay).concat(
- this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay, minDelay));
- }
-};
-
-}
+//>>built
+define("dijit/_base/typematic",["../typematic"],function(){}); \ No newline at end of file
diff --git a/lib/dijit/_base/typematic.js.uncompressed.js b/lib/dijit/_base/typematic.js.uncompressed.js
new file mode 100644
index 000000000..dea7c8ee6
--- /dev/null
+++ b/lib/dijit/_base/typematic.js.uncompressed.js
@@ -0,0 +1,3 @@
+define("dijit/_base/typematic", ["../typematic"], function(){
+ // for back-compat, just loads top level module
+});
diff --git a/lib/dijit/_base/wai.js b/lib/dijit/_base/wai.js
index 58c9cdb8f..d16ca3575 100644
--- a/lib/dijit/_base/wai.js
+++ b/lib/dijit/_base/wai.js
@@ -1,145 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.wai"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.wai"] = true;
-dojo.provide("dijit._base.wai");
-
-
-dijit.wai = {
- onload: function(){
- // summary:
- // Detects if we are in high-contrast mode or not
-
- // This must be a named function and not an anonymous
- // function, so that the widget parsing code can make sure it
- // registers its onload function after this function.
- // DO NOT USE "this" within this function.
-
- // create div for testing if high contrast mode is on or images are turned off
- var div = dojo.create("div",{
- id: "a11yTestNode",
- style:{
- cssText:'border: 1px solid;'
- + 'border-color:red green;'
- + 'position: absolute;'
- + 'height: 5px;'
- + 'top: -999px;'
- + 'background-image: url("' + (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")) + '");'
- }
- }, dojo.body());
-
- // test it
- var cs = dojo.getComputedStyle(div);
- if(cs){
- var bkImg = cs.backgroundImage;
- var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
- dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
- if(dojo.isIE){
- div.outerHTML = ""; // prevent mixed-content warning, see http://support.microsoft.com/kb/925014
- }else{
- dojo.body().removeChild(div);
- }
- }
- }
-};
-
-// Test if computer is in high contrast mode.
-// Make sure the a11y test runs first, before widgets are instantiated.
-if(dojo.isIE || dojo.isMoz){ // NOTE: checking in Safari messes things up
- dojo._loaders.unshift(dijit.wai.onload);
-}
-
-dojo.mixin(dijit, {
- 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 dojo.trim((dojo.attr(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.
-
- dojo.attr(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 = dojo.attr(elem, "role");
- if(!roleValue){ return; }
- if(role){
- var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
- dojo.attr(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);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/_base/wai.js.uncompressed.js b/lib/dijit/_base/wai.js.uncompressed.js
new file mode 100644
index 000000000..524007695
--- /dev/null
+++ b/lib/dijit/_base/wai.js.uncompressed.js
@@ -0,0 +1,105 @@
+define("dijit/_base/wai", [
+ "dojo/dom-attr", // domAttr.attr
+ "dojo/_base/lang", // lang.mixin
+ "..", // 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
+ // summary:
+ // Deprecated methods for setting/getting wai roles and states.
+ // New code should call setAttribute()/getAttribute() directly.
+ //
+ // Also loads hccss to apply dijit_a11y class to root node if machine is in high-contrast mode.
+
+ lang.mixin(dijit, {
+ 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);
+ }
+ });
+
+ return dijit;
+});
diff --git a/lib/dijit/_base/window.js b/lib/dijit/_base/window.js
index 713455b90..4b79d780d 100644
--- a/lib/dijit/_base/window.js
+++ b/lib/dijit/_base/window.js
@@ -1,18 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.window"] = true;
-dojo.provide("dijit._base.window");
-dojo.require("dojo.window");
-
-
-dijit.getDocumentWindow = function(doc){
- return dojo.window.get(doc);
-};
-
-}
+//>>built
+define("dijit/_base/window",["dojo/window",".."],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..0e065c966
--- /dev/null
+++ b/lib/dijit/_base/window.js.uncompressed.js
@@ -0,0 +1,13 @@
+define("dijit/_base/window", [
+ "dojo/window", // windowUtils.get
+ ".." // export symbol to dijit
+], function(windowUtils, dijit){
+ // module:
+ // dijit/_base/window
+ // 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 978371557..afa4a944d 100644
--- a/lib/dijit/_editor/RichText.js
+++ b/lib/dijit/_editor/RichText.js
@@ -1,2096 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.RichText"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.RichText"] = true;
-dojo.provide("dijit._editor.RichText");
-dojo.require("dijit._Widget");
-dojo.require("dijit._CssStateMixin");
-dojo.require("dijit._editor.selection");
-dojo.require("dijit._editor.range");
-dojo.require("dijit._editor.html");
-
-
-// used to restore content when user leaves this page then comes back
-// but do not try doing dojo.doc.write if we are using xd loading.
-// dojo.doc.write will only work if RichText.js is included in the dojo.js
-// file. If it is included in dojo.js and you want to allow rich text saving
-// for back/forward actions, then set dojo.config.allowXdRichTextSave = true.
-if(!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"]){
- if(dojo._postLoad){
- (function(){
- var savetextarea = dojo.doc.createElement('textarea');
- savetextarea.id = dijit._scopeName + "._editor.RichText.value";
- dojo.style(savetextarea, {
- display:'none',
- position:'absolute',
- top:"-100px",
- height:"3px",
- width:"3px"
- });
- dojo.body().appendChild(savetextarea);
- })();
- }else{
- //dojo.body() is not available before onLoad is fired
- try{
- dojo.doc.write('<textarea id="' + dijit._scopeName + '._editor.RichText.value" ' +
- 'style="display:none;position:absolute;top:-100px;left:-100px;height:3px;width:3px;overflow:hidden;"></textarea>');
- }catch(e){ }
- }
-}
-
-dojo.declare("dijit._editor.RichText", [dijit._Widget, dijit._CssStateMixin], {
- constructor: function(params){
- // 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
-
- // 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 && dojo.isString(params.value)){
- this.value = params.value;
- }
-
- this.onLoadDeferred = new dojo.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 = [dojo.hitch(this, "_preFixUrlAttributes")].concat(this.contentPreFilters);
- if(dojo.isMoz){
- this.contentPreFilters = [this._normalizeFontStyle].concat(this.contentPreFilters);
- this.contentPostFilters = [this._removeMozBogus].concat(this.contentPostFilters);
- }
- if(dojo.isWebKit){
- // 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(dojo.isIE){
- // IE generates <strong> and <em> but we want to normalize to <b> and <i>
- this.contentPostFilters = [this._normalizeFontStyle].concat(this.contentPostFilters);
- }
- this.inherited(arguments);
-
- dojo.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 = dojo.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(!dojo.isIE){
- ctrlKeyHandlers.Z = exec("redo"); //FIXME: undo?
- }
-
- for(var 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(dijit._editor._editorCommandsLocalized){
- // Use the already generate cache of mappings.
- this._local2NativeFormatNames = dijit._editor._local2NativeFormatNames;
- this._native2LocalFormatNames = dijit._editor._native2LocalFormatNames;
- return;
- }
- dijit._editor._editorCommandsLocalized = true;
- dijit._editor._local2NativeFormatNames = {};
- dijit._editor._native2LocalFormatNames = {};
- this._local2NativeFormatNames = dijit._editor._local2NativeFormatNames;
- this._native2LocalFormatNames = dijit._editor._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 = dojo.create('div', {style: style, innerHTML: localhtml});
- dojo.body().appendChild(div);
-
- // IE9 has a timing issue with doing this right after setting
- // the inner HTML, so put a delay in.
- var inject = dojo.hitch(this, function(){
- var node = div.firstChild;
- while(node){
- try{
- dijit._editor.selection.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 */ }
- }
- div.parentNode.removeChild(div);
- div.innerHTML = "";
- });
- setTimeout(inject, 0);
- },
-
- 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 dojo.Deferred();
- }
-
- if(!this.isClosed){ this.close(); }
- dojo.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(dojo.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 = dojo.doc.createElement("div");
- dn.setAttribute('widgetId', this.id);
- ta.removeAttribute('widgetId');
- dn.cssText = ta.cssText;
- dn.className += " " + ta.className;
- dojo.place(dn, ta, "before");
- var tmpFunc = dojo.hitch(this, function(){
- //some browsers refuse to submit display=none textarea, so
- //move the textarea off screen instead
- dojo.style(ta, {
- display: "block",
- position: "absolute",
- top: "-1000px"
- });
-
- if(dojo.isIE){ //nasty IE bug: abnormal formatting if overflow is not hidden
- var s = ta.style;
- this.__overflow = s.overflow;
- s.overflow = "hidden";
- }
- });
- if(dojo.isIE){
- setTimeout(tmpFunc, 10);
- }else{
- tmpFunc();
- }
-
- if(ta.form){
- var resetValue = ta.value;
- this.reset = function(){
- var current = this.getValue();
- if(current != resetValue){
- this.replaceValue(resetValue);
- }
- };
- dojo.connect(ta.form, "onsubmit", this, function(){
- // Copy value to the <textarea> so it gets submitted along with form.
- // FIXME: should we be calling close() here instead?
- dojo.attr(ta, 'disabled', this.disabled); // don't submit the value if disabled
- ta.value = this.getValue();
- });
- }
- }else{
- html = dijit._editor.getChildrenHtml(dn);
- dn.innerHTML = "";
- }
-
- var content = dojo.contentBox(dn);
- this._oldHeight = content.h;
- this._oldWidth = content.w;
-
- 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 !== "" && (!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"])){
- var saveTextarea = dojo.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(!dijit._editor._globalSaveHandler){
- dijit._editor._globalSaveHandler = {};
- dojo.addOnUnload(function() {
- var id;
- for(id in dijit._editor._globalSaveHandler){
- var f = dijit._editor._globalSaveHandler[id];
- if(dojo.isFunction(f)){
- f();
- }
- }
- });
- }
- dijit._editor._globalSaveHandler[this.id] = dojo.hitch(this, "_saveContent");
- }
-
- this.isClosed = false;
-
- var ifr = (this.editorObject = this.iframe = dojo.doc.createElement('iframe'));
- ifr.id = this.id+"_iframe";
- this._iframeSrc = this._getIframeDocTxt();
- 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(dojo.isIE >= 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 = dojo.hitch( this, function(win){
- this.window = win;
- this.document = this.window.document;
-
- if(dojo.isIE){
- this._localizeEditorCommands();
- }
-
- // Do final setup and set initial contents of editor
- this.onLoad(html);
- });
-
- // Set the iframe's initial (blank) content.
- var s = 'javascript:parent.' + dijit._scopeName + '.byId("'+this.id+'")._iframeSrc';
- ifr.setAttribute('src', s);
- this.editingArea.appendChild(ifr);
-
- if(dojo.isSafari <= 4){
- var src = ifr.getAttribute("src");
- if(!src || src.indexOf("javascript") == -1){
- // Safari 4 and earlier sometimes act oddly
- // So we have to set it again.
- setTimeout(function(){ifr.setAttribute('src', s);},0);
- }
- }
-
- // TODO: this is a guess at the default line-height, kinda works
- if(dn.nodeName == "LI"){
- dn.lastChild.style.marginTop = "-1.2em";
- }
-
- dojo.addClass(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 = dojo.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(dojo.isIE || dojo.isWebKit || (!this.height && !dojo.isMoz)){
- // 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(dojo.isMoz){
- // 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 = "&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 = dojo.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;
- }
- }
- dojo.style(self.domNode, sC, "");
- }
- userStyle += match + ';';
- });
-
-
- // need to find any associated label element and update iframe document title
- var label=dojo.query('label[for="'+this.id+'"]');
-
- return [
- this.isLeftToRight() ? "<html>\n<head>\n" : "<html dir='rtl'>\n<head>\n",
- (dojo.isMoz && 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.
- ((dojo.isWebKit)?"\t\twidth: 100%;\n":""),
- ((dojo.isWebKit)?"\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||dojo.isOpera) ? "" : "\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.
- (!dojo.isIE ? "\tli{ min-height:1.2em; }\n" : ""),
- "</style>\n",
- this._applyEditingAreaStyleSheets(),"\n",
- "</head>\n<body ",
- (setBodyId?"id='dijitEditorBody' ":""),
- "onload='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 dojo._Url(dojo.global.location, url)).toString();
- this.editingAreaStyleSheets.push(abstring);
- text += '<link rel="stylesheet" type="text/css" href="'+abstring+'"/>';
- }
- return text;
- },
-
- addStyleSheet: function(/*dojo._Url*/ uri){
- // summary:
- // add an external stylesheet for the editing area
- // uri:
- // A dojo.uri.Uri pointing to the 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 dojo._Url(dojo.global.location, url)).toString();
- }
-
- if(dojo.indexOf(this.editingAreaStyleSheets, url) > -1){
-// console.debug("dijit._editor.RichText.addStyleSheet: Style sheet "+url+" is already applied");
- return;
- }
-
- this.editingAreaStyleSheets.push(url);
- this.onLoadDeferred.addCallback(dojo.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._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 dojo._Url(dojo.global.location, url)).toString();
- }
- var index = dojo.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];
- dojo.withGlobal(this.window,'query', dojo, ['link:[href="'+url+'"]']).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(dojo.isIE || dojo.isWebKit || dojo.isOpera){
- var preventIEfocus = dojo.isIE && (this.isLoaded || !this.focusOnLoad);
- if(preventIEfocus){ this.editNode.unselectable = "on"; }
- this.editNode.contentEditable = !value;
- if(preventIEfocus){
- var _this = this;
- setTimeout(function(){ _this.editNode.unselectable = "off"; }, 0);
- }
- }else{ //moz
- try{
- this.document.designMode=(value?'off':'on');
- }catch(e){ return; } // ! _disabledOK
- if(!value && this._mozSettingProps){
- var ps = this._mozSettingProps;
- for(var 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 = dijit.registerIframe(this.iframe);
- }
- if(!dojo.isIE && !dojo.isWebKit && (this.height || dojo.isMoz)){
- 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(dojo.isIE){ // #4996 IE wants to focus the BODY tag
- this.tabStop = dojo.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;
- dojo.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(dojo.isIE){ // 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(dojo.isWebKit){
- //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.
- setTimeout(dojo.hitch(this, "placeCursorAtEnd"), 0);
- }
- });
- }
-
- if(dojo.isIE){
- // 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 = dojo.hitch(this, function(){
- this.setValue(html);
- if(this.onLoadDeferred){
- this.onLoadDeferred.callback(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
- dojo.addOnLoad(dojo.hitch(this, function(){ setTimeout(dojo.hitch(this, "focus"), this.updateInterval); }));
- }
- // Save off the initial content now
- this.value = this.getValue(true);
- });
- if(this.setValueDeferred){
- this.setValueDeferred.addCallback(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 === dojo.keys.TAB && this.isTabIndent ){
- dojo.stopEvent(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(dojo.isIE){
- if(e.keyCode == dojo.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 === dojo.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
- dojo.stopEvent(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);
- }
- }
- return true;
- },
-
- onKeyUp: function(e){
- // summary:
- // Handler for onkeyup event
- // tags:
- // callback
- return;
- },
-
- setDisabled: function(/*Boolean*/ disabled){
- // summary:
- // Deprecated, use set('disabled', ...) instead.
- // tags:
- // deprecated
- dojo.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){
- dojo.attr(this.document.body, "spellcheck", !disabled);
- }else{
- // try again after the editor is finished loading
- this.onLoadDeferred.addCallback(dojo.hitch(this, function(){
- dojo.attr(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){
- dojo.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 = dojo.hitch(this, "onKeyPressed");
- }
- setTimeout(this._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(!dojo.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(/*Event*/ e){
- // 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(!dojo.isIE && this.window.document.documentElement && this.window.document.documentElement.focus){
- this.window.document.documentElement.focus();
- }else if(dojo.doc.body.focus){
- dojo.doc.body.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(!dojo.isIE){
- dijit.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 everytime 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){
- clearTimeout(this._updateTimer);
- }
- if(!this._updateHandler){
- this._updateHandler = dojo.hitch(this,"onNormalizedDisplayChanged");
- }
- this._updateTimer = setTimeout(this._updateHandler, 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 by dojo.connect to map our
- // normalized set of commands to those supported by the target
- // browser.
- // tags:
- // private
-
- var command = cmd.toLowerCase();
- if(command == "formatblock"){
- if(dojo.isSafari && argument === undefined){ command = "heading"; }
- }else if(command == "hilitecolor" && !dojo.isMoz){
- 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);
- 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 (dojo.isIE && supportedBy.ie) ||
- (dojo.isMoz && supportedBy.mozilla) ||
- (dojo.isWebKit && supportedBy.webkit) ||
- (dojo.isOpera && 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") && dojo.isIE){
- 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.
- // tags:
- // protected
- if(this.disabled || !this._disabledOK){ return false; }
- command = this._normalizeCommand(command);
- if(dojo.isMoz || dojo.isWebKit){
- if(command == "unlink"){ // mozilla returns true always
- // console.debug(this._sCall("hasAncestorElement", ['a']));
- return this._sCall("hasAncestorElement", ["a"]);
- }else if(command == "inserttable"){
- return true;
- }
- }
- //see #4109
- if(dojo.isWebKit){
- if(command == "cut" || command == "copy") {
- // WebKit deems clipboard activity as a security threat and natively would return false
- var sel = this.window.getSelection();
- if(sel){ sel = sel.toString(); }
- return !!sel;
- }else if(command == "paste"){
- return true;
- }
- }
-
- var elem = dojo.isIE ? this.document.selection.createRange() : this.document;
- try{
- return elem.queryCommandEnabled(command);
- }catch(e){
- //Squelch, occurs if editor is hidden on FF 3 (and maybe others.)
- return false;
- }
-
- },
-
- 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(dojo.isIE && command == "formatblock"){
- r = this._native2LocalFormatNames[this.document.queryCommandValue(command)];
- }else if(dojo.isMoz && 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 dojo.withGlobal(this.window, name, dijit._editor.selection, 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(dojo.isMoz){
- // 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(dojo.isMoz){
- 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;
- if(last.lastChild){
- this._sCall("selectElement", [ last.lastChild ]);
- }else{
- this._sCall("selectElement", [ 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.addCallback(dojo.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 && dojo.isMoz && html.toLowerCase() == "<p></p>"){
- html = "<p>&nbsp;</p>";
- }
-
- // Use &nbsp; to avoid webkit problems where editor is disabled until the user clicks it
- if(!html && dojo.isWebKit){
- html = "&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 && !dojo.isMoz){ // 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 = "&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;
- dojo.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;
- dojo.forEach(this.contentDomPreFilters, function(ef){
- if(ef && dojo.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(!dojo.isString(dom)){
- dom = dom || this.editNode;
- if(this.contentDomPostFilters.length){
- if(nonDestructive){
- dom = dojo.clone(dom);
- }
- dojo.forEach(this.contentDomPostFilters, function(ef){
- dom = ef(dom);
- });
- }
- ec = dijit._editor.getChildrenHtml(dom);
- }else{
- ec = dom;
- }
-
- if(!dojo.trim(ec.replace(/^\xA0\xA0*/, '').replace(/\xA0\xA0*$/, '')).length){
- ec = "";
- }
-
- // if(dojo.isIE){
- // //removing appended <P>&nbsp;</P> for IE
- // ec = ec.replace(/(?:<p>&nbsp;</p>[\n\r]*)+$/i,"");
- // }
- dojo.forEach(this.contentPostFilters, function(ef){
- ec = ef(ec);
- });
-
- return ec;
- },
-
- _saveContent: function(/*Event*/ e){
- // summary:
- // Saves the content in an onunload event if the editor has not been closed
- // tags:
- // private
-
- var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.value");
- 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._getNodeHtml() instead.
- // tags:
- // deprecated
- dojo.deprecated('dijit.Editor::getNodeHtml is deprecated','use dijit._editor.getNodeHtml instead', 2);
- return dijit._editor.getNodeHtml(node); // String
- },
-
- getNodeChildrenHtml: function(/* DomNode */ dom){
- // summary:
- // Deprecated. Use dijit._editor.getChildrenHtml() instead.
- // tags:
- // deprecated
- dojo.deprecated('dijit.Editor::getNodeChildrenHtml is deprecated','use dijit._editor.getChildrenHtml instead', 2);
- return dijit._editor.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(dojo.isIE){
- this.iframe.onfocus = null;
- }
- this.iframe._loadFunc = null;
-
- if(this._iframeRegHandle){
- dijit.unregisterIframe(this._iframeRegHandle);
- delete this._iframeRegHandle;
- }
-
- if(this.textarea){
- var s = this.textarea.style;
- s.position = "";
- s.left = s.top = "";
- if(dojo.isIE){
- s.overflow = this.__overflow;
- this.__overflow = null;
- }
- this.textarea.value = this.value;
- dojo.destroy(this.domNode);
- this.domNode = this.textarea;
- }else{
- // Note that this destroys the iframe
- this.domNode.innerHTML = this.value;
- }
- delete this.iframe;
-
- dojo.removeClass(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); }
- this.inherited(arguments);
- if(dijit._editor._globalSaveHandler){
- delete dijit._editor._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.
- ******************************************************************************/
-
- _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(dojo.isIE){
- 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")) && (dojo.isMoz || dojo.isWebKit)){
- 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;
- if(dojo.isMoz){
- // mozilla doesn't support hilitecolor properly when useCSS is
- // set to false (bugzilla #279330)
- this.document.execCommand("styleWithCSS", false, true);
- 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(dojo.isIE){
- // 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;
- }
- return this.document.execCommand("backcolor", false, argument);
- },
-
- _forecolorImpl: function(argument){
- // summary:
- // This function implements the forecolor command
- // argument:
- // arguments to the exec command, if any.
- // tags:
- // protected
- if(dojo.isIE){
- // 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;
- }
- return this.document.execCommand("forecolor", false, argument);
- },
-
- _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(dojo.isIE){
- 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(dojo.isMoz && !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
- if(dojo.isIE){
- this._adaptIESelection()
- }
- return this.document.execCommand("bold", false, argument);
- },
-
- _italicImpl: function(argument){
- // summary:
- // This function implements an over-ride of the italic command.
- // argument:
- // Not used, operates by selection.
- // tags:
- // protected
- if(dojo.isIE){
- this._adaptIESelection()
- }
- return this.document.execCommand("italic", false, argument);
- },
-
- _underlineImpl: function(argument){
- // summary:
- // This function implements an over-ride of the underline command.
- // argument:
- // Not used, operates by selection.
- // tags:
- // protected
- if(dojo.isIE){
- this._adaptIESelection()
- }
- return this.document.execCommand("underline", false, argument);
- },
-
- _strikethroughImpl: function(argument){
- // summary:
- // This function implements an over-ride of the strikethrough command.
- // argument:
- // Not used, operates by selection.
- // tags:
- // protected
- if(dojo.isIE){
- this._adaptIESelection()
- }
- return this.document.execCommand("strikethrough", false, argument);
- },
-
- 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 = dojo.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 = dijit.range.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);
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/_editor/RichText.js.uncompressed.js b/lib/dijit/_editor/RichText.js.uncompressed.js
new file mode 100644
index 000000000..9e385fbb4
--- /dev/null
+++ b/lib/dijit/_editor/RichText.js.uncompressed.js
@@ -0,0 +1,2891 @@
+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.getMarginBox 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/_base/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.body win.doc.body.focus win.doc.createElement win.global.location win.withGlobal
+ "../_Widget",
+ "../_CssStateMixin",
+ "./selection",
+ "./range",
+ "./html",
+ "../focus",
+ ".." // 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){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _CssStateMixin = dijit._CssStateMixin;
+=====*/
+
+// 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){
+ // 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});
+ win.body().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{
+ selectionapi.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 */ }
+ }
+ div.parentNode.removeChild(div);
+ div.innerHTML = "";
+ });
+ setTimeout(inject, 0);
+ },
+
+ 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 = win.doc.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")){
+ setTimeout(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 = win.doc.createElement('iframe'));
+ ifr.id = this.id+"_iframe";
+ this._iframeSrc = this._getIframeDocTxt();
+ 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 iframeSrcRef = 'parent.' + dijit._scopeName + '.byId("'+this.id+'")._iframeSrc';
+ var s = 'javascript:(function(){try{return ' + iframeSrcRef + '}catch(e){document.open();document.domain="' +
+ document.domain + '";document.write(' + iframeSrcRef + ');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){
+ // Safari 4 and earlier sometimes act oddly
+ // So we have to set it again.
+ setTimeout(function(){ifr.setAttribute('src', s);},0);
+ }
+ }
+
+ // 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='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._Url*/ uri){
+ // summary:
+ // add an external stylesheet for the editing area
+ // uri:
+ // A dojo.uri.Uri pointing to the 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.addCallback(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._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];
+ win.withGlobal(this.window,'query', dojo, ['link:[href="'+url+'"]']).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){
+ var _this = this;
+ setTimeout(function(){
+ if(_this.editNode){ // guard in case widget destroyed before timeout
+ _this.editNode.unselectable = "off";
+ }
+ }, 0);
+ }
+ }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.
+ setTimeout(lang.hitch(this, "placeCursorAtEnd"), 0);
+ }
+ });
+ }
+
+ 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.callback(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, function(){ setTimeout(lang.hitch(this, "focus"), this.updateInterval); }));
+ }
+ // Save off the initial content now
+ this.value = this.getValue(true);
+ });
+ if(this.setValueDeferred){
+ this.setValueDeferred.addCallback(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.addCallback(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");
+ }
+ setTimeout(this._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(win.doc.body.focus){
+ win.doc.body.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){
+ clearTimeout(this._updateTimer);
+ }
+ if(!this._updateHandler){
+ this._updateHandler = lang.hitch(this,"onNormalizedDisplayChanged");
+ }
+ this._updateTimer = setTimeout(this._updateHandler, 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);
+ 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;
+ if(last.lastChild){
+ this._sCall("selectElement", [ last.lastChild ]);
+ }else{
+ this._sCall("selectElement", [ 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.addCallback(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){
+ clearTimeout(this._updateTimer);
+ }
+ 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.
+ 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);
+ win.withGlobal(this.window, lang.hitch(this, function(){
+ var newrange = rangeapi.create();
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ selectionapi.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");
+ win.withGlobal(this.window, lang.hitch(this, function(){
+ var newrange = rangeapi.create();
+ newrange.setStart(sNode, 0);
+ newrange.setEnd(sNode, sNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ selectionapi.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.
+ win.withGlobal(this.window, lang.hitch(this, function(){
+ 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();
+ 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);
+ selectionapi.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?
+ win.withGlobal(this.window, lang.hitch(this, function(){
+ // 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 = domConstruct.create(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();
+ newrange.setStart(sc, 0);
+ newrange.setEnd(sc, sc.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ selectionapi.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.
+ win.withGlobal(this.window, lang.hitch(this, function(){
+ 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 = domConstruct.create("span");
+ sNode = doc.createTextNode(".");
+ breaker.appendChild(sNode);
+ // Create a junk node to avoid it trying to stlye the breaker.
+ // This will get destroyed later.
+ var extraSpan = domConstruct.create("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();
+ 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);
+ selectionapi.remove();
+ domConstruct.destroy(extraSpan);
+ breaker.innerHTML = "&#160;"; // &nbsp;
+ selectionapi.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);
+ selectionapi.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(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).
+ win.withGlobal(this.window, lang.hitch(this, function(){
+ var breakers = query(".ieFormatBreakerSpan", node);
+ var i;
+ for(i = 0; i < breakers.length; i++){
+ var b = breakers[i];
+ 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 2f769960d..7eff3ba01 100644
--- a/lib/dijit/_editor/_Plugin.js
+++ b/lib/dijit/_editor/_Plugin.js
@@ -1,289 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor._Plugin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor._Plugin"] = true;
-dojo.provide("dijit._editor._Plugin");
-dojo.require("dijit._Widget");
-dojo.require("dijit.form.Button");
-
-
-dojo.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(/*Object?*/args, /*DomNode?*/node){
- this.params = args || {};
- dojo.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._Widget?
- // 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: dijit.form.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 = dojo.mixin({
- label: label,
- 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
-
- dojo.forEach(this._connects, dojo.disconnect);
- if(this.dropDown){
- this.dropDown.destroyRecursive();
- }
- },
-
- connect: function(o, f, tf){
- // summary:
- // Make a dojo.connect() that is automatically disconnected when this plugin is destroyed.
- // Similar to `dijit._Widget.connect`.
- // tags:
- // protected
- this._connects.push(dojo.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(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",
- dojo.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
- var oldValue = this[name];
- this[name] = value;
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/_editor/_Plugin.js.uncompressed.js b/lib/dijit/_editor/_Plugin.js.uncompressed.js
new file mode 100644
index 000000000..d1bed1298
--- /dev/null
+++ b/lib/dijit/_editor/_Plugin.js.uncompressed.js
@@ -0,0 +1,294 @@
+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(/*Object?*/args){
+ 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._Widget?
+ // 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,
+ 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(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 196c8a309..45becc4b0 100644
--- a/lib/dijit/_editor/html.js
+++ b/lib/dijit/_editor/html.js
@@ -1,193 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.html"] = true;
-dojo.provide("dijit._editor.html");
-
-dojo.getObject("_editor", true, dijit);
-
-dijit._editor.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
-};
-
-dijit._editor.getNodeHtml=function(/* DomNode */node){
- var output;
- 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 = '<' + lName;
-
- //store the list of attributes and sort it to have the
- //attributes appear in the dictionary order
- var attrarray = [];
- var attr;
- if(dojo.isIE && node.outerHTML){
- var s = node.outerHTML;
- s = s.substr(0, s.indexOf('>'))
- .replace(/(['"])[^"']*\1/g, ''); //to make the following regexp safe
- var reg = /(\b\w+)\s?=/g;
- var m, key;
- while((m = reg.exec(s))){
- key = m[1];
- if(key.substr(0,3) != '_dj'){
- if(key == 'src' || key == 'href'){
- if(node.getAttribute('_djrealurl')){
- attrarray.push([key,node.getAttribute('_djrealurl')]);
- continue;
- }
- }
- 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()]);
- }
- }
- }
- }else{
- 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' /*&&
- (attr.specified == undefined || attr.specified)*/){
- var v = attr.value;
- if(n == 'src' || n == 'href'){
- if(node.getAttribute('_djrealurl')){
- v = node.getAttribute('_djrealurl');
- }
- }
- attrarray.push([n,v]);
- }
- }
- }
- 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 += ' ' + attr[0] + '="' +
- (dojo.isString(attr[1]) ? dijit._editor.escapeXml(attr[1], true) : attr[1]) + '"';
- }
- if(lName === "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 += '>' + node.innerHTML +'</' + lName + '>';
- }else{
- if(node.childNodes.length){
- output += '>' + dijit._editor.getChildrenHtml(node)+'</' + lName +'>';
- }else{
- 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 += ' />';
- break;
- default:
- // Assume XML style separate closure for everything else.
- output += '></' + lName + '>';
- }
- }
- }
- break;
- case 4: // cdata
- case 3: // text
- // FIXME:
- output = dijit._editor.escapeXml(node.nodeValue, true);
- break;
- case 8: //comment
- // FIXME:
- output = '<!--' + dijit._editor.escapeXml(node.nodeValue, true) + '-->';
- break;
- default:
- output = "<!-- Element not recognized - Type: " + node.nodeType + " Name: " + node.nodeName + "-->";
- }
- return output;
-};
-
-dijit._editor.getChildrenHtml = function(/* DomNode */dom){
- // summary:
- // Returns the html content of a DomNode and children
- var out = "";
- if(!dom){ return out; }
- 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 = !dojo.isIE || 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 otherise 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){
- out += dijit._editor.getNodeHtml(node);
- }
- }
- return out; // String
-};
-
-}
+//>>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
diff --git a/lib/dijit/_editor/html.js.uncompressed.js b/lib/dijit/_editor/html.js.uncompressed.js
new file mode 100644
index 000000000..94a8dacfd
--- /dev/null
+++ b/lib/dijit/_editor/html.js.uncompressed.js
@@ -0,0 +1,194 @@
+define("dijit/_editor/html", [
+ "dojo/_base/lang", // lang.isString
+ "dojo/_base/sniff", // has("ie")
+ ".." // for exporting symbols to dijit._editor (remove for 2.0)
+], function(lang, has, dijit){
+
+// module:
+// dijit/_editor/html
+// summary:
+// Utility functions used by editor
+
+lang.getObject("_editor", true, dijit);
+
+dijit._editor.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
+};
+
+dijit._editor.getNodeHtml=function(/* DomNode */node){
+ var output;
+ 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 = '<' + lName;
+
+ //store the list of attributes and sort it to have the
+ //attributes appear in the dictionary order
+ var attrarray = [];
+ var attr;
+ if(has("ie") && node.outerHTML){
+ var s = node.outerHTML;
+ s = s.substr(0, s.indexOf('>'))
+ .replace(/(['"])[^"']*\1/g, ''); //to make the following regexp safe
+ var reg = /(\b\w+)\s?=/g;
+ var m, key;
+ while((m = reg.exec(s))){
+ key = m[1];
+ if(key.substr(0,3) != '_dj'){
+ if(key == 'src' || key == 'href'){
+ if(node.getAttribute('_djrealurl')){
+ attrarray.push([key,node.getAttribute('_djrealurl')]);
+ continue;
+ }
+ }
+ 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()]);
+ }
+ }
+ }
+ }else{
+ 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' /*&&
+ (attr.specified == undefined || attr.specified)*/){
+ var v = attr.value;
+ if(n == 'src' || n == 'href'){
+ if(node.getAttribute('_djrealurl')){
+ v = node.getAttribute('_djrealurl');
+ }
+ }
+ attrarray.push([n,v]);
+ }
+ }
+ }
+ 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 += ' ' + attr[0] + '="' +
+ (lang.isString(attr[1]) ? dijit._editor.escapeXml(attr[1], true) : attr[1]) + '"';
+ }
+ if(lName === "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 += '>' + node.innerHTML +'</' + lName + '>';
+ }else{
+ if(node.childNodes.length){
+ output += '>' + dijit._editor.getChildrenHtml(node)+'</' + lName +'>';
+ }else{
+ 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 += ' />';
+ break;
+ default:
+ // Assume XML style separate closure for everything else.
+ output += '></' + lName + '>';
+ }
+ }
+ }
+ break;
+ case 4: // cdata
+ case 3: // text
+ // FIXME:
+ output = dijit._editor.escapeXml(node.nodeValue, true);
+ break;
+ case 8: //comment
+ // FIXME:
+ output = '<!--' + dijit._editor.escapeXml(node.nodeValue, true) + '-->';
+ break;
+ default:
+ output = "<!-- Element not recognized - Type: " + node.nodeType + " Name: " + node.nodeName + "-->";
+ }
+ return output;
+};
+
+dijit._editor.getChildrenHtml = function(/* DomNode */dom){
+ // summary:
+ // Returns the html content of a DomNode and children
+ var out = "";
+ if(!dom){ return out; }
+ 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 otherise 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){
+ out += dijit._editor.getNodeHtml(node);
+ }
+ }
+ return out; // String
+};
+
+return dijit._editor;
+});
diff --git a/lib/dijit/_editor/nls/FontChoice.js b/lib/dijit/_editor/nls/FontChoice.js
index f2b6e0c90..f6b3da4e4 100644
--- a/lib/dijit/_editor/nls/FontChoice.js
+++ b/lib/dijit/_editor/nls/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"None","1":"xx-small","2":"x-small","formatBlock":"Format","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Paragraph","pre":"Pre-formatted","sans-serif":"sans-serif","fontName":"Font","h1":"Heading","h2":"Subheading","h3":"Sub-subheading","monospace":"monospace","fontSize":"Size","cursive":"cursive"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/FontChoice",{root:({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"}),"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}); \ No newline at end of file
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 b/lib/dijit/_editor/nls/LinkDialog.js
index 0dd81f149..aa9435913 100644
--- a/lib/dijit/_editor/nls/LinkDialog.js
+++ b/lib/dijit/_editor/nls/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Description:","insertImageTitle":"Image Properties","set":"Set","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","createLinkTitle":"Link Properties","parentWindow":"Parent Window","currentWindow":"Current Window","url":"URL:"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/LinkDialog",{root:({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"}),"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}); \ No newline at end of file
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 b/lib/dijit/_editor/nls/ar/FontChoice.js
index dd4f99423..76de525e2 100644
--- a/lib/dijit/_editor/nls/ar/FontChoice.js
+++ b/lib/dijit/_editor/nls/ar/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"‏لا شيء‏","1":"صغير جدا جدا","2":"صغير جدا","formatBlock":"النسق","3":"صغير","4":"متوسط","5":"كبير","6":"كبير جدا","7":"كبير جدا جدا","fantasy":"خيالي","serif":"serif","p":"فقرة","pre":"منسق بصفة مسبقة","sans-serif":"sans-serif","fontName":"طاقم طباعة","h1":"عنوان","h2":"عنوان فرعي","h3":"فرعي-عنوان فرعي","monospace":"أحادي المسافة","fontSize":"الحجم","cursive":"كتابة بحروف متصلة"}) \ No newline at end of file
+//>>built
+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:"كبير جدا جدا"})); \ No newline at end of file
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..f006116c6
--- /dev/null
+++ b/lib/dijit/_editor/nls/ar/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/ar/FontChoice", //begin v1.x content
+({
+ 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: "كبير جدا جدا"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ar/LinkDialog.js b/lib/dijit/_editor/nls/ar/LinkDialog.js
index e229c6860..458eb0e65 100644
--- a/lib/dijit/_editor/nls/ar/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ar/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"الوصف:","insertImageTitle":"خصائص الصورة","set":"تحديد","newWindow":"‏نافذة جديدة‏","topWindow":"النافذة العلوية","target":"الهدف:","createLinkTitle":"خصائص الوصلة","parentWindow":"النافذة الرئيسية","currentWindow":"النافذة الحالية","url":"‏عنوان URL:‏"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/ar/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/ar/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..a523563d3
--- /dev/null
+++ b/lib/dijit/_editor/nls/ar/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/ar/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "خصائص الوصلة",
+ insertImageTitle: "خصائص الصورة",
+ url: "‏عنوان URL:‏",
+ text: "الوصف:",
+ target: "الهدف:",
+ set: "تحديد",
+ currentWindow: "النافذة الحالية",
+ parentWindow: "النافذة الرئيسية",
+ topWindow: "النافذة العلوية",
+ newWindow: "‏نافذة جديدة‏"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ar/commands.js b/lib/dijit/_editor/nls/ar/commands.js
index 81069e8d2..58a6b8ab9 100644
--- a/lib/dijit/_editor/nls/ar/commands.js
+++ b/lib/dijit/_editor/nls/ar/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"ازالة النسق","copy":"نسخ","paste":"لصق","selectAll":"‏اختيار كل‏","insertOrderedList":"‏كشف مرقم‏","insertTable":"ادراج/تحرير جدول","print":"طباعة","underline":"~تسطير","foreColor":"لون الواجهة الأمامية","htmlToggle":"مصدر HTML","formatBlock":"نمط الفقرة","newPage":"صفحة جديدة","insertHorizontalRule":"مسطرة أفقية","delete":"حذف","appleKey":"⌘${0}","insertUnorderedList":"كشف نقطي","tableProp":"خصائص الجدول","insertImage":"ادراج صورة","superscript":"رمز علوي","subscript":"رمز سفلي","createLink":"تكوين وصلة","undo":"تراجع","fullScreen":"تبديل الشاشة الكاملة","italic":"~مائل","fontName":"اسم طاقم الطباعة","justifyLeft":"محاذاة الى اليسار","unlink":"ازالة وصلة","toggleTableBorder":"تبديل حدود الجدول","viewSource":"مشاهدة مصدر HTML","ctrlKey":"ctrl+${0}","fontSize":"حجم طاقم الطباعة","systemShortcut":"يكون التصرف \"${0}\" متاحا فقط ببرنامج الاستعراض الخاص بك باستخدام المسار المختصر للوحة المفاتيح. استخدم ${1}.","indent":"ازاحة للداخل","redo":"‏اعادة‏","strikethrough":"تشطيب","justifyFull":"ضبط","justifyCenter":"محاذاة في الوسط","hiliteColor":"‏لون الخلفية‏","deleteTable":"حذف جدول","outdent":"ازاحة للخارج","cut":"قص","plainFormatBlock":"نمط الفقرة","toggleDir":"تبديل الاتجاه","bold":"عري~ض","tabIndent":"ازاحة علامة الجدولة للداخل","justifyRight":"محاذاة الى اليمين"}) \ No newline at end of file
+//>>built
+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":"صفحة جديدة","systemShortcut":"يكون التصرف \"${0}\" متاحا فقط ببرنامج الاستعراض الخاص بك باستخدام المسار المختصر للوحة المفاتيح. استخدم ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
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..0a86d7f7d
--- /dev/null
+++ b/lib/dijit/_editor/nls/ar/commands.js.uncompressed.js
@@ -0,0 +1,54 @@
+define(
+"dijit/_editor/nls/ar/commands", //begin v1.x content
+({
+ '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
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/az/FontChoice.js b/lib/dijit/_editor/nls/az/FontChoice.js
new file mode 100644
index 000000000..eb7662031
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/FontChoice.js
@@ -0,0 +1,2 @@
+//>>built
+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"})); \ No newline at end of file
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..0dd41c9b7
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/FontChoice.js.uncompressed.js
@@ -0,0 +1,27 @@
+define(
+"dijit/_editor/nls/az/FontChoice", //begin v1.x content
+({
+ "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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/az/LinkDialog.js b/lib/dijit/_editor/nls/az/LinkDialog.js
new file mode 100644
index 000000000..d2c25ccfc
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/LinkDialog.js
@@ -0,0 +1,2 @@
+//>>built
+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:"})); \ No newline at end of file
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..f4ae27921
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/LinkDialog.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dijit/_editor/nls/az/LinkDialog", //begin v1.x content
+({
+ "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:"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/az/commands.js b/lib/dijit/_editor/nls/az/commands.js
new file mode 100644
index 000000000..fdc80861b
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/commands.js
@@ -0,0 +1,2 @@
+//>>built
+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}"})); \ No newline at end of file
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..13e21011f
--- /dev/null
+++ b/lib/dijit/_editor/nls/az/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/az/commands", //begin v1.x content
+({
+ "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}"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ca/FontChoice.js b/lib/dijit/_editor/nls/ca/FontChoice.js
index 6a393feaa..bad60bf0c 100644
--- a/lib/dijit/_editor/nls/ca/FontChoice.js
+++ b/lib/dijit/_editor/nls/ca/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Cap","1":"xx-petit","2":"x-petit","formatBlock":"Format","3":"petit","4":"mitjà","5":"gran","6":"x-gran","7":"xx-gran","fantasy":"Fantasia","serif":"serif","p":"Paràgraf","pre":"Format previ","sans-serif":"sans-serif","fontName":"Tipus de lletra","h1":"Títol","h2":"Subtítol","h3":"Subsubtítol","monospace":"monoespai","fontSize":"Mida","cursive":"Cursiva"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..e4d0214d8
--- /dev/null
+++ b/lib/dijit/_editor/nls/ca/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/ca/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ca/LinkDialog.js b/lib/dijit/_editor/nls/ca/LinkDialog.js
index f7dd3af07..447273db6 100644
--- a/lib/dijit/_editor/nls/ca/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ca/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Descripció:","insertImageTitle":"Propietats de la imatge","set":"Defineix","newWindow":"Finestra nova","topWindow":"Finestra superior","target":"Destinació:","createLinkTitle":"Propietats de l'enllaç","parentWindow":"Finestra pare","currentWindow":"Finestra actual","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..16dda33e6
--- /dev/null
+++ b/lib/dijit/_editor/nls/ca/LinkDialog.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dijit/_editor/nls/ca/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ca/commands.js b/lib/dijit/_editor/nls/ca/commands.js
index 534715e5a..0b724df79 100644
--- a/lib/dijit/_editor/nls/ca/commands.js
+++ b/lib/dijit/_editor/nls/ca/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Elimina el format","copy":"Copia","paste":"Enganxa","selectAll":"Selecciona-ho tot","insertOrderedList":"Llista numerada","insertTable":"Insereix/edita la taula","print":"Imprimeix","underline":"Subratllat","foreColor":"Color de primer pla","htmlToggle":"Font HTML","formatBlock":"Estil de paràgraf","newPage":"Pàgina nova","insertHorizontalRule":"Regla horitzontal","delete":"Suprimeix","insertUnorderedList":"Llista de vinyetes","tableProp":"Propietat de taula","insertImage":"Insereix imatge","superscript":"Superíndex","subscript":"Subíndex","createLink":"Crea un enllaç","undo":"Desfés","fullScreen":"Commuta pantalla completa","italic":"Cursiva","fontName":"Nom del tipus de lletra","justifyLeft":"Alinea a l'esquerra","unlink":"Elimina l'enllaç","toggleTableBorder":"Inverteix els contorns de taula","viewSource":"Visualitza font HTML","ctrlKey":"control+${0}","fontSize":"Cos de la lletra","systemShortcut":"L'acció \"${0}\" és l'única disponible al navegador utilitzant una drecera del teclat. Utilitzeu ${1}.","indent":"Sagnat","redo":"Refés","strikethrough":"Ratllat","justifyFull":"Justifica","justifyCenter":"Centra","hiliteColor":"Color de fons","deleteTable":"Suprimeix la taula","outdent":"Sagna a l'esquerra","cut":"Retalla","plainFormatBlock":"Estil de paràgraf","toggleDir":"Inverteix la direcció","bold":"Negreta","tabIndent":"Sagnat","justifyRight":"Alinea a la dreta","appleKey":"⌘${0}"}) \ No newline at end of file
+//>>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
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..b9d49d18a
--- /dev/null
+++ b/lib/dijit/_editor/nls/ca/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/ca/commands", //begin v1.x content
+({
+ '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}'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/commands.js b/lib/dijit/_editor/nls/commands.js
index 582b782c0..aaa1cc201 100644
--- a/lib/dijit/_editor/nls/commands.js
+++ b/lib/dijit/_editor/nls/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Remove Format","copy":"Copy","paste":"Paste","selectAll":"Select All","insertOrderedList":"Numbered List","insertTable":"Insert/Edit Table","print":"Print","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","newPage":"New Page","insertHorizontalRule":"Horizontal Rule","delete":"Delete","appleKey":"⌘${0}","insertUnorderedList":"Bullet List","tableProp":"Table Property","insertImage":"Insert Image","superscript":"Superscript","subscript":"Subscript","createLink":"Create Link","undo":"Undo","fullScreen":"Toggle Full Screen","italic":"Italic","fontName":"Font Name","justifyLeft":"Align Left","unlink":"Remove Link","toggleTableBorder":"Toggle Table Border","viewSource":"View HTML Source","ctrlKey":"ctrl+${0}","fontSize":"Font Size","systemShortcut":"The \"${0}\" action is only available in your browser using a keyboard shortcut. Use ${1}.","indent":"Indent","redo":"Redo","strikethrough":"Strikethrough","justifyFull":"Justify","justifyCenter":"Align Center","hiliteColor":"Background Color","deleteTable":"Delete Table","outdent":"Outdent","cut":"Cut","plainFormatBlock":"Paragraph Style","toggleDir":"Toggle Direction","bold":"Bold","tabIndent":"Tab Indent","justifyRight":"Align Right"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/commands",{root:({"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","systemShortcut":"The \"${0}\" action is only available in your browser using a keyboard shortcut. Use ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"}),"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}); \ No newline at end of file
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 b/lib/dijit/_editor/nls/cs/FontChoice.js
index b60a88027..f62ce4af1 100644
--- a/lib/dijit/_editor/nls/cs/FontChoice.js
+++ b/lib/dijit/_editor/nls/cs/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Žádný","1":"extra malé","2":"velmi malé","formatBlock":"Formát","3":"malé","4":"střední","5":"velké","6":"velmi velké","7":"extra velké","fantasy":"fantasy","serif":"serif","p":"Odstavec","pre":"Předformátované","sans-serif":"sans-serif","fontName":"Písmo","h1":"Nadpis","h2":"Podnadpis","h3":"Podnadpis 2","monospace":"monospace","fontSize":"Velikost","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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é"})); \ No newline at end of file
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..5feaa7d26
--- /dev/null
+++ b/lib/dijit/_editor/nls/cs/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/cs/FontChoice", //begin v1.x content
+({
+ 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é"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/cs/LinkDialog.js b/lib/dijit/_editor/nls/cs/LinkDialog.js
index 41dad34f6..9d4aa550d 100644
--- a/lib/dijit/_editor/nls/cs/LinkDialog.js
+++ b/lib/dijit/_editor/nls/cs/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Popis:","insertImageTitle":"Vlastnosti obrázku","set":"Nastavit","newWindow":"Nové okno","topWindow":"Okno nejvyšší úrovně","target":"Cíl:","createLinkTitle":"Vlastnosti odkazu","parentWindow":"Nadřízené okno","currentWindow":"Aktuální okno","url":"Adresa URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..4445db454
--- /dev/null
+++ b/lib/dijit/_editor/nls/cs/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/cs/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/cs/commands.js b/lib/dijit/_editor/nls/cs/commands.js
index c3572d1d2..a2927caea 100644
--- a/lib/dijit/_editor/nls/cs/commands.js
+++ b/lib/dijit/_editor/nls/cs/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Odebrat formát","copy":"Kopírovat","paste":"Vložit","selectAll":"Vybrat vše","insertOrderedList":"Číslovaný seznam","insertTable":"Vložit/upravit tabulku","print":"Tisk","underline":"Podtržení","foreColor":"Barva popředí","htmlToggle":"Zdroj HTML","formatBlock":"Styl odstavce","newPage":"Nová stránka","insertHorizontalRule":"Vodorovná čára","delete":"Odstranit","insertUnorderedList":"Seznam s odrážkami","tableProp":"Vlastnost tabulky","insertImage":"Vložit obrázek","superscript":"Horní index","subscript":"Dolní index","createLink":"Vytvořit odkaz","undo":"Zpět","fullScreen":"Přepnout celou obrazovku","italic":"Kurzíva","fontName":"Název písma","justifyLeft":"Zarovnat vlevo","unlink":"Odebrat odkaz","toggleTableBorder":"Přepnout ohraničení tabulky","viewSource":"Zobrazit zdroj HTML","fontSize":"Velikost písma","systemShortcut":"Akce \"${0}\" je v prohlížeči dostupná pouze prostřednictvím klávesové zkratky. Použijte klávesovou zkratku ${1}.","indent":"Odsadit","redo":"Opakovat","strikethrough":"Přeškrtnutí","justifyFull":"Do bloku","justifyCenter":"Zarovnat na střed","hiliteColor":"Barva pozadí","deleteTable":"Odstranit tabulku","outdent":"Předsadit","cut":"Vyjmout","plainFormatBlock":"Styl odstavce","toggleDir":"Přepnout směr","bold":"Tučné","tabIndent":"Odsazení tabulátoru","justifyRight":"Zarovnat vpravo","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..7992b4735
--- /dev/null
+++ b/lib/dijit/_editor/nls/cs/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/cs/commands", //begin v1.x content
+({
+ '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}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/da/FontChoice.js b/lib/dijit/_editor/nls/da/FontChoice.js
index a45c55bc5..e9dca2c1e 100644
--- a/lib/dijit/_editor/nls/da/FontChoice.js
+++ b/lib/dijit/_editor/nls/da/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Ingen","1":"xx-small","2":"x-small","formatBlock":"Format","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Afsnit","pre":"Forudformateret","sans-serif":"sans-serif","fontName":"Skrifttype","h1":"Overskrift","h2":"Underoverskrift","h3":"Underunderoverskrift","monospace":"monospace","fontSize":"Størrelse","cursive":"kursiv"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..a4c65e57f
--- /dev/null
+++ b/lib/dijit/_editor/nls/da/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/da/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/da/LinkDialog.js b/lib/dijit/_editor/nls/da/LinkDialog.js
index 9b757f75d..1e3e3948d 100644
--- a/lib/dijit/_editor/nls/da/LinkDialog.js
+++ b/lib/dijit/_editor/nls/da/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Beskrivelse:","insertImageTitle":"Billedegenskaber","set":"Definér","newWindow":"Nyt vindue","topWindow":"Øverste vindue","target":"Mål:","createLinkTitle":"Linkegenskaber","parentWindow":"Overordnet vindue","currentWindow":"Aktuelt vindue","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..3191eb680
--- /dev/null
+++ b/lib/dijit/_editor/nls/da/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/da/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/da/commands.js b/lib/dijit/_editor/nls/da/commands.js
index fca175c80..a7b86591b 100644
--- a/lib/dijit/_editor/nls/da/commands.js
+++ b/lib/dijit/_editor/nls/da/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Fjern format","copy":"Kopiér","paste":"Sæt ind","selectAll":"Markér alle","insertOrderedList":"Nummereret liste","insertTable":"Indsæt/redigér tabel","print":"Udskriv","underline":"Understreget","foreColor":"Forgrundsfarve","htmlToggle":"HTML-kilde","formatBlock":"Afsnitstypografi","newPage":"Ny side","insertHorizontalRule":"Vandret linje","delete":"Slet","insertUnorderedList":"Punktliste","tableProp":"Tabelegenskab","insertImage":"Indsæt billede","superscript":"Hævet skrift","subscript":"Sænket skrift","createLink":"Opret link","undo":"Fortryd","fullScreen":"Aktivér/deaktivér fuldskærm","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejusteret","unlink":"Fjern link","toggleTableBorder":"Skift tabelramme","viewSource":"Vis HTML-kilde","fontSize":"Skriftstørrelse","systemShortcut":"Funktionen \"${0}\" kan kun bruges i din browser med en tastaturgenvej. Brug ${1}.","indent":"Indrykning","redo":"Annullér Fortryd","strikethrough":"Gennemstreget","justifyFull":"Lige margener","justifyCenter":"Centreret","hiliteColor":"Baggrundsfarve","deleteTable":"Slet tabel","outdent":"Udrykning","cut":"Klip","plainFormatBlock":"Afsnitstypografi","toggleDir":"Skift retning","bold":"Fed","tabIndent":"Indrykning med tabulator","justifyRight":"Højrejusteret","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..7b0b401fd
--- /dev/null
+++ b/lib/dijit/_editor/nls/da/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/da/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'Funktionen "${0}" kan kun bruges i din browser med en tastaturgenvej. Brug ${1}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/de/FontChoice.js b/lib/dijit/_editor/nls/de/FontChoice.js
index c584c1812..f92c13d02 100644
--- a/lib/dijit/_editor/nls/de/FontChoice.js
+++ b/lib/dijit/_editor/nls/de/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Keine Angabe","1":"XXS","2":"XS","formatBlock":"Format","3":"S","4":"M","5":"L","6":"XL","7":"XXL","fantasy":"Fantasie","serif":"Serife","p":"Absatz","pre":"Vorformatiert","sans-serif":"Serifenlos","fontName":"Schriftart","h1":"Überschrift","h2":"Unterüberschrift","h3":"Unterunterüberschrift","monospace":"Monospaceschrift","fontSize":"Größe","cursive":"Kursiv"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..d445a3095
--- /dev/null
+++ b/lib/dijit/_editor/nls/de/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/de/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/de/LinkDialog.js b/lib/dijit/_editor/nls/de/LinkDialog.js
index b1eab6cb4..8f2e59132 100644
--- a/lib/dijit/_editor/nls/de/LinkDialog.js
+++ b/lib/dijit/_editor/nls/de/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","set":"Festlegen","newWindow":"Neues Fenster","topWindow":"Aktives Fenster","target":"Ziel:","createLinkTitle":"Linkeigenschaften","parentWindow":"Übergeordnetes Fenster","currentWindow":"Aktuelles Fenster","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..a3b203ba3
--- /dev/null
+++ b/lib/dijit/_editor/nls/de/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/de/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "Linkeigenschaften",
+ insertImageTitle: "Grafikeigenschaften",
+ url: "URL:",
+ text: "Beschreibung:",
+ target: "Ziel:",
+ set: "Festlegen",
+ currentWindow: "Aktuelles Fenster",
+ parentWindow: "Übergeordnetes Fenster",
+ topWindow: "Aktives Fenster",
+ newWindow: "Neues Fenster"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/de/commands.js b/lib/dijit/_editor/nls/de/commands.js
index 8fa589cc7..aff458b1c 100644
--- a/lib/dijit/_editor/nls/de/commands.js
+++ b/lib/dijit/_editor/nls/de/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Formatierung entfernen","copy":"Kopieren","paste":"Einfügen","selectAll":"Alles auswählen","insertOrderedList":"Nummerierung","insertTable":"Tabelle einfügen/bearbeiten","print":"Drucken","underline":"Unterstrichen","foreColor":"Vordergrundfarbe","htmlToggle":"HTML-Quelltext","formatBlock":"Absatzstil","newPage":"Neue Seite","insertHorizontalRule":"Horizontaler Strich","delete":"Löschen","insertUnorderedList":"Aufzählungszeichen","tableProp":"Tabelleneigenschaft","insertImage":"Grafik einfügen","superscript":"Hochgestellt","subscript":"Tiefgestellt","createLink":"Link erstellen","undo":"Rückgängig","fullScreen":"Gesamtanzeige","italic":"Kursiv","fontName":"Schriftartname","justifyLeft":"Linksbündig","unlink":"Link entfernen","toggleTableBorder":"Tabellenumrandung ein-/ausschalten","viewSource":"HTML-Quelle","ctrlKey":"Strg+${0}","fontSize":"Schriftgröße","systemShortcut":"Die Aktion \"${0}\" ist nur über einen Direktaufruf in Ihrem Browser verfügbar. Verwenden Sie ${1}.","indent":"Einrücken","redo":"Wiederherstellen","strikethrough":"Durchgestrichen","justifyFull":"Blocksatz","justifyCenter":"Zentriert","hiliteColor":"Hintergrundfarbe","deleteTable":"Tabelle löschen","outdent":"Ausrücken","cut":"Ausschneiden","plainFormatBlock":"Absatzstil","toggleDir":"Wechselrichtung","bold":"Fett","tabIndent":"Tabulatoreinrückung","justifyRight":"Rechtsbündig","appleKey":"⌘${0}"}) \ No newline at end of file
+//>>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
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..a1c27dd25
--- /dev/null
+++ b/lib/dijit/_editor/nls/de/commands.js.uncompressed.js
@@ -0,0 +1,53 @@
+define(
+"dijit/_editor/nls/de/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'Die Aktion "${0}" ist nur über einen Direktaufruf in Ihrem Browser verfügbar. Verwenden Sie ${1}.',
+ 'ctrlKey':'Strg+${0}'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/el/FontChoice.js b/lib/dijit/_editor/nls/el/FontChoice.js
index a529fe873..f8f42221f 100644
--- a/lib/dijit/_editor/nls/el/FontChoice.js
+++ b/lib/dijit/_editor/nls/el/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Χωρίς","1":"xx-μικρά","2":"x-μικρά","formatBlock":"Μορφή","3":"μικρά","4":"μεσαία","5":"μεγάλα","6":"x-μεγάλα","7":"xx-μεγάλα","fantasy":"φαντασίας","serif":"με πατούρες (serif)","p":"Παράγραφος","pre":"Προ-μορφοποιημένο","sans-serif":"χωρίς πατούρες (sans-serif)","fontName":"Γραμματοσειρά","h1":"Επικεφαλίδα","h2":"Δευτερεύουσα επικεφαλίδα","h3":"Δευτερεύουσα επικεφαλίδα τρίτου επιπέδου","monospace":"σταθερού πλάτους","fontSize":"Μέγεθος","cursive":"πλάγιοι"}) \ No newline at end of file
+//>>built
+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-μεγάλα"})); \ No newline at end of file
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..d913350f3
--- /dev/null
+++ b/lib/dijit/_editor/nls/el/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/el/FontChoice", //begin v1.x content
+({
+ 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-μεγάλα"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/el/LinkDialog.js b/lib/dijit/_editor/nls/el/LinkDialog.js
index 8a1e121e8..279ef641b 100644
--- a/lib/dijit/_editor/nls/el/LinkDialog.js
+++ b/lib/dijit/_editor/nls/el/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Περιγραφή:","insertImageTitle":"Ιδιότητες εικόνας","set":"Ορισμός","newWindow":"Νέο παράθυρο","topWindow":"Παράθυρο σε πρώτο πλάνο","target":"Προορισμός:","createLinkTitle":"Ιδιότητες σύνδεσης","parentWindow":"Γονικό παράθυρο","currentWindow":"Τρέχον παράθυρο","url":"Διεύθυνση URL:"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/el/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/el/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..3b13e98b6
--- /dev/null
+++ b/lib/dijit/_editor/nls/el/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/el/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "Ιδιότητες σύνδεσης",
+ insertImageTitle: "Ιδιότητες εικόνας",
+ url: "Διεύθυνση URL:",
+ text: "Περιγραφή:",
+ target: "Προορισμός:",
+ set: "Ορισμός",
+ currentWindow: "Τρέχον παράθυρο",
+ parentWindow: "Γονικό παράθυρο",
+ topWindow: "Παράθυρο σε πρώτο πλάνο",
+ newWindow: "Νέο παράθυρο"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/el/commands.js b/lib/dijit/_editor/nls/el/commands.js
index dc8540574..ea5403357 100644
--- a/lib/dijit/_editor/nls/el/commands.js
+++ b/lib/dijit/_editor/nls/el/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Αφαίρεση μορφοποίησης","copy":"Αντιγραφή","paste":"Επικόλληση","selectAll":"Επιλογή όλων","insertOrderedList":"Αριθμημένη λίστα","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","print":"Εκτύπωση","underline":"Υπογράμμιση","foreColor":"Χρώμα προσκηνίου","htmlToggle":"Πρωτογενής κώδικας HTML","formatBlock":"Στυλ παραγράφου","newPage":"Νέα σελίδα","insertHorizontalRule":"Οριζόντια γραμμή","delete":"Διαγραφή","insertUnorderedList":"Λίστα με κουκίδες","tableProp":"Ιδιότητα πίνακα","insertImage":"Εισαγωγή εικόνας","superscript":"Εκθέτης","subscript":"Δείκτης","createLink":"Δημιουργία σύνδεσης","undo":"Αναίρεση","fullScreen":"Εναλλαγή κατάστασης πλήρους οθόνης","italic":"Πλάγια","fontName":"Όνομα γραμματοσειράς","justifyLeft":"Στοίχιση αριστερά","unlink":"Αφαίρεση σύνδεσης","toggleTableBorder":"Εναλλαγή εμφάνισης περιγράμματος πίνακα","viewSource":"Προβολή προέλευσης HTML","fontSize":"Μέγεθος γραμματοσειράς","systemShortcut":"Σε αυτό το πρόγραμμα πλοήγησης, η ενέργεια \"${0}\" είναι διαθέσιμη μόνο με τη χρήση μιας συντόμευσης πληκτρολογίου. Χρησιμοποιήστε τη συντόμευση ${1}.","indent":"Εσοχή","redo":"Ακύρωση αναίρεσης","strikethrough":"Διαγράμμιση","justifyFull":"Πλήρης στοίχιση","justifyCenter":"Στοίχιση στο κέντρο","hiliteColor":"Χρώμα φόντου","deleteTable":"Διαγραφή πίνακα","outdent":"Μείωση περιθωρίου","cut":"Αποκοπή","plainFormatBlock":"Στυλ παραγράφου","toggleDir":"Εναλλαγή κατεύθυνσης","bold":"Έντονα","tabIndent":"Εσοχή με το πλήκτρο Tab","justifyRight":"Στοίχιση δεξιά","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..7d2916b31
--- /dev/null
+++ b/lib/dijit/_editor/nls/el/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/el/commands", //begin v1.x content
+({
+ '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}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/es/FontChoice.js b/lib/dijit/_editor/nls/es/FontChoice.js
index fd7d96590..184c259ef 100644
--- a/lib/dijit/_editor/nls/es/FontChoice.js
+++ b/lib/dijit/_editor/nls/es/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Ninguno","1":"xx-pequeño","2":"x-pequeño","formatBlock":"Formato","3":"pequeño","4":"medio","5":"grande","6":"x-grande","7":"xx-grande","fantasy":"fantasía","serif":"serif","p":"Párrafo","pre":"Preformateado","sans-serif":"sans-serif","fontName":"Font","h1":"Cabecera","h2":"Subcabecera","h3":"Sub-subcabecera","monospace":"espacio sencillo","fontSize":"Tamaño","cursive":"cursiva"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..9fe1e09ce
--- /dev/null
+++ b/lib/dijit/_editor/nls/es/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/es/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/es/LinkDialog.js b/lib/dijit/_editor/nls/es/LinkDialog.js
index 7d69bdb80..7d995cbb4 100644
--- a/lib/dijit/_editor/nls/es/LinkDialog.js
+++ b/lib/dijit/_editor/nls/es/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Descripción:","insertImageTitle":"Propiedades de la imagen","set":"Establecer","newWindow":"Nueva ventana","topWindow":"Ventana superior","target":"Destino:","createLinkTitle":"Propiedades del enlace","parentWindow":"Ventana padre","currentWindow":"Ventana actual","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..eea817fba
--- /dev/null
+++ b/lib/dijit/_editor/nls/es/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/es/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/es/commands.js b/lib/dijit/_editor/nls/es/commands.js
index 0d189dc8d..eae7c635d 100644
--- a/lib/dijit/_editor/nls/es/commands.js
+++ b/lib/dijit/_editor/nls/es/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Eliminar formato","copy":"Copiar","paste":"Pegar","selectAll":"Seleccionar todo","insertOrderedList":"Lista numerada","insertTable":"Insertar/Editar tabla","print":"Imprimir","underline":"Subrayado","foreColor":"Color de primer plano","htmlToggle":"Fuente HTML","formatBlock":"Estilo de párrafo","newPage":"Nueva página","insertHorizontalRule":"Regla horizontal","delete":"Suprimir","insertUnorderedList":"Lista con viñetas","tableProp":"Propiedad de tabla","insertImage":"Insertar imagen","superscript":"Superíndice","subscript":"Subíndice","createLink":"Crear enlace","undo":"Deshacer","fullScreen":"Conmutar pantalla completa","italic":"Cursiva","fontName":"Nombre de font","justifyLeft":"Alinear izquierda","unlink":"Eliminar enlace","toggleTableBorder":"Conmutar borde de tabla","viewSource":"Ver fuente HTML","ctrlKey":"control+${0}","fontSize":"Tamaño de font","systemShortcut":"La acción \"${0}\" sólo está disponible en su navegador mediante un atajo de teclado. Utilice ${1}.","indent":"Sangría","redo":"Rehacer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinear centro","hiliteColor":"Color de segundo plano","deleteTable":"Suprimir tabla","outdent":"Anular sangría","cut":"Cortar","plainFormatBlock":"Estilo de párrafo","toggleDir":"Conmutar dirección","bold":"Negrita","tabIndent":"Sangría de tabulador","justifyRight":"Alinear derecha","appleKey":"⌘${0}"}) \ No newline at end of file
+//>>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
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..13072dc48
--- /dev/null
+++ b/lib/dijit/_editor/nls/es/commands.js.uncompressed.js
@@ -0,0 +1,53 @@
+define(
+"dijit/_editor/nls/es/commands", //begin v1.x content
+({
+ '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}'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/fi/FontChoice.js b/lib/dijit/_editor/nls/fi/FontChoice.js
index 02c68e986..c2c1e7cd3 100644
--- a/lib/dijit/_editor/nls/fi/FontChoice.js
+++ b/lib/dijit/_editor/nls/fi/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Ei mitään","1":"xx-small","2":"x-small","formatBlock":"Muoto","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Kappale","pre":"Esimuotoiltu","sans-serif":"sans-serif","fontName":"Fontti","h1":"Otsikko","h2":"Alatason otsikko","h3":"Alimman tason otsikko","monospace":"monospace","fontSize":"Koko","cursive":"cursive"}) \ No newline at end of file
+//>>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
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..73cbd7034
--- /dev/null
+++ b/lib/dijit/_editor/nls/fi/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/fi/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/fi/LinkDialog.js b/lib/dijit/_editor/nls/fi/LinkDialog.js
index 817dfe875..1a0976a42 100644
--- a/lib/dijit/_editor/nls/fi/LinkDialog.js
+++ b/lib/dijit/_editor/nls/fi/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Kuvaus:","insertImageTitle":"Kuvan ominaisuudet","set":"Aseta","newWindow":"Uusi ikkuna","topWindow":"Päällimmäinen ikkuna","target":"Kohde:","createLinkTitle":"Linkin ominaisuudet","parentWindow":"Pääikkuna","currentWindow":"Nykyinen ikkuna","url":"URL-osoite:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..8cfd2f1e6
--- /dev/null
+++ b/lib/dijit/_editor/nls/fi/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/fi/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/fi/commands.js b/lib/dijit/_editor/nls/fi/commands.js
index b67d4ae62..88a6f1886 100644
--- a/lib/dijit/_editor/nls/fi/commands.js
+++ b/lib/dijit/_editor/nls/fi/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Poista muotoilu","copy":"Kopioi","paste":"Liitä","selectAll":"Valitse kaikki","insertOrderedList":"Numeroitu luettelo","insertTable":"Lisää taulukko/muokkaa taulukkoa","print":"Tulosta","underline":"Alleviivaus","foreColor":"Edustaväri","htmlToggle":"HTML-lähde","formatBlock":"Kappaletyyli","newPage":"Uusi sivu","insertHorizontalRule":"Vaakasuuntainen viiva","delete":"Poista","insertUnorderedList":"Numeroimaton luettelo","tableProp":"Taulukon ominaisuudet","insertImage":"Lisää kuva","superscript":"Yläindeksi","subscript":"Alaindeksi","createLink":"Luo linkki","undo":"Kumoa","fullScreen":"Vaihda koko näyttö","italic":"Kursivointi","fontName":"Fontin nimi","justifyLeft":"Tasaus vasemmalle","unlink":"Poista linkki","toggleTableBorder":"Ota taulukon kehys käyttöön/poista kehys käytöstä","viewSource":"Näytä HTML-lähde","fontSize":"Fontin koko","systemShortcut":"Toiminto \"${0}\" on käytettävissä selaimessa vain näppäimistön pikatoiminnolla. Käytä seuraavaa: ${1}.","indent":"Sisennä","redo":"Tee uudelleen","strikethrough":"Yliviivaus","justifyFull":"Tasaus","justifyCenter":"Tasaus keskelle","hiliteColor":"Taustaväri","deleteTable":"Poista taulukko","outdent":"Ulonna","cut":"Leikkaa","plainFormatBlock":"Kappaletyyli","toggleDir":"Vaihda suuntaa","bold":"Lihavointi","tabIndent":"Sarkainsisennys","justifyRight":"Tasaus oikealle","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..1e532a60a
--- /dev/null
+++ b/lib/dijit/_editor/nls/fi/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/fi/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'Toiminto "${0}" on käytettävissä selaimessa vain näppäimistön pikatoiminnolla. Käytä seuraavaa: ${1}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/fr/FontChoice.js b/lib/dijit/_editor/nls/fr/FontChoice.js
index 2e3a97803..8253f01f9 100644
--- a/lib/dijit/_editor/nls/fr/FontChoice.js
+++ b/lib/dijit/_editor/nls/fr/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Néant","1":"xxs","2":"xs","formatBlock":"Mise en forme","3":"s","4":"m","5":"l","6":"xl","7":"xxl","fantasy":"fantaisie","serif":"serif","p":"Paragraphe","pre":"Pré-mise en forme","sans-serif":"sans serif","fontName":"Police","h1":"En-tête","h2":"Sous-en-tête","h3":"Sous-sous-en-tête","monospace":"espacement fixe","fontSize":"Taille","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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 b/lib/dijit/_editor/nls/fr/LinkDialog.js
index 8103ae329..21c2c51fa 100644
--- a/lib/dijit/_editor/nls/fr/LinkDialog.js
+++ b/lib/dijit/_editor/nls/fr/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Description :","insertImageTitle":"Propriétés de l'image","set":"Définir","newWindow":"Nouvelle fenêtre","topWindow":"Fenêtre supérieure","target":"Cible :","createLinkTitle":"Propriétés du lien","parentWindow":"Fenêtre parent","currentWindow":"Fenêtre actuelle","url":"URL :"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..c72da62e8
--- /dev/null
+++ b/lib/dijit/_editor/nls/fr/LinkDialog.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dijit/_editor/nls/fr/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/fr/commands.js b/lib/dijit/_editor/nls/fr/commands.js
index 532ac1347..b1b471b54 100644
--- a/lib/dijit/_editor/nls/fr/commands.js
+++ b/lib/dijit/_editor/nls/fr/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Supprimer la mise en forme","copy":"Copier","paste":"Coller","selectAll":"Sélectionner tout","insertOrderedList":"Liste numérotée","insertTable":"Insérer/Modifier un tableau","print":"Imprimer","underline":"Souligner","foreColor":"Couleur d'avant-plan","htmlToggle":"Source HTML","formatBlock":"Style de paragraphe","newPage":"Nouvelle page","insertHorizontalRule":"Règle horizontale","delete":"Supprimer","insertUnorderedList":"Liste à puces","tableProp":"Propriété du tableau","insertImage":"Insérer une image","superscript":"Exposant","subscript":"Indice","createLink":"Créer un lien","undo":"Annuler","fullScreen":"Basculer en plein écran","italic":"Italique","fontName":"Nom de police","justifyLeft":"Aligner à gauche","unlink":"Supprimer le lien","toggleTableBorder":"Afficher/Masquer la bordure du tableau","viewSource":"Afficher la source HTML","fontSize":"Taille de police","systemShortcut":"L'action \"${0}\" est disponible dans votre navigateur uniquement, par le biais d'un raccourci-clavier. Utilisez ${1}.","indent":"Retrait","redo":"Rétablir","strikethrough":"Barrer","justifyFull":"Justifier","justifyCenter":"Aligner au centre","hiliteColor":"Couleur d'arrière-plan","deleteTable":"Supprimer le tableau","outdent":"Retrait négatif","cut":"Couper","plainFormatBlock":"Style de paragraphe","toggleDir":"Changer de sens","bold":"Gras","tabIndent":"Retrait de tabulation","justifyRight":"Aligner à droite","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..077514081
--- /dev/null
+++ b/lib/dijit/_editor/nls/fr/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/fr/commands", //begin v1.x content
+({
+ '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}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/he/FontChoice.js b/lib/dijit/_editor/nls/he/FontChoice.js
index 4c2e16f50..f97865f03 100644
--- a/lib/dijit/_editor/nls/he/FontChoice.js
+++ b/lib/dijit/_editor/nls/he/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"ללא ","1":"קטן ביות","2":"קטן מאוד","formatBlock":"עיצוב","3":"קטן","4":"בינוני","5":"גדול","6":"גדול מאוד","7":"גדול ביותר","fantasy":"fantasy","serif":"serif","p":"פיסקה","pre":"מעוצב מראש","sans-serif":"sans-serif","fontName":"גופן","h1":"כותרת","h2":"תת-כותרת","h3":"תת-תת-כותרת","monospace":"monospace","fontSize":"גודל","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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:"גדול ביותר"})); \ No newline at end of file
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..985e5c83e
--- /dev/null
+++ b/lib/dijit/_editor/nls/he/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/he/FontChoice", //begin v1.x content
+({
+ 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: "גדול ביותר"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/he/LinkDialog.js b/lib/dijit/_editor/nls/he/LinkDialog.js
index 493974ca6..458508b2f 100644
--- a/lib/dijit/_editor/nls/he/LinkDialog.js
+++ b/lib/dijit/_editor/nls/he/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"תיאור:","insertImageTitle":"תכונות תמונה","set":"הגדרה","newWindow":"חלון חדש","topWindow":"חלון עליון","target":"יעד:","createLinkTitle":"תכונות קישור","parentWindow":"חלון אב","currentWindow":"חלון נוכחי","url":"URL:‏"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/he/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/he/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..dcd6fc738
--- /dev/null
+++ b/lib/dijit/_editor/nls/he/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/he/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "תכונות קישור",
+ insertImageTitle: "תכונות תמונה",
+ url: "URL:‏",
+ text: "תיאור:",
+ target: "יעד:",
+ set: "הגדרה",
+ currentWindow: "חלון נוכחי",
+ parentWindow: "חלון אב",
+ topWindow: "חלון עליון",
+ newWindow: "חלון חדש"
+})
+//end v1.x content
+);
+
diff --git a/lib/dijit/_editor/nls/he/commands.js b/lib/dijit/_editor/nls/he/commands.js
index 39d598e94..93062bdaf 100644
--- a/lib/dijit/_editor/nls/he/commands.js
+++ b/lib/dijit/_editor/nls/he/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"סילוק עיצוב","copy":"עותק","paste":"הדבקה","selectAll":"בחירת הכל","insertOrderedList":"רשימה ממוספרת","insertTable":"הוספת/עריכת טבלה","print":"הדפסה","underline":"קו תחתי","foreColor":"צבע חזית","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","newPage":"דף חדש","insertHorizontalRule":"קו אופקי","delete":"מחיקה","appleKey":"⌘${0}‎","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה","fullScreen":"מיתוג מסך מלא","italic":"נטוי","fontName":"שם גופן","justifyLeft":"יישור לשמאל","unlink":"סילוק הקישור","toggleTableBorder":"מיתוג גבול טבלה","viewSource":"הצגת מקור HTML","ctrlKey":"ctrl+${0}‎","fontSize":"גופן יחסי","systemShortcut":"הפעולה \"${0}\" זמינה בדפדפן רק באמצעות קיצור דרך במקלדת. השתמשו בקיצור ${1}.","indent":"הגדלת כניסה","redo":"שחזור פעולה","strikethrough":"קו חוצה","justifyFull":"יישור דו-צדדי","justifyCenter":"יישור למרכז","hiliteColor":"צבע רקע","deleteTable":"מחיקת טבלה","outdent":"הקטנת כניסה","cut":"גזירה","plainFormatBlock":"סגנון פיסקה","toggleDir":"מיתוג כיוון","bold":"מודגש","tabIndent":"כניסת טאב","justifyRight":"יישור לימין"}) \ No newline at end of file
+//>>built
+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":"דף חדש","systemShortcut":"הפעולה \"${0}\" זמינה בדפדפן רק באמצעות קיצור דרך במקלדת. השתמשו בקיצור ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
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..e31869135
--- /dev/null
+++ b/lib/dijit/_editor/nls/he/commands.js.uncompressed.js
@@ -0,0 +1,53 @@
+define(
+"dijit/_editor/nls/he/commands", //begin v1.x content
+({
+ '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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/hr/FontChoice.js b/lib/dijit/_editor/nls/hr/FontChoice.js
new file mode 100644
index 000000000..bd6de6d9b
--- /dev/null
+++ b/lib/dijit/_editor/nls/hr/FontChoice.js
@@ -0,0 +1,2 @@
+//>>built
+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"})); \ No newline at end of file
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 b/lib/dijit/_editor/nls/hr/LinkDialog.js
new file mode 100644
index 000000000..cca4e88df
--- /dev/null
+++ b/lib/dijit/_editor/nls/hr/LinkDialog.js
@@ -0,0 +1,2 @@
+//>>built
+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"})); \ No newline at end of file
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 b/lib/dijit/_editor/nls/hr/commands.js
new file mode 100644
index 000000000..449777af9
--- /dev/null
+++ b/lib/dijit/_editor/nls/hr/commands.js
@@ -0,0 +1,2 @@
+//>>built
+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","systemShortcut":"\"${0}\" akcija je dostupna jedino u vašem pregledniku upotrebom prečice tipkovnice. Koristite ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
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 b/lib/dijit/_editor/nls/hu/FontChoice.js
index 831fe99c5..fd3e1b451 100644
--- a/lib/dijit/_editor/nls/hu/FontChoice.js
+++ b/lib/dijit/_editor/nls/hu/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Nincs","1":"xx-kicsi","2":"x-kicsi","formatBlock":"Formátum","3":"kicsi","4":"közepes","5":"nagy","6":"x-nagy","7":"xx-nagy","fantasy":"fantázia","serif":"talpas","p":"Bekezdés","pre":"Előformázott","sans-serif":"talpatlan","fontName":"Betűtípus","h1":"Címsor","h2":"Alcím","h3":"Al-alcím","monospace":"rögzített szélességű","fontSize":"Méret","cursive":"kurzív"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..dd0c13b0d
--- /dev/null
+++ b/lib/dijit/_editor/nls/hu/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/hu/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/hu/LinkDialog.js b/lib/dijit/_editor/nls/hu/LinkDialog.js
index 23f765ef6..7e8067b41 100644
--- a/lib/dijit/_editor/nls/hu/LinkDialog.js
+++ b/lib/dijit/_editor/nls/hu/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Leírás:","insertImageTitle":"Kép tulajdonságai","set":"Beállítás","newWindow":"Új ablak","topWindow":"Legfelső szintű ablak","target":"Cél:","createLinkTitle":"Hivatkozás tulajdonságai","parentWindow":"Szülő ablak","currentWindow":"Aktuális ablak","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..fddb0bd74
--- /dev/null
+++ b/lib/dijit/_editor/nls/hu/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/hu/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/hu/commands.js b/lib/dijit/_editor/nls/hu/commands.js
index bd016cf92..39d06ddb9 100644
--- a/lib/dijit/_editor/nls/hu/commands.js
+++ b/lib/dijit/_editor/nls/hu/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Formázás eltávolítása","copy":"Másolás","paste":"Beillesztés","selectAll":"Összes kijelölése","insertOrderedList":"Számozott lista","insertTable":"Táblázat beszúrása/szerkesztése","print":"Nyomtatás","underline":"Aláhúzott","foreColor":"Előtérszín","htmlToggle":"HTML forrás","formatBlock":"Bekezdés stílusa","newPage":"Új oldal","insertHorizontalRule":"Vízszintes vonalzó","delete":"Törlés","insertUnorderedList":"Felsorolásjeles lista","tableProp":"Táblázat tulajdonságai","insertImage":"Kép beszúrása","superscript":"Felső index","subscript":"Alsó index","createLink":"Hivatkozás létrehozása","undo":"Visszavonás","fullScreen":"Váltás teljes képernyőre","italic":"Dőlt","fontName":"Betűtípus","justifyLeft":"Balra igazítás","unlink":"Hivatkozás eltávolítása","toggleTableBorder":"Táblázatszegély ki-/bekapcsolása","viewSource":"HTML forrás megjelenítése","fontSize":"Betűméret","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}.","indent":"Behúzás","redo":"Újra","strikethrough":"Áthúzott","justifyFull":"Sorkizárás","justifyCenter":"Középre igazítás","hiliteColor":"Háttérszín","deleteTable":"Táblázat törlése","outdent":"Negatív behúzás","cut":"Kivágás","plainFormatBlock":"Bekezdés stílusa","toggleDir":"Irány váltókapcsoló","bold":"Félkövér","tabIndent":"Tab behúzás","justifyRight":"Jobbra igazítás","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..590f06464
--- /dev/null
+++ b/lib/dijit/_editor/nls/hu/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/hu/commands", //begin v1.x content
+({
+ '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}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/it/FontChoice.js b/lib/dijit/_editor/nls/it/FontChoice.js
index a248473b5..fb0e15282 100644
--- a/lib/dijit/_editor/nls/it/FontChoice.js
+++ b/lib/dijit/_editor/nls/it/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Nessuna","1":"xx-small","2":"x-small","formatBlock":"Formato","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Paragrafo","pre":"Preformattato","sans-serif":"sans-serif","fontName":"Carattere","h1":"Intestazione","h2":"Sottointestazione","h3":"Sottointestazione secondaria","monospace":"spaziatura fissa","fontSize":"Dimensione","cursive":"corsivo"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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 94ebe18d2..8e6eb0002 100644
--- a/lib/dijit/_editor/nls/it/LinkDialog.js
+++ b/lib/dijit/_editor/nls/it/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Descrizione:","insertImageTitle":"Proprietà immagine","set":"Imposta","newWindow":"Nuova finestra","topWindow":"Finestra in primo piano","target":"Destinazione:","createLinkTitle":"Proprietà collegamento","parentWindow":"Finestra parent","currentWindow":"Finestra corrente","url":"URL:"}) \ No newline at end of file
+//>>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
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..f9e4675fe
--- /dev/null
+++ b/lib/dijit/_editor/nls/it/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/it/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/it/commands.js b/lib/dijit/_editor/nls/it/commands.js
index 2b08f8170..f413791b7 100644
--- a/lib/dijit/_editor/nls/it/commands.js
+++ b/lib/dijit/_editor/nls/it/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","print":"Stampa","underline":"Sottolineato","foreColor":"Colore primo piano","htmlToggle":"Origine HTML","formatBlock":"Stile paragrafo","newPage":"Nuova pagina","insertHorizontalRule":"Righello orizzontale","delete":"Elimina","insertUnorderedList":"Elenco puntato","tableProp":"Proprietà tabella","insertImage":"Inserisci immagine","superscript":"Apice","subscript":"Pedice","createLink":"Crea collegamento","undo":"Annulla","fullScreen":"Attiva/Disattiva schermo intero","italic":"Corsivo","fontName":"Nome carattere","justifyLeft":"Allinea a sinistra","unlink":"Rimuovi collegamento","toggleTableBorder":"Mostra/Nascondi margine tabella","viewSource":"Visualizza origine HTML","fontSize":"Dimensione carattere","systemShortcut":"Azione \"${0}\" disponibile sul proprio browser solo mediante i tasti di scelta rapida della tastiera. Utilizzare ${1}.","indent":"Rientra","redo":"Ripristina","strikethrough":"Barrato","justifyFull":"Giustifica","justifyCenter":"Allinea al centro","hiliteColor":"Colore sfondo","deleteTable":"Elimina tabella","outdent":"Rimuovi rientro","cut":"Taglia","plainFormatBlock":"Stile paragrafo","toggleDir":"Inverti direzione","bold":"Grassetto","tabIndent":"Rientranza tabulazione","justifyRight":"Allinea a destra","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..83be36a83
--- /dev/null
+++ b/lib/dijit/_editor/nls/it/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/it/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'Azione "${0}" disponibile sul proprio browser solo mediante i tasti di scelta rapida della tastiera. Utilizzare ${1}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ja/FontChoice.js b/lib/dijit/_editor/nls/ja/FontChoice.js
index 647f90d2d..cf1ee81cf 100644
--- a/lib/dijit/_editor/nls/ja/FontChoice.js
+++ b/lib/dijit/_editor/nls/ja/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"なし","1":"超極小","2":"極小","formatBlock":"フォーマット","3":"小","4":"標準","5":"大","6":"特大","7":"超特大","fantasy":"fantasy","serif":"serif","p":"段落","pre":"事前フォーマット済み","sans-serif":"sans-serif","fontName":"フォント","h1":"見出し","h2":"副見出し","h3":"副見出しの副見出し","monospace":"monospace","fontSize":"サイズ","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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:"超特大"})); \ No newline at end of file
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..e654c1998
--- /dev/null
+++ b/lib/dijit/_editor/nls/ja/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/ja/FontChoice", //begin v1.x content
+({
+ 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: "超特大"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ja/LinkDialog.js b/lib/dijit/_editor/nls/ja/LinkDialog.js
index 815f5083d..408e45ed6 100644
--- a/lib/dijit/_editor/nls/ja/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ja/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"説明:","insertImageTitle":"イメージ・プロパティー","set":"設定","newWindow":"新規ウィンドウ","topWindow":"最上位ウィンドウ","target":"ターゲット:","createLinkTitle":"リンク・プロパティー","parentWindow":"親ウィンドウ","currentWindow":"現行ウィンドウ","url":"URL:"}) \ No newline at end of file
+//>>built
+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..95f44f71a
--- /dev/null
+++ b/lib/dijit/_editor/nls/ja/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/ja/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "リンク・プロパティー",
+ insertImageTitle: "イメージ・プロパティー",
+ url: "URL:",
+ text: "説明:",
+ target: "ターゲット:",
+ set: "設定",
+ currentWindow: "現行ウィンドウ",
+ parentWindow: "親ウィンドウ",
+ topWindow: "最上位ウィンドウ",
+ newWindow: "新規ウィンドウ"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ja/commands.js b/lib/dijit/_editor/nls/ja/commands.js
index 2ba1d51bb..56026d1e3 100644
--- a/lib/dijit/_editor/nls/ja/commands.js
+++ b/lib/dijit/_editor/nls/ja/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"書式のクリア","copy":"コピー","paste":"貼り付け","selectAll":"すべて選択","insertOrderedList":"番号付きリスト","insertTable":"テーブルの挿入/編集","print":"印刷","underline":"下線","foreColor":"前景色","htmlToggle":"HTML ソース","formatBlock":"段落スタイル","newPage":"新規ページ","insertHorizontalRule":"水平罫線","delete":"削除","insertUnorderedList":"黒丸付きリスト","tableProp":"テーブル・プロパティー","insertImage":"イメージの挿入","superscript":"上付き文字","subscript":"下付き文字","createLink":"リンクの作成","undo":"元に戻す","fullScreen":"全画面表示に切り替え","italic":"イタリック","fontName":"フォント名","justifyLeft":"左揃え","unlink":"リンクの削除","toggleTableBorder":"テーブル・ボーダーの切り替え","viewSource":"HTML ソースの表示","ctrlKey":"Ctrl+${0}","fontSize":"フォント・サイズ","systemShortcut":"\"${0}\" アクションを使用できるのは、ブラウザーでキーボード・ショートカットを使用する場合のみです。${1} を使用してください。","indent":"インデント","redo":"やり直し","strikethrough":"取り消し線","justifyFull":"両端揃え","justifyCenter":"中央揃え","hiliteColor":"マーカー","deleteTable":"テーブルの削除","outdent":"アウトデント","cut":"切り取り","plainFormatBlock":"段落スタイル","toggleDir":"方向の切り替え","bold":"太字","tabIndent":"タブ・インデント","justifyRight":"右揃え","appleKey":"⌘${0}"}) \ No newline at end of file
+//>>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
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..b97ea2ed4
--- /dev/null
+++ b/lib/dijit/_editor/nls/ja/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/ja/commands", //begin v1.x content
+({
+ '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}'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/kk/FontChoice.js b/lib/dijit/_editor/nls/kk/FontChoice.js
index 6a9dbbff3..1569c30b2 100644
--- a/lib/dijit/_editor/nls/kk/FontChoice.js
+++ b/lib/dijit/_editor/nls/kk/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Ешбір","1":"xx-кіші","2":"x-кіші","formatBlock":"Пішім","3":"кіші","4":"орташа","5":"үлкен","6":"x-үлкен","7":"xx-үлкен","fantasy":"қиял-ғажайып","serif":"serif","p":"Еже","pre":"Алдын ала пішімделген","sans-serif":"sans-serif","fontName":"Қаріп","h1":"Үстіңгі деректеме","h2":"Ішкі тақырып","h3":"Ішкі-ішкі тақырып","monospace":"monospace","fontSize":"Өлшемі","cursive":"көлбеу"}) \ No newline at end of file
+//>>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
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..58c607be0
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/kk/FontChoice", //begin v1.x content
+({
+ 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-үлкен"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/kk/LinkDialog.js b/lib/dijit/_editor/nls/kk/LinkDialog.js
index c1c5ca2fa..b186e824a 100644
--- a/lib/dijit/_editor/nls/kk/LinkDialog.js
+++ b/lib/dijit/_editor/nls/kk/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Сипаттама:","insertImageTitle":"Сурет сипаттары","set":"Орнату","newWindow":"Жаңа терезе","topWindow":"Ең жоғарғы терезе","target":"Мақсат:","createLinkTitle":"Сілтеме сипаттары","parentWindow":"Басты терезе","currentWindow":"Ағымдағы терезе","url":"URL мекенжайы:"}) \ No newline at end of file
+//>>built
+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..942f7e7f6
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/LinkDialog.js.uncompressed.js
@@ -0,0 +1,16 @@
+define(
+"dijit/_editor/nls/kk/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "Сілтеме сипаттары",
+ insertImageTitle: "Сурет сипаттары",
+ url: "URL мекенжайы:",
+ text: "Сипаттама:",
+ target: "Мақсат:",
+ set: "Орнату",
+ currentWindow: "Ағымдағы терезе",
+ parentWindow: "Басты терезе",
+ topWindow: "Ең жоғарғы терезе",
+ newWindow: "Жаңа терезе"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/kk/commands.js b/lib/dijit/_editor/nls/kk/commands.js
index ac362d31e..15d253122 100644
--- a/lib/dijit/_editor/nls/kk/commands.js
+++ b/lib/dijit/_editor/nls/kk/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Пішімді алып тастау","copy":"Көшіру","paste":"Қою","selectAll":"Барлығын таңдау","insertOrderedList":"Нөмірленген тізім","insertTable":"Кестені кірістіру/өңдеу","print":"Басып шығару","underline":"Асты сызылған","foreColor":"Алды түсі","htmlToggle":"HTML көзі","formatBlock":"Еже мәнері","newPage":"Жаңа бет","insertHorizontalRule":"Көлденең сызғыш","delete":"Жою","insertUnorderedList":"Таңбалауыш тізім","tableProp":"Кесте сипаты","insertImage":"Сурет кірістіру","superscript":"Жолүсті","subscript":"Жоласты","createLink":"Сілтеме жасау","undo":"Болдырмау ","fullScreen":"Толық экранды қосу","italic":"Көлбеу","fontName":"Қаріп атауы","justifyLeft":"Сол жақ бойынша туралау","unlink":"Сілтемені жою","toggleTableBorder":"Кесте жиегін қосу","viewSource":"HTML көзін қарау","fontSize":"Қаріп өлшемі","systemShortcut":"\"${0}\" әрекеті шолғышта тек пернелер тіркесімі арқылы қол жетімді. ${1} пайдаланыңыз.","indent":"Шегіндіру","redo":"Қайтару","strikethrough":"Сызылған","justifyFull":"Туралау","justifyCenter":"Ортасы бойынша туралау","hiliteColor":"Өң түсі","deleteTable":"Кестені жою","outdent":"Шығыңқы","cut":"Қиып алу","plainFormatBlock":"Еже мәнері","toggleDir":"Бағытты қосу","bold":"Қалың","tabIndent":"Қойынды шегінісі","justifyRight":"Оң жақ бойынша туралау","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..77a8173b8
--- /dev/null
+++ b/lib/dijit/_editor/nls/kk/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/kk/commands", //begin v1.x content
+({
+ '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} пайдаланыңыз.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ko/FontChoice.js b/lib/dijit/_editor/nls/ko/FontChoice.js
index f3e2dc4ad..4c077bd1a 100644
--- a/lib/dijit/_editor/nls/ko/FontChoice.js
+++ b/lib/dijit/_editor/nls/ko/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"없음","1":"가장 작게","2":"조금 작게","formatBlock":"서식","3":"작게","4":"중간","5":"크게","6":"조금 크게","7":"가장 크게","fantasy":"fantasy","serif":"serif","p":"단락","pre":"서식이 지정됨","sans-serif":"sans-serif","fontName":"글꼴","h1":"제목","h2":"부제목","h3":"하위 부제목","monospace":"monospace","fontSize":"크기","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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:"가장 크게"})); \ No newline at end of file
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..92d615d0b
--- /dev/null
+++ b/lib/dijit/_editor/nls/ko/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/ko/FontChoice", //begin v1.x content
+({
+ 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: "가장 크게"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ko/LinkDialog.js b/lib/dijit/_editor/nls/ko/LinkDialog.js
index fd1e9d5b0..a8b7c7c9e 100644
--- a/lib/dijit/_editor/nls/ko/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ko/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"설명:","insertImageTitle":"이미지 등록 정보","set":"설정","newWindow":"새 창","topWindow":"최상위 창","target":"대상","createLinkTitle":"링크 등록 정보","parentWindow":"상위 창","currentWindow":"현재 창","url":"URL:"}) \ No newline at end of file
+//>>built
+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..44cc8337f
--- /dev/null
+++ b/lib/dijit/_editor/nls/ko/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/ko/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "링크 등록 정보",
+ insertImageTitle: "이미지 등록 정보",
+ url: "URL:",
+ text: "설명:",
+ target: "대상",
+ set: "설정",
+ currentWindow: "현재 창",
+ parentWindow: "상위 창",
+ topWindow: "최상위 창",
+ newWindow: "새 창"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ko/commands.js b/lib/dijit/_editor/nls/ko/commands.js
index 972b047e3..6ad5e7137 100644
--- a/lib/dijit/_editor/nls/ko/commands.js
+++ b/lib/dijit/_editor/nls/ko/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"형식 제거","copy":"복사","paste":"붙여넣기","selectAll":"모두 선택","insertOrderedList":"번호 목록","insertTable":"테이블 삽입/편집","print":"인쇄","underline":"밑줄","foreColor":"전경색","htmlToggle":"HTML 소스","formatBlock":"단락 양식","newPage":"새 페이지","insertHorizontalRule":"수평 자","delete":"삭제","insertUnorderedList":"글머리표 목록","tableProp":"테이블 특성","insertImage":"이미지 삽입","superscript":"위첨자","subscript":"아래첨자","createLink":"링크 작성","undo":"실행 취소","fullScreen":"전체 화면 토글","italic":"기울임꼴","fontName":"글꼴 이름","justifyLeft":"왼쪽 맞춤","unlink":"링크 제거","toggleTableBorder":"테이블 외곽선 토글","viewSource":"HTML 소스 보기","fontSize":"글꼴 크기","systemShortcut":"\"${0}\" 조치는 브라우저에서 키보드 단축키를 통해서만 사용 가능합니다. ${1}을(를) 사용하십시오.","indent":"들여쓰기","redo":"다시 실행","strikethrough":"취소선","justifyFull":"양쪽 맞춤","justifyCenter":"가운데 맞춤","hiliteColor":"배경색","deleteTable":"테이블 삭제","outdent":"내어쓰기","cut":"잘라내기","plainFormatBlock":"단락 양식","toggleDir":"방향 토글","bold":"굵게","tabIndent":"탭 들여쓰기","justifyRight":"오른쪽 맞춤","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..3582114dc
--- /dev/null
+++ b/lib/dijit/_editor/nls/ko/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ko/commands", //begin v1.x content
+({
+ '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}을(를) 사용하십시오.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/nb/FontChoice.js b/lib/dijit/_editor/nls/nb/FontChoice.js
index c7c8f5dd5..834b21cc4 100644
--- a/lib/dijit/_editor/nls/nb/FontChoice.js
+++ b/lib/dijit/_editor/nls/nb/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Ingen","1":"xx-liten","2":"x-liten","formatBlock":"Format","3":"liten","4":"middels","5":"stor","6":"x-stor","7":"xx-stor","fantasy":"fantasi","serif":"serif","p":"Avsnitt","pre":"Forhåndsformatert","sans-serif":"sans-serif","fontName":"Skrift","h1":"Overskrift","h2":"Undertittel","h3":"Under-undertittel","monospace":"monospace","fontSize":"Størrelse","cursive":"kursiv"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..d15cb84aa
--- /dev/null
+++ b/lib/dijit/_editor/nls/nb/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/nb/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/nb/LinkDialog.js b/lib/dijit/_editor/nls/nb/LinkDialog.js
index 5a5653cad..757717935 100644
--- a/lib/dijit/_editor/nls/nb/LinkDialog.js
+++ b/lib/dijit/_editor/nls/nb/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Beskrivelse:","insertImageTitle":"Bildeegenskaper","set":"Definer","newWindow":"Nytt vindu","topWindow":"Øverste vindu","target":"Mål:","createLinkTitle":"Koblingsegenskaper","parentWindow":"Overordnet vindu","currentWindow":"Gjeldende vindu","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..435138ec0
--- /dev/null
+++ b/lib/dijit/_editor/nls/nb/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/nb/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/nb/commands.js b/lib/dijit/_editor/nls/nb/commands.js
index daf828988..a039878d8 100644
--- a/lib/dijit/_editor/nls/nb/commands.js
+++ b/lib/dijit/_editor/nls/nb/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Fjern format","copy":"Kopier","paste":"Lim inn","selectAll":"Velg alle","insertOrderedList":"Nummerert liste","insertTable":"Sett inn/rediger tabell","print":"Skriv ut","underline":"Understreking","foreColor":"Forgrunnsfarge","htmlToggle":"HTML-kilde","formatBlock":"Avsnittsstil","newPage":"Ny side","insertHorizontalRule":"Vannrett strek","delete":"Slett","appleKey":"⌘${0}","insertUnorderedList":"Punktliste","tableProp":"Tabellegenskap","insertImage":"Sett inn bilde","superscript":"Hevet skrift","subscript":"Senket skrift","createLink":"Opprett kobling","undo":"Angre","fullScreen":"Slå på/av full skjerm","italic":"Kursiv","fontName":"Skriftnavn","justifyLeft":"Venstrejuster","unlink":"Fjern kobling","toggleTableBorder":"Bytt tabellkant","viewSource":"Vis HTML-kilde","ctrlKey":"ctrl+${0}","fontSize":"Skriftstørrelse","systemShortcut":"Handlingen \"${0}\" er bare tilgjengelig i nettleseren ved hjelp av en tastatursnarvei. Bruk ${1}.","indent":"Innrykk","redo":"Gjør om","strikethrough":"Gjennomstreking","justifyFull":"Juster","justifyCenter":"Midtstill","hiliteColor":"Bakgrunnsfarge","deleteTable":"Slett tabell","outdent":"Fjern innrykk","cut":"Klipp ut","plainFormatBlock":"Avsnittsstil","toggleDir":"Bytt retning","bold":"Fet","tabIndent":"Tabulatorinnrykk","justifyRight":"Høyrejuster"}) \ No newline at end of file
+//>>built
+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","systemShortcut":"Handlingen \"${0}\" er bare tilgjengelig i nettleseren ved hjelp av en tastatursnarvei. Bruk ${1}.","ctrlKey":"ctrl+${0}","appleKey":"⌘${0}"})); \ No newline at end of file
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..4f6a78017
--- /dev/null
+++ b/lib/dijit/_editor/nls/nb/commands.js.uncompressed.js
@@ -0,0 +1,53 @@
+define(
+"dijit/_editor/nls/nb/commands", //begin v1.x content
+({
+ '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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/nl/FontChoice.js b/lib/dijit/_editor/nls/nl/FontChoice.js
index 2bdbd583e..91932514b 100644
--- a/lib/dijit/_editor/nls/nl/FontChoice.js
+++ b/lib/dijit/_editor/nls/nl/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Geen","1":"xx-klein","2":"x-klein","formatBlock":"Opmaak","3":"klein","4":"gemiddeld","5":"groot","6":"x-groot","7":"xx-groot","fantasy":"fantasy","serif":"serif","p":"Alinea","pre":"Vooraf opgemaakt","sans-serif":"sans-serif","fontName":"Lettertype","h1":"Kop","h2":"Subkop","h3":"Sub-subkop","monospace":"monospace","fontSize":"Grootte","cursive":"cursief"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..43ddc20b4
--- /dev/null
+++ b/lib/dijit/_editor/nls/nl/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/nl/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/nl/LinkDialog.js b/lib/dijit/_editor/nls/nl/LinkDialog.js
index 5f4ba588a..7969d538d 100644
--- a/lib/dijit/_editor/nls/nl/LinkDialog.js
+++ b/lib/dijit/_editor/nls/nl/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","set":"Instellen","newWindow":"Nieuw venster","topWindow":"Bovenste venster","target":"Doel:","createLinkTitle":"Linkeigenschappen","parentWindow":"Hoofdvenster","currentWindow":"Huidig venster","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..cccaf0464
--- /dev/null
+++ b/lib/dijit/_editor/nls/nl/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/nl/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "Linkeigenschappen",
+ insertImageTitle: "Afbeeldingseigenschappen",
+ url: "URL:",
+ text: "Beschrijving:",
+ target: "Doel:",
+ set: "Instellen",
+ currentWindow: "Huidig venster",
+ parentWindow: "Hoofdvenster",
+ topWindow: "Bovenste venster",
+ newWindow: "Nieuw venster"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/nl/commands.js b/lib/dijit/_editor/nls/nl/commands.js
index ebc7c9947..30564deba 100644
--- a/lib/dijit/_editor/nls/nl/commands.js
+++ b/lib/dijit/_editor/nls/nl/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Opmaak verwijderen","copy":"Kopiëren","paste":"Plakken","selectAll":"Alles selecteren","insertOrderedList":"Genummerde lijst","insertTable":"Tabel invoegen/bewerken","print":"Afdrukken","underline":"Onderstrepen","foreColor":"Voorgrondkleur","htmlToggle":"HTML-bron","formatBlock":"Alineastijl","newPage":"Nieuwe pagina","insertHorizontalRule":"Horizontale liniaal","delete":"Wissen","insertUnorderedList":"Lijst met opsommingstekens","tableProp":"Tabeleigenschap","insertImage":"Afbeelding invoegen","superscript":"Superscript","subscript":"Subscript","createLink":"Link maken","undo":"Ongedaan maken","fullScreen":"Volledig scherm in-/uitschakelen","italic":"Cursief","fontName":"Lettertype","justifyLeft":"Links uitlijnen","unlink":"Link verwijderen","toggleTableBorder":"Tabelkader wijzigen","viewSource":"HTML-bron bekijken","fontSize":"Lettergrootte","systemShortcut":"De actie \"${0}\" is alleen beschikbaar in uw browser via een sneltoetscombinatie. Gebruik ${1}.","indent":"Inspringen","redo":"Opnieuw","strikethrough":"Doorhalen","justifyFull":"Uitvullen","justifyCenter":"Centreren","hiliteColor":"Achtergrondkleur","deleteTable":"Tabel wissen","outdent":"Uitspringen","cut":"Knippen","plainFormatBlock":"Alineastijl","toggleDir":"Schrijfrichting wijzigen","bold":"Vet","tabIndent":"Inspringen","justifyRight":"Rechts uitlijnen","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..e2db8144a
--- /dev/null
+++ b/lib/dijit/_editor/nls/nl/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/nl/commands", //begin v1.x content
+({
+ '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}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pl/FontChoice.js b/lib/dijit/_editor/nls/pl/FontChoice.js
index e555c2812..4255ea21a 100644
--- a/lib/dijit/_editor/nls/pl/FontChoice.js
+++ b/lib/dijit/_editor/nls/pl/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Brak","1":"najmniejsza","2":"mniejsza","formatBlock":"Format","3":"mała","4":"średnia","5":"duża","6":"większa","7":"największa","fantasy":"fantazyjna","serif":"szeryfowa","p":"Akapit","pre":"Wstępnie sformatowane","sans-serif":"bezszeryfowa","fontName":"Czcionka","h1":"Nagłówek","h2":"Nagłówek 2-go poziomu","h3":"Nagłówek 3-go poziomu","monospace":"czcionka o stałej szerokości","fontSize":"Wielkość","cursive":"kursywa"}) \ No newline at end of file
+//>>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
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..2726d1eb0
--- /dev/null
+++ b/lib/dijit/_editor/nls/pl/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/pl/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pl/LinkDialog.js b/lib/dijit/_editor/nls/pl/LinkDialog.js
index 86f71e53c..39efed70c 100644
--- a/lib/dijit/_editor/nls/pl/LinkDialog.js
+++ b/lib/dijit/_editor/nls/pl/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Opis:","insertImageTitle":"Właściwości obrazu","set":"Ustaw","newWindow":"Nowe okno","topWindow":"Okno najwyższego poziomu","target":"Cel:","createLinkTitle":"Właściwości odsyłacza","parentWindow":"Okno macierzyste","currentWindow":"Bieżące okno","url":"Adres URL:"}) \ No newline at end of file
+//>>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
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..d94475c03
--- /dev/null
+++ b/lib/dijit/_editor/nls/pl/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/pl/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pl/commands.js b/lib/dijit/_editor/nls/pl/commands.js
index 0615a6905..70b6b1def 100644
--- a/lib/dijit/_editor/nls/pl/commands.js
+++ b/lib/dijit/_editor/nls/pl/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Usuń formatowanie","copy":"Kopiuj","paste":"Wklej","selectAll":"Wybierz wszystko","insertOrderedList":"Lista numerowana","insertTable":"Wstaw/edytuj tabelę","print":"Drukuj","underline":"Podkreślenie","foreColor":"Kolor pierwszego planu","htmlToggle":"Kod źródłowy HTML","formatBlock":"Styl akapitu","newPage":"Nowa strona","insertHorizontalRule":"Linia pozioma","delete":"Usuń","insertUnorderedList":"Lista wypunktowana","tableProp":"Właściwość tabeli","insertImage":"Wstaw obraz","superscript":"Indeks górny","subscript":"Indeks dolny","createLink":"Utwórz odsyłacz","undo":"Cofnij","fullScreen":"Przełącz pełny ekran","italic":"Kursywa","fontName":"Nazwa czcionki","justifyLeft":"Wyrównaj do lewej","unlink":"Usuń odsyłacz","toggleTableBorder":"Przełącz ramkę tabeli","viewSource":"Wyświetl kod źródłowy HTML","ctrlKey":"Ctrl+${0}","fontSize":"Wielkość czcionki","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}.","indent":"Wcięcie","redo":"Ponów","strikethrough":"Przekreślenie","justifyFull":"Wyrównaj do lewej i prawej","justifyCenter":"Wyrównaj do środka","hiliteColor":"Kolor tła","deleteTable":"Usuń tabelę","outdent":"Usuń wcięcie","cut":"Wytnij","plainFormatBlock":"Styl akapitu","toggleDir":"Przełącz kierunek","bold":"Pogrubienie","tabIndent":"Wcięcie o tabulator","justifyRight":"Wyrównaj do prawej","appleKey":"⌘${0}"}) \ No newline at end of file
+//>>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
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..5d84ba7f3
--- /dev/null
+++ b/lib/dijit/_editor/nls/pl/commands.js.uncompressed.js
@@ -0,0 +1,53 @@
+define(
+"dijit/_editor/nls/pl/commands", //begin v1.x content
+({
+ '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",
+ /* 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}'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pt-pt/FontChoice.js b/lib/dijit/_editor/nls/pt-pt/FontChoice.js
index b7b8405c4..02bd23464 100644
--- a/lib/dijit/_editor/nls/pt-pt/FontChoice.js
+++ b/lib/dijit/_editor/nls/pt-pt/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Nenhum","1":"xxs","2":"xs","formatBlock":"Formato","3":"small","4":"medium","5":"large","6":"xl","7":"xxl","fantasy":"fantasy","serif":"serif","p":"Parágrafo","pre":"Pré-formatado","sans-serif":"sans-serif","fontName":"Tipo de letra","h1":"Título","h2":"Sub-título","h3":"Sub-subtítulo","monospace":"monospace","fontSize":"Tamanho","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..aa3f84137
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt-pt/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/pt-pt/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pt-pt/LinkDialog.js b/lib/dijit/_editor/nls/pt-pt/LinkDialog.js
index 4499fa7c0..1364d3116 100644
--- a/lib/dijit/_editor/nls/pt-pt/LinkDialog.js
+++ b/lib/dijit/_editor/nls/pt-pt/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Descrição:","insertImageTitle":"Propriedades da imagem","set":"Definir","newWindow":"Nova janela","topWindow":"Janela superior","target":"Destino:","createLinkTitle":"Propriedades da ligação","parentWindow":"Janela ascendente","currentWindow":"Janela actual","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..bd423cfdb
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt-pt/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/pt-pt/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pt-pt/commands.js b/lib/dijit/_editor/nls/pt-pt/commands.js
index 1f4815dfe..698118d0c 100644
--- a/lib/dijit/_editor/nls/pt-pt/commands.js
+++ b/lib/dijit/_editor/nls/pt-pt/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Remover formato","copy":"Copiar","paste":"Colar","selectAll":"Seleccionar tudo","insertOrderedList":"Lista numerada","insertTable":"Inserir/Editar tabela","print":"Imprimir","underline":"Sublinhado","foreColor":"Cor de primeiro plano","htmlToggle":"Código-fonte de HTML","formatBlock":"Estilo de parágrafo","newPage":"Nova página","insertHorizontalRule":"Régua horizontal","delete":"Eliminar","insertUnorderedList":"Lista marcada","tableProp":"Propriedades da tabela","insertImage":"Inserir imagem","superscript":"Superior à linha","subscript":"Inferior à linha","createLink":"Criar ligação","undo":"Anular","fullScreen":"Alternar ecrã completo","italic":"Itálico","fontName":"Nome do tipo de letra","justifyLeft":"Alinhar à esquerda","unlink":"Remover ligação","toggleTableBorder":"Alternar contorno da tabela","viewSource":"Ver origem HTML","fontSize":"Tamanho do tipo de letra","systemShortcut":"A acção \"${0}\" apenas está disponível no navegador utilizando um atalho de teclado. Utilize ${1}.","indent":"Indentar","redo":"Repetir","strikethrough":"Rasurado","justifyFull":"Justificar","justifyCenter":"Alinhar ao centro","hiliteColor":"Cor de segundo plano","deleteTable":"Eliminar tabela","outdent":"Recuar","cut":"Cortar","plainFormatBlock":"Estilo de parágrafo","toggleDir":"Alternar direcção","bold":"Negrito","tabIndent":"Indentar com a tecla Tab","justifyRight":"Alinhar à direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>built
+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","systemShortcut":"A acção \"${0}\" apenas está disponível no navegador utilizando um atalho de teclado. Utilize ${1}."})); \ No newline at end of file
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..d6bf5e430
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt-pt/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/pt-pt/commands", //begin v1.x content
+({
+ '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}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pt/FontChoice.js b/lib/dijit/_editor/nls/pt/FontChoice.js
index 2ce4785f3..57c44c79c 100644
--- a/lib/dijit/_editor/nls/pt/FontChoice.js
+++ b/lib/dijit/_editor/nls/pt/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Nenhuma","1":"extra-extra-pequeno","2":"extra-pequeno","formatBlock":"Formatar","3":"pequena","4":"médio","5":"grande","6":"extra-grande","7":"extra-extra-grande","fantasy":"fantasy","serif":"serif","p":"Parágrafo","pre":"Pré-formatado","sans-serif":"sans-serif","fontName":"Fonte","h1":"Título","h2":"Subtítulo","h3":"Sub-subtítulo","monospace":"espaço simples","fontSize":"Tamanho","cursive":"cursiva"}) \ No newline at end of file
+//>>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
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..9b2f06442
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/pt/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pt/LinkDialog.js b/lib/dijit/_editor/nls/pt/LinkDialog.js
index 0a55795eb..8d03b5561 100644
--- a/lib/dijit/_editor/nls/pt/LinkDialog.js
+++ b/lib/dijit/_editor/nls/pt/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Descrição:","insertImageTitle":"Propriedades de Imagem","set":"Definir","newWindow":"Nova Janela","topWindow":"Primeira Janela","target":"Destino:","createLinkTitle":"Propriedades de Link","parentWindow":"Janela Pai","currentWindow":"Janela Atual","url":"URL:"}) \ No newline at end of file
+//>>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
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..447b2c31b
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/pt/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/pt/commands.js b/lib/dijit/_editor/nls/pt/commands.js
index cef0a157e..35c6142ca 100644
--- a/lib/dijit/_editor/nls/pt/commands.js
+++ b/lib/dijit/_editor/nls/pt/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Todos","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","print":"Imprimir","underline":"Sublinhado","foreColor":"Cor do Primeiro Plano","htmlToggle":"Origem HTML","formatBlock":"Estilo de Parágrafo","newPage":"Nova Página","insertHorizontalRule":"Régua Horizontal","delete":"Excluir","insertUnorderedList":"Lista com Marcadores","tableProp":"Propriedade da Tabela","insertImage":"Inserir Imagem","superscript":"Sobrescrito","subscript":"Subscrito","createLink":"Criar Link","undo":"Desfazer","fullScreen":"Comutar Tela Cheia","italic":"Itálico","fontName":"Nome da Fonte","justifyLeft":"Alinhar à Esquerda","unlink":"Remover Link","toggleTableBorder":"Alternar Moldura da Tabela","viewSource":"Visualizar Origem HTML","fontSize":"Tamanho da Fonte","systemShortcut":"A ação \"${0}\" está disponível em seu navegador apenas usando um atalho de teclado. Use ${1}.","indent":"Recuar","redo":"Refazer","strikethrough":"Tachado","justifyFull":"Justificar","justifyCenter":"Alinhar pelo Centro","hiliteColor":"Cor do Segundo Plano","deleteTable":"Excluir Tabela","outdent":"Não chanfrado","cut":"Recortar","plainFormatBlock":"Estilo de Parágrafo","toggleDir":"Comutar Direção","bold":"Negrito","tabIndent":"Recuo de Guia","justifyRight":"Alinhar à Direita","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..b2fad6a30
--- /dev/null
+++ b/lib/dijit/_editor/nls/pt/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/pt/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'A ação "${0}" está disponível em seu navegador apenas usando um atalho de teclado. Use ${1}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ro/FontChoice.js b/lib/dijit/_editor/nls/ro/FontChoice.js
index 4806cb3e9..a65bf8319 100644
--- a/lib/dijit/_editor/nls/ro/FontChoice.js
+++ b/lib/dijit/_editor/nls/ro/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Fără","1":"xxs (xx-small)","2":"xs (x-small)","formatBlock":"Format","3":"s (small)","4":"m (medium)","5":"l (large)","6":"xl (x-large)","7":"xxl (xx-large)","fantasy":"fantasy","serif":"serif","p":"Paragraf","pre":"Preformatat","sans-serif":"sans-serif","fontName":"Font","h1":"Titlu","h2":"Subtitlu","h3":"Sub-subtitlu","monospace":"monospace","fontSize":"Dimensiune","cursive":"cursive"}) \ No newline at end of file
+//>>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
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..02f2269f8
--- /dev/null
+++ b/lib/dijit/_editor/nls/ro/FontChoice.js.uncompressed.js
@@ -0,0 +1,31 @@
+define(
+"dijit/_editor/nls/ro/FontChoice", //begin v1.x content
+({
+ 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)"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ro/LinkDialog.js b/lib/dijit/_editor/nls/ro/LinkDialog.js
index fba0a8423..3a6772646 100644
--- a/lib/dijit/_editor/nls/ro/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ro/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Descriere:","insertImageTitle":"Proprietăţi imagine","set":"Setare","newWindow":"Fereastra nouă","topWindow":"Fereastra cea mai de sus","target":"Destinaţie:","createLinkTitle":"Proprietăţi legătură","parentWindow":"Fereastra părinte","currentWindow":"Fereastra curentă","url":"URL:"}) \ No newline at end of file
+//>>built
+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ă"})); \ No newline at end of file
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..0fafb290b
--- /dev/null
+++ b/lib/dijit/_editor/nls/ro/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/ro/LinkDialog", //begin v1.x content
+({
+ 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ă"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ro/commands.js b/lib/dijit/_editor/nls/ro/commands.js
index 776bcb3ae..dcbf9d3a9 100644
--- a/lib/dijit/_editor/nls/ro/commands.js
+++ b/lib/dijit/_editor/nls/ro/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Înlăturare format","copy":"Copiere","paste":"Lipire","selectAll":"Selectează tot","insertOrderedList":"Listă numerotată","insertTable":"Inserare/Editare tabelă","print":"Tipărire","underline":"Subliniere","foreColor":"Culoare de prim-plan","htmlToggle":"Sursă HTML","formatBlock":"Stil paragraf","newPage":"Pagină nouă","insertHorizontalRule":"Linie delimitatoare","delete":"Ştergere","insertUnorderedList":"Listă cu marcator","tableProp":"Proprietate tabelă","insertImage":"Inserare imagine","superscript":"Scriere indice superior","subscript":"Scriere indice inferior","createLink":"Creare legătură","undo":"Anulare acţiune","fullScreen":"Comutare ecran complet","italic":"Cursiv","fontName":"Nume font","justifyLeft":"Aliniere stânga","unlink":"Înlăturare legătură","toggleTableBorder":"Comutare bordură tabelă","viewSource":"Vizualizara sursă HTML","fontSize":"Dimensiune font","systemShortcut":"Acţiunea \"${0}\" este disponibilă în browser doar utilizând o comandă rapidă de la tastatură. Utilizaţi ${1}.","indent":"Micşorare indent","redo":"Refacere acţiune","strikethrough":"Tăiere text cu o linie","justifyFull":"Aliniere stânga-dreapta","justifyCenter":"Aliniere centru","hiliteColor":"Culoare de fundal","deleteTable":"Ştergere tabelă","outdent":"Mărire indent","cut":"Tăiere","plainFormatBlock":"Stil paragraf","toggleDir":"Comutare direcţie","bold":"Aldin","tabIndent":"Indentare Tab","justifyRight":"Aliniere dreapta","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..a534e9f49
--- /dev/null
+++ b/lib/dijit/_editor/nls/ro/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/ro/commands", //begin v1.x content
+({
+ '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}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ru/FontChoice.js b/lib/dijit/_editor/nls/ru/FontChoice.js
index b836589cf..8851c9df5 100644
--- a/lib/dijit/_editor/nls/ru/FontChoice.js
+++ b/lib/dijit/_editor/nls/ru/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Нет","1":"самый маленький","2":"очень маленький","formatBlock":"Формат","3":"маленький","4":"средний","5":"большой","6":"очень большой","7":"самый большой","fantasy":"артистический","serif":"с засечками","p":"Абзац","pre":"Заранее отформатированный","sans-serif":"без засечек","fontName":"Шрифт","h1":"Заголовок","h2":"Подзаголовок","h3":"Вложенный подзаголовок","monospace":"непропорциональный","fontSize":"Размер","cursive":"курсив"}) \ No newline at end of file
+//>>built
+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:"самый большой"})); \ No newline at end of file
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..611a40c82
--- /dev/null
+++ b/lib/dijit/_editor/nls/ru/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/ru/FontChoice", //begin v1.x content
+({
+ fontSize: "Размер",
+ fontName: "Шрифт",
+ formatBlock: "Формат",
+
+ serif: "с засечками",
+ "sans-serif": "без засечек",
+ monospace: "непропорциональный",
+ cursive: "курсив",
+ fantasy: "артистический",
+
+ noFormat: "Нет",
+ p: "Абзац",
+ h1: "Заголовок",
+ h2: "Подзаголовок",
+ h3: "Вложенный подзаголовок",
+ pre: "Заранее отформатированный",
+
+ 1: "самый маленький",
+ 2: "очень маленький",
+ 3: "маленький",
+ 4: "средний",
+ 5: "большой",
+ 6: "очень большой",
+ 7: "самый большой"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ru/LinkDialog.js b/lib/dijit/_editor/nls/ru/LinkDialog.js
index 0b91f4c09..b7ce76ba7 100644
--- a/lib/dijit/_editor/nls/ru/LinkDialog.js
+++ b/lib/dijit/_editor/nls/ru/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Описание:","insertImageTitle":"Свойства изображения","set":"Задать","newWindow":"Новое окно","topWindow":"Верхнее окно","target":"Целевой объект:","createLinkTitle":"Свойства ссылки","parentWindow":"Родительское окно","currentWindow":"Текущее окно","url":"URL:"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/ru/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/ru/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..35b914001
--- /dev/null
+++ b/lib/dijit/_editor/nls/ru/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/ru/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "Свойства ссылки",
+ insertImageTitle: "Свойства изображения",
+ url: "URL:",
+ text: "Описание:",
+ target: "Целевой объект:",
+ set: "Задать",
+ currentWindow: "Текущее окно",
+ parentWindow: "Родительское окно",
+ topWindow: "Верхнее окно",
+ newWindow: "Новое окно"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/ru/commands.js b/lib/dijit/_editor/nls/ru/commands.js
index bbc76174a..6a6a5099a 100644
--- a/lib/dijit/_editor/nls/ru/commands.js
+++ b/lib/dijit/_editor/nls/ru/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Удалить формат","copy":"Копировать","paste":"Вставить","selectAll":"Выбрать все","insertOrderedList":"Нумерованный список","insertTable":"Вставить/изменить таблицу","print":"Печать","underline":"Подчеркивание","foreColor":"Цвет текста","htmlToggle":"Код HTML","formatBlock":"Стиль абзаца","newPage":"Создать страницу","insertHorizontalRule":"Горизонтальная линейка","delete":"Удалить","insertUnorderedList":"Список с маркерами","tableProp":"Свойства таблицы","insertImage":"Вставить изображение","superscript":"Верхний индекс","subscript":"Нижний индекс","createLink":"Создать ссылку","undo":"Отменить","fullScreen":"Переключить полноэкранный режим","italic":"Курсив","fontName":"Название шрифта","justifyLeft":"По левому краю","unlink":"Удалить ссылку","toggleTableBorder":"Переключить рамку таблицы","viewSource":"Показать исходный код HTML","fontSize":"Размер шрифта","systemShortcut":"Действие \"${0}\" можно выполнить в браузере только путем нажатия клавиш ${1}.","indent":"Отступ","redo":"Повторить","strikethrough":"Перечеркивание","justifyFull":"По ширине","justifyCenter":"По центру","hiliteColor":"Цвет фона","deleteTable":"Удалить таблицу","outdent":"Втяжка","cut":"Вырезать","plainFormatBlock":"Стиль абзаца","toggleDir":"Изменить направление","bold":"Полужирный","tabIndent":"Табуляция","justifyRight":"По правому краю","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..112659bd6
--- /dev/null
+++ b/lib/dijit/_editor/nls/ru/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/ru/commands", //begin v1.x content
+({
+ '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}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sk/FontChoice.js b/lib/dijit/_editor/nls/sk/FontChoice.js
index afe267bcc..89224b04c 100644
--- a/lib/dijit/_editor/nls/sk/FontChoice.js
+++ b/lib/dijit/_editor/nls/sk/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Žiadny","1":"xx-small","2":"x-small","formatBlock":"Formát","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"Odsek","pre":"Predformátované","sans-serif":"sans-serif","fontName":"Písmo","h1":"Hlavička","h2":"Podhlavička","h3":"Pod-podhlavička","monospace":"monospace","fontSize":"Veľkosť","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..50dce9b79
--- /dev/null
+++ b/lib/dijit/_editor/nls/sk/FontChoice.js.uncompressed.js
@@ -0,0 +1,31 @@
+define(
+"dijit/_editor/nls/sk/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
+
diff --git a/lib/dijit/_editor/nls/sk/LinkDialog.js b/lib/dijit/_editor/nls/sk/LinkDialog.js
index 75d0f885e..1251d38e7 100644
--- a/lib/dijit/_editor/nls/sk/LinkDialog.js
+++ b/lib/dijit/_editor/nls/sk/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Opis:","insertImageTitle":"Vlastnosti obrázka ","set":"Nastaviť","newWindow":"Nové okno ","topWindow":"Najvrchnejšie okno ","target":"Cieľ:","createLinkTitle":"Pripojiť vlastnosti","parentWindow":"Rodičovské okno ","currentWindow":"Aktuálne okno ","url":"URL:"}) \ No newline at end of file
+//>>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
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..7aec07ccb
--- /dev/null
+++ b/lib/dijit/_editor/nls/sk/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/sk/LinkDialog", //begin v1.x content
+({
+ 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 "
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sk/commands.js b/lib/dijit/_editor/nls/sk/commands.js
index a59975e72..1ba3b24c6 100644
--- a/lib/dijit/_editor/nls/sk/commands.js
+++ b/lib/dijit/_editor/nls/sk/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Odstrániť formát","copy":"Kopírovať","paste":"Nalepiť","selectAll":"Vybrať všetko","insertOrderedList":"Číslovaný zoznam","insertTable":"Vložiť/upraviť tabuľku","print":"Tlačiť","underline":"Podčiarknuť","foreColor":"Farba popredia","htmlToggle":"Zdroj HTML","formatBlock":"Štýl odseku","newPage":"Nová stránka ","insertHorizontalRule":"Horizontálna čiara","delete":"Vymazať","insertUnorderedList":"Zoznam s odrážkami","tableProp":"Vlastnosť tabuľky","insertImage":"Vložiť obrázok","superscript":"Horný index","subscript":"Dolný index","createLink":"Vytvoriť prepojenie","undo":"Vrátiť späť","fullScreen":"Zobraziť na celú obrazovku","italic":"Kurzíva","fontName":"Názov písma","justifyLeft":"Zarovnať doľava","unlink":"Odstrániť prepojenie","toggleTableBorder":"Prepnúť rámček tabuľky","viewSource":"Zobraziť zdrojový kód HTML ","fontSize":"Veľkosť písma","systemShortcut":"Akcia \"${0}\" je vo vašom prehliadači dostupná len s použitím klávesovej skratky. Použite ${1}.","indent":"Odsadiť","redo":"Znova vykonať","strikethrough":"Prečiarknuť","justifyFull":"Zarovnať podľa okraja","justifyCenter":"Zarovnať na stred","hiliteColor":"Farba pozadia","deleteTable":"Vymazať tabuľku","outdent":"Predsadiť","cut":"Vystrihnúť","plainFormatBlock":"Štýl odseku","toggleDir":"Prepnúť smer","bold":"Tučné písmo","tabIndent":"Odsadenie tabulátora","justifyRight":"Zarovnať doprava","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..8fd58cdcc
--- /dev/null
+++ b/lib/dijit/_editor/nls/sk/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/sk/commands", //begin v1.x content
+({
+ '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 ",
+ /* Error messages */
+ 'systemShortcut': 'Akcia "${0}" je vo vašom prehliadači dostupná len s použitím klávesovej skratky. Použite ${1}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sl/FontChoice.js b/lib/dijit/_editor/nls/sl/FontChoice.js
index e6fe9d303..817223623 100644
--- a/lib/dijit/_editor/nls/sl/FontChoice.js
+++ b/lib/dijit/_editor/nls/sl/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Brez","1":"xx-majhno","2":"x-majhno","formatBlock":"Oblika","3":"majhno","4":"srednje","5":"veliko","6":"x-veliko","7":"xx-veliko","fantasy":"fantasy","serif":"serif","p":"Odstavek","pre":"Vnaprej oblikovan","sans-serif":"sans-serif","fontName":"Pisava","h1":"Naslovni slog","h2":"Podnaslovni slog","h3":"Pod-podnaslovni slog","monospace":"monospace","fontSize":"Velikost","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..bed8749d8
--- /dev/null
+++ b/lib/dijit/_editor/nls/sl/FontChoice.js.uncompressed.js
@@ -0,0 +1,31 @@
+define(
+"dijit/_editor/nls/sl/FontChoice", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sl/LinkDialog.js b/lib/dijit/_editor/nls/sl/LinkDialog.js
index e485a4163..dce532d8a 100644
--- a/lib/dijit/_editor/nls/sl/LinkDialog.js
+++ b/lib/dijit/_editor/nls/sl/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Opis:","insertImageTitle":"Lastnosti slike","set":"Nastavi","newWindow":"Novo okno","topWindow":"Okno na vrhu","target":"Cilj:","createLinkTitle":"Lastnosti povezave","parentWindow":"Nadrejeno okno","currentWindow":"Trenutno okno","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..1df1ae577
--- /dev/null
+++ b/lib/dijit/_editor/nls/sl/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/sl/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
+
diff --git a/lib/dijit/_editor/nls/sl/commands.js b/lib/dijit/_editor/nls/sl/commands.js
index e40b8033b..9061e1602 100644
--- a/lib/dijit/_editor/nls/sl/commands.js
+++ b/lib/dijit/_editor/nls/sl/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Odstrani oblikovanje","copy":"Prekopiraj","paste":"Prilepi","selectAll":"Izberi vse","insertOrderedList":"Oštevilčen seznam","insertTable":"Vstavi/uredi tabelo","print":"Natisni","underline":"Podčrtano","foreColor":"Barva ospredja","htmlToggle":"Izvorna koda HTML","formatBlock":"Slog odstavka","newPage":"Nova stran","insertHorizontalRule":"Vodoravno ravnilo","delete":"Izbriši","insertUnorderedList":"Naštevni seznam","tableProp":"Lastnost tabele","insertImage":"Vstavi sliko","superscript":"Nadpisano","subscript":"Podpisano","createLink":"Ustvari povezavo","undo":"Razveljavi","fullScreen":"Preklopi na celozaslonski način","italic":"Ležeče","fontName":"Ime pisave","justifyLeft":"Poravnaj levo","unlink":"Odstrani povezavo","toggleTableBorder":"Preklopi na rob tabele","viewSource":"Prikaži izvorno kodo HTML","fontSize":"Velikost pisave","systemShortcut":"Dejanje \"${0}\" lahko v vašem brskalniku uporabite samo z bližnjico na tipkovnici. Uporabite ${1}.","indent":"Zamik","redo":"Znova uveljavi","strikethrough":"Prečrtano","justifyFull":"Poravnaj obojestransko","justifyCenter":"Poravnaj na sredino","hiliteColor":"Barva ozadja","deleteTable":"Izbriši tabelo","outdent":"Primakni","cut":"Izreži","plainFormatBlock":"Slog odstavka","toggleDir":"Preklopi smer","bold":"Krepko","tabIndent":"Zamik tabulatorja","justifyRight":"Poravnaj desno","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..9701eed05
--- /dev/null
+++ b/lib/dijit/_editor/nls/sl/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/sl/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'Dejanje "${0}" lahko v vašem brskalniku uporabite samo z bližnjico na tipkovnici. Uporabite ${1}.'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sv/FontChoice.js b/lib/dijit/_editor/nls/sv/FontChoice.js
index 0637af9ff..197fca5e3 100644
--- a/lib/dijit/_editor/nls/sv/FontChoice.js
+++ b/lib/dijit/_editor/nls/sv/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Ingen","1":"mycket, mycket litet","2":"mycket litet","formatBlock":"Format","3":"litet","4":"medelstort","5":"stort","6":"extra stort","7":"extra extra stort","fantasy":"fantasy","serif":"serif","p":"Stycke","pre":"Förformaterat","sans-serif":"sans-serif","fontName":"Teckensnitt","h1":"Rubrik","h2":"Underrubrik","h3":"Underunderrubrik","monospace":"monospace","fontSize":"Storlek","cursive":"kursivt"}) \ No newline at end of file
+//>>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
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..eca88dab7
--- /dev/null
+++ b/lib/dijit/_editor/nls/sv/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/sv/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sv/LinkDialog.js b/lib/dijit/_editor/nls/sv/LinkDialog.js
index 80a1259cf..91eb3cb0e 100644
--- a/lib/dijit/_editor/nls/sv/LinkDialog.js
+++ b/lib/dijit/_editor/nls/sv/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Beskrivning:","insertImageTitle":"Bildegenskaper","set":"Ange","newWindow":"nytt fönster","topWindow":"översta fönstret","target":"Mål:","createLinkTitle":"Länkegenskaper","parentWindow":"överordnat fönster","currentWindow":"aktuellt fönster","url":"URL-adress:"}) \ No newline at end of file
+//>>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
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..14b12b19a
--- /dev/null
+++ b/lib/dijit/_editor/nls/sv/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/sv/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/sv/commands.js b/lib/dijit/_editor/nls/sv/commands.js
index b571e8233..fb62d3068 100644
--- a/lib/dijit/_editor/nls/sv/commands.js
+++ b/lib/dijit/_editor/nls/sv/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Ta bort format","copy":"Kopiera","paste":"Klistra in","selectAll":"Markera allt","insertOrderedList":"Numrerad lista","insertTable":"Infoga/redigera tabell","print":"Skriv ut","underline":"Understrykning","foreColor":"Förgrundsfärg","htmlToggle":"HTML-källkod","formatBlock":"Styckeformat","newPage":"Ny sida","insertHorizontalRule":"Horisontell linjal","delete":"Ta bort","appleKey":"⌘+${0}","insertUnorderedList":"Punktlista","tableProp":"Tabellegenskap","insertImage":"Infoga bild","superscript":"Upphöjt","subscript":"Nedsänkt","createLink":"Skapa länk","undo":"Ångra","fullScreen":"Växla helskärm","italic":"Kursiv","fontName":"Teckensnittsnamn","justifyLeft":"Vänsterjustera","unlink":"Ta bort länk","toggleTableBorder":"Aktivera/avaktivera tabellram","viewSource":"Visa HTML-kod","ctrlKey":"Ctrl+${0}","fontSize":"Teckenstorlek","systemShortcut":"Åtgärden \"${0}\" är endast tillgänglig i webbläsaren med hjälp av ett kortkommando. Använd ${1}.","indent":"Indrag","redo":"Gör om","strikethrough":"Genomstruken","justifyFull":"Marginaljustera","justifyCenter":"Centrera","hiliteColor":"Bakgrundsfärg","deleteTable":"Ta bort tabell","outdent":"Utdrag","cut":"Klipp ut","plainFormatBlock":"Styckeformat","toggleDir":"Växla riktning","bold":"Fetstil","tabIndent":"Tabbindrag","justifyRight":"Högerjustera"}) \ No newline at end of file
+//>>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
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..03d8ceaa6
--- /dev/null
+++ b/lib/dijit/_editor/nls/sv/commands.js.uncompressed.js
@@ -0,0 +1,54 @@
+define(
+"dijit/_editor/nls/sv/commands", //begin v1.x content
+({
+ '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",
+ /* Error messages */
+ 'systemShortcut': 'Åtgärden "${0}" är endast tillgänglig i webbläsaren med hjälp av ett kortkommando. Använd ${1}.',
+ 'ctrlKey':'Ctrl+${0}',
+ 'appleKey':'\u2318+${0}' // "command" or open-apple key on Macintosh
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/th/FontChoice.js b/lib/dijit/_editor/nls/th/FontChoice.js
index 02688efaa..4434be9b8 100644
--- a/lib/dijit/_editor/nls/th/FontChoice.js
+++ b/lib/dijit/_editor/nls/th/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"ไม่มี","1":"xx-small","2":"x-small","formatBlock":"รูปแบบ","3":"small","4":"medium","5":"large","6":"x-large","7":"xx-large","fantasy":"fantasy","serif":"serif","p":"ย่อหน้า","pre":"การกำหนดรูปแบบล่วงหน้า","sans-serif":"sans-serif","fontName":"ฟอนต์","h1":"ส่วนหัว","h2":"ส่วนหัวย่อย","h3":"ส่วนย่อยของส่วนหัวย่อย","monospace":"monospace","fontSize":"ขนาด","cursive":"cursive"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..5d1201c77
--- /dev/null
+++ b/lib/dijit/_editor/nls/th/FontChoice.js.uncompressed.js
@@ -0,0 +1,31 @@
+define(
+"dijit/_editor/nls/th/FontChoice", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/th/LinkDialog.js b/lib/dijit/_editor/nls/th/LinkDialog.js
index 4d1aeb296..4b7756829 100644
--- a/lib/dijit/_editor/nls/th/LinkDialog.js
+++ b/lib/dijit/_editor/nls/th/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"รายละเอียด:","insertImageTitle":"คุณสมบัติอิมเมจ","set":"ตั้งค่า","newWindow":"หน้าต่างใหม่","topWindow":"หน้าต่างบนสุด","target":"เป้าหมาย:","createLinkTitle":"คุณสมบัติลิงก์","parentWindow":"หน้าต่างหลัก","currentWindow":"หน้าต่างปัจจุบัน","url":"URL:"}) \ No newline at end of file
+//>>built
+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..115cb91f2
--- /dev/null
+++ b/lib/dijit/_editor/nls/th/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/th/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "คุณสมบัติลิงก์",
+ insertImageTitle: "คุณสมบัติอิมเมจ",
+ url: "URL:",
+ text: "รายละเอียด:",
+ target: "เป้าหมาย:",
+ set: "ตั้งค่า",
+ currentWindow: "หน้าต่างปัจจุบัน",
+ parentWindow: "หน้าต่างหลัก",
+ topWindow: "หน้าต่างบนสุด",
+ newWindow: "หน้าต่างใหม่"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/th/commands.js b/lib/dijit/_editor/nls/th/commands.js
index a98942a8d..d7480eb96 100644
--- a/lib/dijit/_editor/nls/th/commands.js
+++ b/lib/dijit/_editor/nls/th/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"ลบรูปแบบออก","copy":"คัดลอก","paste":"วาง","selectAll":"เลือกทั้งหมด","insertOrderedList":"ลำดับเลข","insertTable":"แทรก/แก้ไขตาราง","print":"พิมพ์","underline":"ขีดเส้นใต้","foreColor":"สีพื้นหน้า","htmlToggle":"ซอร์ส HTML","formatBlock":"ลักษณะย่อหน้า","newPage":"หน้าใหม่","insertHorizontalRule":"ไม้บรรทัดแนวนอน","delete":"ลบ","insertUnorderedList":"หัวข้อย่อย","tableProp":"คุณสมบัติตาราง","insertImage":"แทรกอิมเมจ","superscript":"ตัวยก","subscript":"ตัวห้อย","createLink":"สร้างลิงก์","undo":"เลิกทำ","fullScreen":"สลับจอภาพแบบเต็ม","italic":"ตัวเอียง","fontName":"ชื่อฟอนต์","justifyLeft":"จัดชิดซ้าย","unlink":"ลบลิงก์ออก","toggleTableBorder":"สลับเส้นขอบตาราง","viewSource":"ดูซอร์ส HTML","fontSize":"ขนาดฟอนต์","systemShortcut":"การดำเนินการ\"${0}\" ใช้งานได้เฉพาะกับเบราว์เซอร์ของคุณโดยใช้แป้นพิมพ์ลัด ใช้ ${1}","indent":"เพิ่มการเยื้อง","redo":"ทำซ้ำ","strikethrough":"ขีดทับ","justifyFull":"จัดชิดขอบ","justifyCenter":"จัดกึ่งกลาง","hiliteColor":"สีพื้นหลัง","deleteTable":"ลบตาราง","outdent":"ลดการเยื้อง","cut":"ตัด","plainFormatBlock":"ลักษณะย่อหน้า","toggleDir":"สลับทิศทาง","bold":"ตัวหนา","tabIndent":"เยื้องแท็บ","justifyRight":"จัดชิดขวา","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..82b4e8ef8
--- /dev/null
+++ b/lib/dijit/_editor/nls/th/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/th/commands", //begin v1.x content
+({
+ '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}'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/tr/FontChoice.js b/lib/dijit/_editor/nls/tr/FontChoice.js
index 28173c929..ee3450af2 100644
--- a/lib/dijit/_editor/nls/tr/FontChoice.js
+++ b/lib/dijit/_editor/nls/tr/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"Yok","1":"xx-küçük","2":"x-küçük","formatBlock":"Biçim","3":"küçük","4":"orta","5":"büyük","6":"x-büyük","7":"xx-büyük","fantasy":"fantazi","serif":"serif","p":"Paragraf","pre":"Önceden Biçimlendirilmiş","sans-serif":"sans-serif","fontName":"Yazı Tipi","h1":"Başlık","h2":"Alt Başlık","h3":"Alt Alt Başlık","monospace":"tek aralıklı","fontSize":"Boyut","cursive":"el yazısı"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..db0afbe92
--- /dev/null
+++ b/lib/dijit/_editor/nls/tr/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/tr/FontChoice", //begin v1.x content
+({
+ 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"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/tr/LinkDialog.js b/lib/dijit/_editor/nls/tr/LinkDialog.js
index 64bf3e219..0a78e2132 100644
--- a/lib/dijit/_editor/nls/tr/LinkDialog.js
+++ b/lib/dijit/_editor/nls/tr/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"Açıklama:","insertImageTitle":"Resim Özellikleri","set":"Ayarla","newWindow":"Yeni Pencere","topWindow":"En Üst Pencere","target":"Hedef:","createLinkTitle":"Bağlantı Özellikleri","parentWindow":"Üst Pencere","currentWindow":"Geçerli Pencere","url":"URL:"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..48cd60f5e
--- /dev/null
+++ b/lib/dijit/_editor/nls/tr/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/tr/LinkDialog", //begin v1.x content
+({
+ 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"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/tr/commands.js b/lib/dijit/_editor/nls/tr/commands.js
index ed7b66db8..5565b9a14 100644
--- a/lib/dijit/_editor/nls/tr/commands.js
+++ b/lib/dijit/_editor/nls/tr/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"Biçimi Kaldır","copy":"Kopyala","paste":"Yapıştır","selectAll":"Tümünü Seç","insertOrderedList":"Numaralı Liste","insertTable":"Tablo Ekle/Düzenle","print":"Yazdır","underline":"Altı Çizili","foreColor":"Ön Plan Rengi","htmlToggle":"HTML Kaynağı","formatBlock":"Paragraf Stili","newPage":"Yeni Sayfa","insertHorizontalRule":"Yatay Kural","delete":"Sil","insertUnorderedList":"Madde İşaretli Liste","tableProp":"Tablo Özelliği","insertImage":"Resim Ekle","superscript":"Üst Simge","subscript":"Alt Simge","createLink":"Bağlantı Oluştur","undo":"Geri Al","fullScreen":"Tam Ekranı Aç/Kapat","italic":"İtalik","fontName":"Yazı Tipi Adı","justifyLeft":"Sola Hizala","unlink":"Bağlantıyı Kaldır","toggleTableBorder":"Tablo Kenarlığını Göster/Gizle","viewSource":"HTML Kaynağını Görüntüle","fontSize":"Yazı Tipi Boyutu","systemShortcut":"\"${0}\" işlemi yalnızca tarayıcınızda bir klavye kısayoluyla birlikte kullanılabilir. Şunu kullanın: ${1}.","indent":"Girinti","redo":"Yinele","strikethrough":"Üstü Çizili","justifyFull":"Yasla","justifyCenter":"Ortaya Hizala","hiliteColor":"Arka Plan Rengi","deleteTable":"Tabloyu Sil","outdent":"Çıkıntı","cut":"Kes","plainFormatBlock":"Paragraf Stili","toggleDir":"Yönü Değiştir","bold":"Kalın","tabIndent":"Sekme Girintisi","justifyRight":"Sağa Hizala","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..60e76b77c
--- /dev/null
+++ b/lib/dijit/_editor/nls/tr/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/tr/commands", //begin v1.x content
+({
+ '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}.'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/zh-tw/FontChoice.js b/lib/dijit/_editor/nls/zh-tw/FontChoice.js
index 006977983..cf158d5f1 100644
--- a/lib/dijit/_editor/nls/zh-tw/FontChoice.js
+++ b/lib/dijit/_editor/nls/zh-tw/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"無","1":"最小","2":"較小","formatBlock":"格式","3":"小","4":"中","5":"大","6":"較大","7":"最大","fantasy":"Fantasy","serif":"新細明體","p":"段落","pre":"預先格式化","sans-serif":"新細明體","fontName":"字型","h1":"標題","h2":"子標題","h3":"次子標題","monospace":"等寬","fontSize":"大小","cursive":"Cursive"}) \ No newline at end of file
+//>>built
+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:"最大"})); \ No newline at end of file
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..72a48d3d4
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh-tw/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/zh-tw/FontChoice", //begin v1.x content
+({
+ fontSize: "大小",
+ fontName: "字型",
+ formatBlock: "格式",
+
+ serif: "新細明體",
+ "sans-serif": "新細明體",
+ monospace: "等寬",
+ cursive: "Cursive",
+ fantasy: "Fantasy",
+
+ noFormat: "無",
+ p: "段落",
+ h1: "標題",
+ h2: "子標題",
+ h3: "次子標題",
+ pre: "預先格式化",
+
+ 1: "最小",
+ 2: "較小",
+ 3: "小",
+ 4: "中",
+ 5: "大",
+ 6: "較大",
+ 7: "最大"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/zh-tw/LinkDialog.js b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js
index 949318b40..216916abe 100644
--- a/lib/dijit/_editor/nls/zh-tw/LinkDialog.js
+++ b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"說明:","insertImageTitle":"影像內容","set":"設定","newWindow":"新視窗","topWindow":"最上面的視窗","target":"目標:","createLinkTitle":"鏈結內容","parentWindow":"上層視窗","currentWindow":"現行視窗","url":"URL:"}) \ No newline at end of file
+//>>built
+define("dijit/_editor/nls/zh-tw/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-tw/LinkDialog.js.uncompressed.js b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js
new file mode 100644
index 000000000..1233e9a80
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh-tw/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/zh-tw/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "鏈結內容",
+ insertImageTitle: "影像內容",
+ url: "URL:",
+ text: "說明:",
+ target: "目標:",
+ set: "設定",
+ currentWindow: "現行視窗",
+ parentWindow: "上層視窗",
+ topWindow: "最上面的視窗",
+ newWindow: "新視窗"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/zh-tw/commands.js b/lib/dijit/_editor/nls/zh-tw/commands.js
index 17f6fea49..2f676219b 100644
--- a/lib/dijit/_editor/nls/zh-tw/commands.js
+++ b/lib/dijit/_editor/nls/zh-tw/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"移除格式","copy":"複製","paste":"貼上","selectAll":"全選","insertOrderedList":"編號清單","insertTable":"插入/編輯表格","print":"列印","underline":"底線","foreColor":"前景顏色","htmlToggle":"HTML 原始檔","formatBlock":"段落樣式","newPage":"新頁面","insertHorizontalRule":"水平尺規","delete":"刪除","insertUnorderedList":"項目符號清單","tableProp":"表格內容","insertImage":"插入影像","superscript":"上標","subscript":"下標","createLink":"建立鏈結","undo":"復原","fullScreen":"切換全螢幕","italic":"斜體","fontName":"字型名稱","justifyLeft":"靠左對齊","unlink":"移除鏈結","toggleTableBorder":"切換表格邊框","viewSource":"檢視 HTML 原始檔","fontSize":"字型大小","systemShortcut":"\"${0}\" 動作在您的瀏覽器中,只能使用鍵盤快速鍵。請使用 ${1}。","indent":"縮排","redo":"重做","strikethrough":"刪除線","justifyFull":"對齊","justifyCenter":"置中對齊","hiliteColor":"背景顏色","deleteTable":"刪除表格","outdent":"凸排","cut":"剪下","plainFormatBlock":"段落樣式","toggleDir":"切換方向","bold":"粗體","tabIndent":"標籤縮排","justifyRight":"靠右對齊","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..a7009ad27
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh-tw/commands.js.uncompressed.js
@@ -0,0 +1,51 @@
+define(
+"dijit/_editor/nls/zh-tw/commands", //begin v1.x content
+({
+ '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}。'
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/zh/FontChoice.js b/lib/dijit/_editor/nls/zh/FontChoice.js
index a9850c7fd..67e802189 100644
--- a/lib/dijit/_editor/nls/zh/FontChoice.js
+++ b/lib/dijit/_editor/nls/zh/FontChoice.js
@@ -1 +1,2 @@
-({"noFormat":"无","1":"XXS 号","2":"XS 号","formatBlock":"格式","3":"S 号","4":"M 号","5":"L 号","6":"XL 号","7":"XXL 号","fantasy":"虚线","serif":"有衬线","p":"段落","pre":"预设有格式的","sans-serif":"无衬线","fontName":"字体","h1":"标题","h2":"子标题","h3":"二级子标题","monospace":"等宽字体","fontSize":"大小","cursive":"草书"}) \ No newline at end of file
+//>>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
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..f708d6677
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh/FontChoice.js.uncompressed.js
@@ -0,0 +1,30 @@
+define(
+"dijit/_editor/nls/zh/FontChoice", //begin v1.x content
+({
+ 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 号"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/zh/LinkDialog.js b/lib/dijit/_editor/nls/zh/LinkDialog.js
index 5b5390fbc..40cbebd24 100644
--- a/lib/dijit/_editor/nls/zh/LinkDialog.js
+++ b/lib/dijit/_editor/nls/zh/LinkDialog.js
@@ -1 +1,2 @@
-({"text":"描述:","insertImageTitle":"图像属性","set":"设置","newWindow":"新建窗口","topWindow":"顶层窗口","target":"目标:","createLinkTitle":"链接属性","parentWindow":"父窗口","currentWindow":"当前窗口","url":"URL:"}) \ No newline at end of file
+//>>built
+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..7a82796eb
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh/LinkDialog.js.uncompressed.js
@@ -0,0 +1,17 @@
+define(
+"dijit/_editor/nls/zh/LinkDialog", //begin v1.x content
+({
+ createLinkTitle: "链接属性",
+ insertImageTitle: "图像属性",
+ url: "URL:",
+ text: "描述:",
+ target: "目标:",
+ set: "设置",
+ currentWindow: "当前窗口",
+ parentWindow: "父窗口",
+ topWindow: "顶层窗口",
+ newWindow: "新建窗口"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/nls/zh/commands.js b/lib/dijit/_editor/nls/zh/commands.js
index 11763dfc4..bbac1fc3a 100644
--- a/lib/dijit/_editor/nls/zh/commands.js
+++ b/lib/dijit/_editor/nls/zh/commands.js
@@ -1 +1,2 @@
-({"removeFormat":"除去格式","copy":"复制","paste":"粘贴","selectAll":"全选","insertOrderedList":"编号列表","insertTable":"插入/编辑表","print":"打印","underline":"下划线","foreColor":"前景色","htmlToggle":"HTML 源代码","formatBlock":"段落样式","newPage":"新建页面","insertHorizontalRule":"水平线","delete":"删除","insertUnorderedList":"符号列表","tableProp":"表属性","insertImage":"插入图像","superscript":"上标","subscript":"下标","createLink":"创建链接","undo":"撤销","fullScreen":"切换全屏幕","italic":"斜体","fontName":"字体名称","justifyLeft":"左对齐","unlink":"除去链接","toggleTableBorder":"切换表边框","viewSource":"查看 HTML 源代码","fontSize":"字体大小","systemShortcut":"只能在浏览器中通过键盘快捷方式执行“${0}”操作。使用 ${1}。","indent":"增加缩进","redo":"重做","strikethrough":"删除线","justifyFull":"对齐","justifyCenter":"居中","hiliteColor":"背景色","deleteTable":"删除表","outdent":"减少缩进","cut":"剪切","plainFormatBlock":"段落样式","toggleDir":"固定方向","bold":"粗体","tabIndent":"制表符缩进","justifyRight":"右对齐","appleKey":"⌘${0}","ctrlKey":"ctrl+${0}"}) \ No newline at end of file
+//>>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
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..fb4b8dd46
--- /dev/null
+++ b/lib/dijit/_editor/nls/zh/commands.js.uncompressed.js
@@ -0,0 +1,52 @@
+define(
+"dijit/_editor/nls/zh/commands", //begin v1.x content
+({
+ '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}。'
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
index 9d0b7ded8..665b4bb7d 100644
--- a/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
+++ b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js
@@ -1,190 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.AlwaysShowToolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.AlwaysShowToolbar"] = true;
-dojo.provide("dijit._editor.plugins.AlwaysShowToolbar");
-dojo.require("dijit._editor._Plugin");
-
-
-dojo.declare("dijit._editor.plugins.AlwaysShowToolbar", dijit._editor._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:
- // | <div dojoType="dijit.Editor" height=""
- // | extraPlugins="['dijit._editor.plugins.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.addCallback(dojo.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 = dojo._getMarginSize(e.editNode).h;
- if(dojo.isOpera){
- 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 = dojo._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(dojo.isIE <= 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";
- dojo.marginBox(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 = dojo.isIE < 7;
- if(!this._handleScroll){ return; }
- var tdn = this.editor.header;
- var db = dojo.body;
-
- if(!this._scrollSetUp){
- this._scrollSetUp = true;
- this._scrollThreshold = dojo.position(tdn, true).y;
-// console.log("threshold:", this._scrollThreshold);
- //what's this for?? comment out for now
-// if((isIE6)&&(db)&&(dojo.style(db, "backgroundIimage")=="none")){
-// db.style.backgroundImage = "url(" + dojo.uri.moduleUri("dijit", "templates/blank.gif") + ")";
-// db.style.backgroundAttachment = "fixed";
-// }
- }
-
- var scrollPos = dojo._docScroll().y;
- var s = tdn.style;
-
- if(scrollPos > this._scrollThreshold && scrollPos < this._scrollThreshold+this._lastHeight){
- // dojo.debug(scrollPos);
- if(!this._fixEnabled){
- var tdnbox = dojo._getMarginSize(tdn);
- this.editor.iframe.style.marginTop = tdnbox.h+"px";
-
- if(isIE6){
- s.left = dojo.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];
- }
- dojo.body().appendChild(tdn);
- dojo.addClass(tdn,'dijitIEFixedToolbar');
- }else{
- s.position = "fixed";
- s.top = "0px";
- }
-
- dojo.marginBox(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 = "";
- dojo.removeClass(tdn,'dijitIEFixedToolbar');
- if(this._IEOriginalPos){
- dojo.place(tdn, this._IEOriginalPos[1], this._IEOriginalPos[0]);
- this._IEOriginalPos = null;
- }else{
- dojo.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;
- dojo.forEach(this._connects, dojo.disconnect);
-// clearInterval(this.scrollInterval);
-
- if(dojo.isIE < 7){
- dojo.removeClass(this.editor.header, 'dijitIEFixedToolbar');
- }
- }
-});
-
-}
+//>>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
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..42935c3fc
--- /dev/null
+++ b/lib/dijit/_editor/plugins/AlwaysShowToolbar.js.uncompressed.js
@@ -0,0 +1,199 @@
+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/_base/sniff", // has("ie") has("opera")
+ "dojo/_base/window", // win.body
+ "../_Plugin"
+], function(declare, domClass, domConstruct, domGeometry, lang, has, win, _Plugin){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// module:
+// dijit/_editor/plugins/AlwaysShowToolbar
+// 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).
+
+
+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:
+ // | <div data-dojo-type="dijit.Editor" height=""
+ // | data-dojo-props="extraPlugins: [dijit._editor.plugins.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.addCallback(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().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];
+ }
+ win.body().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 670d491ae..60b3baa8a 100644
--- a/lib/dijit/_editor/plugins/EnterKeyHandling.js
+++ b/lib/dijit/_editor/plugins/EnterKeyHandling.js
@@ -1,604 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"] = true;
-dojo.provide("dijit._editor.plugins.EnterKeyHandling");
-dojo.require("dojo.window");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit._editor.range");
-
-
-dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._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:
- //
- // * blockModeForEnter=BR
- // * blockModeForEnter=DIV
- // * blockModeForEnter=P
- //
- // In blockModeForEnter=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();
- }
- dojo.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.addCallback(dojo.hitch(this,function(d){
- this.connect(editor.document, "onkeypress", function(e){
- if(e.charOrCode == dojo.keys.ENTER){
- // Just do it manually. The handleEnterKey has a shift mode that
- // Always acts like <br>, so just use it.
- var ne = dojo.mixin({},e);
- ne.shiftKey = true;
- if(!this.handleEnterKey(ne)){
- dojo.stopEvent(e);
- }
- }
- });
- return d;
- }));
- }else if(this.blockNodeForEnter){
- // add enter key handler
- // FIXME: need to port to the new event code!!
- var h = dojo.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(e){
- // summary:
- // Handler for keypress events.
- // tags:
- // private
- if(this._checkListLater){
- if(dojo.withGlobal(this.editor.window, 'isCollapsed', dijit)){
- var liparent=dojo.withGlobal(this.editor.window, 'getAncestorElement', dijit._editor.selection, ['LI']);
- if(!liparent){
- // circulate the undo detection code by calling RichText::execCommand directly
- dijit._editor.RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter);
- // set the innerHTML of the new block node
- var block = dojo.withGlobal(this.editor.window, 'getAncestorElement', dijit._editor.selection, [this.blockNodeForEnter]);
- if(block){
- block.innerHTML=this.bogusHtmlContent;
- if(dojo.isIE){
- // 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(dojo.isMoz){
- 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 = dijit.range.create(this.editor.window);
- newrange.setStart(liparent.firstChild,0);
- var selection = dijit.range.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: '&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 blockModeForEnter 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 = dojo.withGlobal(this.editor.window, "getParentElement", dijit._editor.selection);
- var header = dijit.range.getAncestor(parent,this.blockNodes);
- if(header){
- if(header.tagName == 'LI'){
- return true; // let browser handle
- }
- selection = dijit.range.getSelection(this.editor.window);
- range = selection.getRangeAt(0);
- if(!range.collapsed){
- range.deleteContents();
- selection = dijit.range.getSelection(this.editor.window);
- range = selection.getRangeAt(0);
- }
- if(dijit.range.atBeginningOfContainer(header, range.startContainer, range.startOffset)){
- br=doc.createElement('br');
- newrange = dijit.range.create(this.editor.window);
- header.insertBefore(br,header.firstChild);
- newrange.setStartBefore(br.nextSibling);
- selection.removeAllRanges();
- selection.addRange(newrange);
- }else if(dijit.range.atEndOfContainer(header, range.startContainer, range.startOffset)){
- newrange = dijit.range.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;
- dojo.withGlobal(this.editor.window, function(){
- startNode = doc.createTextNode(txt.substring(0, range.startOffset));
- endNode = doc.createTextNode(txt.substring(range.startOffset));
- brNode = doc.createElement("br");
-
- if(endNode.nodeValue == "" && dojo.isWebKit){
- endNode = doc.createTextNode('\xA0')
- }
- dojo.place(startNode, rs, "after");
- dojo.place(brNode, startNode, "after");
- dojo.place(endNode, brNode, "after");
- dojo.destroy(rs);
- newrange = dijit.range.create(dojo.gobal);
- newrange.setStart(endNode,0);
- selection.removeAllRanges();
- selection.addRange(newrange);
- });
- return false;
- }
- return true; // let browser handle
- }
- }else{
- selection = dijit.range.getSelection(this.editor.window);
- if(selection.rangeCount){
- range = selection.getRangeAt(0);
- if(range && range.startContainer){
- if(!range.collapsed){
- range.deleteContents();
- selection = dijit.range.getSelection(this.editor.window);
- range = selection.getRangeAt(0);
- }
- rs = range.startContainer;
- if(rs && rs.nodeType == 3){
- // Text node, we have to split it.
- dojo.withGlobal(this.editor.window, dojo.hitch(this, function(){
- 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){
- dojo.place(startNode, rs, "after");
- }else{
- startNode = rs;
- }
- dojo.place(brNode, startNode, "after");
- dojo.place(endNode, brNode, "after");
- dojo.destroy(rs);
- newrange = dijit.range.create(dojo.gobal);
- newrange.setStart(endNode,0);
- newrange.setEnd(endNode, endNode.length);
- selection.removeAllRanges();
- selection.addRange(newrange);
- if(endEmpty && !dojo.isWebKit){
- dijit._editor.selection.remove();
- }else{
- dijit._editor.selection.collapse(true);
- }
- }));
- }else{
- dojo.withGlobal(this.editor.window, dojo.hitch(this, function(){
- var brNode = doc.createElement("br");
- rs.appendChild(brNode);
- var endNode = doc.createTextNode('\xA0');
- rs.appendChild(endNode);
- newrange = dijit.range.create(dojo.global);
- newrange.setStart(endNode,0);
- newrange.setEnd(endNode, endNode.length);
- selection.removeAllRanges();
- selection.addRange(newrange);
- dijit._editor.selection.collapse(true);
- }));
- }
- }
- }else{
- // don't change this: do not call this.execCommand, as that may have other logic in subclass
- dijit._editor.RichText.prototype.execCommand.call(this.editor, 'inserthtml', '<br>');
- }
- }
- return false;
- }
- var _letBrowserHandle = true;
-
- // first remove selection
- selection = dijit.range.getSelection(this.editor.window);
- range = selection.getRangeAt(0);
- if(!range.collapsed){
- range.deleteContents();
- selection = dijit.range.getSelection(this.editor.window);
- range = selection.getRangeAt(0);
- }
-
- var block = dijit.range.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(dojo.isMoz){
- // 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;|\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s|&nbsp;|\xA0)<\/span>)?(<br>)?$/.test(blockNode.innerHTML)){
- // empty LI node
- blockNode.innerHTML = '';
- if(dojo.isWebKit){ // WebKit tosses the range when innerHTML is reset
- newrange = dijit.range.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{
- dijit._editor.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:dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [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 = dijit.range.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(dijit.range.atEndOfContainer(block.blockNode, node, endOffset)){
- if(block.blockNode === block.blockContainer){
- block.blockNode.appendChild(newblock);
- }else{
- dojo.place(newblock, block.blockNode, "after");
- }
- _letBrowserHandle = false;
- // lets move caret to the newly created block
- newrange = dijit.range.create(this.editor.window);
- newrange.setStart(newblock, 0);
- selection.removeAllRanges();
- selection.addRange(newrange);
- if(this.editor.height){
- dojo.window.scrollIntoView(newblock);
- }
- }else if(dijit.range.atBeginningOfContainer(block.blockNode,
- range.startContainer, range.startOffset)){
- dojo.place(newblock, block.blockNode, block.blockNode === block.blockContainer ? "first" : "before");
- if(newblock.nextSibling && this.editor.height){
- // position input caret - mostly WebKit needs this
- newrange = dijit.range.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
- dojo.window.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{
- dojo.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.
- dojo.place(startNode, rs, "before");
- dojo.place(endNode, rs, "after");
- dojo.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;
- }
- dojo.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 = dijit.range.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){
- dijit.scrollIntoView(newblock);
- }
- if(dojo.isMoz){
- // 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){
- dijit.scrollIntoView(newblock);
- }
- if(dojo.isMoz){
- // 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;
- }
- var ret = {"node": node, "offset": offset};
- return ret;
- },
-
- 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 : dijit._editor.selection.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'){
-
- dojo.destroy(para.lastChild);
- }
- }
- if(!para.childNodes.length){
- para.innerHTML=this.bogusHtmlContent;
- }
- }
-});
-
-}
+//>>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
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..3f5937778
--- /dev/null
+++ b/lib/dijit/_editor/plugins/EnterKeyHandling.js.uncompressed.js
@@ -0,0 +1,638 @@
+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/_base/sniff", // has("ie") has("mozilla") has("webkit")
+ "dojo/_base/window", // win.global win.withGlobal
+ "dojo/window", // winUtils.scrollIntoView
+ "../_Plugin",
+ "../RichText",
+ "../range",
+ "../selection"
+], function(declare, domConstruct, event, keys, lang, has, win, winUtils, _Plugin, RichText, rangeapi, selectionapi){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// module:
+// dijit/_editor/plugins/EnterKeyHandling
+// 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.
+
+
+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', dijit)){
+ var liparent=win.withGlobal(this.editor.window, 'getAncestorElement', selectionapi, ['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 = win.withGlobal(this.editor.window, 'getAncestorElement', selectionapi, [this.blockNodeForEnter]);
+ if(block){
+ block.innerHTML=this.bogusHtmlContent;
+ if(has("ie")){
+ // 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 = win.withGlobal(this.editor.window, "getParentElement", selectionapi);
+ 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;
+ win.withGlobal(this.editor.window, function(){
+ 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();
+ 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.
+ win.withGlobal(this.editor.window, lang.hitch(this, function(){
+ 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();
+ newrange.setStart(endNode,0);
+ newrange.setEnd(endNode, endNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ if(endEmpty && !has("webkit")){
+ selectionapi.remove();
+ }else{
+ selectionapi.collapse(true);
+ }
+ }));
+ }else{
+ var targetNode;
+ if(range.startOffset >= 0){
+ targetNode = rs.childNodes[range.startOffset];
+ }
+ win.withGlobal(this.editor.window, lang.hitch(this, function(){
+ 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(win.global);
+ newrange.setStart(endNode,0);
+ newrange.setEnd(endNode, endNode.length);
+ selection.removeAllRanges();
+ selection.addRange(newrange);
+ selectionapi.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:win.withGlobal(this.editor.window, "getAncestorElement", selectionapi, [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 : selectionapi.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 ef91fd676..7e12ac008 100644
--- a/lib/dijit/_editor/plugins/FontChoice.js
+++ b/lib/dijit/_editor/plugins/FontChoice.js
@@ -1,583 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.FontChoice"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.FontChoice"] = true;
-dojo.provide("dijit._editor.plugins.FontChoice");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit._editor.range");
-dojo.require("dijit._editor.selection");
-dojo.require("dijit.form.FilteringSelect");
-dojo.require("dojo.data.ItemFileReadStore");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dijit._editor", "FontChoice", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit._editor.plugins._FontDropDown",
- [dijit._Widget, dijit._Templated],{
- // 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: "",
-
- // widgetsInTemplate: [public] boolean
- // Over-ride denoting the template has widgets to parse.
- widgetsInTemplate: true,
-
- // 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 dojoType='dijit.form.FilteringSelect' required='false' labelType='html' labelAttr='label' searchAttr='name' " +
- "tabIndex='-1' id='${selectId}' dojoAttachPoint='select' value=''/>" +
- "</span>",
-
- postMixInProperties: function(){
- // summary:
- // Over-ride to set specific properties.
- this.inherited(arguments);
-
- this.strings = dojo.i18n.getLocalization("dijit._editor", "FontChoice");
-
- // Set some substitution variables used in the template
- this.label = this.strings[this.command];
- this.id = dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
- this.selectId = this.id + "_select";
-
- 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>" }
- var items = dojo.map(this.values, function(value){
- var name = this.strings[value] || value;
- return {
- label: this.getLabel(value, name),
- name: name,
- value: value
- };
- }, this);
-
- this.select.store = new dojo.data.ItemFileReadStore({
- data: {
- identifier: "value",
- items: items
- }
- });
-
- 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?true:false;
- this.select.set('value', dojo.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 retreiving 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);
- }
-});
-
-
-dojo.declare("dijit._editor.plugins._FontNameDropDown", dijit._editor.plugins._FontDropDown, {
- // summary:
- // Dropdown to select a font; goes in editor toolbar.
-
- // generic: 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?true: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"
-// ,"????": "fantasy" TODO: IE doesn't map fantasy font-family?
- };
- value = map[value] || value;
- }
- this.inherited(arguments, [value, priorityChange]);
- }
-});
-
-dojo.declare("dijit._editor.plugins._FontSizeDropDown", dijit._editor.plugins._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?true: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]);
- }
-});
-
-
-dojo.declare("dijit._editor.plugins._FormatBlockDropDown", dijit._editor.plugins._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 = dijit.range.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 = dojo.hitch(this, function(node, array){
- 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(dojo.withGlobal(editor.window, "inSelection", dijit._editor.selection, [c])){
- var tag = c.tagName? c.tagName.toLowerCase(): "";
- if(dojo.indexOf(this.values, tag) !== -1){
- array.push(c);
- }
- processChildren(c,array);
- }
- }
- }
- }
- });
-
- var unformatNodes = dojo.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(dojo.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(dojo.withGlobal(editor.window, "inSelection", dijit._editor.selection, [node])){
- if(node.nodeType == 1){
- tag = node.tagName? node.tagName.toLowerCase(): "";
- if(dojo.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){
- dojo.place(node.firstChild, node, "before");
- }
- node.parentNode.removeChild(node);
- }else{
- // Everyone else works fine this way, a paste-over and is native
- // undo friendly.
- dojo.withGlobal(editor.window,
- "selectElementChildren", dijit._editor.selection, [node]);
- var html = dojo.withGlobal(editor.window,
- "getSelectedHtml", dijit._editor.selection, [null]);
- dojo.withGlobal(editor.window,
- "selectElement", dijit._editor.selection, [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)
-dojo.declare("dijit._editor.plugins.FontChoice", dijit._editor._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', custom:['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] booleam
- // 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: dijit._editor.plugins._FontNameDropDown,
- fontSize: dijit._editor.plugins._FontSizeDropDown,
- formatBlock: dijit._editor.plugins._FormatBlockDropDown
- }[this.command],
- params = this.params;
-
- // For back-compat reasons support setting custom values via "custom" parameter
- // rather than "values" parameter
- if(this.params.custom){
- params.values = this.params.custom;
- }
-
- var editor = this.editor;
- this.button = new clazz(dojo.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 = dojo.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 = dijit.range.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 && dojo.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(dojo.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 this plugin.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- switch(o.args.name){
- case "fontName": case "fontSize": case "formatBlock":
- o.plugin = new dijit._editor.plugins.FontChoice({
- command: o.args.name,
- plainText: o.args.plainText?o.args.plainText:false
- });
- }
-});
-
-}
+//>>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
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..51b78273c
--- /dev/null
+++ b/lib/dijit/_editor/plugins/FontChoice.js.uncompressed.js
@@ -0,0 +1,591 @@
+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
+ "dojo/_base/window", // win.withGlobal
+ "../../registry", // registry.getUniqueId
+ "../../_Widget",
+ "../../_TemplatedMixin",
+ "../../_WidgetsInTemplateMixin",
+ "../../form/FilteringSelect",
+ "../_Plugin",
+ "../range",
+ "../selection",
+ "dojo/i18n!../nls/FontChoice"
+], function(array, declare, domConstruct, i18n, lang, MemoryStore, win,
+ registry, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, FilteringSelect, _Plugin, rangeapi, selectionapi){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin;
+ var FilteringSelect = dijit.form.FilteringSelect;
+=====*/
+
+
+// module:
+// dijit/_editor/plugins/FontChoice
+// summary:
+// fontchoice, fontsize, and formatblock editor plugins
+
+
+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];
+ this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_")); // TODO: unneeded??
+ 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: 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(win.withGlobal(editor.window, "inSelection", selectionapi, [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(win.withGlobal(editor.window, "inSelection", selectionapi, [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.
+ win.withGlobal(editor.window,
+ "selectElementChildren", selectionapi, [node]);
+ var html = win.withGlobal(editor.window,
+ "getSelectedHtml", selectionapi, [null]);
+ win.withGlobal(editor.window,
+ "selectElement", selectionapi, [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', custom:['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
+ 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
+ });
+ };
+});
+
+});
diff --git a/lib/dijit/_editor/plugins/FullScreen.js b/lib/dijit/_editor/plugins/FullScreen.js
index 6978252c8..139f630dc 100644
--- a/lib/dijit/_editor/plugins/FullScreen.js
+++ b/lib/dijit/_editor/plugins/FullScreen.js
@@ -1,441 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.FullScreen"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.FullScreen"] = true;
-dojo.provide("dijit._editor.plugins.FullScreen");
-dojo.require("dojo.window");
-dojo.require("dojo.i18n");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.Button");
-dojo.requireLocalization("dijit._editor", "commands", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit._editor.plugins.FullScreen",dijit._editor._Plugin,{
- // summary:
- // This plugin provides FullScreen cabability 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 = dojo.i18n.getLocalization("dijit._editor", "commands"),
- editor = this.editor;
- this.button = new dijit.form.ToggleButton({
- label: strings["fullScreen"],
- dir: editor.dir,
- lang: editor.lang,
- showLabel: false,
- iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "FullScreen",
- tabIndex: "-1",
- onChange: dojo.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(dojo.keys.F11, true, true, dojo.hitch(this, function(e){
- // Enable the CTRL-SHIFT-F11 hotkey for fullscreen mode.
- this.toggle();
- dojo.stopEvent(e);
- setTimeout(dojo.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 === dojo.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 = dijit.getFocus();
- var avn = this._getAltViewNode();
- if(f.node == ed.iframe ||
- (avn && f.node === avn)){
- setTimeout(dojo.hitch(this, function(){
- ed.toolbar.focus();
- }), 10);
- }else{
- if(avn && dojo.style(ed.iframe, "display") === "none"){
- setTimeout(dojo.hitch(this, function(){
- dijit.focus(avn);
- }), 10);
- }else{
- setTimeout(dojo.hitch(this, function(){
- ed.focus();
- }), 10);
- }
- }
- dojo.stopEvent(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 = dojo.window.getBox();
- dojo.marginBox(this.editor.domNode, {
- w: vp.w,
- h: vp.h
- });
-
- //Adjust the inernal heights too, as they can be a bit off.
- var hHeight = this.editor.getHeaderHeight();
- var fHeight = this.editor.getFooterHeight();
- var extents = dojo._getPadBorderExtents(this.editor.domNode);
- var fcpExtents = dojo._getPadBorderExtents(this.editor.iframe.parentNode);
- var fcmExtents = dojo._getMarginExtents(this.editor.iframe.parentNode);
-
- var cHeight = vp.h - (hHeight + extents.h + fHeight);
- dojo.marginBox(this.editor.iframe.parentNode, {
- h: cHeight,
- w: vp.w
- });
- dojo.marginBox(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
- var vp = dojo.window.getBox();
-
- //Alias this for shorter code.
- var ed = this.editor;
- var body = dojo.body();
- var editorParent = ed.domNode.parentNode;
-
- this.isFullscreen = full;
-
- if(full){
- //Parent classes can royally screw up this plugin, so we
- //have to set eveything to position static.
- while(editorParent && editorParent !== dojo.body()){
- dojo.addClass(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 = dojo.hitch(this, this._containFocus);
-
- this._origState = {};
- this._origiFrameState = {};
-
- // Store the basic editor state we have to restore later.
- // Not using dojo.style here, had problems, didn't
- // give me stuff like 100%, gave me pixel calculated values.
- // Need the exact original values.
- var domNode = ed.domNode,
- domStyle = domNode && domNode.style || {};
- this._origState = {
- width: domStyle.width || "",
- height: domStyle.height || "",
- top: dojo.style(domNode, "top") || "",
- left: dojo.style(domNode, "left") || "",
- position: dojo.style(domNode, "position") || "static",
- marginBox: dojo.marginBox(ed.domNode)
- };
-
- // Store the iframe state we have to restore later.
- // Not using dojo.style 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 = dojo.style(ed.iframe, "backgroundColor");
- this._origiFrameState = {
- backgroundColor: bc || "transparent",
- width: iframeStyle.width || "auto",
- height: iframeStyle.height || "auto",
- zIndex: iframeStyle.zIndex || ""
- };
-
- // Okay, size everything.
- dojo.style(ed.domNode, {
- position: "absolute",
- top: "0px",
- left: "0px",
- zIndex: this.zIndex,
- width: vp.w + "px",
- height: vp.h + "px"
- });
-
- dojo.style(ed.iframe, {
- height: "100%",
- width: "100%",
- zIndex: this.zIndex,
- backgroundColor: bc !== "transparent" &&
- bc !== "rgba(0, 0, 0, 0)"?bc:"white"
- });
-
- dojo.style(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 = dojo.style(body, "overflow");
- }else{
- this._oldOverflow = "";
- }
-
- if(dojo.isIE && !dojo.isQuirks){
- // 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 = dojo.style(body.parentNode, "overflow");
- }catch(e){
- this._oldBodyParentOverflow = "scroll";
- }
- }
- dojo.style(body.parentNode, "overflow", "hidden");
- }
- dojo.style(body, "overflow", "hidden");
-
- var resizer = function(){
- // function to handle resize events.
- // Will check current VP and only resize if
- // different.
- var vp = dojo.window.getBox();
- 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(dojo.hitch(this, function(){
- delete this._resizer;
- this._resizeEditor();
- }), 10);
- };
- this._resizeHandle = dojo.connect(window, "onresize", this, resizer);
-
- // Also monitor for direct calls to resize and adapt editor.
- this._resizeHandle2 = dojo.connect(ed, "resize", dojo.hitch(this, function(){
- if(this._resizer){
- clearTimeout(this._resizer);
- delete this._resizer;
- }
- this._resizer = setTimeout(dojo.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(){dojo.window.scrollIntoView(dn);}, 250);
- }else{
- if(this._resizeHandle){
- // Cleanup resizing listeners
- dojo.disconnect(this._resizeHandle);
- this._resizeHandle = null;
- }
- if(this._resizeHandle2){
- // Cleanup resizing listeners
- dojo.disconnect(this._resizeHandle2);
- this._resizeHandle2 = null;
- }
- if(this._rst){
- clearTimeout(this._rst);
- this._rst = null;
- }
-
- //Remove all position static class assigns.
- while(editorParent && editorParent !== dojo.body()){
- dojo.removeClass(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(dojo.isIE && !dojo.isQuirks){
- body.parentNode.style.overflow = self._oldBodyParentOverflow;
- delete self._oldBodyParentOverflow;
- }
- dojo.style(body, "overflow", self._oldOverflow);
- delete self._oldOverflow;
-
- dojo.style(ed.domNode, self._origState);
- dojo.style(ed.iframe.parentNode, {
- height: "",
- width: ""
- });
- dojo.style(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 = dijit.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(dojo.hitch(this, function(){ed.resize({h: mb.h});}), 0);
- }
- }
- dojo.window.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
- dojo.disconnect(this._resizeHandle);
- this._resizeHandle = null;
- }
- if(this._resizeHandle2){
- // Cleanup resizing listeners
- dojo.disconnect(this._resizeHandle2);
- this._resizeHandle2 = null;
- }
- if(this._resizer){
- clearTimeout(this._resizer);
- this._resizer = null;
- }
- this.inherited(arguments);
- }
-});
-
-
-// Register this plugin.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- var name = o.args.name.toLowerCase();
- if(name === "fullscreen"){
- o.plugin = new dijit._editor.plugins.FullScreen({
- zIndex: ("zIndex" in o.args)?o.args.zIndex:500
- });
- }
-});
-
-}
+//>>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
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..819f11f59
--- /dev/null
+++ b/lib/dijit/_editor/plugins/FullScreen.js.uncompressed.js
@@ -0,0 +1,457 @@
+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/_base/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){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+
+// module:
+// dijit/_editor/plugins/FullScreen
+// 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.
+
+
+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"],
+ 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();
+ 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
+ var vp = winUtils.getBox();
+
+ //Alias this for shorter code.
+ var ed = this.editor;
+ var body = win.body();
+ var editorParent = ed.domNode.parentNode;
+
+ 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 !== win.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();
+ 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 !== win.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 feb5cf9ec..a70a9683c 100644
--- a/lib/dijit/_editor/plugins/LinkDialog.js
+++ b/lib/dijit/_editor/plugins/LinkDialog.js
@@ -1,516 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.LinkDialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.LinkDialog"] = true;
-dojo.provide("dijit._editor.plugins.LinkDialog");
-dojo.require("dijit._Widget");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.TooltipDialog");
-dojo.require("dijit.form.DropDownButton");
-dojo.require("dijit.form.ValidationTextBox");
-dojo.require("dijit.form.Select");
-dojo.require("dijit._editor.range");
-dojo.require("dojo.i18n");
-dojo.require("dojo.string");
-dojo.requireLocalization("dijit", "common", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.requireLocalization("dijit._editor", "LinkDialog", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit._editor.plugins.LinkDialog", dijit._editor._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: dijit.form.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: new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
-
- // _userAtRxp [private] RegExp
- // Regular expression used to validate e-mail address fragment.
- _userAtRxp: new RegExp("^([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+@", "i"),
-
- // linkDialogTemplate: [protected] String
- // Template for contents of TooltipDialog to pick URL
- linkDialogTemplate: [
- "<table><tr><td>",
- "<label for='${id}_urlInput'>${url}</label>",
- "</td><td>",
- "<input dojoType='dijit.form.ValidationTextBox' required='true' " +
- "id='${id}_urlInput' name='urlInput' intermediateChanges='true'/>",
- "</td></tr><tr><td>",
- "<label for='${id}_textInput'>${text}</label>",
- "</td><td>",
- "<input dojoType='dijit.form.ValidationTextBox' required='true' id='${id}_textInput' " +
- "name='textInput' intermediateChanges='true'/>",
- "</td></tr><tr><td>",
- "<label for='${id}_targetSelect'>${target}</label>",
- "</td><td>",
- "<select id='${id}_targetSelect' name='targetSelect' dojoType='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 dojoType='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>",
- "<button dojoType='dijit.form.Button' type='button' id='${id}_cancelButton'>${buttonCancel}</button>",
- "</td></tr></table>"
- ].join(""),
-
- _initButton: function(){
- // Override _Plugin._initButton() to initialize DropDownButton and TooltipDialog.
- var _this = this;
- this.tag = this.command == 'insertImage' ? 'img' : 'a';
- var messages = dojo.mixin(dojo.i18n.getLocalization("dijit", "common", this.lang),
- dojo.i18n.getLocalization("dijit._editor", "LinkDialog", this.lang));
- var dropDown = (this.dropDown = new dijit.TooltipDialog({
- title: messages[this.command + "Title"],
- execute: dojo.hitch(this, "setValue"),
- onOpen: function(){
- _this._onOpenDialog();
- dijit.TooltipDialog.prototype.onOpen.apply(this, arguments);
- },
- onCancel: function(){
- setTimeout(dojo.hitch(_this, "_onCloseDialog"),0);
- }
- }));
- messages.urlRegExp = this.urlRegExp;
- messages.id = dijit.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>" +
- dojo.string.substitute(this.linkDialogTemplate, messages));
- dropDown.startup();
- this._urlInput = dijit.byId(this._uniqueId + "_urlInput");
- this._textInput = dijit.byId(this._uniqueId + "_textInput");
- this._setButton = dijit.byId(this._uniqueId + "_setButton");
- this.connect(dijit.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 = dojo.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);
- });
-
- this._connectTagEvents();
- this.inherited(arguments);
- },
-
- _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 = dojo.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("./") !== 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.addCallback(dojo.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(dojo.isIE < 9){ //see #4151
- var sel = dijit.range.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)){
- // Stll nothing, one last thing to try on IE, as it might be 'img'
- // and thus considered a control.
- a = dojo.withGlobal(this.editor.window,
- "getSelectedElement", dijit._editor.selection, [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 targetted 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 childent, then unlink. The following insert will
- // then replace the selected text.
- dojo.withGlobal(this.editor.window,
- "selectElementChildren", dijit._editor.selection, [a]);
- this.editor.execCommand("unlink");
- }
- }
- }
- // make sure values are properly escaped, etc.
- args = this._checkValues(args);
- this.editor.execCommand('inserthtml',
- dojo.string.substitute(this.htmlTemplate, args));
- },
-
- _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;
- dojo.withGlobal(this.editor.window, "selectElement", dijit._editor.selection, [a, true]);
- }else{
- text = dojo.withGlobal(this.editor.window, dijit._editor.selection.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;
- if(dojo.isIE < 9){
- // IE is difficult to select the element in, using the range unified
- // API seems to work reasonably well.
- var sel = dijit.range.getSelection(this.editor.window);
- 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)){
- // Stll nothing, one last thing to try on IE, as it might be 'img'
- // and thus considered a control.
- a = dojo.withGlobal(this.editor.window,
- "getSelectedElement", dijit._editor.selection, [this.tag]);
- }
- }else{
- a = dojo.withGlobal(this.editor.window,
- "getAncestorElement", dijit._editor.selection, [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 && dojo.attr(t,"href")){
- dojo.withGlobal(this.editor.window,
- "selectElement",
- dijit._editor.selection, [t]);
- this.editor.onDisplayChanged();
-
- setTimeout(dojo.hitch(this, function(){
- // Focus shift outside the event handler.
- // IE doesn't like focus changes in event handles.
- this.button.set("disabled", false);
- this.button.openDropDown();
- }), 10);
- }
- }
- }
-});
-
-dojo.declare("dijit._editor.plugins.ImgLinkDialog", [dijit._editor.plugins.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><tr><td>",
- "<label for='${id}_urlInput'>${url}</label>",
- "</td><td>",
- "<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' " +
- "required='true' id='${id}_urlInput' name='urlInput' intermediateChanges='true'/>",
- "</td></tr><tr><td>",
- "<label for='${id}_textInput'>${text}</label>",
- "</td><td>",
- "<input dojoType='dijit.form.ValidationTextBox' required='false' id='${id}_textInput' " +
- "name='textInput' intermediateChanges='true'/>",
- "</td></tr><tr><td>",
- "</td><td>",
- "</td></tr><tr><td colspan='2'>",
- "<button dojoType='dijit.form.Button' type='submit' id='${id}_setButton'>${set}</button>",
- "<button dojoType='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');
- dojo.withGlobal(this.editor.window,
- "selectElement", dijit._editor.selection, [img, true]);
- }else{
- text = dojo.withGlobal(this.editor.window, dijit._editor.selection.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.addCallback(dojo.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){
- dojo.withGlobal(this.editor.window,
- "selectElement",
- dijit._editor.selection, [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 && dojo.attr(t,"src")){
- dojo.withGlobal(this.editor.window,
- "selectElement",
- dijit._editor.selection, [t]);
- this.editor.onDisplayChanged();
- setTimeout(dojo.hitch(this, function(){
- // Focus shift outside the event handler.
- // IE doesn't like focus changes in event handles.
- this.button.set("disabled", false);
- this.button.openDropDown();
- }), 10);
- }
- }
- }
-});
-
-// Register this plugin.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- switch(o.args.name){
- case "createLink":
- o.plugin = new dijit._editor.plugins.LinkDialog({command: o.args.name});
- break;
- case "insertImage":
- o.plugin = new dijit._editor.plugins.ImgLinkDialog({command: o.args.name});
- break;
- }
-});
-
-}
+//>>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
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..e5537271d
--- /dev/null
+++ b/lib/dijit/_editor/plugins/LinkDialog.js.uncompressed.js
@@ -0,0 +1,586 @@
+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/_base/sniff", // has("ie")
+ "dojo/string", // string.substitute
+ "dojo/_base/window", // win.withGlobal
+ "../../_Widget",
+ "../_Plugin",
+ "../../form/DropDownButton",
+ "../range",
+ "../selection"
+], function(require, declare, domAttr, keys, lang, has, string, win,
+ _Widget, _Plugin, DropDownButton, rangeapi, selectionapi){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// 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><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"],
+ 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("./") !== 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.addCallback(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 = win.withGlobal(this.editor.window,
+ "getSelectedElement", selectionapi, [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.
+ win.withGlobal(this.editor.window,
+ "selectElementChildren", selectionapi, [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));
+ },
+
+ _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;
+ win.withGlobal(this.editor.window, "selectElement", selectionapi, [a, true]);
+ }else{
+ text = win.withGlobal(this.editor.window, selectionapi.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;
+ if(has("ie") < 9){
+ // IE is difficult to select the element in, using the range unified
+ // API seems to work reasonably well.
+ var sel = rangeapi.getSelection(this.editor.window);
+ 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 = win.withGlobal(this.editor.window,
+ "getSelectedElement", selectionapi, [this.tag]);
+ }
+ }else{
+ a = win.withGlobal(this.editor.window,
+ "getAncestorElement", selectionapi, [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;
+
+ win.withGlobal(editor.window,
+ "selectElement",
+ selectionapi, [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){
+ clearTimeout(editor._updateTimer);
+ 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><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');
+ win.withGlobal(this.editor.window,
+ "selectElement", selectionapi, [img, true]);
+ }else{
+ text = win.withGlobal(this.editor.window, selectionapi.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.addCallback(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){
+ win.withGlobal(this.editor.window,
+ "selectElement",
+ selectionapi, [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;
+
+ win.withGlobal(editor.window,
+ "selectElement",
+ selectionapi, [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){
+ clearTimeout(editor._updateTimer);
+ 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
+LinkDialog.ImgLinkDialog = ImgLinkDialog;
+return LinkDialog;
+});
diff --git a/lib/dijit/_editor/plugins/NewPage.js b/lib/dijit/_editor/plugins/NewPage.js
index 7e628d364..911731a00 100644
--- a/lib/dijit/_editor/plugins/NewPage.js
+++ b/lib/dijit/_editor/plugins/NewPage.js
@@ -1,81 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.NewPage"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.NewPage"] = true;
-dojo.provide("dijit._editor.plugins.NewPage");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.Button");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dijit._editor", "commands", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit._editor.plugins.NewPage",dijit._editor._Plugin,{
- // summary:
- // This plugin provides a simple 'new page' calability. 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 = dojo.i18n.getLocalization("dijit._editor", "commands"),
- editor = this.editor;
- this.button = new dijit.form.Button({
- label: strings["newPage"],
- dir: editor.dir,
- lang: editor.lang,
- showLabel: false,
- iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "NewPage",
- tabIndex: "-1",
- onClick: dojo.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.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- var name = o.args.name.toLowerCase();
- if(name === "newpage"){
- o.plugin = new dijit._editor.plugins.NewPage({
- content: ("content" in o.args)?o.args.content:"<br>"
- });
- }
-});
-
-}
+//>>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
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..5750bb55f
--- /dev/null
+++ b/lib/dijit/_editor/plugins/NewPage.js.uncompressed.js
@@ -0,0 +1,83 @@
+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){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// module:
+// dijit/_editor/plugins/NewPage
+// summary:
+// This plugin provides a simple 'new page' capability. In other
+// words, set content to some default user defined string.
+
+
+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"],
+ 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 83cf0ddc7..7de192d52 100644
--- a/lib/dijit/_editor/plugins/Print.js
+++ b/lib/dijit/_editor/plugins/Print.js
@@ -1,125 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.Print"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.Print"] = true;
-dojo.provide("dijit._editor.plugins.Print");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.Button");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dijit._editor", "commands", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit._editor.plugins.Print",dijit._editor._Plugin,{
- // summary:
- // This plugin provides Print cabability 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 = dojo.i18n.getLocalization("dijit._editor", "commands"),
- editor = this.editor;
- this.button = new dijit.form.Button({
- label: strings["print"],
- dir: editor.dir,
- lang: editor.lang,
- showLabel: false,
- iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "Print",
- tabIndex: "-1",
- onClick: dojo.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.addCallback(
- dojo.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(!dojo.isOpera && !dojo.isChrome){
- dijit.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 styles = [];
- 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.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- var name = o.args.name.toLowerCase();
- if(name === "print"){
- o.plugin = new dijit._editor.plugins.Print({command: "print"});
- }
-});
-
-}
+//>>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
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..06774f6ab
--- /dev/null
+++ b/lib/dijit/_editor/plugins/Print.js.uncompressed.js
@@ -0,0 +1,129 @@
+define("dijit/_editor/plugins/Print", [
+ "dojo/_base/declare", // declare
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.hitch
+ "dojo/_base/sniff", // has("chrome") has("opera")
+ "../../focus", // focus.focus()
+ "../_Plugin",
+ "../../form/Button",
+ "dojo/i18n!../nls/commands"
+], function(declare, i18n, lang, has, focus, _Plugin, Button){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// module:
+// dijit/_editor/plugins/Print
+// summary:
+// This plugin provides Print capability to the editor. When
+// clicked, the document in the editor frame will be printed.
+
+
+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"],
+ 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.addCallback(
+ 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 b/lib/dijit/_editor/plugins/TabIndent.js
index eb27f69dd..d471891cc 100644
--- a/lib/dijit/_editor/plugins/TabIndent.js
+++ b/lib/dijit/_editor/plugins/TabIndent.js
@@ -1,69 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.TabIndent"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.TabIndent"] = true;
-dojo.provide("dijit._editor.plugins.TabIndent");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.ToggleButton");
-
-
-dojo.experimental("dijit._editor.plugins.TabIndent");
-
-
-dojo.declare("dijit._editor.plugins.TabIndent",
- dijit._editor._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: dijit.form.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.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- switch(o.args.name){
- case "tabIndent":
- o.plugin = new dijit._editor.plugins.TabIndent({command: o.args.name});
- }
-});
-
-}
+//>>built
+define("dijit/_editor/plugins/TabIndent",["dojo/_base/declare","dojo/_base/kernel","../_Plugin","../../form/ToggleButton"],function(_1,_2,_3,_4){_2.experimental("dijit._editor.plugins.TabIndent");var _5=_1("dijit._editor.plugins.TabIndent",_3,{useDefaultCommand:false,buttonClass:_4,command:"tabIndent",_initButton:function(){this.inherited(arguments);var e=this.editor;this.connect(this.button,"onChange",function(_6){e.set("isTabIndent",_6);});this.updateState();},updateState:function(){var _7=this.get("disabled");this.button.set("disabled",_7);if(_7){return;}this.button.set("checked",this.editor.isTabIndent,false);}});_3.registry["tabIndent"]=function(){return new _5({command:"tabIndent"});};return _5;}); \ No newline at end of file
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..8d4287b87
--- /dev/null
+++ b/lib/dijit/_editor/plugins/TabIndent.js.uncompressed.js
@@ -0,0 +1,69 @@
+define("dijit/_editor/plugins/TabIndent", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.experimental
+ "../_Plugin",
+ "../../form/ToggleButton"
+], function(declare, kernel, _Plugin, ToggleButton){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+ // module:
+ // dijit/_editor/plugins/TabIndent
+ // 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
+
+
+ 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 2f24d0424..c7943d640 100644
--- a/lib/dijit/_editor/plugins/TextColor.js
+++ b/lib/dijit/_editor/plugins/TextColor.js
@@ -1,105 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.TextColor"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.TextColor"] = true;
-dojo.provide("dijit._editor.plugins.TextColor");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.ColorPalette");
-
-
-dojo.declare("dijit._editor.plugins.TextColor", dijit._editor._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: dijit.form.DropDownButton,
-
- // useDefaultCommand: Boolean
- // False as we do not use the default editor command/click behavior.
- useDefaultCommand: false,
-
- constructor: function(){
- this.dropDown = new dijit.ColorPalette();
- this.connect(this.dropDown, "onChange", function(color){
- this.editor.execCommand(this.command, color);
-
- });
- },
-
- 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 = dojo.colorFromRgb(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;
-
- }
-
- if(value !== this.dropDown.get('value')){
- this.dropDown.set('value', value, false);
- }
- }
-});
-
-// Register this plugin.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin", null, function(o){
- if(o.plugin){
- return;
- }
- switch(o.args.name){
- case "foreColor":
- case "hiliteColor":
- o.plugin = new dijit._editor.plugins.TextColor({
- command: o.args.name
- });
- }
-});
-
-}
+//>>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
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..2cbcf6249
--- /dev/null
+++ b/lib/dijit/_editor/plugins/TextColor.js.uncompressed.js
@@ -0,0 +1,119 @@
+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){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// module:
+// dijit/_editor/plugins/TextColor
+// summary:
+// This plugin provides dropdown color pickers for setting text color and background color
+
+
+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({
+ 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 92e3d91c8..058445a9c 100644
--- a/lib/dijit/_editor/plugins/ToggleDir.js
+++ b/lib/dijit/_editor/plugins/ToggleDir.js
@@ -1,80 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.ToggleDir"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.ToggleDir"] = true;
-dojo.provide("dijit._editor.plugins.ToggleDir");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.ToggleButton");
-
-
-dojo.experimental("dijit._editor.plugins.ToggleDir");
-
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.ToggleButton");
-
-dojo.declare("dijit._editor.plugins.ToggleDir",
- dijit._editor._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: dijit.form.ToggleButton,
-
- _initButton: function(){
- // Override _Plugin._initButton() to setup handler for button click events.
- this.inherited(arguments);
- this.editor.onLoadDeferred.addCallback(dojo.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 = dojo.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.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- switch(o.args.name){
- case "toggleDir":
- o.plugin = new dijit._editor.plugins.ToggleDir({command: o.args.name});
- }
-});
-
-}
+//>>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
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..b651518c8
--- /dev/null
+++ b/lib/dijit/_editor/plugins/ToggleDir.js.uncompressed.js
@@ -0,0 +1,77 @@
+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){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+ // module:
+ // dijit/_editor/plugins/ToggleDir
+ // summary:
+ // This plugin is used to toggle direction of the edited document,
+ // independent of what direction the whole page is.
+
+
+ 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.addCallback(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 e655ad21d..c788fa048 100644
--- a/lib/dijit/_editor/plugins/ViewSource.js
+++ b/lib/dijit/_editor/plugins/ViewSource.js
@@ -1,555 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.plugins.ViewSource"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.plugins.ViewSource"] = true;
-dojo.provide("dijit._editor.plugins.ViewSource");
-dojo.require("dojo.window");
-dojo.require("dojo.i18n");
-dojo.require("dijit._editor._Plugin");
-dojo.require("dijit.form.Button");
-dojo.requireLocalization("dijit._editor", "commands", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit._editor.plugins.ViewSource",dijit._editor._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(dojo.isWebKit){this._vsFocused = true;}
- this.button.set("checked", !this.button.get("checked"));
-
- },
-
- _initButton: function(){
- // summary:
- // Over-ride for creation of the resize button.
- var strings = dojo.i18n.getLocalization("dijit._editor", "commands"),
- editor = this.editor;
- this.button = new dijit.form.ToggleButton({
- label: strings["viewSource"],
- dir: editor.dir,
- lang: editor.lang,
- showLabel: false,
- iconClass: this.iconClassPrefix + " " + this.iconClassPrefix + "ViewSource",
- tabIndex: "-1",
- onChange: dojo.hitch(this, "_showSource")
- });
-
- // IE 7 has a horrible bug with zoom, so we have to create this node
- // to cross-check later. Sigh.
- if(dojo.isIE == 7){
- this._ieFixNode = dojo.create("div", {
- style: {
- opacity: "0",
- zIndex: "-1000",
- position: "absolute",
- top: "-1000px"
- }
- }, dojo.body());
- }
- // 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(dojo.keys.F12, true, true, dojo.hitch(this, function(e){
- // Move the focus before switching
- // It'll focus back. Hiding a focused
- // node causes issues.
- this.button.focus();
- this.toggle();
- dojo.stopEvent(e);
-
- // Call the focus shift outside of the handler.
- setTimeout(dojo.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){
- var lcmd = cmd.toLowerCase();
- if(lcmd === "viewsource"){
- return true;
- }else{
- return false;
- }
- };
- this.editor.onDisplayChanged();
- html = ed.get("value");
- html = this._filter(html);
- ed.set("value", html);
- this._pluginList = [];
- dojo.forEach(edPlugins, function(p){
- // Turn off any plugins not controlled by queryCommandenabled.
- if(!(p instanceof dijit._editor.plugins.ViewSource)){
- 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;
- var is = dojo._getMarginSize(ed.iframe.parentNode);
-
- dojo.marginBox(this.sourceArea, {
- w: is.w,
- h: is.h
- });
-
- dojo.style(ed.iframe, "display", "none");
- dojo.style(this.sourceArea, {
- display: "block"
- });
-
- var resizer = function(){
- // function to handle resize events.
- // Will check current VP and only resize if
- // different.
- var vp = dojo.window.getBox();
-
- 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(dojo.hitch(this, function(){
- delete this._resizer;
- this._resize();
- }), 10);
- };
- this._resizeHandle = dojo.connect(window, "onresize", this, resizer);
-
- //Call this on a delay once to deal with IE glitchiness on initial size.
- setTimeout(dojo.hitch(this, this._resize), 100);
-
- //Trigger a check for command enablement/disablement.
- this.editor.onNormalizedDisplayChanged();
-
- this.editor.__oldGetValue = this.editor.getValue;
- this.editor.getValue = dojo.hitch(this, function() {
- var txt = this.sourceArea.value;
- txt = this._filter(txt);
- return txt;
- });
- }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;
- }
- dojo.disconnect(this._resizeHandle);
- 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();
- }
-
- dojo.forEach(edPlugins, function(p){
- // Turn back on any plugins we turned off.
- p.set("disabled", false);
- });
-
- dojo.style(this.sourceArea, "display", "none");
- dojo.style(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(dojo.hitch(this, function(){
- // Make resize calls.
- var parent = ed.domNode.parentNode;
- if(parent){
- var container = dijit.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 = dojo.position(ed.domNode);
-
- // Styles are now applied to the internal source container, so we have
- // to subtract them off.
- var containerPadding = dojo._getPadBorderExtents(ed.iframe.parentNode);
- var containerMargin = dojo._getMarginExtents(ed.iframe.parentNode);
-
- var extents = dojo._getPadBorderExtents(ed.domNode);
- var mExtents = dojo._getMarginExtents(ed.domNode);
- var edb = {
- w: eb.w - (extents.w + mExtents.w),
- h: eb.h - (tbH + extents.h + mExtents.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 = dojo.window.getBox();
- edb.w = (vp.w - extents.w);
- edb.h = (vp.h - (tbH + extents.h + fH));
- }
-
- if(dojo.isIE){
- // 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);
- }
-
- dojo.marginBox(this.sourceArea, {
- w: edb.w - (containerPadding.w + containerMargin.w),
- h: edb.h - (containerPadding.h + containerMargin.h)
- });
-
- // Scale the parent container too in this case.
- dojo.marginBox(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 = dojo.create("textarea");
- if(this.readOnly){
- dojo.attr(this.sourceArea, "readOnly", true);
- this._readOnly = true;
- }
- dojo.style(this.sourceArea, {
- padding: "0px",
- margin: "0px",
- borderWidth: "0px",
- borderStyle: "none"
- });
- dojo.place(this.sourceArea, ed.iframe, "before");
-
- if(dojo.isIE && 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.
- dojo.style(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.
- dijit.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", dojo.hitch(this, function(e){
- if(this._sourceShown && e.keyCode == dojo.keys.F12 && e.ctrlKey && e.shiftKey){
- this.button.focus();
- this.button.set("checked", false);
- setTimeout(dojo.hitch(this, function(){ed.focus();}), 100);
- dojo.stopEvent(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 win = dojo.global;
- var elem = this.sourceArea;
- dijit.focus(elem);
- if(this._sourceShown && !this.readOnly){
- if(dojo.isIE){
- 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(win.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){
- dojo.body().removeChild(this._ieFixNode);
- }
- if(this._resizer){
- clearTimeout(this._resizer);
- delete this._resizer;
- }
- if(this._resizeHandle){
- dojo.disconnect(this._resizeHandle);
- delete this._resizeHandle;
- }
- this.inherited(arguments);
- }
-});
-
-// Register this plugin.
-dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
- if(o.plugin){ return; }
- var name = o.args.name.toLowerCase();
- if(name === "viewsource"){
- o.plugin = new dijit._editor.plugins.ViewSource({
- readOnly: ("readOnly" in o.args)?o.args.readOnly:false,
- stripComments: ("stripComments" in o.args)?o.args.stripComments:true,
- stripScripts: ("stripScripts" in o.args)?o.args.stripScripts:true,
- stripIFrames: ("stripIFrames" in o.args)?o.args.stripIFrames:true
- });
- }
-});
-
-}
+//>>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
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..afc7606ea
--- /dev/null
+++ b/lib/dijit/_editor/plugins/ViewSource.js.uncompressed.js
@@ -0,0 +1,564 @@
+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/_base/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/i18n!../nls/commands"
+], function(array, declare, domAttr, domConstruct, domGeometry, domStyle, event, i18n, keys, lang, on, has, win,
+ winUtils, focus, _Plugin, ToggleButton, dijit, registry){
+
+/*=====
+ var _Plugin = dijit._editor._Plugin;
+=====*/
+
+// module:
+// dijit/_editor/plugins/ViewSource
+// summary:
+// This plugin provides a simple view source capability.
+
+
+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"],
+ 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"
+ }
+ }, win.body());
+ }
+ // 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 instanceof ViewSource)){
+ 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();
+
+ 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;
+ });
+ }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;
+ }
+ 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.
+ 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();
+ 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){
+ win.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);
+ }
+});
+
+// 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 2e5074583..3c92de470 100644
--- a/lib/dijit/_editor/range.js
+++ b/lib/dijit/_editor/range.js
@@ -1,541 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.range"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.range"] = true;
-dojo.provide("dijit._editor.range");
-
-
-dijit.range={};
-
-dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){
-// dojo.profile.start("dijit.range.getIndex");
- var ret=[], retR=[];
- var stop = parent;
- var onode = node;
-
- var pnode, n;
- while(node != stop){
- 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(!dojo.isArray(index) || index.length == 0){
- return parent;
- }
- var node = parent;
-// if(!node)debugger
- dojo.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 dojo.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._w3c = Boolean(window['getSelection']);
-dijit.range.create = function(/*Window?*/win){
- if(dijit.range._w3c){
- return (win || dojo.global).document.createRange();
- }else{//IE
- return new dijit.range.W3CRange;
- }
-}
-
-dijit.range.getSelection = function(/*Window*/win, /*Boolean?*/ignoreUpdate){
- if(dijit.range._w3c){
- return win.getSelection();
- }else{//IE
- var s = new dijit.range.ie.selection(win);
- if(!ignoreUpdate){
- s._getCurrentSelection();
- }
- return s;
- }
-}
-
-if(!dijit.range._w3c){
- dijit.range.ie={
- cachedSelection: {},
- selection: function(win){
- 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 = win.document.selection.createRange();
- var type=win.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);
- }
- };
- },
- 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;
- var endOffset = dijit.range.getIndex(lastnode, endContainer).o+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){
- dojo.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);
- }
-
- 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;
- }
- }
-
-dojo.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(body){
- this._getIERange();
- return this._cachedBookmark;
- },
- _select: function(){
- var r = this._getIERange();
- r.select();
- },
- deleteContents: function(){
- var r = this._getIERange();
- 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(!dijit.range._w3c)
-
-}
+//>>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
diff --git a/lib/dijit/_editor/range.js.uncompressed.js b/lib/dijit/_editor/range.js.uncompressed.js
new file mode 100644
index 000000000..c35f7a036
--- /dev/null
+++ b/lib/dijit/_editor/range.js.uncompressed.js
@@ -0,0 +1,553 @@
+define("dijit/_editor/range", [
+ "dojo/_base/array", // array.every
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.isArray
+ "dojo/_base/window", // win.global
+ ".." // 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._w3c = Boolean(window['getSelection']);
+dijit.range.create = function(/*Window?*/window){
+ if(dijit.range._w3c){
+ return (window || win.global).document.createRange();
+ }else{//IE
+ return new dijit.range.W3CRange;
+ }
+};
+
+dijit.range.getSelection = function(/*Window*/win, /*Boolean?*/ignoreUpdate){
+ if(dijit.range._w3c){
+ return win.getSelection();
+ }else{//IE
+ var s = new dijit.range.ie.selection(win);
+ if(!ignoreUpdate){
+ s._getCurrentSelection();
+ }
+ return s;
+ }
+};
+
+if(!dijit.range._w3c){
+ dijit.range.ie = {
+ cachedSelection: {},
+ selection: function(win){
+ 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 = win.document.selection.createRange();
+ var type = win.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);
+ }
+
+ 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(!dijit.range._w3c)
+
+
+return dijit.range;
+});
diff --git a/lib/dijit/_editor/selection.js b/lib/dijit/_editor/selection.js
index 6fed82770..55d8ee23b 100644
--- a/lib/dijit/_editor/selection.js
+++ b/lib/dijit/_editor/selection.js
@@ -1,369 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._editor.selection"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._editor.selection"] = true;
-dojo.provide("dijit._editor.selection");
-
-
-dojo.getObject("_editor.selection", true, dijit);
-
-// 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.
-
-dojo.mixin(dijit._editor.selection, {
- getType: function(){
- // summary:
- // Get the selection type (like dojo.doc.select.type in IE).
- if(dojo.isIE < 9){
- return dojo.doc.selection.type.toLowerCase();
- }else{
- var stype = "text";
-
- // Check if the actual selection is a CONTROL (IMG, TABLE, HR, etc...).
- var oSel;
- try{
- oSel = dojo.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
- }
- },
-
- getSelectedText: function(){
- // summary:
- // Return the text (no html tags) included in the current selection or null if no text is selected
- if(dojo.isIE < 9){
- if(dijit._editor.selection.getType() == 'control'){
- return null;
- }
- return dojo.doc.selection.createRange().text;
- }else{
- var selection = dojo.global.getSelection();
- if(selection){
- return selection.toString(); //String
- }
- }
- return '';
- },
-
- getSelectedHtml: function(){
- // summary:
- // Return the html text of the current selection or null if unavailable
- if(dojo.isIE < 9){
- if(dijit._editor.selection.getType() == 'control'){
- return null;
- }
- return dojo.doc.selection.createRange().htmlText;
- }else{
- var selection = dojo.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 = dojo.doc.createElement("div");
- div.appendChild(frag);
- html += div.innerHTML;
- }
- return html; //String
- }
- return null;
- }
- },
-
- 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(dojo.isIE < 9){
- var range = dojo.doc.selection.createRange();
- if(range && range.item){
- return dojo.doc.selection.createRange().item(0);
- }
- }else{
- var selection = dojo.global.getSelection();
- return selection.anchorNode.childNodes[ selection.anchorOffset ];
- }
- }
- 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(dojo.isIE < 9){
- var r = dojo.doc.selection.createRange();
- r.collapse(true);
- return r.parentElement();
- }else{
- var selection = dojo.global.getSelection();
- if(selection){
- var node = selection.anchorNode;
- while(node && (node.nodeType != 1)){ // not an element
- node = node.parentNode;
- }
- return node;
- }
- }
- }
- 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
- // Boolean to indicate whether to collapse the cursor to the beginning of the selection or end.
- if(window.getSelection){
- var selection = dojo.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 if(dojo.isIE){ // IE
- var range = dojo.doc.selection.createRange();
- range.collapse(beginning);
- range.select();
- }
- },
-
- remove: function(){
- // summary:
- // Function to delete the currently selected content from the document.
- var sel = dojo.doc.selection;
- if(dojo.isIE < 9){
- if(sel.type.toLowerCase() != "none"){
- sel.clear();
- }
- return sel; //Selection
- }else{
- sel = dojo.global.getSelection();
- sel.deleteFromDocument();
- 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
- // Boolean to indicate if the foxus should change or not.
- var win = dojo.global;
- var doc = dojo.doc;
- var range;
- element = dojo.byId(element);
- if(doc.selection && dojo.isIE < 9 && dojo.body().createTextRange){ // IE
- 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 */}
- }
- }else if(win.getSelection){
- var selection = dojo.global.getSelection();
- if(dojo.isOpera){
- //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);
- }
- }
- },
-
- 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;
- var doc = dojo.doc;
- var win = dojo.global;
- element = dojo.byId(element);
- if(dojo.isIE < 9 && dojo.body().createTextRange){
- try{
- var tg = element.tagName ? element.tagName.toLowerCase() : "";
- if(tg === "img" || tg === "table"){
- range = dojo.body().createControlRange();
- }else{
- range = dojo.body().createRange();
- }
- range.addElement(element);
- if(!nochangefocus){
- range.select();
- }
- }catch(e){
- this.selectElementChildren(element,nochangefocus);
- }
- }else if(dojo.global.getSelection){
- var selection = win.getSelection();
- range = doc.createRange();
- if(selection.removeAllRanges){ // Mozilla
- // FIXME: does this work on Safari?
- if(dojo.isOpera){
- //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);
- }
- }
- },
-
- inSelection: function(node){
- // summary:
- // This function determines if 'node' is
- // in the current selection.
- // tags:
- // public
- if(node){
- var newRange;
- var doc = dojo.doc;
- var range;
-
- if(dojo.global.getSelection){
- //WC3
- var sel = dojo.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 if(doc.selection){
- // Probably IE, so we can't use the range object as the pseudo
- // range doesn't implement the boundry 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
- }
-
-});
-
-}
+//>>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
diff --git a/lib/dijit/_editor/selection.js.uncompressed.js b/lib/dijit/_editor/selection.js.uncompressed.js
new file mode 100644
index 000000000..d1c8331b5
--- /dev/null
+++ b/lib/dijit/_editor/selection.js.uncompressed.js
@@ -0,0 +1,372 @@
+define("dijit/_editor/selection", [
+ "dojo/dom", // dom.byId
+ "dojo/_base/lang",
+ "dojo/_base/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
+ ".." // 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
+
+
+lang.getObject("_editor.selection", true, dijit);
+
+// 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.
+
+lang.mixin(dijit._editor.selection, {
+ getType: function(){
+ // summary:
+ // Get the selection type (like win.doc.select.type in IE).
+ if(has("ie") < 9){
+ return win.doc.selection.type.toLowerCase();
+ }else{
+ 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
+ }
+ },
+
+ getSelectedText: function(){
+ // summary:
+ // Return the text (no html tags) included in the current selection or null if no text is selected
+ if(has("ie") < 9){
+ if(dijit._editor.selection.getType() == 'control'){
+ return null;
+ }
+ return win.doc.selection.createRange().text;
+ }else{
+ var selection = win.global.getSelection();
+ if(selection){
+ return selection.toString(); //String
+ }
+ }
+ return '';
+ },
+
+ getSelectedHtml: function(){
+ // summary:
+ // Return the html text of the current selection or null if unavailable
+ if(has("ie") < 9){
+ if(dijit._editor.selection.getType() == 'control'){
+ return null;
+ }
+ return win.doc.selection.createRange().htmlText;
+ }else{
+ 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;
+ }
+ },
+
+ 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(has("ie") < 9){
+ var range = win.doc.selection.createRange();
+ if(range && range.item){
+ return win.doc.selection.createRange().item(0);
+ }
+ }else{
+ var selection = win.global.getSelection();
+ return selection.anchorNode.childNodes[ selection.anchorOffset ];
+ }
+ }
+ 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(has("ie") < 9){
+ var r = win.doc.selection.createRange();
+ r.collapse(true);
+ return r.parentElement();
+ }else{
+ var selection = win.global.getSelection();
+ if(selection){
+ var node = selection.anchorNode;
+ while(node && (node.nodeType != 1)){ // not an element
+ node = node.parentNode;
+ }
+ return node;
+ }
+ }
+ }
+ 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
+ // Boolean to indicate whether to collapse the cursor to the beginning of the selection or end.
+ if(window.getSelection){
+ 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 if(has("ie")){ // IE
+ 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(has("ie") < 9){
+ if(sel.type.toLowerCase() != "none"){
+ sel.clear();
+ }
+ return sel; //Selection
+ }else{
+ sel = win.global.getSelection();
+ sel.deleteFromDocument();
+ 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
+ // Boolean to indicate if the foxus should change or not.
+ var global = win.global;
+ var doc = win.doc;
+ var range;
+ element = dom.byId(element);
+ if(doc.selection && has("ie") < 9 && win.body().createTextRange){ // IE
+ 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 */}
+ }
+ }else if(global.getSelection){
+ 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);
+ }
+ }
+ },
+
+ 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;
+ var doc = win.doc;
+ var global = win.global;
+ element = dom.byId(element);
+ if(has("ie") < 9 && win.body().createTextRange){
+ try{
+ var tg = element.tagName ? element.tagName.toLowerCase() : "";
+ if(tg === "img" || tg === "table"){
+ range = win.body().createControlRange();
+ }else{
+ range = win.body().createRange();
+ }
+ range.addElement(element);
+ if(!nochangefocus){
+ range.select();
+ }
+ }catch(e){
+ this.selectElementChildren(element,nochangefocus);
+ }
+ }else if(global.getSelection){
+ 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);
+ }
+ }
+ },
+
+ 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.global.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 if(doc.selection){
+ // Probably IE, so we can't use the range object as the pseudo
+ // range doesn't implement the boundry 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
+ }
+
+});
+
+return dijit._editor.selection;
+});
diff --git a/lib/dijit/_tree/dndSource.js b/lib/dijit/_tree/dndSource.js
index 2f2c968be..bbe5fabb8 100644
--- a/lib/dijit/_tree/dndSource.js
+++ b/lib/dijit/_tree/dndSource.js
@@ -1,19 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._tree.dndSource"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._tree.dndSource"] = true;
-dojo.provide("dijit._tree.dndSource");
-dojo.require("dijit.tree.dndSource");
-
-
-// TODO: remove this file in 2.0
-dojo.deprecated("dijit._tree.dndSource has been moved to dijit.tree.dndSource, use that instead", "", "2.0");
-
-dijit._tree.dndSource = dijit.tree.dndSource;
-
-}
+//>>built
+define("dijit/_tree/dndSource",["dojo/_base/kernel","dojo/_base/lang","../tree/dndSource"],function(_1,_2,_3){_1.deprecated("dijit._tree.dndSource has been moved to dijit.tree.dndSource, use that instead","","2.0");_2.setObject("dijit._tree.dndSource",_3);}); \ 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..3833b6072
--- /dev/null
+++ b/lib/dijit/_tree/dndSource.js.uncompressed.js
@@ -0,0 +1,15 @@
+define("dijit/_tree/dndSource", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.getObject
+ "../tree/dndSource"
+], function(kernel, lang, dndSource){
+ // module:
+ // dijit/_tree/dndSource
+ // 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
new file mode 100644
index 000000000..082e1b75e
--- /dev/null
+++ b/lib/dijit/a11y.js
@@ -0,0 +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
diff --git a/lib/dijit/a11y.js.uncompressed.js b/lib/dijit/a11y.js.uncompressed.js
new file mode 100644
index 000000000..83f97cb1e
--- /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/_base/sniff", // has("ie")
+ "./_base/manager", // manager._isElementShown
+ "." // for exporting methods to dijit namespace
+], function(array, config, declare, dom, domAttr, domStyle, has, manager, dijit){
+
+ // module:
+ // dijit/a11y
+ // summary:
+ // Accessibility utility functions (keyboard, tab stops, etc.)
+
+ 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") && child.scopeName !== "HTML") || !shown(child)){
+ continue;
+ }
+
+ if(isTabNavigable(child)){
+ var tabindex = domAttr.get(child, "tabIndex");
+ 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){
+ // summary:
+ // Finds the descendant of the specified root node
+ // that is first in the tabbing order
+ var elems = dijit._getTabNavigable(dom.byId(root));
+ return elems.lowest ? elems.lowest : elems.first; // DomNode
+ };
+
+ dijit.getLastInTabbingOrder = function(/*String|DOMNode*/ root){
+ // summary:
+ // Finds the descendant of the specified root node
+ // that is last in the tabbing order
+ var elems = dijit._getTabNavigable(dom.byId(root));
+ return elems.last ? elems.last : elems.highest; // DomNode
+ };
+
+ return {
+ hasDefaultTabStop: dijit.hasDefaultTabStop,
+ isTabNavigable: dijit.isTabNavigable,
+ _getTabNavigable: dijit._getTabNavigable,
+ getFirstInTabbingOrder: dijit.getFirstInTabbingOrder,
+ getLastInTabbingOrder: dijit.getLastInTabbingOrder
+ };
+});
diff --git a/lib/dijit/dijit-all.js b/lib/dijit/dijit-all.js
index e504b096e..658b1acfe 100644
--- a/lib/dijit/dijit-all.js
+++ b/lib/dijit/dijit-all.js
@@ -1,77 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.dijit-all"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.dijit-all"] = true;
-dojo.provide("dijit.dijit-all");
-dojo.require("dijit.dijit");
-dojo.require("dijit.ColorPalette");
-dojo.require("dijit.Declaration");
-dojo.require("dijit.Dialog");
-dojo.require("dijit.DialogUnderlay");
-dojo.require("dijit.TooltipDialog");
-dojo.require("dijit.Editor");
-dojo.require("dijit._editor.plugins.FontChoice");
-dojo.require("dijit._editor.plugins.LinkDialog");
-dojo.require("dijit.Menu");
-dojo.require("dijit.MenuItem");
-dojo.require("dijit.PopupMenuItem");
-dojo.require("dijit.MenuBar");
-dojo.require("dijit.MenuBarItem");
-dojo.require("dijit.PopupMenuBarItem");
-dojo.require("dijit.MenuSeparator");
-dojo.require("dijit.ProgressBar");
-dojo.require("dijit.TitlePane");
-dojo.require("dijit.Toolbar");
-dojo.require("dijit.Tooltip");
-dojo.require("dijit.Tree");
-dojo.require("dijit.InlineEditBox");
-dojo.require("dijit.form.Form");
-dojo.require("dijit.form.Button");
-dojo.require("dijit.form.DropDownButton");
-dojo.require("dijit.form.ComboButton");
-dojo.require("dijit.form.ToggleButton");
-dojo.require("dijit.form.CheckBox");
-dojo.require("dijit.form.RadioButton");
-dojo.require("dijit.form.TextBox");
-dojo.require("dijit.form.ValidationTextBox");
-dojo.require("dijit.form.CurrencyTextBox");
-dojo.require("dijit.form.DateTextBox");
-dojo.require("dijit.form.NumberSpinner");
-dojo.require("dijit.form.NumberTextBox");
-dojo.require("dijit.form.ComboBox");
-dojo.require("dijit.form.FilteringSelect");
-dojo.require("dijit.form.MultiSelect");
-dojo.require("dijit.form.Select");
-dojo.require("dijit.form.HorizontalSlider");
-dojo.require("dijit.form.VerticalSlider");
-dojo.require("dijit.form.HorizontalRule");
-dojo.require("dijit.form.VerticalRule");
-dojo.require("dijit.form.HorizontalRuleLabels");
-dojo.require("dijit.form.VerticalRuleLabels");
-dojo.require("dijit.form.SimpleTextarea");
-dojo.require("dijit.form.Textarea");
-dojo.require("dijit.layout.AccordionContainer");
-dojo.require("dijit.layout.ContentPane");
-dojo.require("dijit.layout.BorderContainer");
-dojo.require("dijit.layout.LayoutContainer");
-dojo.require("dijit.layout.LinkPane");
-dojo.require("dijit.layout.SplitContainer");
-dojo.require("dijit.layout.StackContainer");
-dojo.require("dijit.layout.TabContainer");
-
-
-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");
-
-/*=====
-dijit["dijit-all"] = {
- // summary:
- // A rollup that includes every dijit. You probably don't need this.
-};
-=====*/
-
-}
+//>>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
diff --git a/lib/dijit/dijit-all.js.uncompressed.js b/lib/dijit/dijit-all.js.uncompressed.js
new file mode 100644
index 000000000..042624573
--- /dev/null
+++ b/lib/dijit/dijit-all.js.uncompressed.js
@@ -0,0 +1,70 @@
+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(dijit){
+
+ // module:
+ // dijit/dijit-all
+ // 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 8d4f2ae8e..58fc8c8af 100644
--- a/lib/dijit/dijit.js
+++ b/lib/dijit/dijit.js
@@ -1,38 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.dijit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.dijit"] = true;
-dojo.provide("dijit.dijit");
-dojo.require("dijit._base");
-dojo.require("dojo.parser");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._Container");
-dojo.require("dijit.layout._LayoutWidget");
-dojo.require("dijit.form._FormWidget");
-
-
-/*=====
-dijit.dijit = {
- // summary:
- // A roll-up for common dijit methods
- // description:
- // A rollup file for the build system including the core and common
- // dijit files.
- //
- // example:
- // | <script type="text/javascript" src="js/dojo/dijit/dijit.js"></script>
- //
-};
-=====*/
-
-// 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
-
-}
+//>>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
diff --git a/lib/dijit/dijit.js.uncompressed.js b/lib/dijit/dijit.js.uncompressed.js
new file mode 100644
index 000000000..7ead16abe
--- /dev/null
+++ b/lib/dijit/dijit.js.uncompressed.js
@@ -0,0 +1,21 @@
+define("dijit/dijit", [
+ ".",
+ "./_base",
+ "dojo/parser",
+ "./_Widget",
+ "./_TemplatedMixin",
+ "./_Container",
+ "./layout/_LayoutWidget",
+ "./form/_FormWidget",
+ "./form/_FormValueWidget"
+], function(dijit){
+
+ // module:
+ // dijit/dijit
+ // 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
new file mode 100644
index 000000000..dffbfa056
--- /dev/null
+++ b/lib/dijit/dijit.profile.js
@@ -0,0 +1,39 @@
+var profile = (function(){
+ var testResourceRe = /^dijit\/tests\//,
+
+ copyOnly = function(filename, mid){
+ var list = {
+ "dijit/dijit.profile":1,
+ "dijit/package.json":1,
+ "dijit/themes/claro/compile":1
+ };
+ return (mid in list) || (/^dijit\/resources\//.test(mid) && !/\.css$/.test(filename)) || /(png|jpg|jpeg|gif|tiff)$/.test(filename);
+ };
+
+ return {
+ resourceTags:{
+ test: function(filename, mid){
+ return testResourceRe.test(mid) || mid=="dijit/robot" || mid=="dijit/robotx";
+ },
+
+ copyOnly: function(filename, mid){
+ return copyOnly(filename, mid);
+ },
+
+ amd: function(filename, mid){
+ return !testResourceRe.test(mid) && !copyOnly(filename, mid) && /\.js$/.test(filename);
+ },
+
+ 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
new file mode 100644
index 000000000..c52073b65
--- /dev/null
+++ b/lib/dijit/focus.js
@@ -0,0 +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
diff --git a/lib/dijit/focus.js.uncompressed.js b/lib/dijit/focus.js.uncompressed.js
new file mode 100644
index 000000000..749a5bb8c
--- /dev/null
+++ b/lib/dijit/focus.js.uncompressed.js
@@ -0,0 +1,389 @@
+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/_base/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
+ "." // 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
+ // summary:
+ // Returns a singleton that tracks the currently focused node, and which widgets are currently "active".
+
+/*=====
+ dijit.focus = {
+ // 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._Widget[]
+ // List of currently active widgets (focused widget and it's ancestors)
+ activeStack: [],
+
+ registerIframe: function(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.
+ },
+
+ registerWin: function(targetWindow, 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: Window?
+ // If specified this is the window associated with the iframe,
+ // i.e. iframe.contentWindow.
+ // effectiveNode: DOMNode?
+ // 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.
+ }
+ };
+=====*/
+
+ var FocusManager = declare([Stateful, Evented], {
+ // curNode: DomNode
+ // Currently focused item on screen
+ curNode: null,
+
+ // activeStack: dijit._Widget[]
+ // 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.
+ // IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble
+ // through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers
+ // fire.
+ // 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 activateListener = 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('onactivate', activateListener);
+ var deactivateListener = function(evt){
+ _this._onBlurNode(effectiveNode || evt.srcElement);
+ };
+ doc.attachEvent('ondeactivate', deactivateListener);
+
+ return {
+ remove: function(){
+ targetWindow.document.detachEvent('onmousedown', mousedownListener);
+ doc.detachEvent('onactivate', activateListener);
+ doc.detachEvent('ondeactivate', deactivateListener);
+ 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
+ this.set("prevNode", this.curNode);
+ this.set("curNode", null);
+
+ 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 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([]);
+ this.prevNode = null;
+ }), 100);
+ },
+
+ _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;
+ }
+
+ this._onTouchNode(node);
+
+ if(node == this.curNode){ return; }
+ 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(win.doc.parentWindow || win.doc.defaultView);
+ if(has("ie")){
+ unload.addOnWindowUnload(function(){
+ handle.remove();
+ handle = null;
+ })
+ }
+ });
+
+ // Setup dijit.focus as a pointer to the singleton but also (for backwards compatibility)
+ // as a function to set focus.
+ 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 77846776f..a0db441a4 100644
--- a/lib/dijit/form/Button.js
+++ b/lib/dijit/form/Button.js
@@ -1,360 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.Button"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.Button"] = true;
-dojo.provide("dijit.form.Button");
-dojo.require("dijit.form._FormWidget");
-dojo.require("dijit._Container");
-dojo.require("dijit._HasDropDown");
-
-
-dojo.declare("dijit.form.Button",
- dijit.form._FormWidget,
- {
- // 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 dojoType="dijit.form.Button" onClick="...">Hello world</button>
- //
- // example:
- // | var button1 = new dijit.form.Button({label: "hello world", onClick: foo});
- // | dojo.body().appendChild(button1.domNode);
-
- // label: HTML String
- // Text to display in button.
- // If the label is hidden (showLabel=false) then and no title has
- // been specified, then label is also set as title attribute of icon.
- label: "",
-
- // 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: "",
-
- // type: String
- // Defines the type of button. "button", "submit", or "reset".
- type: "button",
-
- baseClass: "dijitButton",
-
- templateString: dojo.cache("dijit.form", "templates/Button.html", "<span class=\"dijit dijitReset dijitInline\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"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\tdojoAttachPoint=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),
-
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- value: "valueNode"
- }),
-
- _onClick: function(/*Event*/ e){
- // summary:
- // Internal function to handle click actions
- if(this.disabled){
- return false;
- }
- this._clicked(); // widget click actions
- return this.onClick(e); // user click actions
- },
-
- _onButtonClick: function(/*Event*/ e){
- // summary:
- // Handler when the user activates the button portion.
- if(this._onClick(e) === false){ // returning nothing is same as true
- e.preventDefault(); // needed for checkbox
- }else if(this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a nonform widget needs to be signalled
- for(var node=this.domNode; node.parentNode/*#5935*/; node=node.parentNode){
- var widget=dijit.byNode(node);
- if(widget && typeof widget._onSubmit == "function"){
- widget._onSubmit(e);
- break;
- }
- }
- }else if(this.valueNode){
- this.valueNode.click();
- e.preventDefault(); // cancel BUTTON click and continue with hidden INPUT click
- }
- },
-
- buildRendering: function(){
- this.inherited(arguments);
- dojo.setSelectable(this.focusNode, false);
- },
-
- _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))){
- this.set('label', source.innerHTML);
- }
- },
-
- _setShowLabelAttr: function(val){
- if(this.containerNode){
- dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val);
- }
- this._set("showLabel", val);
- },
-
- 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
- },
-
- _clicked: function(/*Event*/ e){
- // summary:
- // Internal overridable function for when the button is clicked
- },
-
- setLabel: function(/*String*/ content){
- // summary:
- // Deprecated. Use set('label', ...) instead.
- dojo.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.
- this._set("label", content);
- this.containerNode.innerHTML = content;
- if(this.showLabel == false && !this.params.title){
- this.titleNode.title = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
- }
- },
-
- _setIconClassAttr: function(/*String*/ val){
- // Custom method so that icon node is hidden when not in use, to avoid excess padding/margin
- // appearing around it (even if it's a 0x0 sized <img> node)
-
- var oldVal = this.iconClass || "dijitNoIcon",
- newVal = val || "dijitNoIcon";
- dojo.replaceClass(this.iconNode, newVal, oldVal);
- this._set("iconClass", val);
- }
-});
-
-
-dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, dijit._HasDropDown], {
- // summary:
- // A button with a drop down
- //
- // example:
- // | <button dojoType="dijit.form.DropDownButton" label="Hello world">
- // | <div dojotype="dijit.Menu">...</div>
- // | </button>
- //
- // example:
- // | var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) });
- // | dojo.body().appendChild(button1);
- //
-
- baseClass : "dijitDropDownButton",
-
- templateString: dojo.cache("dijit.form", "templates/DropDownButton.html", "<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\" dojoAttachPoint=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"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\tdojoAttachPoint=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdojoAttachPoint=\"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\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),
-
- _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 = dojo.query("*", this.srcNodeRef);
- dijit.form.DropDownButton.superclass._fillContent.call(this, 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 = dojo.query("[widgetId]", this.dropDownContainer)[0];
- this.dropDown = dijit.byNode(dropDownNode);
- delete this.dropDownContainer;
- }
- if(this.dropDown){
- dijit.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(){
- // Loads our dropdown
- var dropDown = this.dropDown;
- if(!dropDown){ return; }
- if(!this.isLoaded()){
- var handler = dojo.connect(dropDown, "onLoad", this, function(){
- dojo.disconnect(handler);
- this.openDropDown();
- });
- dropDown.refresh();
- }else{
- this.openDropDown();
- }
- },
-
- isFocusable: function(){
- // Overridden so that focus is handled by the _HasDropDown mixin, not by
- // the _FormWidget mixin.
- return this.inherited(arguments) && !this._mouseDown;
- }
-});
-
-dojo.declare("dijit.form.ComboButton", dijit.form.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 dojoType="dijit.form.ComboButton" onClick="...">
- // | <span>Hello world</span>
- // | <div dojoType="dijit.Menu">...</div>
- // | </button>
- //
- // example:
- // | var button1 = new dijit.form.ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"});
- // | dojo.body().appendChild(button1.domNode);
- //
-
- templateString: dojo.cache("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\" dojoAttachPoint=\"buttonNode\" dojoAttachEvent=\"ondijitclick:_onButtonClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"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\tdojoAttachPoint=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdojoAttachEvent=\"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}\" dojoAttachPoint=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"),
-
- attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), {
- id: "",
- tabIndex: ["focusNode", "titleNode"],
- title: "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 == dojo.keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){
- dijit.focus(this._popupStateNode);
- dojo.stopEvent(evt);
- }
- },
-
- _onArrowKeyPress: function(/*Event*/ evt){
- // summary:
- // Handler for left arrow key when focus is on right part of button
- if(evt.charOrCode == dojo.keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){
- dijit.focus(this.titleNode);
- dojo.stopEvent(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){
- dijit.focus(position == "start" ? this.titleNode : this._popupStateNode);
- }
- }
-});
-
-dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
- // summary:
- // A button that can be in two states (checked or not).
- // Can be base class for things like tabs or checkbox or radio buttons
-
- baseClass: "dijitToggleButton",
-
- // 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,
-
- attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), {
- checked:"focusNode"
- }),
-
- _clicked: function(/*Event*/ evt){
- this.set('checked', !this.checked);
- },
-
- _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){
- this._set("checked", value);
- dojo.attr(this.focusNode || this.domNode, "checked", value);
- dijit.setWaiState(this.focusNode || this.domNode, "pressed", value);
- this._handleOnChange(value, priorityChange);
- },
-
- setChecked: function(/*Boolean*/ checked){
- // summary:
- // Deprecated. Use set('checked', true/false) instead.
- dojo.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0");
- this.set('checked', checked);
- },
-
- 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);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/Button.js.uncompressed.js b/lib/dijit/form/Button.js.uncompressed.js
new file mode 100644
index 000000000..6236c81c3
--- /dev/null
+++ b/lib/dijit/form/Button.js.uncompressed.js
@@ -0,0 +1,126 @@
+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/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.trim
+ "dojo/ready",
+ "./_FormWidget",
+ "./_ButtonMixin",
+ "dojo/text!./templates/Button.html"
+], function(require, declare, domClass, kernel, lang, ready, _FormWidget, _ButtonMixin, template){
+
+/*=====
+ var _FormWidget = dijit.form._FormWidget;
+ var _ButtonMixin = dijit.form._ButtonMixin;
+=====*/
+
+// module:
+// dijit/form/Button
+// summary:
+// Button widget
+
+// Back compat w/1.6, remove for 2.0
+if(!kernel.isAsync){
+ 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 dijit.form.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
+ // 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 939f6e8bb..1d0bcceaf 100644
--- a/lib/dijit/form/CheckBox.js
+++ b/lib/dijit/form/CheckBox.js
@@ -1,204 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.CheckBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.CheckBox"] = true;
-dojo.provide("dijit.form.CheckBox");
-dojo.require("dijit.form.ToggleButton");
-
-
-dojo.declare(
- "dijit.form.CheckBox",
- dijit.form.ToggleButton,
- {
- // 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: dojo.cache("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\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onclick:_onClick\"\n/></div>\n"),
-
- baseClass: "dijitCheckBox",
-
- // 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).
- //
- // However, get('value') will return either the string or false depending on
- // whether or not the checkbox is checked.
- //
- // set('value', string) will check the checkbox and change the value to the
- // specified string
- //
- // set('value', boolean) will change the checked state.
- 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,
-
- // the attributeMap should inherit from dijit.form._FormWidget.prototype.attributeMap
- // instead of ToggleButton as the icon mapping has no meaning for a CheckBox
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- readOnly: "focusNode"
- }),
-
- _setReadOnlyAttr: function(/*Boolean*/ value){
- this._set("readOnly", value);
- dojo.attr(this.focusNode, 'readOnly', value);
- dijit.setWaiState(this.focusNode, "readonly", value);
- },
-
- _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
- // dojoType="dijit.CheckBox" value="chicken">)
- if(typeof newValue == "string"){
- this._set("value", newValue);
- dojo.attr(this.focusNode, 'value', newValue);
- 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 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,
-
- postMixInProperties: function(){
- if(this.value == ""){
- this.value = "on";
- }
-
- // Need to set initial checked state as part of template, so that form submit works.
- // dojo.attr(node, "checked", bool) doesn't work on IEuntil node has been attached
- // to <body>, see #8666
- this.checkedAttrSetting = this.checked ? "checked" : "";
-
- this.inherited(arguments);
- },
-
- _fillContent: function(/*DomNode*/ source){
- // Override Button::_fillContent() since it doesn't make sense for CheckBox,
- // since CheckBox doesn't even have a container
- },
-
- reset: function(){
- // Override ToggleButton.reset()
-
- this._hasBeenBlurred = false;
-
- this.set('checked', this.params.checked || false);
-
- // Handle unlikely event that the <input type=checkbox> value attribute has changed
- this._set("value", this.params.value || "on");
- dojo.attr(this.focusNode, 'value', this.value);
- },
-
- _onFocus: function(){
- if(this.id){
- dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");
- }
- this.inherited(arguments);
- },
-
- _onBlur: function(){
- if(this.id){
- dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");
- }
- this.inherited(arguments);
- },
-
- _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){
- dojo.stopEvent(e);
- return false;
- }
- return this.inherited(arguments);
- }
- }
-);
-
-dojo.declare(
- "dijit.form.RadioButton",
- dijit.form.CheckBox,
- {
- // summary:
- // Same as an HTML radio, but with fancy styling.
-
- type: "radio",
- baseClass: "dijitRadio",
-
- _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){
- var _this = this;
- // search for radio buttons with the same name that need to be unchecked
- dojo.query("INPUT[type=radio]", this.focusNode.form || dojo.doc).forEach( // can't use name= since dojo.query doesn't support [] in the name
- function(inputNode){
- if(inputNode.name == _this.name && inputNode != _this.focusNode && inputNode.form == _this.focusNode.form){
- var widget = dijit.getEnclosingWidget(inputNode);
- if(widget && widget.checked){
- widget.set('checked', false);
- }
- }
- }
- );
- }
- },
-
- _clicked: function(/*Event*/ e){
- if(!this.checked){
- this.set('checked', true);
- }
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/CheckBox.js.uncompressed.js b/lib/dijit/form/CheckBox.js.uncompressed.js
new file mode 100644
index 000000000..4663e1e69
--- /dev/null
+++ b/lib/dijit/form/CheckBox.js.uncompressed.js
@@ -0,0 +1,120 @@
+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", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/kernel",
+ "dojo/query", // query
+ "dojo/ready",
+ "./ToggleButton",
+ "./_CheckBoxMixin",
+ "dojo/text!./templates/CheckBox.html",
+ "dojo/NodeList-dom" // NodeList.addClass/removeClass
+], function(require, declare, domAttr, kernel, query, ready, ToggleButton, _CheckBoxMixin, template){
+
+/*=====
+ var ToggleButton = dijit.form.ToggleButton;
+ var _CheckBoxMixin = dijit.form._CheckBoxMixin;
+=====*/
+
+ // module:
+ // dijit/form/CheckBox
+ // summary:
+ // Checkbox widget
+
+ // Back compat w/1.6, remove for 2.0
+ if(!kernel.isAsync){
+ 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._set("value", newValue);
+ domAttr.set(this.focusNode, 'value', newValue);
+ 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 b/lib/dijit/form/ComboBox.js
index aecc5c4fc..2c46468c2 100644
--- a/lib/dijit/form/ComboBox.js
+++ b/lib/dijit/form/ComboBox.js
@@ -1,1231 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.ComboBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.ComboBox"] = true;
-dojo.provide("dijit.form.ComboBox");
-dojo.require("dojo.window");
-dojo.require("dojo.regexp");
-dojo.require("dojo.data.util.simpleFetch");
-dojo.require("dojo.data.util.filter");
-dojo.require("dijit._CssStateMixin");
-dojo.require("dijit.form._FormWidget");
-dojo.require("dijit.form.ValidationTextBox");
-dojo.require("dijit._HasDropDown");
-dojo.requireLocalization("dijit.form", "ComboBox", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare(
- "dijit.form.ComboBoxMixin",
- dijit._HasDropDown,
- {
- // summary:
- // Implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect`
- // description:
- // All widgets that mix in dijit.form.ComboBoxMixin must extend `dijit.form._FormValueWidget`.
- // tags:
- // protected
-
- // item: Object
- // This is the item returned by the dojo.data.store implementation that
- // provides the data for this ComboBox, it's the currently selected item.
- item: null,
-
- // pageSize: Integer
- // Argument to data provider.
- // Specifies number of search results per page (before hitting "next" button)
- pageSize: Infinity,
-
- // store: [const] Object
- // Reference to data provider object used by this ComboBox
- store: null,
-
- // fetchProperties: Object
- // Mixin to the dojo.data 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,
- // before doing further filtering based on `searchAttr` and the key.
- // Any reference to the `searchAttr` is ignored.
- query: {},
-
- // 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",
-
- // searchDelay: Integer
- // Delay in milliseconds between when user types something and we start
- // searching based on that value
- searchDelay: 100,
-
- // searchAttr: String
- // Search for items in the data store where this attribute (in the item)
- // matches what the user typed
- searchAttr: "name",
-
- // 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",
-
- // queryExpr: String
- // This specifies what query ComboBox/FilteringSelect sends to the data store,
- // based on what the user has typed. Changing this expression will modify
- // whether the drop down shows only exact matches, a "starting with" match,
- // etc. Use it in conjunction with highlightMatch.
- // 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 ComboBox/FilteringSelect should ignore case when matching possible items
- ignoreCase: true,
-
- // hasDownArrow: Boolean
- // Set this textbox to have a down arrow button, to display the drop down list.
- // Defaults to true.
- hasDownArrow: true,
-
- templateString: dojo.cache("dijit.form", "templates/DropDownBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"_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\tdojoAttachPoint=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"),
-
- baseClass: "dijitTextBox dijitComboBox",
-
- // dropDownClass: [protected extension] String
- // Name of the dropdown widget class used to select a date/time.
- // Subclasses should specify this.
- dropDownClass: "dijit.form._ComboBoxMenu",
-
- // Set classes like dijitDownArrowButtonHover depending on
- // mouse action over button node
- cssStateNodes: {
- "_buttonNode": "dijitDownArrowButton"
- },
-
- // 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(dojo.isIE){
- // in the case of a mouse click in a popup being handled,
- // then the dojo.doc.selection is not the textarea, but the popup
- // var r = dojo.doc.selection.createRange();
- // hack to get IE 6 to play nice. What a POS browser.
- var tr = dojo.doc.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);
- dijit.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);
- dijit.setWaiState(this.domNode, "disabled", value);
- },
-
- _abortQuery: function(){
- // stop in-progress query
- if(this.searchTimer){
- clearTimeout(this.searchTimer);
- this.searchTimer = null;
- }
- if(this._fetchHandle){
- if(this._fetchHandle.abort){ this._fetchHandle.abort(); }
- this._fetchHandle = null;
- }
- },
-
- _onInput: function(/*Event*/ evt){
- // summary:
- // Handles paste events
- if(!this.searchTimer && (evt.type == 'paste'/*IE|WebKit*/ || evt.type == 'input'/*Firefox*/) && this._lastInput != this.textbox.value){
- this.searchTimer = setTimeout(dojo.hitch(this, function(){
- this._onKey({charOrCode: 229}); // fake IME key to cause a search
- }), 100); // long delay that will probably be preempted by keyboard input
- }
- this.inherited(arguments);
- },
-
- _onKey: function(/*Event*/ evt){
- // summary:
- // Handles keyboard events
-
- var key = evt.charOrCode;
-
- // except for cutting/pasting case - ctrl + x/v
- if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == dojo.keys.SHIFT){
- return; // throw out weird key combinations and spurious events
- }
-
- var doSearch = false;
- var pw = this.dropDown;
- var dk = dojo.keys;
- var highlighted = null;
- this._prev_key_backspace = false;
- 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(this._opened){
- highlighted = pw.getHighlightedOption();
- }
- switch(key){
- case dk.PAGE_DOWN:
- case dk.DOWN_ARROW:
- case dk.PAGE_UP:
- case dk.UP_ARROW:
- // Keystroke caused ComboBox_menu to move to a different item.
- // Copy new item to <input> box.
- if(this._opened){
- this._announceOption(highlighted);
- }
- dojo.stopEvent(evt);
- break;
-
- case dk.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);
- dojo.stopEvent(evt);
- break;
- }else if(highlighted == pw.previousButton){
- this._nextSearch(-1);
- dojo.stopEvent(evt);
- break;
- }
- }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
- }
- // default case:
- // if enter pressed while drop down is open, or for FilteringSelect,
- // if we are in the middle of a query to convert a directly typed in value to an item,
- // prevent submit, but allow event to bubble
- if(this._opened || this._fetchHandle){
- evt.preventDefault();
- }
- // fall through
-
- case dk.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();
- }
- if(this._opened){
- this._lastQuery = null; // in case results come back later
- this.closeDropDown();
- }
- break;
-
- case ' ':
- if(highlighted){
- // user is effectively clicking a choice in the drop down menu
- dojo.stopEvent(evt);
- this._selectOption();
- this.closeDropDown();
- }else{
- // user typed a space into the input box, treat as normal character
- doSearch = true;
- }
- break;
-
- case dk.DELETE:
- case dk.BACKSPACE:
- this._prev_key_backspace = true;
- doSearch = true;
- break;
-
- default:
- // Non char keys (F1-F12 etc..) shouldn't open list.
- // 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
- this.item = undefined; // undefined means item needs to be set
- this.searchTimer = setTimeout(dojo.hitch(this, "_startSearchFromInput"),1);
- }
- },
-
- _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
- dijit.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._getCaretPos(fn);
- // 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
- dijit.selectInputText(fn, cpos);
- }
- }else{
- // text does not autoComplete; replace the whole value and highlight
- fn.value = text;
- dijit.selectInputText(fn);
- }
- },
-
- _openResultList: function(/*Object*/ results, /*Object*/ dataObject){
- // 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
- this._fetchHandle = null;
- if( this.disabled ||
- this.readOnly ||
- (dataObject.query[this.searchAttr] != this._lastQuery)
- ){
- return;
- }
- var wasSelected = this.dropDown._highlighted_option && dojo.hasClass(this.dropDown._highlighted_option, "dijitMenuItemSelected");
- this.dropDown.clearResultList();
- if(!results.length && !this._maxOptions){ // if no results and not just the previous choices button
- this.closeDropDown();
- return;
- }
-
- // 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.
-
- dataObject._maxOptions = this._maxOptions;
- var nodes = this.dropDown.createOptions(
- results,
- dataObject,
- dojo.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(dataObject.direction){
- if(1 == dataObject.direction){
- this.dropDown.highlightFirstOption();
- }else if(-1 == dataObject.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(dataObject.query[this.searchAttr])){
- this._announceOption(nodes[1]); // 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);
-
- // hide the tooltip
- this.displayMessage("");
-
- this.openDropDown();
-
- dijit.setWaiState(this.domNode, "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);
- dijit.setWaiState(this.domNode, "expanded", "false");
- dijit.removeWaiState(this.focusNode,"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){
- dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true);
- }
- this._refreshState();
- }
- },
-
- _onBlur: function(){
- // summary:
- // Called magically when focus has shifted away from this widget and it's drop down
- this.closeDropDown();
- 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
- if(!displayedValue){
- displayedValue = this.store.getValue(item, this.searchAttr);
- }
- var value = this._getValueField() != this.searchAttr? this.store.getIdentity(item) : displayedValue;
- this._set("item", item);
- dijit.form.ComboBox.superclass._setValueAttr.call(this, value, priorityChange, displayedValue);
- },
-
- _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{
- newValue = this.store.getValue(node.item, this.searchAttr).toString();
- this.set('item', node.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
- dijit.setWaiState(this.focusNode, "activedescendant", dojo.attr(node, "id"));
- // autocomplete the rest of the option to announce change
- this._autoCompleteText(newValue);
- },
-
- _selectOption: function(/*Event*/ evt){
- // summary:
- // Menu callback function, called when an item in the menu is selected.
- if(evt){
- this._announceOption(evt.target);
- }
- this.closeDropDown();
- this._setCaretPos(this.focusNode, this.focusNode.value.length);
- dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); // set this.value and fire onChange
- },
-
- _startSearchAll: function(){
- this._startSearch('');
- },
-
- _startSearchFromInput: function(){
- this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
- },
-
- _getQueryString: function(/*String*/ text){
- return dojo.string.substitute(this.queryExpr, [text]);
- },
-
- _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 = dojo.getObject(this.dropDownClass, false);
- this.dropDown = new dropDownConstructor({
- onChange: dojo.hitch(this, this._selectOption),
- id: popupId,
- dir: this.dir
- });
- dijit.removeWaiState(this.focusNode,"activedescendant");
- dijit.setWaiState(this.textbox,"owns",popupId); // associate popup with textbox
- }
- // create a new query to prevent accidentally querying for a hidden
- // value from FilteringSelect's keyField
- var query = dojo.clone(this.query); // #5970
- this._lastInput = key; // Store exactly what was entered by the user.
- this._lastQuery = query[this.searchAttr] = this._getQueryString(key);
- // #5970: 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.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){
- this.searchTimer = null;
- var fetch = {
- queryOptions: {
- ignoreCase: this.ignoreCase,
- deep: true
- },
- query: query,
- onBegin: dojo.hitch(this, "_setMaxOptions"),
- onComplete: dojo.hitch(this, "_openResultList"),
- onError: function(errText){
- _this._fetchHandle = null;
- console.error('dijit.form.ComboBox: ' + errText);
- _this.closeDropDown();
- },
- start: 0,
- count: this.pageSize
- };
- dojo.mixin(fetch, _this.fetchProperties);
- this._fetchHandle = _this.store.fetch(fetch);
-
- var nextSearch = function(dataObject, direction){
- dataObject.start += dataObject.count*direction;
- // #4091:
- // tell callback the direction of the paging so the screen
- // reader knows which menu option to shout
- dataObject.direction = direction;
- this._fetchHandle = this.store.fetch(dataObject);
- this.focus();
- };
- this._nextSearch = this.dropDown.onPage = dojo.hitch(this, nextSearch, this._fetchHandle);
- }, query, this), this.searchDelay);
- },
-
- _setMaxOptions: function(size, request){
- this._maxOptions = size;
- },
-
- _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 ///////////////////////////////////////
-
- constructor: function(){
- this.query={};
- this.fetchProperties={};
- },
-
- postMixInProperties: function(){
- if(!this.store){
- var srcNodeRef = this.srcNodeRef;
-
- // if user didn't specify store, then assume there are option tags
- this.store = new dijit.form._ComboBoxDataStore(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();
- this.value = this.store.getValue(item, valueField);
- }
- }
- }
-
- this.inherited(arguments);
- },
-
- 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=dojo.query('label[for="'+this.id+'"]');
- if(label.length){
- label[0].id = (this.id+"_label");
- dijit.setWaiState(this.domNode, "labelledby", label[0].id);
-
- }
- this.inherited(arguments);
- },
-
- _setHasDownArrowAttr: function(val){
- this.hasDownArrow = val;
- this._buttonNode.style.display = val ? "" : "none";
- },
-
- _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._escapeHtml(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 = dojo.regexp.escapeString(find); // escape regexp special chars
- return this._escapeHtml(label).replace(
- // prepend ^ when this.queryExpr == "${0}*" and append $ when this.queryExpr == "*${0}"
- new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers),
- '<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;");
- 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*/ item, /*dojo.data.store*/ store){
- // summary:
- // Computes the label to display based on the dojo.data store item.
- // 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)
- return store.getValue(item, this.labelAttr || this.searchAttr).toString(); // String
- }
- }
-);
-
-dojo.declare(
- "dijit.form._ComboBoxMenu",
- [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
- {
- // summary:
- // Focus-less menu for internal use in `dijit.form.ComboBox`
- // tags:
- // private
-
- templateString: "<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"
- +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' role='option'></li>"
- +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' role='option'></li>"
- +"</ul>",
-
- // _messages: Object
- // Holds "next" and "previous" text for paging buttons on drop down
- _messages: null,
-
- baseClass: "dijitComboBoxMenu",
-
- postMixInProperties: function(){
- this.inherited(arguments);
- this._messages = dojo.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);
- },
-
- // stubs
- onChange: function(/*Object*/ value){
- // summary:
- // Notifies ComboBox/FilteringSelect that user clicked an option in the drop down menu.
- // Probably should be called onSelect.
- // 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._blurOptionNode();
- },
-
- _createOption: function(/*Object*/ item, labelFunc){
- // summary:
- // Creates an option to appear on the popup menu subclassed by
- // `dijit.form.FilteringSelect`.
-
- var menuitem = dojo.create("li", {
- "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"),
- role: "option"
- });
- var labelObject = labelFunc(item);
- if(labelObject.html){
- menuitem.innerHTML = labelObject.label;
- }else{
- menuitem.appendChild(
- dojo.doc.createTextNode(labelObject.label)
- );
- }
- // #3250: in blank options, assign a normal height
- if(menuitem.innerHTML == ""){
- menuitem.innerHTML = "&nbsp;";
- }
- menuitem.item=item;
- return menuitem;
- },
-
- createOptions: function(results, dataObject, labelFunc){
- // summary:
- // Fills in the items in the drop down list
- // results:
- // Array of dojo.data items
- // dataObject:
- // dojo.data store
- // labelFunc:
- // Function to produce a label in the drop down list from a dojo.data item
-
- //this._dataObject=dataObject;
- //this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList);
- // display "Previous . . ." button
- this.previousButton.style.display = (dataObject.start == 0) ? "none" : "";
- dojo.attr(this.previousButton, "id", this.id + "_prev");
- // create options using _createOption function defined by parent
- // ComboBox (or FilteringSelect) class
- // #2309:
- // iterate over cache nondestructively
- dojo.forEach(results, function(item, i){
- var menuitem = this._createOption(item, labelFunc);
- dojo.attr(menuitem, "id", this.id + i);
- this.domNode.insertBefore(menuitem, this.nextButton);
- }, this);
- // display "Next . . ." button
- var displayMore = false;
- //Try to determine if we should show 'more'...
- if(dataObject._maxOptions && dataObject._maxOptions != -1){
- if((dataObject.start + dataObject.count) < dataObject._maxOptions){
- displayMore = true;
- }else if((dataObject.start + dataObject.count) > dataObject._maxOptions && dataObject.count == results.length){
- //Weird return from a datastore, 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(dataObject.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";
- dojo.attr(this.nextButton,"id", this.id + "_next");
- return this.domNode.childNodes;
- },
-
- clearResultList: function(){
- // summary:
- // Clears the entries in the drop down list, but of course keeps the previous and next buttons.
- while(this.domNode.childNodes.length>2){
- this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
- }
- this._blurOptionNode();
- },
-
- _onMouseDown: function(/*Event*/ evt){
- dojo.stopEvent(evt);
- },
-
- _onMouseUp: function(/*Event*/ evt){
- if(evt.target === this.domNode || !this._highlighted_option){
- // !this._highlighted_option check to prevent immediate selection when menu appears on top
- // of <input>, see #9898. Note that _HasDropDown also has code to prevent this.
- return;
- }else if(evt.target == this.previousButton){
- this._blurOptionNode();
- this.onPage(-1);
- }else if(evt.target == this.nextButton){
- this._blurOptionNode();
- this.onPage(1);
- }else{
- var tgt = evt.target;
- // while the clicked node is inside the div
- while(!tgt.item){
- // recurse to the top
- tgt = tgt.parentNode;
- }
- this._setValueAttr({ target: tgt }, true);
- }
- },
-
- _onMouseOver: function(/*Event*/ evt){
- if(evt.target === this.domNode){ return; }
- var tgt = evt.target;
- if(!(tgt == this.previousButton || tgt == this.nextButton)){
- // while the clicked node is inside the div
- while(!tgt.item){
- // recurse to the top
- tgt = tgt.parentNode;
- }
- }
- this._focusOptionNode(tgt);
- },
-
- _onMouseOut: function(/*Event*/ evt){
- if(evt.target === this.domNode){ return; }
- this._blurOptionNode();
- },
-
- _focusOptionNode: function(/*DomNode*/ node){
- // summary:
- // Does the actual highlight.
- if(this._highlighted_option != node){
- this._blurOptionNode();
- this._highlighted_option = node;
- dojo.addClass(this._highlighted_option, "dijitMenuItemSelected");
- }
- },
-
- _blurOptionNode: function(){
- // summary:
- // Removes highlight on highlighted option.
- if(this._highlighted_option){
- dojo.removeClass(this._highlighted_option, "dijitMenuItemSelected");
- this._highlighted_option = null;
- }
- },
-
- _highlightNextOption: function(){
- // summary:
- // Highlight the item just below the current selection.
- // If nothing selected, highlight first option.
-
- // because each press of a button clears the menu,
- // the highlighted option sometimes becomes detached from the menu!
- // test to see if the option has a parent to see if this is the case.
- if(!this.getHighlightedOption()){
- var fc = this.domNode.firstChild;
- this._focusOptionNode(fc.style.display == "none" ? fc.nextSibling : fc);
- }else{
- var ns = this._highlighted_option.nextSibling;
- if(ns && ns.style.display != "none"){
- this._focusOptionNode(ns);
- }else{
- this.highlightFirstOption();
- }
- }
- // scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover
- dojo.window.scrollIntoView(this._highlighted_option);
- },
-
- highlightFirstOption: function(){
- // summary:
- // Highlight the first real item in the list (not Previous Choices).
- var first = this.domNode.firstChild;
- var second = first.nextSibling;
- this._focusOptionNode(second.style.display == "none" ? first : second); // remotely possible that Previous Choices is the only thing in the list
- dojo.window.scrollIntoView(this._highlighted_option);
- },
-
- highlightLastOption: function(){
- // summary:
- // Highlight the last real item in the list (not More Choices).
- this._focusOptionNode(this.domNode.lastChild.previousSibling);
- dojo.window.scrollIntoView(this._highlighted_option);
- },
-
- _highlightPrevOption: function(){
- // summary:
- // Highlight the item just above the current selection.
- // If nothing selected, highlight last option (if
- // you select Previous and try to keep scrolling up the list).
- if(!this.getHighlightedOption()){
- var lc = this.domNode.lastChild;
- this._focusOptionNode(lc.style.display == "none" ? lc.previousSibling : lc);
- }else{
- var ps = this._highlighted_option.previousSibling;
- if(ps && ps.style.display != "none"){
- this._focusOptionNode(ps);
- }else{
- this.highlightLastOption();
- }
- }
- dojo.window.scrollIntoView(this._highlighted_option);
- },
-
- _page: function(/*Boolean*/ up){
- // summary:
- // Handles page-up and page-down keypresses
-
- var scrollamount = 0;
- var oldscroll = this.domNode.scrollTop;
- var height = dojo.style(this.domNode, "height");
- // if no item is highlighted, highlight the first option
- if(!this.getHighlightedOption()){
- this._highlightNextOption();
- }
- while(scrollamount<height){
- if(up){
- // stop at option 1
- if(!this.getHighlightedOption().previousSibling ||
- this._highlighted_option.previousSibling.style.display == "none"){
- break;
- }
- this._highlightPrevOption();
- }else{
- // stop at last option
- if(!this.getHighlightedOption().nextSibling ||
- this._highlighted_option.nextSibling.style.display == "none"){
- break;
- }
- this._highlightNextOption();
- }
- // going backwards
- var newscroll=this.domNode.scrollTop;
- scrollamount+=(newscroll-oldscroll)*(up ? -1:1);
- oldscroll=newscroll;
- }
- },
-
- pageUp: function(){
- // summary:
- // Handles pageup keypress.
- // TODO: just call _page directly from handleKey().
- // tags:
- // private
- this._page(true);
- },
-
- pageDown: function(){
- // summary:
- // Handles pagedown keypress.
- // TODO: just call _page directly from handleKey().
- // tags:
- // private
- this._page(false);
- },
-
- getHighlightedOption: function(){
- // summary:
- // Returns the highlighted option.
- var ho = this._highlighted_option;
- return (ho && ho.parentNode) ? ho : null;
- },
-
- 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.charOrCode){
- case dojo.keys.DOWN_ARROW:
- this._highlightNextOption();
- return false;
- case dojo.keys.PAGE_DOWN:
- this.pageDown();
- return false;
- case dojo.keys.UP_ARROW:
- this._highlightPrevOption();
- return false;
- case dojo.keys.PAGE_UP:
- this.pageUp();
- return false;
- default:
- return true;
- }
- }
- }
-);
-
-dojo.declare(
- "dijit.form.ComboBox",
- [dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin],
- {
- // summary:
- // Auto-completing text box, and base class for dijit.form.FilteringSelect.
- //
- // 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.
-
- _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
- // summary:
- // Hook so set('value', value) works.
- // description:
- // Sets the value of the select.
- this._set("item", null); // value not looked up in store
- if(!value){ value = ''; } // null translates to blank
- dijit.form.ValidationTextBox.prototype._setValueAttr.call(this, value, priorityChange, displayedValue);
- }
- }
-);
-
-dojo.declare("dijit.form._ComboBoxDataStore", null, {
- // summary:
- // Inefficient but small data store specialized for inlined `dijit.form.ComboBox` data
- //
- // description:
- // Provides a store for inlined data like:
- //
- // | <select>
- // | <option value="AL">Alabama</option>
- // | ...
- //
- // Actually. just implements the subset of dojo.data.Read/Notification
- // needed for ComboBox and FilteringSelect to work.
- //
- // Note that an item is just a pointer to the <option> DomNode.
-
- constructor: function( /*DomNode*/ root){
- this.root = root;
- if(root.tagName != "SELECT" && root.firstChild){
- root = dojo.query("select", root);
- if(root.length > 0){ // SELECT is a child of srcNodeRef
- root = root[0];
- }else{ // no select, so create 1 to parent the option tags to define selectedIndex
- this.root.innerHTML = "<SELECT>"+this.root.innerHTML+"</SELECT>";
- root = this.root.firstChild;
- }
- this.root = root;
- }
- dojo.query("> option", root).forEach(function(node){
- // TODO: this was added in #3858 but unclear why/if it's needed; doesn't seem to be.
- // If it is needed then can we just hide the select itself instead?
- //node.style.display="none";
- node.innerHTML = dojo.trim(node.innerHTML);
- });
-
- },
-
- getValue: function( /*item*/ item,
- /*attribute-name-string*/ attribute,
- /*value?*/ defaultValue){
- return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
- },
-
- isItemLoaded: function(/*anything*/ something){
- return true;
- },
-
- getFeatures: function(){
- return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true};
- },
-
- _fetchItems: function( /*Object*/ args,
- /*Function*/ findCallback,
- /*Function*/ errorCallback){
- // summary:
- // See dojo.data.util.simpleFetch.fetch()
- if(!args.query){ args.query = {}; }
- if(!args.query.name){ args.query.name = ""; }
- if(!args.queryOptions){ args.queryOptions = {}; }
- var matcher = dojo.data.util.filter.patternToRegExp(args.query.name, args.queryOptions.ignoreCase),
- items = dojo.query("> option", this.root).filter(function(option){
- return (option.innerText || option.textContent || '').match(matcher);
- } );
- if(args.sort){
- items.sort(dojo.data.util.sorter.createSortFunction(args.sort, this));
- }
- findCallback(items, args);
- },
-
- close: function(/*dojo.data.api.Request || args || null*/ request){
- return;
- },
-
- getLabel: function(/*item*/ item){
- return item.innerHTML;
- },
-
- getIdentity: function(/*item*/ item){
- return dojo.attr(item, "value");
- },
-
- fetchItemByIdentity: function(/*Object*/ args){
- // summary:
- // Given the identity of an item, this method returns the item that has
- // that identity through the onItem callback.
- // Refer to dojo.data.api.Identity.fetchItemByIdentity() for more details.
- //
- // description:
- // Given arguments like:
- //
- // | {identity: "CA", onItem: function(item){...}
- //
- // Call `onItem()` with the DOM node `<option value="CA">California</option>`
- var item = dojo.query("> option[value='" + args.identity + "']", this.root)[0];
- args.onItem(item);
- },
-
- fetchSelectedItem: function(){
- // summary:
- // Get the option marked as selected, like `<option selected>`.
- // Not part of dojo.data API.
- var root = this.root,
- si = root.selectedIndex;
- return typeof si == "number"
- ? dojo.query("> option:nth-child(" + (si != -1 ? si+1 : 1) + ")", root)[0]
- : null; // dojo.data.Item
- }
-});
-//Mix in the simple fetch implementation to this class.
-dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);
-
-}
+//>>built
+define("dijit/form/ComboBox",["dojo/_base/declare","./ValidationTextBox","./ComboBoxMixin"],function(_1,_2,_3){return _1("dijit.form.ComboBox",[_2,_3],{});}); \ No newline at end of file
diff --git a/lib/dijit/form/ComboBox.js.uncompressed.js b/lib/dijit/form/ComboBox.js.uncompressed.js
new file mode 100644
index 000000000..a72f24797
--- /dev/null
+++ b/lib/dijit/form/ComboBox.js.uncompressed.js
@@ -0,0 +1,34 @@
+define("dijit/form/ComboBox", [
+ "dojo/_base/declare", // declare
+ "./ValidationTextBox",
+ "./ComboBoxMixin"
+], function(declare, ValidationTextBox, ComboBoxMixin){
+
+/*=====
+ var ValidationTextBox = dijit.form.ValidationTextBox;
+ var ComboBoxMixin = dijit.form.ComboBoxMixin;
+=====*/
+
+ // module:
+ // dijit/form/ComboBox
+ // summary:
+ // Auto-completing text box
+
+ 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
new file mode 100644
index 000000000..99f0efa04
--- /dev/null
+++ b/lib/dijit/form/ComboBoxMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/ComboBoxMixin.js.uncompressed.js b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js
new file mode 100644
index 000000000..d49c7072e
--- /dev/null
+++ b/lib/dijit/form/ComboBoxMixin.js.uncompressed.js
@@ -0,0 +1,148 @@
+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", // declare
+ "dojo/_base/Deferred",
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.mixin
+ "dojo/store/util/QueryResults", // dojo.store.util.QueryResults
+ "./_AutoCompleterMixin",
+ "./_ComboBoxMenu",
+ "../_HasDropDown",
+ "dojo/text!./templates/DropDownBox.html"
+], function(declare, Deferred, kernel, lang, QueryResults, _AutoCompleterMixin, _ComboBoxMenu, _HasDropDown, template){
+
+/*=====
+ var _AutoCompleterMixin = dijit.form._AutoCompleterMixin;
+ var _ComboBoxMenu = dijit.form._ComboBoxMenu;
+ var _HasDropDown = dijit._HasDropDown;
+=====*/
+
+ // module:
+ // dijit/form/ComboBoxMixin
+ // summary:
+ // Provides main functionality of ComboBox widget
+
+ 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.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(); });
+ var fetchHandle = this.fetch(lang.mixin({
+ query: query,
+ onBegin: function(count){
+ deferred.total = 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.
+ if(this.params.store){
+ this._setStoreAttr(this.params.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){
+ 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 d311582ac..7fd288454 100644
--- a/lib/dijit/form/ComboButton.js
+++ b/lib/dijit/form/ComboButton.js
@@ -1,15 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.ComboButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.ComboButton"] = true;
-dojo.provide("dijit.form.ComboButton");
-dojo.require("dijit.form.Button");
-
-
-
-}
+//>>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
diff --git a/lib/dijit/form/ComboButton.js.uncompressed.js b/lib/dijit/form/ComboButton.js.uncompressed.js
new file mode 100644
index 000000000..91d652288
--- /dev/null
+++ b/lib/dijit/form/ComboButton.js.uncompressed.js
@@ -0,0 +1,91 @@
+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", // 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){
+
+/*=====
+ var DropDownButton = dijit.form.DropDownButton;
+=====*/
+
+// module:
+// dijit/form/ComboButton
+// summary:
+// A combination button and drop-down button.
+
+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 dijit.form.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 cd0d389a0..1eca54193 100644
--- a/lib/dijit/form/CurrencyTextBox.js
+++ b/lib/dijit/form/CurrencyTextBox.js
@@ -1,96 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.CurrencyTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.CurrencyTextBox"] = true;
-dojo.provide("dijit.form.CurrencyTextBox");
-dojo.require("dojo.currency");
-dojo.require("dijit.form.NumberTextBox");
-
-
-/*=====
-dojo.declare(
- "dijit.form.CurrencyTextBox.__Constraints",
- [dijit.form.NumberTextBox.__Constraints, dojo.currency.__FormatOptions, dojo.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}
-});
-=====*/
-
-dojo.declare(
- "dijit.form.CurrencyTextBox",
- dijit.form.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: dijit.form.CurrencyTextBox.__Constraints
- // Despite the name, this parameter specifies both constraints on the input
- // (including minimum/maximum allowed values) as well as
- // formatting options. See `dijit.form.CurrencyTextBox.__Constraints` for details.
- constraints: {},
- ======*/
-
- baseClass: "dijitTextBox dijitCurrencyTextBox",
-
- // Override regExpGen ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
- // than a straight regexp to deal with locale (plus formatting options too?)
- regExpGen: function(constraints){
- // if focused, accept either currency data or NumberTextBox format
- return '(' + (this._focused? this.inherited(arguments, [ dojo.mixin({}, constraints, this.editOptions) ]) + '|' : '')
- + dojo.currency.regexp(constraints) + ')';
- },
-
- // Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45"
- _formatter: dojo.currency.format,
-
- _parser: dojo.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 = dojo.hitch(dojo.mixin({}, this, { _parser: dijit.form.NumberTextBox.prototype._parser }), "inherited")(arguments);
- }
- return v;
- },
-
- _setConstraintsAttr: function(/*Object*/ constraints){
- if(!constraints.currency && this.currency){
- constraints.currency = this.currency;
- }
- this.inherited(arguments, [ dojo.currency._mixInDefaults(dojo.mixin(constraints, { exponent: false })) ]); // get places
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/CurrencyTextBox.js.uncompressed.js b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js
new file mode 100644
index 000000000..9626cfd74
--- /dev/null
+++ b/lib/dijit/form/CurrencyTextBox.js.uncompressed.js
@@ -0,0 +1,94 @@
+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){
+
+/*=====
+ var NumberTextBox = dijit.form.NumberTextBox;
+=====*/
+
+ // module:
+ // dijit/form/CurrencyTextBox
+ // summary:
+ // A validating currency textbox
+
+
+ /*=====
+ declare(
+ "dijit.form.CurrencyTextBox.__Constraints",
+ [dijit.form.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: dijit.form.CurrencyTextBox.__Constraints
+ // Despite the name, this parameter specifies both constraints on the input
+ // (including minimum/maximum allowed values) as well as
+ // formatting options. See `dijit.form.CurrencyTextBox.__Constraints` for details.
+ constraints: {},
+ ======*/
+
+ baseClass: "dijitTextBox dijitCurrencyTextBox",
+
+ // Override regExpGen ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
+ // than a straight regexp to deal with locale (plus formatting options too?)
+ regExpGen: 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 b/lib/dijit/form/DataList.js
new file mode 100644
index 000000000..9b4d0e30e
--- /dev/null
+++ b/lib/dijit/form/DataList.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/DataList",["dojo/_base/declare","dojo/dom","dojo/_base/lang","dojo/query","dojo/store/Memory","../registry"],function(_1,_2,_3,_4,_5,_6){function _7(_8){return {id:_8.value,value:_8.value,name:_3.trim(_8.innerText||_8.textContent||"")};};return _1("dijit.form.DataList",_5,{constructor:function(_9,_a){this.domNode=_2.byId(_a);_3.mixin(this,_9);if(this.id){_6.add(this);}this.domNode.style.display="none";this.inherited(arguments,[{data:_4("option",this.domNode).map(_7)}]);},destroy:function(){_6.remove(this.id);},fetchSelectedItem:function(){var _b=_4("> option[selected]",this.domNode)[0]||_4("> option",this.domNode)[0];return _b&&_7(_b);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/DataList.js.uncompressed.js b/lib/dijit/form/DataList.js.uncompressed.js
new file mode 100644
index 000000000..acfb5167c
--- /dev/null
+++ b/lib/dijit/form/DataList.js.uncompressed.js
@@ -0,0 +1,63 @@
+define("dijit/form/DataList", [
+ "dojo/_base/declare", // declare
+ "dojo/dom", // dom.byId
+ "dojo/_base/lang", // lang.trim
+ "dojo/query", // query
+ "dojo/store/Memory", // dojo.store.Memory
+ "../registry" // registry.add registry.remove
+], function(declare, dom, lang, query, MemoryStore, registry){
+
+ // module:
+ // dijit/form/DataList
+ // summary:
+ // Inefficient but small data store specialized for inlined data via OPTION tags
+
+ 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(/*Object?*/ params, /*DomNode|String*/ srcNodeRef){
+ // 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 b/lib/dijit/form/DateTextBox.js
index 3d929ae76..651fcd13a 100644
--- a/lib/dijit/form/DateTextBox.js
+++ b/lib/dijit/form/DateTextBox.js
@@ -1,40 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.DateTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.DateTextBox"] = true;
-dojo.provide("dijit.form.DateTextBox");
-dojo.require("dijit.Calendar");
-dojo.require("dijit.form._DateTimeTextBox");
-
-
-dojo.declare(
- "dijit.form.DateTextBox",
- dijit.form._DateTimeTextBox,
- {
- // summary:
- // A validating, serializable, range-bound date text box with a drop down calendar
- //
- // Example:
- // | new dijit.form.DateTextBox({value: new Date(2009, 0, 20)})
- //
- // Example:
- // | <input dojotype='dijit.form.DateTextBox' value='2009-01-20'>
-
- baseClass: "dijitTextBox dijitComboBox dijitDateTextBox",
- popupClass: "dijit.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 `dojo.date.stamp.fromISOString`.
- // set("value", ...) accepts either a Date object or a string.
- value: new Date("") // value.toString()="NaN"
- }
-);
-
-}
+//>>built
+define("dijit/form/DateTextBox",["dojo/_base/declare","../Calendar","./_DateTimeTextBox"],function(_1,_2,_3){return _1("dijit.form.DateTextBox",_3,{baseClass:"dijitTextBox dijitComboBox dijitDateTextBox",popupClass:_2,_selector:"date",value:new Date("")});}); \ No newline at end of file
diff --git a/lib/dijit/form/DateTextBox.js.uncompressed.js b/lib/dijit/form/DateTextBox.js.uncompressed.js
new file mode 100644
index 000000000..7257fb93a
--- /dev/null
+++ b/lib/dijit/form/DateTextBox.js.uncompressed.js
@@ -0,0 +1,38 @@
+define("dijit/form/DateTextBox", [
+ "dojo/_base/declare", // declare
+ "../Calendar",
+ "./_DateTimeTextBox"
+], function(declare, Calendar, _DateTimeTextBox){
+
+/*=====
+ var Calendar = dijit.Calendar;
+ var _DateTimeTextBox = dijit.form._DateTimeTextBox;
+=====*/
+
+ // module:
+ // dijit/form/DateTextBox
+ // summary:
+ // A validating, serializable, range-bound date text box with a drop down calendar
+
+
+ return declare("dijit.form.DateTextBox", _DateTimeTextBox, {
+ // summary:
+ // A validating, serializable, range-bound date text box with a drop down calendar
+ //
+ // Example:
+ // | new dijit.form.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 2489a4cdf..4d224ef08 100644
--- a/lib/dijit/form/DropDownButton.js
+++ b/lib/dijit/form/DropDownButton.js
@@ -1,15 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.DropDownButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.DropDownButton"] = true;
-dojo.provide("dijit.form.DropDownButton");
-dojo.require("dijit.form.Button");
-
-
-
-}
+//>>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
diff --git a/lib/dijit/form/DropDownButton.js.uncompressed.js b/lib/dijit/form/DropDownButton.js.uncompressed.js
new file mode 100644
index 000000000..b5c33b806
--- /dev/null
+++ b/lib/dijit/form/DropDownButton.js.uncompressed.js
@@ -0,0 +1,107 @@
+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", // 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){
+
+/*=====
+ Button = dijit.form.Button;
+ _Container = dijit._Container;
+ _HasDropDown = dijit._HasDropDown;
+=====*/
+
+// module:
+// dijit/form/DropDownButton
+// summary:
+// A button with a drop down
+
+
+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 dijit.form.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 81b44ff3b..5cffa0df8 100644
--- a/lib/dijit/form/FilteringSelect.js
+++ b/lib/dijit/form/FilteringSelect.js
@@ -1,227 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.FilteringSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.FilteringSelect"] = true;
-dojo.provide("dijit.form.FilteringSelect");
-dojo.require("dijit.form.ComboBox");
-
-
-dojo.declare(
- "dijit.form.FilteringSelect",
- [dijit.form.MappedTextBox, dijit.form.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*/ dataObject,
- /*Boolean?*/ priorityChange){
- // summary:
- // Callback from dojo.data 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((dataObject && dataObject.query[this.searchAttr] != this._lastQuery) || (!dataObject && 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.valueNode.value = "";
- dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange === undefined && !this._focused));
- this._set("item", null);
- this.validate(this._focused);
- }else{
- this.set('item', result[0], priorityChange);
- }
- },
-
- _openResultList: function(/*Object*/ results, /*Object*/ dataObject){
- // 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(dataObject.query[this.searchAttr] != this._lastQuery){
- return;
- }
- dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, 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){
- // 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; }
- this._lastQuery = value;
-
- if(value === null || value === ''){
- this._setDisplayedValueAttr('', priorityChange);
- return;
- }
-
- //#3347: fetchItemByIdentity if no keyAttr specified
- var self = this;
- this.store.fetchItemByIdentity({
- identity: value,
- onItem: function(item){
- self._callbackSetLabel(item? [item] : [], undefined, priorityChange);
- }
- });
- },
-
- _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.valueNode.value = this.value;
- 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 = dojo.clone(this.query); // #6196: populate query with user-specifics
- // escape meta characters of dojo.data.util.filter.patternToRegExp().
- this._lastQuery = query[this.searchAttr] = this._getDisplayQueryString(label);
- // 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 fetch = {
- query: query,
- queryOptions: {
- ignoreCase: this.ignoreCase,
- deep: true
- },
- onComplete: function(result, dataObject){
- _this._fetchHandle = null;
- dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
- },
- onError: function(errText){
- _this._fetchHandle = null;
- console.error('dijit.form.FilteringSelect: ' + errText);
- dojo.hitch(_this, "_callbackSetLabel")([], undefined, false);
- }
- };
- dojo.mixin(fetch, this.fetchProperties);
- this._fetchHandle = this.store.fetch(fetch);
- }
- },
-
- undo: function(){
- this.set('displayedValue', this._lastDisplayedValue);
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/FilteringSelect.js.uncompressed.js b/lib/dijit/form/FilteringSelect.js.uncompressed.js
new file mode 100644
index 000000000..3a9121bf1
--- /dev/null
+++ b/lib/dijit/form/FilteringSelect.js.uncompressed.js
@@ -0,0 +1,240 @@
+define("dijit/form/FilteringSelect", [
+ "dojo/data/util/filter", // filter.patternToRegExp
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred.when
+ "dojo/_base/lang", // lang.mixin
+ "./MappedTextBox",
+ "./ComboBoxMixin"
+], function(filter, declare, Deferred, lang, MappedTextBox, ComboBoxMixin){
+
+/*=====
+ var MappedTextBox = dijit.form.MappedTextBox;
+ var ComboBoxMixin = dijit.form.ComboBoxMixin;
+=====*/
+
+ // module:
+ // dijit/form/FilteringSelect
+ // summary:
+ // An enhanced version of the HTML SELECT tag, populated dynamically
+
+
+ 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;
+ Deferred.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);
+ Deferred.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 8eba470b9..e38a2ec8c 100644
--- a/lib/dijit/form/Form.js
+++ b/lib/dijit/form/Form.js
@@ -1,189 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.Form"] = true;
-dojo.provide("dijit.form.Form");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit.form._FormMixin");
-dojo.require("dijit.layout._ContentPaneResizeMixin");
-
-
-dojo.declare(
- "dijit.form.Form",
- [dijit._Widget, dijit._Templated, dijit.form._FormMixin, dijit.layout._ContentPaneResizeMixin],
- {
- // summary:
- // Widget corresponding to HTML form tag, for validation and serialization
- //
- // example:
- // | <form dojoType="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 dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- action: "",
- method: "",
- encType: "",
- "accept-charset": "",
- accept: "",
- target: ""
- }),
-
- 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 attributeMap 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;
- dojo.attr(this.domNode, "encType", value);
- if(dojo.isIE){ this.domNode.encoding = value; }
- },
-
- postCreate: function(){
- // IE tries to hide encType
- // TODO: remove in 2.0, no longer necessary with data-dojo-params
- if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){
- var item = this.srcNodeRef.attributes.getNamedItem('encType');
- if(item && !item.specified && (typeof item.value == "string")){
- this.set('encType', item.value);
- }
- }
- this.inherited(arguments);
- },
-
- 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);
- dojo.stopEvent(e);
- return false;
- },
-
- _onSubmit: function(e){
- var fp = dijit.form.Form.prototype;
- // TODO: remove this if statement beginning with 2.0
- if(this.execute != fp.execute || this.onExecute != fp.onExecute){
- dojo.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
- dojo.stopEvent(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();
- }
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/Form.js.uncompressed.js b/lib/dijit/form/Form.js.uncompressed.js
new file mode 100644
index 000000000..75615e7ae
--- /dev/null
+++ b/lib/dijit/form/Form.js.uncompressed.js
@@ -0,0 +1,172 @@
+define("dijit/form/Form", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/_base/event", // event.stop
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/sniff", // has("ie")
+ "../_Widget",
+ "../_TemplatedMixin",
+ "./_FormMixin",
+ "../layout/_ContentPaneResizeMixin"
+], function(declare, domAttr, event, kernel, has, _Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _FormMixin = dijit.form._FormMixin;
+ var _ContentPaneResizeMixin = dijit.layout._ContentPaneResizeMixin;
+=====*/
+
+ // module:
+ // dijit/form/Form
+ // summary:
+ // Widget corresponding to HTML form tag, for validation and serialization
+
+
+ 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 b/lib/dijit/form/HorizontalRule.js
index e81805e6e..85c5472af 100644
--- a/lib/dijit/form/HorizontalRule.js
+++ b/lib/dijit/form/HorizontalRule.js
@@ -1,74 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.HorizontalRule"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.HorizontalRule"] = true;
-dojo.provide("dijit.form.HorizontalRule");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-
-
-dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated],
-{
- // 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, ndx){
- 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;
- }
-});
-
-}
+//>>built
+define("dijit/form/HorizontalRule",["dojo/_base/declare","../_Widget","../_TemplatedMixin"],function(_1,_2,_3){return _1("dijit.form.HorizontalRule",[_2,_3],{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerH\"></div>",count:3,container:"containerNode",ruleStyle:"",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkH\" style=\"left:",_positionSuffix:"%;",_suffix:"\"></div>",_genHTML:function(_4){return this._positionPrefix+_4+this._positionSuffix+this.ruleStyle+this._suffix;},_isHorizontal:true,buildRendering:function(){this.inherited(arguments);var _5;if(this.count==1){_5=this._genHTML(50,0);}else{var i;var _6=100/(this.count-1);if(!this._isHorizontal||this.isLeftToRight()){_5=this._genHTML(0,0);for(i=1;i<this.count-1;i++){_5+=this._genHTML(_6*i,i);}_5+=this._genHTML(100,this.count-1);}else{_5=this._genHTML(100,0);for(i=1;i<this.count-1;i++){_5+=this._genHTML(100-_6*i,i);}_5+=this._genHTML(0,this.count-1);}}this.domNode.innerHTML=_5;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/HorizontalRule.js.uncompressed.js b/lib/dijit/form/HorizontalRule.js.uncompressed.js
new file mode 100644
index 000000000..a05509e69
--- /dev/null
+++ b/lib/dijit/form/HorizontalRule.js.uncompressed.js
@@ -0,0 +1,76 @@
+define("dijit/form/HorizontalRule", [
+ "dojo/_base/declare", // declare
+ "../_Widget",
+ "../_TemplatedMixin"
+], function(declare, _Widget, _TemplatedMixin){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+// module:
+// dijit/form/HorizontalRule
+// summary:
+// Hash marks for `dijit.form.HorizontalSlider`
+
+
+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 d923e8081..be95ba019 100644
--- a/lib/dijit/form/HorizontalRuleLabels.js
+++ b/lib/dijit/form/HorizontalRuleLabels.js
@@ -1,97 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.HorizontalRuleLabels"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.HorizontalRuleLabels"] = true;
-dojo.provide("dijit.form.HorizontalRuleLabels");
-dojo.require("dijit.form.HorizontalRule");
-
-
-dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.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){
- // for markup creation, labels are specified as child elements
- labels = dojo.query("> li", this.srcNodeRef).map(function(node){
- return String(node.innerHTML);
- });
- }
- this.srcNodeRef.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)) ? '' : dojo.number.format(start, this.constraints));
- start += inc;
- }
- }
- return labels;
- },
-
- postMixInProperties: function(){
- this.inherited(arguments);
- this.labels = this.getLabels();
- this.count = this.labels.length;
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js
new file mode 100644
index 000000000..fd4799e24
--- /dev/null
+++ b/lib/dijit/form/HorizontalRuleLabels.js.uncompressed.js
@@ -0,0 +1,99 @@
+define("dijit/form/HorizontalRuleLabels", [
+ "dojo/_base/declare", // declare
+ "dojo/number", // number.format
+ "dojo/query", // query
+ "./HorizontalRule"
+], function(declare, number, query, HorizontalRule){
+
+/*=====
+ var HorizontalRule = dijit.form.HorizontalRule;
+=====*/
+
+// module:
+// dijit/form/HorizontalRuleLabels
+// summary:
+// Labels for `dijit.form.HorizontalSlider`
+
+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){
+ // for markup creation, labels are specified as child elements
+ labels = query("> li", this.srcNodeRef).map(function(node){
+ return String(node.innerHTML);
+ });
+ }
+ this.srcNodeRef.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 93dc4a0c2..cc2563171 100644
--- a/lib/dijit/form/HorizontalSlider.js
+++ b/lib/dijit/form/HorizontalSlider.js
@@ -1,343 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.HorizontalSlider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.HorizontalSlider"] = true;
-dojo.provide("dijit.form.HorizontalSlider");
-dojo.require("dijit.form._FormWidget");
-dojo.require("dijit._Container");
-dojo.require("dojo.dnd.move");
-dojo.require("dijit.form.Button");
-dojo.require("dojo.number");
-
-
-dojo.declare(
- "dijit.form.HorizontalSlider",
- [dijit.form._FormValueWidget, dijit._Container],
-{
- // summary:
- // A form widget that allows one to select a value with a horizontally draggable handle
-
- templateString: dojo.cache("dijit.form", "templates/HorizontalSlider.html", "<table class=\"dijit dijitReset dijitSlider dijitSliderH\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"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\" dojoAttachPoint=\"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\" dojoAttachEvent=\"onmousedown:_onClkDecBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><div class=\"dijitReset dijitSliderBarContainerH\" role=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderProgressBar dijitSliderProgressBarH\" dojoAttachEvent=\"onmousedown:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableH\"\n\t\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleH\" dojoAttachEvent=\"onmousedown:_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\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH\" dojoAttachEvent=\"onmousedown:_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\" dojoAttachEvent=\"onmousedown:_onClkIncBumper\"></div\n\t\t></td\n\t\t><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH\"\n\t\t\t><div class=\"dijitSliderIncrementIconH\" style=\"display:none\" dojoAttachPoint=\"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 dojoAttachPoint=\"containerNode,bottomDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t></tr\n></table>\n"),
-
- // 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: dijit.defaultDuration,
-
- // Flag to _Templated (TODO: why is this here? I see no widgets in the template.)
- widgetsInTemplate: true,
-
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- id: ""
- }),
-
- 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",
- _startingPixelCount: "l",
- _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 dojo.keys.HOME:
- this._setValueAttr(this.minimum, false);
- break;
- case dojo.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()) ? dojo.keys.RIGHT_ARROW : dojo.keys.LEFT_ARROW):
- case (this._descending === false ? dojo.keys.DOWN_ARROW : dojo.keys.UP_ARROW):
- case (this._descending === false ? dojo.keys.PAGE_DOWN : dojo.keys.PAGE_UP):
- this.increment(e);
- break;
- case ((this._descending || this.isLeftToRight()) ? dojo.keys.LEFT_ARROW : dojo.keys.RIGHT_ARROW):
- case (this._descending === false ? dojo.keys.UP_ARROW : dojo.keys.DOWN_ARROW):
- case (this._descending === false ? dojo.keys.PAGE_UP : dojo.keys.PAGE_DOWN):
- this.decrement(e);
- break;
- default:
- return;
- }
- dojo.stopEvent(e);
- },
-
- _onHandleClick: function(e){
- if(this.disabled || this.readOnly){ return; }
- if(!dojo.isIE){
- // 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)
- dijit.focus(this.sliderHandle);
- }
- dojo.stopEvent(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; }
- dijit.focus(this.sliderHandle);
- dojo.stopEvent(e);
- var abspos = dojo.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; }
- pixelValue = pixelValue < 0 ? 0 : maxPixels < pixelValue ? maxPixels : pixelValue;
- var count = this.discreteValues;
- if(count <= 1 || count == Infinity){ count = maxPixels; }
- count--;
- var pixelsPerValue = maxPixels / count;
- var wholeIncrements = Math.round(pixelValue / pixelsPerValue);
- this._setValueAttr((this.maximum-this.minimum)*wholeIncrements/count + this.minimum, priorityChange);
- },
-
- _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
- // summary:
- // Hook so set('value', value) works.
- this._set("value", value);
- this.valueNode.value = value;
- dijit.setWaiState(this.focusNode, "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 = dojo.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 = dojo.getComputedStyle(this.sliderBarContainer);
- var c = dojo._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 == dojo.keys.PAGE_DOWN ? -this.pageIncrement : -1);
- },
-
- increment: function(/*Event*/ e){
- // summary:
- // Increment slider
- // tags:
- // private
- this._bumpValue(e.charOrCode == dojo.keys.PAGE_UP ? this.pageIncrement : 1);
- },
-
- _mouseWheeled: function(/*Event*/ evt){
- // summary:
- // Event handler for mousewheel where supported
- dojo.stopEvent(evt);
- var janky = !dojo.isMozilla;
- var scroll = evt[(janky ? "wheelDelta" : "detail")] * (janky ? 1 : -1);
- this._bumpValue(scroll < 0 ? -1 : 1, true); // negative scroll acts like a decrement
- },
-
- startup: function(){
- if(this._started){ return; }
-
- dojo.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 = dojo.query('label[for="'+this.id+'"]');
- if(label.length){
- label[0].id = (this.id+"_label");
- dijit.setWaiState(this.focusNode, "labelledby", label[0].id);
- }
-
- dijit.setWaiState(this.focusNode, "valuemin", this.minimum);
- dijit.setWaiState(this.focusNode, "valuemax", this.maximum);
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- if(this.showButtons){
- this._connects.push(dijit.typematic.addMouseListener(
- this.decrementButton, this, "_typematicCallback", 25, 500));
- this._connects.push(dijit.typematic.addMouseListener(
- this.incrementButton, this, "_typematicCallback", 25, 500));
- }
- this.connect(this.domNode, !dojo.isMozilla ? "onmousewheel" : "DOMMouseScroll", "_mouseWheeled");
-
- // define a custom constructor for a SliderMover that points back to me
- var mover = dojo.declare(dijit.form._SliderMover, {
- widget: this
- });
- this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover});
-
- this._layoutHackIE7();
- },
-
- destroy: function(){
- this._movable.destroy();
- if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){
- this._inProgressAnim.stop(true);
- }
- this._supportingWidgets = dijit.findWidgets(this.domNode); // tells destroy about pseudo-child widgets (ruler/labels)
- this.inherited(arguments);
- }
-});
-
-dojo.declare("dijit.form._SliderMover",
- dojo.dnd.Mover,
-{
- onMouseMove: function(e){
- var widget = this.widget;
- var abspos = widget._abspos;
- if(!abspos){
- abspos = widget._abspos = dojo.position(widget.sliderBarContainer, true);
- widget._setPixelValue_ = dojo.hitch(widget, "_setPixelValue");
- widget._isReversed_ = widget._isReversed();
- }
- var coordEvent = e.touches ? e.touches[0] : e, // if multitouch take first touch for coords
- pixelValue = coordEvent[widget._mousePixelCoord] - abspos[widget._startingPixelCoord];
- widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false);
- },
-
- destroy: function(e){
- dojo.dnd.Mover.prototype.destroy.apply(this, arguments);
- var widget = this.widget;
- widget._abspos = null;
- widget._setValueAttr(widget.value, true);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/HorizontalSlider.js.uncompressed.js b/lib/dijit/form/HorizontalSlider.js.uncompressed.js
new file mode 100644
index 000000000..0c4031b37
--- /dev/null
+++ b/lib/dijit/form/HorizontalSlider.js.uncompressed.js
@@ -0,0 +1,359 @@
+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", // 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/_base/sniff", // has("ie") has("mozilla")
+ "dojo/dnd/Moveable", // Moveable
+ "dojo/dnd/Mover", // Mover Mover.prototype.destroy.apply
+ "dojo/query", // query
+ "../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,
+ registry, focus, typematic, Button, _FormValueWidget, _Container, template){
+
+/*=====
+ var Button = dijit.form.Button;
+ var _FormValueWidget = dijit.form._FormValueWidget;
+ var _Container = dijit._Container;
+=====*/
+
+// module:
+// dijit/form/HorizontalSlider
+// summary:
+// A form widget that allows one to select a value with a horizontally draggable handle
+
+
+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);
+ var janky = !has("mozilla");
+ var scroll = evt[(janky ? "wheelDelta" : "detail")] * (janky ? 1 : -1);
+ this._bumpValue(scroll < 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){
+ 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._connects.push(typematic.addMouseListener(
+ this.decrementButton, this, "_typematicCallback", 25, 500));
+ this._connects.push(typematic.addMouseListener(
+ this.incrementButton, this, "_typematicCallback", 25, 500));
+ }
+ this.connect(this.domNode, !has("mozilla") ? "onmousewheel" : "DOMMouseScroll", "_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._supportingWidgets = registry.findWidgets(this.domNode); // tells destroy about pseudo-child widgets (ruler/labels)
+ 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 ebdaaf15b..ecd78995c 100644
--- a/lib/dijit/form/MappedTextBox.js
+++ b/lib/dijit/form/MappedTextBox.js
@@ -1,15 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.MappedTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.MappedTextBox"] = true;
-dojo.provide("dijit.form.MappedTextBox");
-dojo.require("dijit.form.ValidationTextBox");
-
-
-
-}
+//>>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
diff --git a/lib/dijit/form/MappedTextBox.js.uncompressed.js b/lib/dijit/form/MappedTextBox.js.uncompressed.js
new file mode 100644
index 000000000..2f8f69d19
--- /dev/null
+++ b/lib/dijit/form/MappedTextBox.js.uncompressed.js
@@ -0,0 +1,89 @@
+define("dijit/form/MappedTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.place
+ "./ValidationTextBox"
+], function(declare, domConstruct, ValidationTextBox){
+
+/*=====
+ var ValidationTextBox = dijit.form.ValidationTextBox;
+=====*/
+
+ // module:
+ // dijit/form/MappedTextBox
+ // 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.
+
+ 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 12f3b40e7..da76fed00 100644
--- a/lib/dijit/form/MultiSelect.js
+++ b/lib/dijit/form/MultiSelect.js
@@ -1,119 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.MultiSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.MultiSelect"] = true;
-dojo.provide("dijit.form.MultiSelect");
-dojo.require("dijit.form._FormWidget");
-
-
-dojo.declare("dijit.form.MultiSelect", dijit.form._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} dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",
-
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- size: "focusNode"
- }),
-
- reset: function(){
- // summary:
- // Reset the widget's value to what it was at initialization time
-
- // TODO: once we inherit from FormValueWidget this won't be needed
- this._hasBeenBlurred = false;
- this._setValueAttr(this._resetValue, true);
- },
-
- 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){
- 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);
- },
-
- getSelected: function(){
- // summary:
- // Access the NodeList of the selected options directly
- return dojo.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.
- return this.getSelected().map(function(n){
- return n.value;
- });
- },
-
- multiple: true, // for Form
-
- _setValueAttr: function(/*Array*/ values){
- // summary:
- // Hook so set('value', values) works.
- // description:
- // Set the value(s) of this Select based on passed values
- dojo.query("option",this.containerNode).forEach(function(n){
- n.selected = (dojo.indexOf(values,n.value) != -1);
- });
- },
-
- invertSelection: function(onChange){
- // summary:
- // Invert the selection
- // onChange: Boolean
- // If null, onChange is not fired.
- dojo.query("option",this.containerNode).forEach(function(n){
- n.selected = !n.selected;
- });
- this._handleOnChange(this.get('value'), onChange == true);
- },
-
- _onChange: function(/*Event*/ e){
- this._handleOnChange(this.get('value'), true);
- },
-
- // for layout widgets:
- resize: function(/*Object*/ size){
- if(size){
- dojo.marginBox(this.domNode, size);
- }
- },
-
- postCreate: function(){
- this._onChange();
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/MultiSelect.js.uncompressed.js b/lib/dijit/form/MultiSelect.js.uncompressed.js
new file mode 100644
index 000000000..c47064641
--- /dev/null
+++ b/lib/dijit/form/MultiSelect.js.uncompressed.js
@@ -0,0 +1,118 @@
+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){
+
+/*=====
+ var _FormValueWidget = dijit.form._FormValueWidget;
+=====*/
+
+// module:
+// dijit/form/MultiSelect
+// summary:
+// Widget version of a <select multiple=true> element,
+// for selecting multiple options.
+
+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){
+ 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);
+ }
+});
+
+});
diff --git a/lib/dijit/form/NumberSpinner.js b/lib/dijit/form/NumberSpinner.js
index ba5a782f5..1f7dc1640 100644
--- a/lib/dijit/form/NumberSpinner.js
+++ b/lib/dijit/form/NumberSpinner.js
@@ -1,71 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.NumberSpinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.NumberSpinner"] = true;
-dojo.provide("dijit.form.NumberSpinner");
-dojo.require("dijit.form._Spinner");
-dojo.require("dijit.form.NumberTextBox");
-
-
-dojo.declare("dijit.form.NumberSpinner",
- [dijit.form._Spinner, dijit.form.NumberTextBoxMixin],
- {
- // 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 dijit.form.NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput");
-
- 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 == dojo.keys.HOME || e.charOrCode == dojo.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 == dojo.keys.HOME ? "min" : "max")];
- if(typeof value == "number"){
- this._setValueAttr(value, false);
- }
- // eat home or end key whether we change the value or not
- dojo.stopEvent(e);
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/NumberSpinner.js.uncompressed.js b/lib/dijit/form/NumberSpinner.js.uncompressed.js
new file mode 100644
index 000000000..e96848eeb
--- /dev/null
+++ b/lib/dijit/form/NumberSpinner.js.uncompressed.js
@@ -0,0 +1,74 @@
+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){
+
+/*=====
+ var _Spinner = dijit.form._Spinner;
+ var NumberTextBox = dijit.form.NumberTextBox;
+=====*/
+
+// module:
+// dijit/form/NumberSpinner
+// summary:
+// Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value
+
+
+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 dijit.form.NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput");
+
+ 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 4d0d64f99..a7cdb8201 100644
--- a/lib/dijit/form/NumberTextBox.js
+++ b/lib/dijit/form/NumberTextBox.js
@@ -1,278 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.NumberTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.NumberTextBox"] = true;
-dojo.provide("dijit.form.NumberTextBox");
-dojo.require("dijit.form.ValidationTextBox");
-dojo.require("dojo.number");
-
-
-/*=====
-dojo.declare(
- "dijit.form.NumberTextBox.__Constraints",
- [dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.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'}
-});
-=====*/
-
-dojo.declare("dijit.form.NumberTextBoxMixin",
- null,
- {
- // summary:
- // A mixin for all number textboxes
- // tags:
- // protected
-
- // Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
- // than a straight regexp to deal with locale (plus formatting options too?)
- regExpGen: dojo.number.regexp,
-
- /*=====
- // constraints: dijit.form.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). See `dijit.form.NumberTextBox.__Constraints` for details.
- 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: dojo.number.__FormatOptions?
- // Formatting options
- // tags:
- // protected extension
-
- return "12345"; // String
- },
- =====*/
- _formatter: dojo.number.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, /*dojo.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 = dojo.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: dojo.number.__ParseOptions
- // Formatting options
- // tags:
- // protected
-
- return 123.45; // Number
- },
- =====*/
- _parser: dojo.number.parse,
-
- parse: function(/*String*/ value, /*dojo.number.__FormatOptions*/ constraints){
- // summary:
- // Replacable function to convert a formatted string to a number value
- // tags:
- // protected extension
-
- var v = this._parser(value, dojo.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 || value === '' || value === undefined) ? 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 = dojo.hitch(dojo.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 dojo.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 comnpute a real string value
- }
- }else if(!value){ // 0 processed in if branch above, ''|null|undefined flow thru 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 unparsable 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("^"+dojo.number._realNumberRegexp(dojo.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 vaidation 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;
- }
- }
- }
- }
-);
-
-dojo.declare("dijit.form.NumberTextBox",
- [dijit.form.RangeBoundTextBox,dijit.form.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"
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/NumberTextBox.js.uncompressed.js b/lib/dijit/form/NumberTextBox.js.uncompressed.js
new file mode 100644
index 000000000..a16cfbd55
--- /dev/null
+++ b/lib/dijit/form/NumberTextBox.js.uncompressed.js
@@ -0,0 +1,286 @@
+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){
+
+/*=====
+ var RangeBoundTextBox = dijit.form.RangeBoundTextBox;
+=====*/
+
+ // module:
+ // dijit/form/NumberTextBox
+ // summary:
+ // A TextBox for entering numbers, with formatting and range checking
+
+
+ /*=====
+ declare(
+ "dijit.form.NumberTextBox.__Constraints",
+ [dijit.form.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'}
+ });
+ =====*/
+
+ var NumberTextBoxMixin = declare("dijit.form.NumberTextBoxMixin", null, {
+ // summary:
+ // A mixin for all number textboxes
+ // tags:
+ // protected
+
+ // Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
+ // than a straight regexp to deal with locale (plus formatting options too?)
+ regExpGen: number.regexp,
+
+ /*=====
+ // constraints: dijit.form.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). See `dijit.form.NumberTextBox.__Constraints` for details.
+ 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: dojo.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, /*dojo.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: dojo.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 || value === '' || value === undefined) ? 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;
+ }
+ }
+ }
+ });
+/*=====
+ NumberTextBoxMixin = dijit.form.NumberTextBoxMixin;
+=====*/
+
+ 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
+
+ return NumberTextBox;
+});
diff --git a/lib/dijit/form/RadioButton.js b/lib/dijit/form/RadioButton.js
index 295ec5ffd..af7fcaee1 100644
--- a/lib/dijit/form/RadioButton.js
+++ b/lib/dijit/form/RadioButton.js
@@ -1,16 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.RadioButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.RadioButton"] = true;
-dojo.provide("dijit.form.RadioButton");
-dojo.require("dijit.form.CheckBox");
-
-
-// TODO: for 2.0, move the RadioButton code into this file
-
-}
+//>>built
+define("dijit/form/RadioButton",["dojo/_base/declare","./CheckBox","./_RadioButtonMixin"],function(_1,_2,_3){return _1("dijit.form.RadioButton",[_2,_3],{baseClass:"dijitRadio"});}); \ No newline at end of file
diff --git a/lib/dijit/form/RadioButton.js.uncompressed.js b/lib/dijit/form/RadioButton.js.uncompressed.js
new file mode 100644
index 000000000..2e1a67d26
--- /dev/null
+++ b/lib/dijit/form/RadioButton.js.uncompressed.js
@@ -0,0 +1,23 @@
+define("dijit/form/RadioButton", [
+ "dojo/_base/declare", // declare
+ "./CheckBox",
+ "./_RadioButtonMixin"
+], function(declare, CheckBox, _RadioButtonMixin){
+
+/*=====
+ var CheckBox = dijit.form.CheckBox;
+ var _RadioButtonMixin = dijit.form._RadioButtonMixin;
+=====*/
+
+ // module:
+ // dijit/form/RadioButton
+ // summary:
+ // Radio button widget
+
+ 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 589967f25..fc57a034b 100644
--- a/lib/dijit/form/RangeBoundTextBox.js
+++ b/lib/dijit/form/RangeBoundTextBox.js
@@ -1,15 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.RangeBoundTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.RangeBoundTextBox"] = true;
-dojo.provide("dijit.form.RangeBoundTextBox");
-dojo.require("dijit.form.ValidationTextBox");
-
-
-
-}
+//>>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
diff --git a/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js
new file mode 100644
index 000000000..6283f8b56
--- /dev/null
+++ b/lib/dijit/form/RangeBoundTextBox.js.uncompressed.js
@@ -0,0 +1,143 @@
+define("dijit/form/RangeBoundTextBox", [
+ "dojo/_base/declare", // declare
+ "dojo/i18n", // i18n.getLocalization
+ "./MappedTextBox"
+], function(declare, i18n, MappedTextBox){
+
+/*=====
+ var MappedTextBox = dijit.form.MappedTextBox;
+=====*/
+
+ // module:
+ // dijit/form/RangeBoundTextBox
+ // summary:
+ // Base class for textbox form widgets which defines a range of valid values.
+
+ /*=====
+ dijit.form.RangeBoundTextBox.__Constraints = function(){
+ // min: Number
+ // Minimum signed value. Default is -Infinity
+ // max: Number
+ // Maximum signed value. Default is +Infinity
+ this.min = min;
+ this.max = max;
+ }
+ =====*/
+
+ return 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: dijit.form.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');
+ var isTooLittle = false;
+ var isTooMuch = false;
+ if("min" in this.constraints){
+ var min = this.constraints.min;
+ min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min);
+ isTooLittle = (typeof min == "number") && min < 0;
+ }
+ if("max" in this.constraints){
+ var max = this.constraints.max;
+ max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0);
+ isTooMuch = (typeof max == "number") && max > 0;
+ }
+ return isTooLittle || isTooMuch;
+ },
+
+ _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 && v !== '' && v !== undefined && (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;
+ }
+ },
+
+ _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);
+ },
+
+ 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.
+ }
+ });
+});
diff --git a/lib/dijit/form/Select.js b/lib/dijit/form/Select.js
index a681cdf89..8322b015e 100644
--- a/lib/dijit/form/Select.js
+++ b/lib/dijit/form/Select.js
@@ -1,305 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.Select"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.Select"] = true;
-dojo.provide("dijit.form.Select");
-dojo.require("dijit.form._FormSelectWidget");
-dojo.require("dijit._HasDropDown");
-dojo.require("dijit.Menu");
-dojo.require("dijit.Tooltip");
-dojo.requireLocalization("dijit.form", "validate", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare("dijit.form._SelectMenu", dijit.Menu, {
- // summary:
- // An internally-used menu for dropdown that allows us a vertical scrollbar
- 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 = dojo.create("div", {style: {overflowX: "hidden", overflowY: "scroll"}}));
- if(o.parentNode){
- o.parentNode.replaceChild(n, o);
- }
- dojo.removeClass(o, "dijitMenuTable");
- n.className = o.className + " dijitSelectMenu";
- o.className = "dijitReset dijitMenuTable";
- dijit.setWaiRole(o,"listbox");
- dijit.setWaiRole(n,"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, "onmousemove", dojo.stopEvent);
- },
-
- 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){
- dojo.marginBox(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%";
- }
- }
- }
-});
-
-dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropDown], {
- // summary:
- // This is a "styleable" select box - it is basically a DropDownButton which
- // can take a <select> as its input.
-
- baseClass: "dijitSelect",
-
- templateString: dojo.cache("dijit.form", "templates/Select.html", "<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdojoAttachPoint=\"_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\" dojoAttachPoint=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} dojoAttachPoint=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"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"),
-
- // attributeMap: Object
- // Add in our style to be applied to the focus node
- attributeMap: dojo.mixin(dojo.clone(dijit.form._FormSelectWidget.prototype.attributeMap),{style:"tableNode"}),
-
- // required: Boolean
- // Can be true or false, default is false.
- required: false,
-
- // state: String
- // Shows current state (ie, validation result) of input (Normal, Warning, or Error)
- 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: "&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 dijit.form._SelectMenu({id: this.id + "_menu"});
- dojo.addClass(this.dropDown.domNode, this.baseClass + "Menu");
- },
-
- _getMenuItemForOption: function(/*dijit.form.__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 dijit.MenuSeparator();
- }else{
- // Just a regular menu option
- var click = dojo.hitch(this, "_setValueAttr", option);
- var item = new dijit.MenuItem({
- option: option,
- label: option.label || this.emptyLabel,
- onClick: click,
- disabled: option.disabled || false
- });
- dijit.setWaiRole(item.focusNode, "listitem");
- return item;
- }
- },
-
- _addOptionItem: function(/*dijit.form.__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)
- dojo.forEach(this._getChildren(), function(child){ child.destroyRecursive(); });
- var item = new dijit.MenuItem({label: "&nbsp;"});
- 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);
- }
- },
-
- _setValueAttr: function(value){
- this.inherited(arguments);
- dojo.attr(this.valueNode, "value", this.get("value"));
- },
-
- _setDisplay: function(/*String*/ newDisplay){
- // summary:
- // sets the display for the given value (or values)
- var lbl = newDisplay || this.emptyLabel;
- this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' + lbl + '</span>';
- dijit.setWaiState(this.focusNode, "valuetext", lbl);
- },
-
- validate: function(/*Boolean*/ isFocused){
- // summary:
- // Called by oninit, onblur, and onkeypress.
- // 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.isValid(isFocused);
- this._set("state", isValid ? "" : "Error");
- dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
- var message = isValid ? "" : this._missingMsg;
- if(this.message !== message){
- this._set("message", message);
- dijit.hideTooltip(this.domNode);
- if(message){
- dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
- }
- }
- 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);
- dijit.hideTooltip(this.domNode);
- this._set("state", "");
- this._set("message", "")
- },
-
- postMixInProperties: function(){
- // summary:
- // set the missing message
- this.inherited(arguments);
- this._missingMsg = dojo.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, "onmousemove", dojo.stopEvent);
- },
-
- _setStyleAttr: function(/*String||Object*/ value){
- this.inherited(arguments);
- dojo.toggleClass(this.domNode, this.baseClass + "FixedWidth", !!this.tableNode.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 = "";
- }
- },
-
- uninitialize: function(preserveDom){
- if(this.dropDown && !this.dropDown._destroyed){
- this.dropDown.destroyRecursive(preserveDom);
- delete this.dropDown;
- }
- this.inherited(arguments);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/Select.js.uncompressed.js b/lib/dijit/form/Select.js.uncompressed.js
new file mode 100644
index 000000000..86abb8349
--- /dev/null
+++ b/lib/dijit/form/Select.js.uncompressed.js
@@ -0,0 +1,347 @@
+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", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/dom-class", // domClass.add domClass.remove domClass.toggle
+ "dojo/dom-construct", // domConstruct.create
+ "dojo/dom-geometry", // domGeometry.setMarginBox
+ "dojo/_base/event", // event.stop
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/lang", // lang.hitch
+ "./_FormSelectWidget",
+ "../_HasDropDown",
+ "../Menu",
+ "../MenuItem",
+ "../MenuSeparator",
+ "../Tooltip",
+ "dojo/text!./templates/Select.html",
+ "dojo/i18n!./nls/validate"
+], function(array, declare, domAttr, domClass, domConstruct, domGeometry, event, i18n, lang,
+ _FormSelectWidget, _HasDropDown, Menu, MenuItem, MenuSeparator, Tooltip, template){
+
+/*=====
+ var _FormSelectWidget = dijit.form._FormSelectWidget;
+ var _HasDropDown = dijit._HasDropDown;
+ var _FormSelectWidget = dijit._FormSelectWidget;
+ var Menu = dijit.Menu;
+ var MenuItem = dijit.MenuItem;
+ var MenuSeparator = dijit.MenuSeparator;
+ var Tooltip = dijit.Tooltip;
+=====*/
+
+// module:
+// dijit/form/Select
+// summary:
+// This is a "styleable" select box - it is basically a DropDownButton which
+// can take a <select> as its input.
+
+
+var _SelectMenu = declare("dijit.form._SelectMenu", Menu, {
+ // summary:
+ // An internally-used menu for dropdown that allows us a vertical scrollbar
+ 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 = domConstruct.create("div", {style: {overflowX: "hidden", overflowY: "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, "onmousemove", event.stop);
+ },
+
+ 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",
+
+ templateString: template,
+
+ // 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"});
+ domClass.add(this.dropDown.domNode, this.baseClass + "Menu");
+ },
+
+ _getMenuItemForOption: function(/*dijit.form.__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();
+ }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,
+ disabled: option.disabled || false
+ });
+ item.focusNode.setAttribute("role", "listitem");
+ return item;
+ }
+ },
+
+ _addOptionItem: function(/*dijit.form.__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({label: "&#160;"});
+ 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);
+ }
+ },
+
+ _setValueAttr: function(value){
+ this.inherited(arguments);
+ domAttr.set(this.valueNode, "value", this.get("value"));
+ this.validate(this.focused); // to update this.state
+ },
+
+ _setDisabledAttr: function(/*Boolean*/ value){
+ this.inherited(arguments);
+ this.validate(this.focused); // to update this.state
+ },
+
+ _setRequiredAttr: function(/*Boolean*/ value){
+ this._set("required", value);
+ this.focusNode.setAttribute("aria-required", value);
+ this.validate(this.focused); // to update this.state
+ },
+
+ _setDisplay: function(/*String*/ newDisplay){
+ // summary:
+ // sets the display for the given value (or values)
+ var lbl = newDisplay || this.emptyLabel;
+ this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' + lbl + '</span>';
+ this.focusNode.setAttribute("aria-valuetext", lbl);
+ },
+
+ 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 ? "" : "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.validate(this.focused); // 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, "onmousemove", event.stop);
+ },
+
+ _setStyleAttr: function(/*String||Object*/ value){
+ this.inherited(arguments);
+ domClass.toggle(this.domNode, this.baseClass + "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 = "";
+ }
+ },
+
+ uninitialize: 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);
+ }
+});
+
+Select._Menu = _SelectMenu; // for monkey patching
+
+return Select;
+});
diff --git a/lib/dijit/form/SimpleTextarea.js b/lib/dijit/form/SimpleTextarea.js
index 6ff823105..41c701937 100644
--- a/lib/dijit/form/SimpleTextarea.js
+++ b/lib/dijit/form/SimpleTextarea.js
@@ -1,103 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.SimpleTextarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.SimpleTextarea"] = true;
-dojo.provide("dijit.form.SimpleTextarea");
-dojo.require("dijit.form.TextBox");
-
-
-dojo.declare("dijit.form.SimpleTextarea",
- dijit.form.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 dojoType="dijit.form.SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea>
- //
- // example:
- // | new dijit.form.SimpleTextarea({ rows:20, cols:30 }, "foo");
-
- baseClass: "dijitTextBox dijitTextArea",
-
- attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, {
- rows:"textbox", cols: "textbox"
- }),
-
- // rows: Number
- // The number of rows of text.
- rows: "3",
-
- // rows: Number
- // The number of characters per line.
- cols: "20",
-
- templateString: "<textarea ${!nameAttrSetting} dojoAttachPoint='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(dojo.isIE && this.cols){ // attribute selectors is not supported in IE6
- dojo.addClass(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);
- },
-
- _previousValue: "",
- _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){
- if(e){ dojo.stopEvent(e); }
- var textarea = this.textbox;
- if(textarea.selectionStart){
- var pos = textarea.selectionStart;
- var cr = 0;
- if(dojo.isOpera){
- 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(dojo.doc.selection){ //IE
- textarea.focus();
- var range = dojo.doc.selection.createRange();
- // delete overflow characters
- range.moveStart("character", -overflow);
- range.text = '';
- // show cursor
- range.select();
- }
- }
- this._previousValue = this.textbox.value;
- }
- this.inherited(arguments);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/SimpleTextarea.js.uncompressed.js b/lib/dijit/form/SimpleTextarea.js.uncompressed.js
new file mode 100644
index 000000000..f665857bc
--- /dev/null
+++ b/lib/dijit/form/SimpleTextarea.js.uncompressed.js
@@ -0,0 +1,100 @@
+define("dijit/form/SimpleTextarea", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add
+ "dojo/_base/sniff", // has("ie") has("opera")
+ "dojo/_base/window", // win.doc.selection win.doc.selection.createRange
+ "./TextBox"
+], function(declare, domClass, has, win, TextBox){
+
+/*=====
+ var TextBox = dijit.form.TextBox;
+=====*/
+
+// module:
+// dijit/form/SimpleTextarea
+// 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.
+
+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 dijit.form.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(win.doc.selection){ //IE
+ textarea.focus();
+ var range = win.doc.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 b/lib/dijit/form/Slider.js
index 80d4cfa98..37ae2789a 100644
--- a/lib/dijit/form/Slider.js
+++ b/lib/dijit/form/Slider.js
@@ -1,23 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.Slider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.Slider"] = true;
-dojo.provide("dijit.form.Slider");
-dojo.require("dijit.form.HorizontalSlider");
-dojo.require("dijit.form.VerticalSlider");
-dojo.require("dijit.form.HorizontalRule");
-dojo.require("dijit.form.VerticalRule");
-dojo.require("dijit.form.HorizontalRuleLabels");
-dojo.require("dijit.form.VerticalRuleLabels");
-
-
-dojo.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself", "", "2.0");
-
-// For back-compat, remove for 2.0
-
-}
+//>>built
+define("dijit/form/Slider",["dojo/_base/kernel","./HorizontalSlider","./VerticalSlider","./HorizontalRule","./VerticalRule","./HorizontalRuleLabels","./VerticalRuleLabels"],function(_1){_1.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself","","2.0");}); \ No newline at end of file
diff --git a/lib/dijit/form/Slider.js.uncompressed.js b/lib/dijit/form/Slider.js.uncompressed.js
new file mode 100644
index 000000000..2e3c05b84
--- /dev/null
+++ b/lib/dijit/form/Slider.js.uncompressed.js
@@ -0,0 +1,18 @@
+define("dijit/form/Slider", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "./HorizontalSlider",
+ "./VerticalSlider",
+ "./HorizontalRule",
+ "./VerticalRule",
+ "./HorizontalRuleLabels",
+ "./VerticalRuleLabels"
+], function(kernel){
+
+ // module:
+ // dijit/form/Slider
+ // summary:
+ // Rollup of all the the Slider related widgets
+ // For back-compat, remove for 2.0
+
+ kernel.deprecated("Call require() for HorizontalSlider / VerticalRule, explicitly rather than 'dijit.form.Slider' itself", "", "2.0");
+});
diff --git a/lib/dijit/form/TextBox.js b/lib/dijit/form/TextBox.js
index 38a9c09d4..54d5b1de3 100644
--- a/lib/dijit/form/TextBox.js
+++ b/lib/dijit/form/TextBox.js
@@ -1,427 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.TextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.TextBox"] = true;
-dojo.provide("dijit.form.TextBox");
-dojo.require("dijit.form._FormWidget");
-
-
-dojo.declare(
- "dijit.form.TextBox",
- dijit.form._FormValueWidget,
- {
- // summary:
- // A base class for textbox form inputs
-
- // 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: "",
-
- templateString: dojo.cache("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\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"),
- _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" dojoAttachPoint="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />',
-
- _buttonInputDisabled: dojo.isIE ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events
-
- baseClass: "dijitTextBox",
-
- attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, {
- maxLength: "focusNode"
- }),
-
- postMixInProperties: function(){
- var type = this.type.toLowerCase();
- if(this.templateString && this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == dijit.form.TextBox.prototype.templateString)){
- this.templateString = this._singleNodeTemplate;
- }
- this.inherited(arguments);
- },
-
- _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 = dojo.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";
- }
- },
-
- _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 && formattedValue != undefined && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){
- this.textbox.value = formattedValue;
- this._set("displayedValue", this.get("displayedValue"));
- }
-
- this._updatePlaceHolder();
-
- 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: "",
-
- getDisplayedValue: function(){
- // summary:
- // Deprecated. Use get('displayedValue') instead.
- // tags:
- // deprecated
- dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.", "", "2.0");
- return this.get('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);
- },
-
- setDisplayedValue: function(/*String*/ value){
- // summary:
- // Deprecated. Use set('displayedValue', ...) instead.
- // tags:
- // deprecated
- dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.", "", "2.0");
- this.set('displayedValue', 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 || value === 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'));
- },
-
- format: function(/*String*/ value, /*Object*/ constraints){
- // summary:
- // Replacable function to convert a value to a properly formatted string.
- // tags:
- // protected extension
- return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value));
- },
-
- parse: function(/*String*/ value, /*Object*/ constraints){
- // summary:
- // Replacable function to convert a formatted string to a value
- // 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(e){
- if(e && e.type && /key/i.test(e.type) && e.keyCode){
- switch(e.keyCode){
- case dojo.keys.SHIFT:
- case dojo.keys.ALT:
- case dojo.keys.CTRL:
- case dojo.keys.TAB:
- return;
- }
- }
- if(this.intermediateChanges){
- var _this = this;
- // the setTimeout allows the key to post to the widget input box
- setTimeout(function(){ _this._handleOnChange(_this.get('value'), false); }, 0);
- }
- this._refreshState();
-
- // In case someone is watch()'ing for changes to displayedValue
- this._set("displayedValue", this.get("displayedValue"));
- },
-
- postCreate: function(){
- if(dojo.isIE){ // IE INPUT tag fontFamily has to be set directly using STYLE
- // the setTimeout gives IE a chance to render the TextBox and to deal with font inheritance
- setTimeout(dojo.hitch(this, function(){
- var s = dojo.getComputedStyle(this.domNode);
- 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;
- }
- }
- }
- }
- }), 0);
- }
-
- // 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);
-
- if(dojo.isMoz || dojo.isOpera){
- this.connect(this.textbox, "oninput", "_onInput");
- }else{
- this.connect(this.textbox, "onkeydown", "_onInput");
- this.connect(this.textbox, "onkeyup", "_onInput");
- this.connect(this.textbox, "onpaste", "_onInput");
- this.connect(this.textbox, "oncut", "_onInput");
- }
- },
-
- _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 = dojo.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);
-
- if(this._selectOnClickHandle){
- this.disconnect(this._selectOnClickHandle);
- }
- if(this.selectOnClick && dojo.isMoz){
- this.textbox.selectionStart = this.textbox.selectionEnd = undefined; // clear selection so that the next mouse click doesn't reselect
- }
-
- this._updatePlaceHolder();
- },
-
- _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);
-
- // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up)
- // and if not, then select all the text
- var textIsNotSelected;
- if(dojo.isIE){
- var range = dojo.doc.selection.createRange();
- var parent = range.parentElement();
- textIsNotSelected = parent == this.textbox && range.text.length == 0;
- }else{
- textIsNotSelected = this.textbox.selectionStart == this.textbox.selectionEnd;
- }
- if(textIsNotSelected){
- dijit.selectInputText(this.textbox);
- }
- });
- }
-
- this._updatePlaceHolder();
-
- // 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);
- }
- }
-);
-
-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?
- var _window = dojo.global;
- var _document = dojo.doc;
- element = dojo.byId(element);
- if(isNaN(start)){ start = 0; }
- if(isNaN(stop)){ stop = element.value ? element.value.length : 0; }
- dijit.focus(element);
- if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
- 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();
- }
- }else if(_window["getSelection"]){
- if(element.setSelectionRange){
- element.setSelectionRange(start, stop);
- }
- }
-};
-
-}
+//>>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
diff --git a/lib/dijit/form/TextBox.js.uncompressed.js b/lib/dijit/form/TextBox.js.uncompressed.js
new file mode 100644
index 000000000..f8f908d8d
--- /dev/null
+++ b/lib/dijit/form/TextBox.js.uncompressed.js
@@ -0,0 +1,175 @@
+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/_base/sniff", // has("ie") has("mozilla")
+ "dojo/_base/window", // win.doc.selection.createRange
+ "./_FormValueWidget",
+ "./_TextBoxMixin",
+ "dojo/text!./templates/TextBox.html",
+ ".." // to export dijit._setSelectionRange, remove in 2.0
+], function(declare, domConstruct, domStyle, kernel, lang, has, win,
+ _FormValueWidget, _TextBoxMixin, template, dijit){
+
+/*=====
+ var _FormValueWidget = dijit.form._FormValueWidget;
+ var _TextBoxMixin = dijit.form._TextBoxMixin;
+=====*/
+
+ // module:
+ // dijit/form/TextBox
+ // summary:
+ // A base class for textbox form inputs
+
+ 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);
+ },
+
+ _onInput: function(e){
+ this.inherited(arguments);
+ if(this.intermediateChanges){ // _TextBoxMixin uses onInput
+ var _this = this;
+ // the setTimeout allows the key to post to the widget input box
+ setTimeout(function(){ _this._handleOnChange(_this.get('value'), false); }, 0);
+ }
+ },
+
+ _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',{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(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 set('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();
+ },
+
+ _onFocus: function(/*String*/ by){
+ if(this.disabled || this.readOnly){ return; }
+ this.inherited(arguments);
+ this._updatePlaceHolder();
+ }
+ });
+
+ if(has("ie")){
+ TextBox = declare(/*===== "dijit.form.TextBox.IEMixin", =====*/ TextBox, {
+ declaredClass: "dijit.form.TextBox", // for user code referencing declaredClass
+
+ _isTextSelected: function(){
+ var range = win.doc.selection.createRange();
+ var parent = range.parentElement();
+ return parent == this.textbox && range.text.length == 0;
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+ // IE INPUT tag fontFamily has to be set directly using STYLE
+ // the setTimeout gives IE a chance to render the TextBox and to deal with font inheritance
+ setTimeout(lang.hitch(this, 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.*/}
+ }), 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();
+ }
+ }
+ }else if(has("mozilla")){
+ TextBox = declare(/*===== "dijit.form.TextBox.MozMixin", =====*/TextBox, {
+ declaredClass: "dijit.form.TextBox", // for user code referencing declaredClass
+
+ _onBlur: function(e){
+ this.inherited(arguments);
+ if(this.selectOnClick){
+ // clear selection so that the next mouse click doesn't reselect
+ this.textbox.selectionStart = this.textbox.selectionEnd = undefined;
+ }
+ }
+ });
+ }else{
+ TextBox.prototype.declaredClass = "dijit.form.TextBox";
+ }
+ lang.setObject("dijit.form.TextBox", TextBox); // don't do direct assignment, it confuses API doc parser
+
+ return TextBox;
+});
diff --git a/lib/dijit/form/Textarea.js b/lib/dijit/form/Textarea.js
index cc1ec917e..648a89ec7 100644
--- a/lib/dijit/form/Textarea.js
+++ b/lib/dijit/form/Textarea.js
@@ -1,167 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.Textarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.Textarea"] = true;
-dojo.provide("dijit.form.Textarea");
-dojo.require("dijit.form.SimpleTextarea");
-
-
-dojo.declare(
- "dijit.form.Textarea",
- dijit.form.SimpleTextarea,
- {
- // 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 dojoType="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: "",
-
- _previousNewlines: 0,
- _strictMode: (dojo.doc.compatMode != 'BackCompat'), // not the same as !dojo.isQuirks
-
- _getHeight: function(textarea){
- var newH = textarea.scrollHeight;
- if(dojo.isIE){
- newH += textarea.offsetHeight - textarea.clientHeight - ((dojo.isIE < 8 && this._strictMode) ? dojo._getPadBorderExtents(textarea).h : 0);
- }else if(dojo.isMoz){
- newH += textarea.offsetHeight - textarea.clientHeight; // creates room for horizontal scrollbar
- }else if(dojo.isWebKit){
- newH += dojo._getBorderExtents(textarea).h;
- }else{ // Opera 9.6 (TODO: test if this is still needed)
- newH += dojo._getPadBorderExtents(textarea).h;
- }
- return newH;
- },
-
- _estimateHeight: function(textarea){
- // 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.
- //
- textarea.style.maxHeight = "";
- textarea.style.height = "auto";
- // #rows = #newlines+1
- // Note: on Moz, the following #rows appears to be 1 too many.
- // Actually, Moz is reserving room for the scrollbar.
- // If you increase the font size, this behavior becomes readily apparent as the last line gets cut off without the +1.
- textarea.rows = (textarea.value.match(/\n/g) || []).length + 1;
- },
-
- _needsHelpShrinking: dojo.isMoz || dojo.isWebKit,
-
- _onInput: function(){
- // Override SimpleTextArea._onInput() to deal with height adjustment
- this.inherited(arguments);
- if(this._busyResizing){ return; }
- this._busyResizing = true;
- var textarea = this.textbox;
- if(textarea.scrollHeight && textarea.offsetHeight && textarea.clientHeight){
- var newH = this._getHeight(textarea) + "px";
- if(textarea.style.height != newH){
- textarea.style.maxHeight = textarea.style.height = newH;
- }
- if(this._needsHelpShrinking){
- if(this._setTimeoutHandle){
- clearTimeout(this._setTimeoutHandle);
- }
- this._setTimeoutHandle = setTimeout(dojo.hitch(this, "_shrink"), 0); // try to collapse multiple shrinks into 1
- }
- }else{
- // hidden content of unknown size
- this._estimateHeight(textarea);
- }
- this._busyResizing = false;
- },
-
- _busyResizing: false,
- _shrink: function(){
- // grow paddingBottom to see if scrollHeight shrinks (when it is unneccesarily big)
- this._setTimeoutHandle = null;
- if(this._needsHelpShrinking && !this._busyResizing){
- this._busyResizing = true;
- var textarea = this.textbox;
- var empty = false;
- if(textarea.value == ''){
- textarea.value = ' '; // prevent collapse all the way back to 0
- empty = true;
- }
- var scrollHeight = textarea.scrollHeight;
- if(!scrollHeight){
- this._estimateHeight(textarea);
- }else{
- var oldPadding = textarea.style.paddingBottom;
- var newPadding = dojo._getPadExtents(textarea);
- newPadding = newPadding.h - newPadding.t;
- textarea.style.paddingBottom = newPadding + 1 + "px"; // tweak padding to see if height can be reduced
- var newH = this._getHeight(textarea) - 1 + "px"; // see if the height changed by the 1px added
- if(textarea.style.maxHeight != newH){ // if can be reduced, so now try a big chunk
- textarea.style.paddingBottom = newPadding + scrollHeight + "px";
- textarea.scrollTop = 0;
- textarea.style.maxHeight = this._getHeight(textarea) - scrollHeight + "px"; // scrollHeight is the added padding
- }
- textarea.style.paddingBottom = oldPadding;
- }
- if(empty){
- textarea.value = '';
- }
- this._busyResizing = false;
- }
- },
-
- resize: function(){
- // summary:
- // Resizes the textarea vertically (should be called after a style/value change)
- this._onInput();
- },
-
- _setValueAttr: function(){
- this.inherited(arguments);
- this.resize();
- },
-
- buildRendering: function(){
- this.inherited(arguments);
-
- // tweak textarea style to reduce browser differences
- dojo.style(this.textbox, { overflowY: 'hidden', overflowX: 'auto', boxSizing: 'border-box', MsBoxSizing: 'border-box', WebkitBoxSizing: 'border-box', MozBoxSizing: 'border-box' });
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- this.connect(this.textbox, "onscroll", "_onInput");
- this.connect(this.textbox, "onresize", "_onInput");
- this.connect(this.textbox, "onfocus", "_onInput"); // useful when a previous estimate was off a bit
- this._setTimeoutHandle = setTimeout(dojo.hitch(this, "resize"), 0);
- },
-
- uninitialize: function(){
- if(this._setTimeoutHandle){
- clearTimeout(this._setTimeoutHandle);
- }
- this.inherited(arguments);
- }
-});
-
-}
+//>>built
+define("dijit/form/Textarea",["dojo/_base/declare","dojo/dom-style","./_ExpandingTextAreaMixin","./SimpleTextarea"],function(_1,_2,_3,_4){return _1("dijit.form.Textarea",[_4,_3],{baseClass:"dijitTextBox dijitTextArea dijitExpandingTextArea",cols:"",buildRendering:function(){this.inherited(arguments);_2.set(this.textbox,{overflowY:"hidden",overflowX:"auto",boxSizing:"border-box",MsBoxSizing:"border-box",WebkitBoxSizing:"border-box",MozBoxSizing:"border-box"});}});}); \ No newline at end of file
diff --git a/lib/dijit/form/Textarea.js.uncompressed.js b/lib/dijit/form/Textarea.js.uncompressed.js
new file mode 100644
index 000000000..c99816e72
--- /dev/null
+++ b/lib/dijit/form/Textarea.js.uncompressed.js
@@ -0,0 +1,49 @@
+define("dijit/form/Textarea", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-style", // domStyle.set
+ "./_ExpandingTextAreaMixin",
+ "./SimpleTextarea"
+], function(declare, domStyle, _ExpandingTextAreaMixin, SimpleTextarea){
+
+/*=====
+ var _ExpandingTextAreaMixin = dijit.form._ExpandingTextAreaMixin;
+ var SimpleTextarea = dijit.form.SimpleTextarea;
+=====*/
+
+// module:
+// dijit/form/Textarea
+// summary:
+// A textarea widget that adjusts it's height according to the amount of data.
+
+
+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 81949c4a1..90b3f279d 100644
--- a/lib/dijit/form/TimeTextBox.js
+++ b/lib/dijit/form/TimeTextBox.js
@@ -1,87 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.TimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.TimeTextBox"] = true;
-dojo.provide("dijit.form.TimeTextBox");
-dojo.require("dijit._TimePicker");
-dojo.require("dijit.form._DateTimeTextBox");
-
-
-/*=====
-dojo.declare(
- "dijit.form.TimeTextBox.__Constraints",
- [dijit.form._DateTimeTextBox.__Constraints, dijit._TimePicker.__Constraints]
-);
-=====*/
-
-dojo.declare(
- "dijit.form.TimeTextBox",
- dijit.form._DateTimeTextBox,
- {
- // summary:
- // A validating, serializable, range-bound time text box with a drop down time picker
-
- baseClass: "dijitTextBox dijitComboBox dijitTimeTextBox",
- popupClass: "dijit._TimePicker",
- _selector: "time",
-
-/*=====
- // constraints: dijit.form.TimeTextBox.__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: dojo.date.stamp.fromISOString("T12:59:59", new Date())})
- //
- // When passed to the parser in markup, must be specified according to locale-independent
- // `dojo.date.stamp.fromISOString` format.
- //
- // Example:
- // | <input dojotype='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){
- 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 dojo.keys.ENTER:
- case dojo.keys.TAB:
- case dojo.keys.ESCAPE:
- case dojo.keys.DOWN_ARROW:
- case dojo.keys.UP_ARROW:
- // these keys have special meaning
- break;
- default:
- // setTimeout() because the keystroke hasn't yet appeared in the <input>,
- // so the get('displayedValue') call below won't give the result we want.
- setTimeout(dojo.hitch(this, 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();
- }), 0);
- }
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/TimeTextBox.js.uncompressed.js b/lib/dijit/form/TimeTextBox.js.uncompressed.js
new file mode 100644
index 000000000..30d80b236
--- /dev/null
+++ b/lib/dijit/form/TimeTextBox.js.uncompressed.js
@@ -0,0 +1,88 @@
+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){
+
+/*=====
+ var _TimePicker = dijit._TimePicker;
+ var _DateTimeTextBox = dijit.form._DateTimeTextBox;
+=====*/
+
+ // module:
+ // dijit/form/TimeTextBox
+ // summary:
+ // A validating, serializable, range-bound time text box with a drop down time picker
+
+
+ /*=====
+ declare(
+ "dijit.form.TimeTextBox.__Constraints",
+ [dijit.form._DateTimeTextBox.__Constraints, dijit._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: dijit.form.TimeTextBox.__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:
+ // setTimeout() because the keystroke hasn't yet appeared in the <input>,
+ // so the get('displayedValue') call below won't give the result we want.
+ setTimeout(lang.hitch(this, 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();
+ }), 0);
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/ToggleButton.js b/lib/dijit/form/ToggleButton.js
index 27b836fbd..196f67f8d 100644
--- a/lib/dijit/form/ToggleButton.js
+++ b/lib/dijit/form/ToggleButton.js
@@ -1,15 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.ToggleButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.ToggleButton"] = true;
-dojo.provide("dijit.form.ToggleButton");
-dojo.require("dijit.form.Button");
-
-
-
-}
+//>>built
+define("dijit/form/ToggleButton",["dojo/_base/declare","dojo/_base/kernel","./Button","./_ToggleButtonMixin"],function(_1,_2,_3,_4){return _1("dijit.form.ToggleButton",[_3,_4],{baseClass:"dijitToggleButton",setChecked:function(_5){_2.deprecated("setChecked("+_5+") is deprecated. Use set('checked',"+_5+") instead.","","2.0");this.set("checked",_5);}});}); \ No newline at end of file
diff --git a/lib/dijit/form/ToggleButton.js.uncompressed.js b/lib/dijit/form/ToggleButton.js.uncompressed.js
new file mode 100644
index 000000000..21ee070cb
--- /dev/null
+++ b/lib/dijit/form/ToggleButton.js.uncompressed.js
@@ -0,0 +1,33 @@
+define("dijit/form/ToggleButton", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "./Button",
+ "./_ToggleButtonMixin"
+], function(declare, kernel, Button, _ToggleButtonMixin){
+
+/*=====
+ var Button = dijit.form.Button;
+ var _ToggleButtonMixin = dijit.form._ToggleButtonMixin;
+=====*/
+
+ // module:
+ // dijit/form/ToggleButton
+ // summary:
+ // A templated button widget that can be in two states (checked or not).
+
+
+ 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 ee4292441..5ca837ac1 100644
--- a/lib/dijit/form/ValidationTextBox.js
+++ b/lib/dijit/form/ValidationTextBox.js
@@ -1,486 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.ValidationTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.ValidationTextBox"] = true;
-dojo.provide("dijit.form.ValidationTextBox");
-dojo.require("dojo.i18n");
-dojo.require("dijit.form.TextBox");
-dojo.require("dijit.Tooltip");
-dojo.requireLocalization("dijit.form", "validate", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-/*=====
- dijit.form.ValidationTextBox.__Constraints = function(){
- // locale: String
- // locale used for validation, picks up value from this widget's lang attribute
- // _flags_: anything
- // various flags passed to regExpGen function
- this.locale = "";
- this._flags_ = "";
- }
-=====*/
-
-dojo.declare(
- "dijit.form.ValidationTextBox",
- dijit.form.TextBox,
- {
- // summary:
- // Base class for textbox widgets with the ability to validate content of various types and provide user feedback.
- // tags:
- // protected
-
- templateString: dojo.cache("dijit.form", "templates/ValidationTextBox.html", "<div class=\"dijit dijitReset dijitInlineTable 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\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"),
- baseClass: "dijitTextBox dijitValidationTextBox",
-
- // 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: dijit.form.ValidationTextBox.__Constraints
- // user-defined object needed to pass parameters to the validator functions
- constraints: {},
-
- // regExp: [extension protected] String
- // regular expression string used to validate the input
- // Do not specify both regExp and regExpGen
- regExp: ".*",
-
- regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){
- // summary:
- // Overridable function used to generate regExp when dependent on constraints.
- // Do not specify both regExp and regExpGen.
- // tags:
- // extension protected
- return this.regExp; // String
- },
-
- // 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: [],
-
- _setValueAttr: function(){
- // summary:
- // Hook so set('value', ...) works.
- this.inherited(arguments);
- this.validate(this._focused);
- },
-
- validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){
- // summary:
- // Overridable function used to validate the text input against the regular expression.
- // tags:
- // protected
- return (new RegExp("^(?:" + this.regExpGen(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
- return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // 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) ? "Incomplete" : "Error"));
- dijit.setWaiState(this.focusNode, "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
- dijit.hideTooltip(this.domNode);
- if(message && this._focused){
- dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight());
- }
- },
-
- _refreshState: function(){
- // Overrides TextBox._refreshState()
- this.validate(this._focused);
- this.inherited(arguments);
- },
-
- //////////// INITIALIZATION METHODS ///////////////////////////////////////
-
- constructor: function(){
- this.constraints = {};
- },
-
- _setConstraintsAttr: function(/*Object*/ constraints){
- if(!constraints.locale && this.lang){
- constraints.locale = this.lang;
- }
- this._set("constraints", constraints);
- this._computePartialRE();
- },
-
- _computePartialRE: function(){
- var p = this.regExpGen(this.constraints);
- this.regExp = p;
- var partialre = "";
- // 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 != ".*"){ this.regExp.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.regExp;
- console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp);
- } // should never be here unless the original RE is bad or the parsing is bad
- this._partialre = "^(?:" + partialre + ")$";
- },
-
- postMixInProperties: function(){
- this.inherited(arguments);
- this.messages = dojo.i18n.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); // 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);
- dijit.setWaiState(this.focusNode, "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);
- }
- }
-);
-
-dojo.declare(
- "dijit.form.MappedTextBox",
- dijit.form.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 = "";
- },
-
- serialize: function(/*anything*/ val, /*Object?*/ 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.
- // 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._Templated.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 dojo.create() with an attrs argument
- // to make dojo.query(input[name=...]) work on IE. (see #8660)
- this.valueNode = dojo.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);
- }
- }
-);
-
-/*=====
- dijit.form.RangeBoundTextBox.__Constraints = function(){
- // min: Number
- // Minimum signed value. Default is -Infinity
- // max: Number
- // Maximum signed value. Default is +Infinity
- this.min = min;
- this.max = max;
- }
-=====*/
-
-dojo.declare(
- "dijit.form.RangeBoundTextBox",
- dijit.form.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: dijit.form.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');
- var isTooLittle = false;
- var isTooMuch = false;
- if("min" in this.constraints){
- var min = this.constraints.min;
- min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min);
- isTooLittle = (typeof min == "number") && min < 0;
- }
- if("max" in this.constraints){
- var max = this.constraints.max;
- max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0);
- isTooMuch = (typeof max == "number") && max > 0;
- }
- return isTooLittle || isTooMuch;
- },
-
- _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 && v !== '' && v !== undefined && (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 = dojo.i18n.getLocalization("dijit.form", "validate", this.lang);
- this.rangeMessage = this.messages.rangeMessage;
- }
- },
-
- _setConstraintsAttr: function(/*Object*/ constraints){
- this.inherited(arguments);
- if(this.focusNode){ // not set when called from postMixInProperties
- if(this.constraints.min !== undefined){
- dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min);
- }else{
- dijit.removeWaiState(this.focusNode, "valuemin");
- }
- if(this.constraints.max !== undefined){
- dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max);
- }else{
- dijit.removeWaiState(this.focusNode, "valuemax");
- }
- }
- },
-
- _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
- // summary:
- // Hook so set('value', ...) works.
-
- dijit.setWaiState(this.focusNode, "valuenow", value);
- this.inherited(arguments);
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/ValidationTextBox.js.uncompressed.js b/lib/dijit/form/ValidationTextBox.js.uncompressed.js
new file mode 100644
index 000000000..b9a0b42f6
--- /dev/null
+++ b/lib/dijit/form/ValidationTextBox.js.uncompressed.js
@@ -0,0 +1,296 @@
+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/i18n", // i18n.getLocalization
+ "./TextBox",
+ "../Tooltip",
+ "dojo/text!./templates/ValidationTextBox.html",
+ "dojo/i18n!./nls/validate"
+], function(declare, i18n, TextBox, Tooltip, template){
+
+/*=====
+ var Tooltip = dijit.Tooltip;
+ var TextBox = dijit.form.TextBox;
+=====*/
+
+ // module:
+ // dijit/form/ValidationTextBox
+ // summary:
+ // Base class for textbox widgets with the ability to validate content of various types and provide user feedback.
+
+
+ /*=====
+ dijit.form.ValidationTextBox.__Constraints = function(){
+ // locale: String
+ // locale used for validation, picks up value from this widget's lang attribute
+ // _flags_: anything
+ // various flags passed to regExpGen function
+ this.locale = "";
+ this._flags_ = "";
+ }
+ =====*/
+
+ return declare("dijit.form.ValidationTextBox", TextBox, {
+ // summary:
+ // Base class for textbox widgets with the ability to validate content of various types and provide user feedback.
+ // tags:
+ // protected
+
+ templateString: template,
+ baseClass: "dijitTextBox dijitValidationTextBox",
+
+ // 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: dijit.form.ValidationTextBox.__Constraints
+ // user-defined object needed to pass parameters to the validator functions
+ constraints: {},
+
+ // regExp: [extension protected] String
+ // regular expression string used to validate the input
+ // Do not specify both regExp and regExpGen
+ regExp: ".*",
+
+ regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ /*===== constraints =====*/){
+ // summary:
+ // Overridable function used to generate regExp when dependent on constraints.
+ // Do not specify both regExp and regExpGen.
+ // tags:
+ // extension protected
+ return this.regExp; // String
+ },
+
+ // 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: [],
+
+ _setValueAttr: function(){
+ // summary:
+ // Hook so set('value', ...) works.
+ this.inherited(arguments);
+ this.validate(this.focused);
+ },
+
+ validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){
+ // summary:
+ // Overridable function used to validate the text input against the regular expression.
+ // tags:
+ // protected
+ return (new RegExp("^(?:" + this.regExpGen(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
+ return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // 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) ? "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()
+ this.validate(this.focused);
+ this.inherited(arguments);
+ },
+
+ //////////// INITIALIZATION METHODS ///////////////////////////////////////
+
+ constructor: function(){
+ this.constraints = {};
+ },
+
+ _setConstraintsAttr: function(/*Object*/ constraints){
+ if(!constraints.locale && this.lang){
+ constraints.locale = this.lang;
+ }
+ this._set("constraints", constraints);
+ this._computePartialRE();
+ },
+
+ _computePartialRE: function(){
+ var p = this.regExpGen(this.constraints);
+ this.regExp = p;
+ var partialre = "";
+ // 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 != ".*"){ this.regExp.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.regExp;
+ console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp);
+ } // should never be here unless the original RE is bad or the parsing is bad
+ this._partialre = "^(?:" + partialre + ")$";
+ },
+
+ postMixInProperties: function(){
+ this.inherited(arguments);
+ this.messages = i18n.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); // 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 b/lib/dijit/form/VerticalRule.js
index 98f612cf0..2212665c0 100644
--- a/lib/dijit/form/VerticalRule.js
+++ b/lib/dijit/form/VerticalRule.js
@@ -1,35 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.VerticalRule"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.VerticalRule"] = true;
-dojo.provide("dijit.form.VerticalRule");
-dojo.require("dijit.form.HorizontalRule");
-
-
-dojo.declare("dijit.form.VerticalRule", dijit.form.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
-
-});
-
-}
+//>>built
+define("dijit/form/VerticalRule",["dojo/_base/declare","./HorizontalRule"],function(_1,_2){return _1("dijit.form.VerticalRule",_2,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleMark dijitRuleMarkV\" style=\"top:",_isHorizontal:false});}); \ No newline at end of file
diff --git a/lib/dijit/form/VerticalRule.js.uncompressed.js b/lib/dijit/form/VerticalRule.js.uncompressed.js
new file mode 100644
index 000000000..dd568d827
--- /dev/null
+++ b/lib/dijit/form/VerticalRule.js.uncompressed.js
@@ -0,0 +1,34 @@
+define("dijit/form/VerticalRule", [
+ "dojo/_base/declare", // declare
+ "./HorizontalRule"
+], function(declare, HorizontalRule){
+
+/*=====
+ var HorizontalRule = dijit.form.HorizontalRule;
+=====*/
+
+ // module:
+ // dijit/form/VerticalRule
+ // summary:
+ // Hash marks for the `dijit.form.VerticalSlider`
+
+ 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 b/lib/dijit/form/VerticalRuleLabels.js
index 57caba8b5..6b2e8948c 100644
--- a/lib/dijit/form/VerticalRuleLabels.js
+++ b/lib/dijit/form/VerticalRuleLabels.js
@@ -1,33 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.VerticalRuleLabels"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.VerticalRuleLabels"] = true;
-dojo.provide("dijit.form.VerticalRuleLabels");
-dojo.require("dijit.form.HorizontalRuleLabels");
-
-
-dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.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
-});
-
-}
+//>>built
+define("dijit/form/VerticalRuleLabels",["dojo/_base/declare","./HorizontalRuleLabels"],function(_1,_2){return _1("dijit.form.VerticalRuleLabels",_2,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(_3){return 100-_3;},_isHorizontal:false});}); \ No newline at end of file
diff --git a/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js
new file mode 100644
index 000000000..45d8f41d8
--- /dev/null
+++ b/lib/dijit/form/VerticalRuleLabels.js.uncompressed.js
@@ -0,0 +1,32 @@
+define("dijit/form/VerticalRuleLabels", [
+ "dojo/_base/declare", // declare
+ "./HorizontalRuleLabels"
+], function(declare, HorizontalRuleLabels){
+
+/*=====
+ var HorizontalRuleLabels = dijit.form.HorizontalRuleLabels;
+=====*/
+
+ // module:
+ // dijit/form/VerticalRuleLabels
+ // summary:
+ // Labels for the `dijit.form.VerticalSlider`
+
+ 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 f074c7cd1..aae7524fb 100644
--- a/lib/dijit/form/VerticalSlider.js
+++ b/lib/dijit/form/VerticalSlider.js
@@ -1,42 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form.VerticalSlider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.VerticalSlider"] = true;
-dojo.provide("dijit.form.VerticalSlider");
-dojo.require("dijit.form.HorizontalSlider");
-
-
-dojo.declare(
- "dijit.form.VerticalSlider",
- dijit.form.HorizontalSlider,
-{
- // summary:
- // A form widget that allows one to select a value with a vertically draggable handle
-
- templateString: dojo.cache("dijit.form", "templates/VerticalSlider.html", "<table class=\"dijit dijitReset dijitSlider dijitSliderV\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"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\" dojoAttachPoint=\"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\" dojoAttachEvent=\"onmousedown:_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 dojoAttachPoint=\"leftDecoration\" class=\"dijitReset dijitSliderDecoration dijitSliderDecorationL dijitSliderDecorationV\"></td\n\t\t><td class=\"dijitReset dijitSliderDecorationC\" style=\"height:100%;\"\n\t\t\t><input dojoAttachPoint=\"valueNode\" type=\"hidden\" ${!nameAttrSetting}\n\t\t\t/><center class=\"dijitReset dijitSliderBarContainerV\" role=\"presentation\" dojoAttachPoint=\"sliderBarContainer\"\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"remainingBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderRemainingBar dijitSliderRemainingBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"><!--#5629--></div\n\t\t\t\t><div role=\"presentation\" dojoAttachPoint=\"progressBar\" class=\"dijitSliderBar dijitSliderBarV dijitSliderProgressBar dijitSliderProgressBarV\" dojoAttachEvent=\"onmousedown:_onBarClick\"\n\t\t\t\t\t><div class=\"dijitSliderMoveable dijitSliderMoveableV\" style=\"vertical-align:top;\"\n\t\t\t\t\t\t><div dojoAttachPoint=\"sliderHandle,focusNode\" class=\"dijitSliderImageHandle dijitSliderImageHandleV\" dojoAttachEvent=\"onmousedown:_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 dojoAttachPoint=\"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\" dojoAttachEvent=\"onmousedown:_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\" dojoAttachPoint=\"incrementButton\"><span class=\"dijitSliderButtonInner\">-</span></div\n\t\t></td\n\t\t><td class=\"dijitReset\"></td\n\t></tr\n></table>\n"),
- _mousePixelCoord: "pageY",
- _pixelCount: "h",
- _startingPixelCoord: "y",
- _startingPixelCount: "t",
- _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;
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/VerticalSlider.js.uncompressed.js b/lib/dijit/form/VerticalSlider.js.uncompressed.js
new file mode 100644
index 000000000..691441d02
--- /dev/null
+++ b/lib/dijit/form/VerticalSlider.js.uncompressed.js
@@ -0,0 +1,42 @@
+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", // declare
+ "./HorizontalSlider",
+ "dojo/text!./templates/VerticalSlider.html"
+], function(declare, HorizontalSlider, template){
+
+/*=====
+ var HorizontalSlider = dijit.form.HorizontalSlider;
+=====*/
+
+ // module:
+ // dijit/form/VerticalSlider
+ // summary:
+ // A form widget that allows one to select a value with a vertically draggable handle
+
+
+ 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
new file mode 100644
index 000000000..2487e0277
--- /dev/null
+++ b/lib/dijit/form/_AutoCompleterMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js
new file mode 100644
index 000000000..57cbb27b6
--- /dev/null
+++ b/lib/dijit/form/_AutoCompleterMixin.js.uncompressed.js
@@ -0,0 +1,765 @@
+define("dijit/form/_AutoCompleterMixin", [
+ "dojo/_base/connect", // keys keys.SHIFT
+ "dojo/data/util/filter", // patternToRegExp
+ "dojo/_base/declare", // declare
+ "dojo/_base/Deferred", // Deferred.when
+ "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/_base/sniff", // has("ie")
+ "dojo/string", // string.substitute
+ "dojo/_base/window", // win.doc.selection.createRange
+ "./DataList",
+ "../registry", // registry.byId
+ "./_TextBoxMixin" // defines _TextBoxMixin.selectInputText
+], function(connect, filter, declare, Deferred, domAttr, event, keys, lang, query, regexp, has, string, win,
+ DataList, registry, _TextBoxMixin){
+
+ // module:
+ // dijit/form/_AutoCompleterMixin
+ // summary:
+ // A mixin that implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect`
+
+
+ return declare("dijit.form._AutoCompleterMixin", null, {
+ // 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.data.store implementation that
+ // provides the data for this ComboBox, it's the currently selected item.
+ item: null,
+
+ // pageSize: Integer
+ // Argument to data provider.
+ // Specifies number of search results per page (before hitting "next" button)
+ pageSize: Infinity,
+
+ // store: [const] dojo.store.api.Store
+ // Reference to data provider object used by this ComboBox
+ 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,
+ // before doing further filtering based on `searchAttr` and the key.
+ // Any reference to the `searchAttr` is ignored.
+ query: {},
+
+ // 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",
+
+ // searchDelay: Integer
+ // Delay in milliseconds between when user types something and we start
+ // searching based on that value
+ searchDelay: 100,
+
+ // searchAttr: String
+ // Search for items in the data store where this attribute (in the item)
+ // matches what the user typed
+ searchAttr: "name",
+
+ // 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",
+
+ // queryExpr: String
+ // This specifies what query ComboBox/FilteringSelect sends to the data store,
+ // based on what the user has typed. Changing this expression will modify
+ // whether the drop down shows only exact matches, a "starting with" match,
+ // etc. Use it in conjunction with highlightMatch.
+ // 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 ComboBox/FilteringSelect should ignore case when matching possible items
+ ignoreCase: true,
+
+ // 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 = win.doc.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);
+ },
+
+ _abortQuery: function(){
+ // stop in-progress query
+ 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(/*Event*/ evt){
+ // summary:
+ // Handles paste events
+ this.inherited(arguments);
+ if(evt.charOrCode == 229){ // IME or cut/paste event
+ this._onKey(evt);
+ }
+ },
+
+ _onKey: function(/*Event*/ evt){
+ // summary:
+ // Handles keyboard 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;
+ var pw = this.dropDown;
+ var highlighted = null;
+ this._prev_key_backspace = false;
+ 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(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);
+ break;
+ }else if(highlighted == pw.previousButton){
+ this._nextSearch(-1);
+ event.stop(evt);
+ break;
+ }
+ }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
+ }
+ // default case:
+ // if enter pressed while drop down is open, or for FilteringSelect,
+ // if we are in the middle of a query to convert a directly typed in value to an item,
+ // prevent submit
+ if(this._opened || this._fetchHandle){
+ event.stop(evt);
+ }
+ // 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;
+
+ case ' ':
+ if(highlighted){
+ // user is effectively clicking a choice in the drop down menu
+ event.stop(evt);
+ this._selectOption(highlighted);
+ this.closeDropDown();
+ }else{
+ // user typed a space into the input box, treat as normal character
+ doSearch = true;
+ }
+ break;
+
+ case keys.DELETE:
+ case keys.BACKSPACE:
+ this._prev_key_backspace = true;
+ doSearch = true;
+ break;
+
+ default:
+ // Non char keys (F1-F12 etc..) shouldn't open list.
+ // 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
+ this.item = undefined; // undefined means item needs to be set
+ this.searchTimer = setTimeout(lang.hitch(this, "_startSearchFromInput"),1);
+ }
+ },
+
+ _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
+ this._fetchHandle = null;
+ if( this.disabled ||
+ this.readOnly ||
+ (query[this.searchAttr] !== this._lastQuery) // TODO: better way to avoid getting unwanted notify
+ ){
+ return;
+ }
+ 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;
+ }
+
+ // 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 nodes = 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(options.direction){
+ if(1 == options.direction){
+ this.dropDown.highlightFirstOption();
+ }else if(-1 == 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(nodes[1]); // 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{
+ newValue = (this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API)
+ this.store.getValue(node.item, this.searchAttr) : node.item[this.searchAttr]).toString();
+ this.set('item', node.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._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
+ },
+
+ _getQueryString: function(/*String*/ text){
+ return string.substitute(this.queryExpr, [text]);
+ },
+
+ _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.
+
+ // Setup parameters to be passed to store.query().
+ // Create a new query to prevent accidentally querying for a hidden
+ // value from FilteringSelect's keyField
+ var query = lang.clone(this.query); // #5970
+ var options = {
+ start: 0,
+ count: this.pageSize,
+ queryOptions: { // remove for 2.0
+ ignoreCase: this.ignoreCase,
+ deep: true
+ }
+ };
+ lang.mixin(options, this.fetchProperties);
+
+ // Generate query
+ var qs = this._getQueryString(key), 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;
+
+ // Function to run the query, wait for the results, and then call _openResultList()
+ var _this = this,
+ startQuery = function(){
+ var resPromise = _this._fetchHandle = _this.store.query(query, options);
+ Deferred.when(resPromise, function(res){
+ _this._fetchHandle = null;
+ res.total = resPromise.total;
+ _this._openResultList(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());
+ _this.closeDropDown();
+ }
+ });
+ };
+
+ // #5970: 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.searchTimer = setTimeout(lang.hitch(this, function(query, _this){
+ this.searchTimer = null;
+
+ startQuery();
+
+ // Setup method to handle clicking next/previous buttons to page through results
+ this._nextSearch = this.dropDown.onPage = function(direction){
+ options.start += options.count * direction;
+ // tell callback the direction of the paging so the screen
+ // reader knows which menu option to shout
+ options.direction = direction;
+ startQuery();
+ _this.focus();
+ };
+ }, query, this), this.searchDelay);
+ },
+
+ _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 ///////////////////////////////////////
+
+ constructor: function(){
+ this.query={};
+ this.fetchProperties={};
+ },
+
+ postMixInProperties: function(){
+ if(!this.store){
+ var srcNodeRef = this.srcNodeRef;
+ var list = this.list;
+ if(list){
+ this.store = registry.byId(list);
+ }else{
+ // 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];
+ }
+ }
+ }
+
+ this.inherited(arguments);
+ },
+
+ 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){
+ label[0].id = (this.id+"_label");
+ this.domNode.setAttribute("aria-labelledby", label[0].id);
+
+ }
+ this.inherited(arguments);
+ },
+
+ _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._escapeHtml(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
+ return this._escapeHtml(label).replace(
+ // prepend ^ when this.queryExpr == "${0}*" and append $ when this.queryExpr == "*${0}"
+ new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers),
+ '<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*/ item, /*dojo.store.api.Store*/ store){
+ // summary:
+ // Computes the label to display based on the dojo.data store item.
+ // 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){ 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 b/lib/dijit/form/_ButtonMixin.js
new file mode 100644
index 000000000..553049335
--- /dev/null
+++ b/lib/dijit/form/_ButtonMixin.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/_ButtonMixin",["dojo/_base/declare","dojo/dom","dojo/_base/event","../registry"],function(_1,_2,_3,_4){return _1("dijit.form._ButtonMixin",null,{label:"",type:"button",_onClick:function(e){if(this.disabled){_3.stop(e);return false;}var _5=this.onClick(e)===false;if(!_5&&this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var _6=this.domNode;_6.parentNode;_6=_6.parentNode){var _7=_4.byNode(_6);if(_7&&typeof _7._onSubmit=="function"){_7._onSubmit(e);_5=true;break;}}}if(_5){e.preventDefault();}return !_5;},postCreate:function(){this.inherited(arguments);_2.setSelectable(this.focusNode,false);},onClick:function(){return true;},_setLabelAttr:function(_8){this._set("label",_8);(this.containerNode||this.focusNode).innerHTML=_8;}});}); \ No newline at end of file
diff --git a/lib/dijit/form/_ButtonMixin.js.uncompressed.js b/lib/dijit/form/_ButtonMixin.js.uncompressed.js
new file mode 100644
index 000000000..f00ebdb07
--- /dev/null
+++ b/lib/dijit/form/_ButtonMixin.js.uncompressed.js
@@ -0,0 +1,85 @@
+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
+// summary:
+// A mixin to add a thin standard API wrapper to a normal HTML button
+
+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 dijit.form.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
new file mode 100644
index 000000000..da6d96a2d
--- /dev/null
+++ b/lib/dijit/form/_CheckBoxMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js b/lib/dijit/form/_CheckBoxMixin.js.uncompressed.js
new file mode 100644
index 000000000..703f8ead7
--- /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
+ // summary:
+ // Mixin to provide widget functionality corresponding to an HTML checkbox
+
+ 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);
+ this.focusNode.setAttribute("aria-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,
+
+ postMixInProperties: function(){
+ if(this.value == ""){
+ this.value = "on";
+ }
+ this.inherited(arguments);
+ },
+
+ 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
new file mode 100644
index 000000000..419e28c54
--- /dev/null
+++ b/lib/dijit/form/_ComboBoxMenu.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js
new file mode 100644
index 000000000..e46db28ed
--- /dev/null
+++ b/lib/dijit/form/_ComboBoxMenu.js.uncompressed.js
@@ -0,0 +1,138 @@
+define("dijit/form/_ComboBoxMenu", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-construct", // domConstruct.create
+ "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, domConstruct, domStyle, keys,
+ _WidgetBase, _TemplatedMixin, _ComboBoxMenuMixin, _ListMouseMixin){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _ComboBoxMenuMixin = dijit.form._ComboBoxMenuMixin;
+ var _ListMouseMixin = dijit.form._ListMouseMixin;
+=====*/
+
+ // module:
+ // dijit/form/_ComboBoxMenu
+ // summary:
+ // Focus-less menu for internal use in `dijit.form.ComboBox`
+
+ 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;'>"
+ +"<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(){
+ return domConstruct.create("div", {
+ "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"),
+ role: "option"
+ });
+ },
+
+ 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.charOrCode){
+ 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
new file mode 100644
index 000000000..1dd299902
--- /dev/null
+++ b/lib/dijit/form/_ComboBoxMenuMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js
new file mode 100644
index 000000000..826f0a1fb
--- /dev/null
+++ b/lib/dijit/form/_ComboBoxMenuMixin.js.uncompressed.js
@@ -0,0 +1,191 @@
+define("dijit/form/_ComboBoxMenuMixin", [
+ "dojo/_base/array", // array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/i18n", // i18n.getLocalization
+ "dojo/_base/window", // win.doc.createTextNode
+ "dojo/i18n!./nls/ComboBox"
+], function(array, declare, domAttr, i18n, win){
+
+// module:
+// dijit/form/_ComboBoxMenuMixin
+// summary:
+// Focus-less menu for internal use in `dijit.form.ComboBox`
+
+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(
+ win.doc.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 || ""));
+
+ menuitem.item=item;
+ 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
+
+ // 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);
+ 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");
+ return this.containerNode.childNodes;
+ },
+
+ 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._getSelectedAttr();
+ }
+});
+
+});
diff --git a/lib/dijit/form/_DateTimeTextBox.js b/lib/dijit/form/_DateTimeTextBox.js
index 9d5c004c8..b79008509 100644
--- a/lib/dijit/form/_DateTimeTextBox.js
+++ b/lib/dijit/form/_DateTimeTextBox.js
@@ -1,250 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._DateTimeTextBox"] = true;
-dojo.provide("dijit.form._DateTimeTextBox");
-dojo.require("dojo.date");
-dojo.require("dojo.date.locale");
-dojo.require("dojo.date.stamp");
-dojo.require("dijit.form.ValidationTextBox");
-dojo.require("dijit._HasDropDown");
-
-
-new Date("X"); // workaround for #11279, new Date("") == NaN
-
-/*=====
-dojo.declare(
- "dijit.form._DateTimeTextBox.__Constraints",
- [dijit.form.RangeBoundTextBox.__Constraints, dojo.date.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'}
-});
-=====*/
-
-dojo.declare(
- "dijit.form._DateTimeTextBox",
- [ dijit.form.RangeBoundTextBox, dijit._HasDropDown ],
- {
- // summary:
- // Base class for validating, serializable, range-bound date or time text box.
-
- templateString: dojo.cache("dijit.form", "templates/DropDownBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"_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\tdojoAttachPoint=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"),
-
- // hasDownArrow: [const] Boolean
- // Set this textbox to display a down arrow button, to open the drop down list.
- hasDownArrow: true,
-
- // openOnClick: [const] Boolean
- // Set to true to open drop down upon clicking anywhere on the textbox.
- openOnClick: true,
-
- /*=====
- // constraints: dijit.form._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.regExpGen().... we use a reg-ex generating function rather
- // than a straight regexp to deal with locale (plus formatting options too?)
- regExpGen: dojo.date.locale.regexp,
-
- // datePackage: String
- // JavaScript namespace to find calendar routines. Uses Gregorian calendar routines
- // at dojo.date, by default.
- datePackage: "dojo.date",
-
- // 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 : dojo.date.compare(val1, val2, this._selector));
- },
-
- // flag to _HasDropDown to make drop down Calendar width == <input> width
- forceWidth: true,
-
- format: function(/*Date*/ value, /*dojo.date.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, /*dojo.date.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 dojo.date.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(/*Object*/ args){
- var dateClass = args.datePackage ? args.datePackage + ".Date" : "Date";
- this.dateClassObj = dojo.getObject(dateClass, false);
- this.value = new this.dateClassObj("");
-
- this.datePackage = args.datePackage || this.datePackage;
- this.dateLocaleModule = dojo.getObject(this.datePackage + ".locale", false);
- this.regExpGen = this.dateLocaleModule.regexp;
- this._invalidDate = dijit.form._DateTimeTextBox.prototype.value.toString();
- },
-
- buildRendering: function(){
- this.inherited(arguments);
-
- if(!this.hasDownArrow){
- this._buttonNode.style.display = "none";
- }
-
- // If openOnClick is true, we basically just want to treat the whole widget as the
- // button. We need to do that also if the actual drop down button will be hidden,
- // so that there's a mouse method for opening the drop down.
- if(this.openOnClick || !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 = dojo.date.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 = dojo.date.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.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 = dojo.getObject(this.popupClass, false),
- 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
- dijit.form._DateTimeTextBox.superclass._setValueAttr.call(textBox, 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.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);
- }
- }
-);
-
-}
+//>>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
diff --git a/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js
new file mode 100644
index 000000000..980c5ff21
--- /dev/null
+++ b/lib/dijit/form/_DateTimeTextBox.js.uncompressed.js
@@ -0,0 +1,262 @@
+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", // 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){
+
+/*=====
+ var _HasDropDown = dijit._HasDropDown;
+ var RangeBoundTextBox = dijit.form.RangeBoundTextBox;
+=====*/
+
+ // module:
+ // dijit/form/_DateTimeTextBox
+ // summary:
+ // Base class for validating, serializable, range-bound date or time text box.
+
+
+ new Date("X"); // workaround for #11279, new Date("") == NaN
+
+ /*=====
+ declare(
+ "dijit.form._DateTimeTextBox.__Constraints",
+ [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'}
+ });
+ =====*/
+
+ 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,
+
+ // openOnClick: [const] Boolean
+ // Set to true to open drop down upon clicking anywhere on the textbox.
+ openOnClick: true,
+
+ /*=====
+ // constraints: dijit.form._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.regExpGen().... we use a reg-ex generating function rather
+ // than a straight regexp to deal with locale (plus formatting options too?)
+ regExpGen: locale.regexp,
+
+ // datePackage: String
+ // JavaScript namespace to find calendar routines. Uses Gregorian calendar routines
+ // at dojo.date, by default.
+ datePackage: date,
+
+ 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, /*dojo.date.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, /*dojo.date.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(/*Object*/ args){
+ this.datePackage = args.datePackage || this.datePackage;
+ this.dateFuncObj = typeof this.datePackage == "string" ?
+ lang.getObject(this.datePackage, false) :// "string" part for back-compat, remove for 2.0
+ this.datePackage;
+ this.dateClassObj = this.dateFuncObj.Date || Date;
+ this.dateLocaleModule = lang.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 openOnClick is true, we basically just want to treat the whole widget as the
+ // button. We need to do that also if the actual drop down button will be hidden,
+ // so that there's a mouse method for opening the drop down.
+ if(this.openOnClick || !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.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);
+ }
+ });
+
+ return _DateTimeTextBox;
+});
diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js b/lib/dijit/form/_ExpandingTextAreaMixin.js
new file mode 100644
index 000000000..d5071e7ca
--- /dev/null
+++ b/lib/dijit/form/_ExpandingTextAreaMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js
new file mode 100644
index 000000000..c06656863
--- /dev/null
+++ b/lib/dijit/form/_ExpandingTextAreaMixin.js.uncompressed.js
@@ -0,0 +1,127 @@
+define("dijit/form/_ExpandingTextAreaMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-construct", // domConstruct.create
+ "dojo/_base/lang", // lang.hitch
+ "dojo/_base/window" // win.body
+], function(declare, domConstruct, lang, win){
+
+ // module:
+ // dijit/form/_ExpandingTextAreaMixin
+ // summary:
+ // Mixin for textarea widgets to add auto-expanding capability
+
+ // feature detection
+ var 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;
+
+ if(needsHelpShrinking == undefined){
+ var te = domConstruct.create('textarea', {rows:"5", cols:"20", value: ' ', style: {zoom:1, overflow:'hidden', visibility:'hidden', position:'absolute', border:"0px solid black", padding:"0px"}}, win.body(), "last");
+ needsHelpShrinking = te.scrollHeight >= te.clientHeight;
+ win.body().removeChild(te);
+ }
+ this.connect(textarea, "onscroll", "_resizeLater");
+ this.connect(textarea, "onresize", "_resizeLater");
+ this.connect(textarea, "onfocus", "_resizeLater");
+ textarea.style.overflowY = "hidden";
+ this._estimateHeight();
+ 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;
+ textarea.style.height = "auto";
+ // #rows = #newlines+1
+ // Note: on Moz, the following #rows appears to be 1 too many.
+ // Actually, Moz is reserving room for the scrollbar.
+ // If you increase the font size, this behavior becomes readily apparent as the last line gets cut off without the +1.
+ textarea.rows = (textarea.value.match(/\n/g) || []).length + 2;
+ },
+
+ _resizeLater: function(){
+ this.defer("resize");
+ },
+
+ resize: function(){
+ // summary:
+ // Resizes the textarea vertically (should be called after a style/value change)
+ function textareaScrollHeight(){
+ var empty = false;
+ if(textarea.value === ''){
+ textarea.value = ' ';
+ empty = true;
+ }
+ var sh = textarea.scrollHeight;
+ if(empty){ textarea.value = ''; }
+ return sh;
+ }
+
+ var textarea = this.textbox;
+ if(textarea.style.overflowY == "hidden"){ textarea.scrollTop = 0; }
+ if(this.busyResizing){ return; }
+ this.busyResizing = true;
+ if(textareaScrollHeight() || textarea.offsetHeight){
+ var currentHeight = textarea.style.height;
+ if(!(/px/.test(currentHeight))){
+ currentHeight = textareaScrollHeight();
+ textarea.rows = 1;
+ textarea.style.height = currentHeight + "px";
+ }
+ var newH = Math.max(Math.max(textarea.offsetHeight, parseInt(currentHeight)) - textarea.clientHeight, 0) + textareaScrollHeight();
+ var newHpx = newH + "px";
+ if(newHpx != textarea.style.height){
+ textarea.rows = 1;
+ textarea.style.height = newHpx;
+ }
+ if(needsHelpShrinking){
+ var origScrollHeight = textareaScrollHeight(),
+ newScrollHeight = origScrollHeight,
+ origMinHeight = textarea.style.minHeight,
+ decrement = 4, // not too fast, not too slow
+ thisScrollHeight;
+ 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.style.overflowY = textareaScrollHeight() > textarea.clientHeight ? "auto" : "hidden";
+ }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 e42702d31..770ec2471 100644
--- a/lib/dijit/form/_FormMixin.js
+++ b/lib/dijit/form/_FormMixin.js
@@ -1,461 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form._FormMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._FormMixin"] = true;
-dojo.provide("dijit.form._FormMixin");
-dojo.require("dojo.window");
-
-
-dojo.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}, ...])
- //
- //
-
- reset: function(){
- dojo.forEach(this.getDescendants(), 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 dojo.every(dojo.map(this.getDescendants(), 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
- dojo.window.scrollIntoView(widget.containerNode || widget.domNode);
- widget.focus();
- didFocus = true;
- }
- return valid;
- }), function(item){ return item; });
- },
-
- setValues: function(val){
- dojo.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 = { };
- dojo.forEach(this.getDescendants(), 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 = dojo.getObject(name, false, obj); // list of values for those widgets
-
- if(values === undefined){
- continue;
- }
- if(!dojo.isArray(values)){
- values = [ values ];
- }
- if(typeof widgets[0].checked == 'boolean'){
- // for checkbox/radio, values is a list of which widgets should be checked
- dojo.forEach(widgets, function(w, i){
- w.set('value', dojo.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
- dojo.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)
-
- dojo.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) &&
- dojo.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;
- dojo.forEach(element.options, function(option){
- option.selected = dojo.some(myObj[name], function(val){ return option.value == val; });
- });
- break;
- case "select-one":
- element.selectedIndex="0";
- dojo.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(){
- dojo.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 setTimout(..., 0) 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 = { };
- dojo.forEach(this.getDescendants(), 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){
- dojo.setObject(name, value, obj);
- }else{
- // give radio widgets a default of null
- value = dojo.getObject(name, false, obj);
- if(value === undefined){
- dojo.setObject(name, null, obj);
- }
- }
- }else{
- // checkbox/toggle button
- var ary=dojo.getObject(name, false, obj);
- if(!ary){
- ary=[];
- dojo.setObject(name, ary, obj);
- }
- if(value !== false){
- ary.push(value);
- }
- }
- }else{
- var prev=dojo.getObject(name, false, obj);
- if(typeof prev != "undefined"){
- if(dojo.isArray(prev)){
- prev.push(value);
- }else{
- dojo.setObject(name, [prev, value], obj);
- }
- }else{
- // unique name
- dojo.setObject(name, value, obj);
- }
- }
- });
-
- /***
- * code for plain input boxes (see also dojo.formToObject, can we use that instead of this code?
- * but it doesn't understand [] notation, presumably)
- var obj = { };
- dojo.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(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 = dojo.map(this._descendants, function(w){
- return w.get("state") || "";
- });
-
- return dojo.indexOf(states, "Error") >= 0 ? "Error" :
- dojo.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : "";
- },
-
- disconnectChildren: function(){
- // summary:
- // Remove connections to monitor changes to children's value, error state, and disabled state,
- // in order to update Form.value and Form.state.
- dojo.forEach(this._childConnections || [], dojo.hitch(this, "disconnect"));
- dojo.forEach(this._childWatches || [], function(w){ w.unwatch(); });
- },
-
- connectChildren: function(/*Boolean*/ inStartup){
- // summary:
- // Setup connections to monitor changes to children's value, error state, and disabled state,
- // in order to update Form.value and Form.state.
- //
- // 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.
-
- var _this = this;
-
- // Remove old connections, if any
- this.disconnectChildren();
-
- this._descendants = this.getDescendants();
-
- // (Re)set this.value and this.state. Send watch() notifications but not on startup.
- var set = inStartup ? function(name, val){ _this[name] = val; } : dojo.hitch(this, "_set");
- set("value", this.get("value"));
- set("state", this._getState());
-
- // Monitor changes to error state and disabled state in order to update
- // Form.state
- var conns = (this._childConnections = []),
- watches = (this._childWatches = []);
- dojo.forEach(dojo.filter(this._descendants,
- function(item){ return item.validate; }
- ),
- function(widget){
- // We are interested in whenever the widget changes validity state - or
- // whenever the disabled attribute on that widget is changed.
- dojo.forEach(["state", "disabled"], function(attr){
- watches.push(widget.watch(attr, function(attr, oldVal, newVal){
- _this.set("state", _this._getState());
- }));
- });
- });
-
- // And monitor calls to child.onChange so we can update this.value
- var onChange = function(){
- // summary:
- // Called when child's value or disabled state changes
-
- // Use setTimeout() 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(_this._onChangeDelayTimer){
- clearTimeout(_this._onChangeDelayTimer);
- }
- _this._onChangeDelayTimer = setTimeout(function(){
- delete _this._onChangeDelayTimer;
- _this._set("value", _this.get("value"));
- }, 10);
- };
- dojo.forEach(
- dojo.filter(this._descendants, function(item){ return item.onChange; } ),
- function(widget){
- // When a child widget's value changes,
- // the efficient thing to do is to just update that one attribute in this.value,
- // but that gets a little complicated when a checkbox is checked/unchecked
- // since this.value["checkboxName"] contains an array of all the checkboxes w/the same name.
- // Doing simple thing for now.
- conns.push(_this.connect(widget, "onChange", onChange));
-
- // Disabling/enabling a child widget should remove it's value from this.value.
- // Again, this code could be more efficient, doing simple thing for now.
- watches.push(widget.watch("disabled", onChange));
- }
- );
- },
-
- startup: function(){
- this.inherited(arguments);
-
- // Initialize value and valid/invalid state tracking. Needs to be done in startup()
- // so that children are initialized.
- this.connectChildren(true);
-
- // Make state change call onValidStateChange(), will be removed in 2.0
- this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); });
- },
-
- destroy: function(){
- this.disconnectChildren();
- this.inherited(arguments);
- }
-
- });
-
-}
+//>>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
diff --git a/lib/dijit/form/_FormMixin.js.uncompressed.js b/lib/dijit/form/_FormMixin.js.uncompressed.js
new file mode 100644
index 000000000..1eb7aa2b2
--- /dev/null
+++ b/lib/dijit/form/_FormMixin.js.uncompressed.js
@@ -0,0 +1,475 @@
+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/window" // winUtils.scrollIntoView
+], function(array, declare, kernel, lang, winUtils){
+
+ // module:
+ // dijit/form/_FormMixin
+ // 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)
+
+ 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 setTimeout(..., 0) 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:
+ // Remove connections to monitor changes to children's value, error state, and disabled state,
+ // in order to update Form.value and Form.state.
+ array.forEach(this._childConnections || [], lang.hitch(this, "disconnect"));
+ array.forEach(this._childWatches || [], function(w){ w.unwatch(); });
+ },
+
+ connectChildren: function(/*Boolean*/ inStartup){
+ // summary:
+ // Setup connections to monitor changes to children's value, error state, and disabled state,
+ // in order to update Form.value and Form.state.
+ //
+ // 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.
+
+ var _this = this;
+
+ // Remove old connections, if any
+ this.disconnectChildren();
+
+ this._descendants = this._getDescendantFormWidgets();
+
+ // (Re)set this.value and this.state. Send watch() notifications but not on startup.
+ var set = inStartup ? function(name, val){ _this[name] = val; } : lang.hitch(this, "_set");
+ set("value", this.get("value"));
+ set("state", this._getState());
+
+ // Monitor changes to error state and disabled state in order to update
+ // Form.state
+ var conns = (this._childConnections = []),
+ watches = (this._childWatches = []);
+ array.forEach(array.filter(this._descendants,
+ function(item){ return item.validate; }
+ ),
+ function(widget){
+ // We are interested in whenever the widget changes validity state - or
+ // whenever the disabled attribute on that widget is changed.
+ array.forEach(["state", "disabled"], function(attr){
+ watches.push(widget.watch(attr, function(){
+ _this.set("state", _this._getState());
+ }));
+ });
+ });
+
+ // And monitor calls to child.onChange so we can update this.value
+ var onChange = function(){
+ // summary:
+ // Called when child's value or disabled state changes
+
+ // Use setTimeout() 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(_this._onChangeDelayTimer){
+ clearTimeout(_this._onChangeDelayTimer);
+ }
+ _this._onChangeDelayTimer = setTimeout(function(){
+ delete _this._onChangeDelayTimer;
+ _this._set("value", _this.get("value"));
+ }, 10);
+ };
+ array.forEach(
+ array.filter(this._descendants, function(item){ return item.onChange; } ),
+ function(widget){
+ // When a child widget's value changes,
+ // the efficient thing to do is to just update that one attribute in this.value,
+ // but that gets a little complicated when a checkbox is checked/unchecked
+ // since this.value["checkboxName"] contains an array of all the checkboxes w/the same name.
+ // Doing simple thing for now.
+ conns.push(_this.connect(widget, "onChange", onChange));
+
+ // Disabling/enabling a child widget should remove it's value from this.value.
+ // Again, this code could be more efficient, doing simple thing for now.
+ watches.push(widget.watch("disabled", onChange));
+ }
+ );
+ },
+
+ startup: function(){
+ this.inherited(arguments);
+
+ // Initialize value and valid/invalid state tracking. Needs to be done in startup()
+ // so that children are initialized.
+ this.connectChildren(true);
+
+ // Make state change call onValidStateChange(), will be removed in 2.0
+ this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); });
+ },
+
+ destroy: function(){
+ this.disconnectChildren();
+ this.inherited(arguments);
+ }
+
+ });
+});
diff --git a/lib/dijit/form/_FormSelectWidget.js b/lib/dijit/form/_FormSelectWidget.js
index fbbf7226b..994bc940b 100644
--- a/lib/dijit/form/_FormSelectWidget.js
+++ b/lib/dijit/form/_FormSelectWidget.js
@@ -1,582 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form._FormSelectWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._FormSelectWidget"] = true;
-dojo.provide("dijit.form._FormSelectWidget");
-dojo.require("dijit.form._FormWidget");
-dojo.require("dojo.data.util.sorter");
-
-
-/*=====
-dijit.form.__SelectOption = function(){
- // 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
- this.value = value;
- this.label = label;
- this.selected = selected;
- this.disabled = disabled;
-}
-=====*/
-
-dojo.declare("dijit.form._FormSelectWidget", dijit.form._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: dijit.form.__SelectOption[]
- // The set of options for our select item. Roughly corresponds to
- // the html <option> tag.
- options: null,
-
- // store: dojo.data.api.Identity
- // A store which, at the very least impelements dojo.data.api.Identity
- // to use for getting our list of options - rather than reading them
- // from the <option> html tags.
- 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,
-
- // onFetch: Function
- // A callback to do with an onFetch - but before any items are actually
- // iterated over (i.e. to filter even futher 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,
-
- 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.__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.__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.__SelectOption is passed in which is not a part of the select
-
- // NOTE: the compare for passing in a dijit.form.__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; // dijit.form.__SelectOption[]
- }
- if(dojo.isArray(lookupValue)){
- return dojo.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__SelectOption[]
- }
- if(dojo.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(!dojo.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] // dijit.form.__SelectOption
- }
- return null; // null
- },
-
- addOption: function(/*dijit.form.__SelectOption|dijit.form.__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(!dojo.isArray(option)){ option = [option]; }
- dojo.forEach(option, function(i){
- if(i && dojo.isObject(i)){
- this.options.push(i);
- }
- }, this);
- this._loadChildren();
- },
-
- removeOption: function(/*String|dijit.form.__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(!dojo.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; }
- var oldOpts = this.getOptions(valueOrIdx);
- dojo.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 = dojo.filter(this.options, function(node, idx){
- return (node.value !== i.value || node.label !== i.label);
- });
- this._removeOptionItem(i);
- }
- }, this);
- this._loadChildren();
- },
-
- updateOption: function(/*dijit.form.__SelectOption|dijit.form.__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 yeild better performance since
- // the children will only be loaded once.
- if(!dojo.isArray(newOption)){ newOption = [newOption]; }
- dojo.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(/*dojo.data.api.Identity*/ store,
- /*anything?*/ selectedValue,
- /*Object?*/ 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.data.api.Identity
- // The store you would like to use - it MUST implement Identity,
- // and MAY implement Notification.
- // selectedValue: anything?
- // The value that this widget should set itself to *after* the store
- // has been loaded
- // fetchArgs: Object?
- // The arguments that will be passed to the store's fetch() function
- var oStore = this.store;
- fetchArgs = fetchArgs || {};
- if(oStore !== store){
- // Our store has changed, so update our notifications
- dojo.forEach(this._notifyConnections || [], dojo.disconnect);
- delete this._notifyConnections;
- if(store && store.getFeatures()["dojo.data.api.Notification"]){
- this._notifyConnections = [
- dojo.connect(store, "onNew", this, "_onNewItem"),
- dojo.connect(store, "onDelete", this, "_onDeleteItem"),
- dojo.connect(store, "onSet", this, "_onSetItem")
- ];
- }
- this._set("store", store);
- }
-
- // Turn off change notifications while we make all these changes
- this._onChangeActive = false;
-
- // Remove existing options (if there are any)
- if(this.options && this.options.length){
- this.removeOption(this.options);
- }
-
- // Add our new options
- if(store){
- this._loadingStore = true;
- store.fetch(dojo.delegate(fetchArgs, {
- onComplete: function(items, opts){
- if(this.sortByLabel && !fetchArgs.sort && items.length){
- items.sort(dojo.data.util.sorter.createSortFunction([{
- attribute: store.getLabelAttributes(items[0])[0]
- }], store));
- }
-
- if(fetchArgs.onFetch){
- items = fetchArgs.onFetch.call(this, items, opts);
- }
- // TODO: Add these guys as a batch, instead of separately
- dojo.forEach(items, function(i){
- this._addOptionForItem(i);
- }, this);
-
- // 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._fetchedWith = opts;
- this._lastValueReported = this.multiple ? [] : null;
- this._onChangeActive = true;
- this.onSetStore();
- this._handleOnChange(this.value);
- },
- scope: this
- }));
- }else{
- delete this._fetchedWith;
- }
- 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._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(!dojo.isArray(newValue)){
- newValue = [newValue];
- }
- dojo.forEach(newValue, function(i, idx){
- if(!dojo.isObject(i)){
- i = i + "";
- }
- if(typeof i === "string"){
- newValue[idx] = dojo.filter(opts, function(node){
- return node.value === i;
- })[0] || {value: "", label: ""};
- }
- }, this);
-
- // Make sure some sane default is set
- newValue = dojo.filter(newValue, function(i){ return i && i.value; });
- if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){
- newValue[0] = opts[0];
- }
- dojo.forEach(opts, function(i){
- i.selected = dojo.some(newValue, function(v){ return v.value === i.value; });
- });
- var val = dojo.map(newValue, function(i){ return i.value; }),
- disp = dojo.map(newValue, function(i){ return i.label; });
-
- this._set("value", this.multiple ? val : val[0]);
- this._setDisplay(this.multiple ? disp : disp[0]);
- this._updateSelection();
- this._handleOnChange(this.value, priorityChange);
- },
-
- _getDisplayedValueAttr: function(){
- // summary:
- // returns the displayed value of the widget
- var val = this.get("value");
- if(!dojo.isArray(val)){
- val = [val];
- }
- var ret = dojo.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; }
- dojo.forEach(this._getChildren(), function(child){
- child.destroyRecursive();
- });
- // Add each menu item
- dojo.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(!dojo.isArray(val)){
- val = [val];
- }
- if(val && val[0]){
- dojo.forEach(this._getChildren(), function(child){
- var isSelected = dojo.some(val, function(v){
- return child.option && (v === child.option.value);
- });
- dojo.toggleClass(child.domNode, this.baseClass + "SelectedOption", isSelected);
- dijit.setWaiState(child.domNode, "selected", isSelected);
- }, 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 = dojo.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 dojo.map(dojo.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. If the item contains
- // children, the children value of the item will be set
- var store = this.store, label = store.getLabel(item),
- value = (label ? store.getIdentity(item) : null);
- return {value: value, label: label, item:item}; // dijit.form.__SelectOption
- },
-
- _addOptionForItem: function(/*item*/ item){
- // summary:
- // Creates (and adds) the option for the given item
- var store = this.store;
- if(!store.isItemLoaded(item)){
- // We are not loaded - so let's load it and add later
- store.loadItem({item: item, onComplete: function(i){
- this._addOptionForItem(item);
- },
- scope: this});
- return;
- }
- var newOpt = this._getOptionObjForItem(item);
- this.addOption(newOpt);
- },
-
- constructor: function(/*Object*/ keywordArgs){
- // summary:
- // 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 = (keywordArgs || {}).value || null;
- },
-
- buildRendering: function(){
- this.inherited(arguments);
- dojo.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.
- var opts = this.options;
- if(!opts){
- opts = this.options = this.srcNodeRef ? dojo.query(">",
- this.srcNodeRef).map(function(node){
- if(node.getAttribute("type") === "separator"){
- return { value: "", label: "", selected: false, disabled: false };
- }
- return {
- value: (node.getAttribute("data-" + dojo._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");
- this.connect(this, "startup", "_loadChildren");
-
- this._setValueAttr(this.value, null);
- },
-
- startup: function(){
- // summary:
- // Connects in our store, if we have one defined
- this.inherited(arguments);
- var store = this.store, fetchArgs = {};
- dojo.forEach(["query", "queryOptions", "onFetch"], function(i){
- if(this[i]){
- fetchArgs[i] = this[i];
- }
- delete this[i];
- }, this);
- if(store && 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, fetchArgs);
- }
- },
-
- destroy: function(){
- // summary:
- // Clean up our connections
- dojo.forEach(this._notifyConnections || [], dojo.disconnect);
- this.inherited(arguments);
- },
-
- _addOptionItem: function(/*dijit.form.__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(/*dijit.form.__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
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/_FormSelectWidget.js.uncompressed.js b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js
new file mode 100644
index 000000000..ade84035c
--- /dev/null
+++ b/lib/dijit/form/_FormSelectWidget.js.uncompressed.js
@@ -0,0 +1,595 @@
+define("dijit/form/_FormSelectWidget", [
+ "dojo/_base/array", // array.filter array.forEach array.map array.some
+ "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
+ "./_FormValueWidget"
+], function(array, aspect, sorter, declare, dom, domClass, kernel, lang, query, _FormValueWidget){
+
+/*=====
+ var _FormValueWidget = dijit.form._FormValueWidget;
+=====*/
+
+// module:
+// dijit/form/_FormSelectWidget
+// summary:
+// Extends _FormValueWidget in order to provide "select-specific"
+// values - i.e., those values that are unique to <select> elements.
+
+
+/*=====
+dijit.form.__SelectOption = function(){
+ // 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
+ this.value = value;
+ this.label = label;
+ this.selected = selected;
+ this.disabled = disabled;
+}
+=====*/
+
+return 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: dijit.form.__SelectOption[]
+ // The set of options for our select item. Roughly corresponds to
+ // the html <option> tag.
+ options: null,
+
+ // store: dojo.data.api.Identity
+ // A store which, at the very least implements dojo.data.api.Identity
+ // to use for getting our list of options - rather than reading them
+ // from the <option> html tags.
+ 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,
+
+ // 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,
+
+ 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.__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.__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.__SelectOption is passed in which is not a part of the select
+
+ // NOTE: the compare for passing in a dijit.form.__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; // dijit.form.__SelectOption[]
+ }
+ if(lang.isArray(lookupValue)){
+ return array.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__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]; // dijit.form.__SelectOption
+ }
+ return null; // null
+ },
+
+ addOption: function(/*dijit.form.__SelectOption|dijit.form.__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|dijit.form.__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(/*dijit.form.__SelectOption|dijit.form.__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(/*dojo.data.api.Identity*/ store,
+ /*anything?*/ selectedValue,
+ /*Object?*/ 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.data.api.Identity
+ // The store you would like to use - 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?
+ // The arguments that will be passed to the store's fetch() function
+ var oStore = this.store;
+ fetchArgs = fetchArgs || {};
+ if(oStore !== store){
+ // Our store has changed, so update our notifications
+ var h;
+ while(h = this._notifyConnections.pop()){ h.remove(); }
+
+ if(store && 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);
+ }
+
+ // Turn off change notifications while we make all these changes
+ this._onChangeActive = false;
+
+ // Remove existing options (if there are any)
+ if(this.options && this.options.length){
+ this.removeOption(this.options);
+ }
+
+ // Add our new options
+ if(store){
+ this._loadingStore = true;
+ store.fetch(lang.delegate(fetchArgs, {
+ onComplete: function(items, opts){
+ if(this.sortByLabel && !fetchArgs.sort && items.length){
+ items.sort(sorter.createSortFunction([{
+ attribute: store.getLabelAttributes(items[0])[0]
+ }], store));
+ }
+
+ if(fetchArgs.onFetch){
+ items = fetchArgs.onFetch.call(this, items, opts);
+ }
+ // TODO: Add these guys as a batch, instead of separately
+ array.forEach(items, function(i){
+ this._addOptionForItem(i);
+ }, this);
+
+ // 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._fetchedWith = opts;
+ this._lastValueReported = this.multiple ? [] : null;
+ this._onChangeActive = true;
+ this.onSetStore();
+ this._handleOnChange(this.value);
+ },
+ scope: this
+ }));
+ }else{
+ delete this._fetchedWith;
+ }
+ 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._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; });
+
+ this._set("value", this.multiple ? val : val[0]);
+ this._setDisplay(this.multiple ? disp : disp[0]);
+ this._updateSelection();
+ this._handleOnChange(this.value, priorityChange);
+ },
+
+ _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 + "SelectedOption", isSelected);
+ child.domNode.setAttribute("aria-selected", isSelected);
+ }, 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. If the item contains
+ // children, the children value of the item will be set
+ var store = this.store, label = store.getLabel(item),
+ value = (label ? store.getIdentity(item) : null);
+ return {value: value, label: label, item:item}; // dijit.form.__SelectOption
+ },
+
+ _addOptionForItem: function(/*item*/ item){
+ // summary:
+ // Creates (and adds) the option for the given item
+ var store = this.store;
+ if(!store.isItemLoaded(item)){
+ // We are not loaded - so let's load it and add later
+ store.loadItem({item: item, onItem: function(i){
+ this._addOptionForItem(i);
+ },
+ scope: this});
+ return;
+ }
+ var newOpt = this._getOptionObjForItem(item);
+ this.addOption(newOpt);
+ },
+
+ constructor: function(/*Object*/ keywordArgs){
+ // summary:
+ // 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 = (keywordArgs || {}).value || null;
+ this._notifyConnections = [];
+ },
+
+ 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.
+ var opts = this.options;
+ if(!opts){
+ opts = 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");
+ this.connect(this, "startup", "_loadChildren");
+
+ this._setValueAttr(this.value, null);
+ },
+
+ startup: function(){
+ // summary:
+ // Connects in our store, if we have one defined
+ this.inherited(arguments);
+ var store = this.store, fetchArgs = {};
+ array.forEach(["query", "queryOptions", "onFetch"], function(i){
+ if(this[i]){
+ fetchArgs[i] = this[i];
+ }
+ delete this[i];
+ }, this);
+ if(store && 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, fetchArgs);
+ }
+ },
+
+ destroy: function(){
+ // summary:
+ // Clean up our connections
+ var h;
+ while(h = this._notifyConnections.pop()){ h.remove(); }
+ this.inherited(arguments);
+ },
+
+ _addOptionItem: function(/*dijit.form.__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(/*dijit.form.__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
+ }
+});
+
+});
diff --git a/lib/dijit/form/_FormValueMixin.js b/lib/dijit/form/_FormValueMixin.js
new file mode 100644
index 000000000..46bb6c52d
--- /dev/null
+++ b/lib/dijit/form/_FormValueMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_FormValueMixin.js.uncompressed.js b/lib/dijit/form/_FormValueMixin.js.uncompressed.js
new file mode 100644
index 000000000..73a01b3fe
--- /dev/null
+++ b/lib/dijit/form/_FormValueMixin.js.uncompressed.js
@@ -0,0 +1,95 @@
+define("dijit/form/_FormValueMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.set
+ "dojo/keys", // keys.ESCAPE
+ "dojo/_base/sniff", // has("ie"), has("quirks")
+ "./_FormWidgetMixin"
+], function(declare, domAttr, keys, has, _FormWidgetMixin){
+
+/*=====
+ var _FormWidgetMixin = dijit.form._FormWidgetMixin;
+=====*/
+
+ // module:
+ // dijit/form/_FormValueMixin
+ // summary:
+ // Mixin for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values.
+
+ 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.focusNode.setAttribute("aria-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)){
+ var te;
+ if(has("ie") < 9 || (has("ie") && has("quirks"))){
+ e.preventDefault(); // default behavior needs to be stopped here since keypress is too late
+ te = document.createEventObject();
+ te.keyCode = keys.ESCAPE;
+ te.shiftKey = e.shiftKey;
+ e.srcElement.fireEvent('onkeypress', te);
+ }
+ }
+ }
+ });
+});
diff --git a/lib/dijit/form/_FormValueWidget.js b/lib/dijit/form/_FormValueWidget.js
new file mode 100644
index 000000000..276378577
--- /dev/null
+++ b/lib/dijit/form/_FormValueWidget.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_FormValueWidget.js.uncompressed.js b/lib/dijit/form/_FormValueWidget.js.uncompressed.js
new file mode 100644
index 000000000..01b5bbd7c
--- /dev/null
+++ b/lib/dijit/form/_FormValueWidget.js.uncompressed.js
@@ -0,0 +1,58 @@
+define("dijit/form/_FormValueWidget", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/sniff", // has("ie")
+ "./_FormWidget",
+ "./_FormValueMixin"
+], function(declare, has, _FormWidget, _FormValueMixin){
+
+/*=====
+var _FormWidget = dijit.form._FormWidget;
+var _FormValueMixin = dijit.form._FormValueMixin;
+=====*/
+
+// module:
+// dijit/form/_FormValueWidget
+// summary:
+// 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
+ setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any
+ }
+ );
+ })();
+ parent = parent.parentNode;
+ }
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/_FormWidget.js b/lib/dijit/form/_FormWidget.js
index ebd1cfb18..f7867b0c5 100644
--- a/lib/dijit/form/_FormWidget.js
+++ b/lib/dijit/form/_FormWidget.js
@@ -1,377 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form._FormWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._FormWidget"] = true;
-dojo.provide("dijit.form._FormWidget");
-dojo.require("dojo.window");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._CssStateMixin");
-
-
-dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
- {
- // 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._Widget.attr`.
- //
- // 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: String
- // Corresponds to the native HTML <input> element's attribute.
- type: "text",
-
- // tabIndex: Integer
- // Order fields are traversed when user hits the tab key
- tabIndex: "0",
-
- // 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,
-
- // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- value: "focusNode",
- id: "focusNode",
- tabIndex: "focusNode",
- alt: "focusNode",
- title: "focusNode"
- }),
-
- 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 attributeMap to set the name due to IE limitations, see #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);
- },
-
- postCreate: function(){
- this.inherited(arguments);
- this.connect(this.domNode, "onmousedown", "_onMouseDown");
- },
-
- _setDisabledAttr: function(/*Boolean*/ value){
- this._set("disabled", value);
- dojo.attr(this.focusNode, 'disabled', value);
- if(this.valueNode){
- dojo.attr(this.valueNode, 'disabled', value);
- }
- dijit.setWaiState(this.focusNode, "disabled", value);
-
- 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 : "focusNode";
- dojo.forEach(dojo.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){
- var node = this[attachPointName];
- // complex code because tabIndex=-1 on a <div> doesn't work on FF
- if(dojo.isWebKit || dijit.hasDefaultTabStop(node)){ // see #11064 about webkit bug
- node.setAttribute('tabIndex', "-1");
- }else{
- node.removeAttribute('tabIndex');
- }
- }, this);
- }else{
- if(this.tabIndex != ""){
- this.focusNode.setAttribute('tabIndex', this.tabIndex);
- }
- }
- },
-
- setDisabled: function(/*Boolean*/ disabled){
- // summary:
- // Deprecated. Use set('disabled', ...) instead.
- dojo.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0");
- this.set('disabled', disabled);
- },
-
- _onFocus: function(e){
- if(this.scrollOnFocus){
- dojo.window.scrollIntoView(this.domNode);
- }
- 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 && (dojo.style(this.domNode, "display") != "none");
- },
-
- focus: function(){
- // summary:
- // Put focus on this widget
- if(!this.disabled){
- dijit.focus(this.focusNode);
- }
- },
-
- 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){
- clearTimeout(this._onChangeHandle);
- }
- // setTimout allows hidden value processing to run and
- // also the onChange handler can safely adjust focus, etc
- this._onChangeHandle = setTimeout(dojo.hitch(this,
- function(){
- this._onChangeHandle = null;
- this.onChange(newValue);
- }), 0); // 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
- clearTimeout(this._onChangeHandle);
- this.onChange(this._lastValueReported);
- }
- this.inherited(arguments);
- },
-
- setValue: function(/*String*/ value){
- // summary:
- // Deprecated. Use set('value', ...) instead.
- dojo.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.
- dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0");
- return this.get('value');
- },
-
- _onMouseDown: function(e){
- // If user clicks on the button, even if the mouse is released outside of it,
- // this button should get focus (to mimics native browser buttons).
- // This is also needed on chrome because otherwise buttons won't get focus at all,
- // which leads to bizarre focus restore on Dialog close etc.
- if(!e.ctrlKey && dojo.mouseButtons.isLeft(e) && this.isFocusable()){ // !e.ctrlKey to ignore right-click on mac
- // 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(dojo.body(), "onmouseup", function(){
- if (this.isFocusable()) {
- this.focus();
- }
- this.disconnect(mouseUpConnector);
- });
- }
- }
-});
-
-dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
-{
- // 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.
- // TODO: unclear what that {value: ""} is for; FormWidget.attributeMap copies value to focusNode,
- // so maybe {value: ""} is so the value *doesn't* get copied to focusNode?
- // Seems like we really want value removed from attributeMap altogether
- // (although there's no easy way to do that now)
-
- // 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,
-
- attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
- value: "",
- readOnly: "focusNode"
- }),
-
- _setReadOnlyAttr: function(/*Boolean*/ value){
- dojo.attr(this.focusNode, 'readOnly', value);
- dijit.setWaiState(this.focusNode, "readonly", value);
- this._set("readOnly", value);
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ // 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 == dojo.keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){
- var te;
- if(dojo.isIE){
- e.preventDefault(); // default behavior needs to be stopped here since keypress is too late
- te = document.createEventObject();
- te.keyCode = dojo.keys.ESCAPE;
- te.shiftKey = e.shiftKey;
- e.srcElement.fireEvent('onkeypress', te);
- }
- }
- },
-
- _layoutHackIE7: function(){
- // summary:
- // Work around table sizing bugs on IE7 by forcing redraw
-
- if(dojo.isIE == 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(e){
- _this.disconnect(disconnectHandle); // only call once
- pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique
- setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any
- }
- );
- })();
- parent = parent.parentNode;
- }
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/_FormWidget.js.uncompressed.js b/lib/dijit/form/_FormWidget.js.uncompressed.js
new file mode 100644
index 000000000..f4a44fc79
--- /dev/null
+++ b/lib/dijit/form/_FormWidget.js.uncompressed.js
@@ -0,0 +1,79 @@
+define("dijit/form/_FormWidget", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/ready",
+ "../_Widget",
+ "../_CssStateMixin",
+ "../_TemplatedMixin",
+ "./_FormWidgetMixin"
+], function(declare, kernel, ready, _Widget, _CssStateMixin, _TemplatedMixin, _FormWidgetMixin){
+
+/*=====
+var _Widget = dijit._Widget;
+var _TemplatedMixin = dijit._TemplatedMixin;
+var _CssStateMixin = dijit._CssStateMixin;
+var _FormWidgetMixin = dijit.form._FormWidgetMixin;
+=====*/
+
+// module:
+// dijit/form/_FormWidget
+// summary:
+// FormWidget
+
+
+// Back compat w/1.6, remove for 2.0
+if(!kernel.isAsync){
+ 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._Widget.attr`.
+ //
+ // 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
new file mode 100644
index 000000000..d84fe9a2a
--- /dev/null
+++ b/lib/dijit/form/_FormWidgetMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js b/lib/dijit/form/_FormWidgetMixin.js.uncompressed.js
new file mode 100644
index 000000000..7900b6e28
--- /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/_base/sniff", // has("webkit")
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.scrollIntoView
+ "../a11y" // a11y.hasDefaultTabStop
+], function(array, declare, domAttr, domStyle, lang, mouse, has, win, winUtils, a11y){
+
+// module:
+// dijit/form/_FormWidgetMixin
+// 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.
+
+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._Widget.attr`.
+ //
+ // 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",
+
+ // tabIndex: Integer
+ // 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(win.body(), "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
new file mode 100644
index 000000000..1e0dee136
--- /dev/null
+++ b/lib/dijit/form/_ListBase.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_ListBase.js.uncompressed.js b/lib/dijit/form/_ListBase.js.uncompressed.js
new file mode 100644
index 000000000..c993c9d34
--- /dev/null
+++ b/lib/dijit/form/_ListBase.js.uncompressed.js
@@ -0,0 +1,123 @@
+define("dijit/form/_ListBase", [
+ "dojo/_base/declare", // declare
+ "dojo/window" // winUtils.scrollIntoView
+], function(declare, winUtils){
+
+// module:
+// dijit/form/_ListBase
+// summary:
+// Focus-less menu to handle UI events consistently
+
+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,
+
+ _getTarget: function(/*Event*/ evt){
+ var tgt = evt.target;
+ var container = this.containerNode;
+ if(tgt == container || tgt == this.domNode){ return null; }
+ while(tgt && tgt.parentNode != container){
+ // recurse to the top
+ tgt = tgt.parentNode;
+ }
+ return tgt;
+ },
+
+ 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._getSelectedAttr();
+ 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._getSelectedAttr();
+ 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._getSelectedAttr();
+ if(selectedNode){
+ this.onDeselect(selectedNode);
+ this.selected = null;
+ }
+ if(node && node.parentNode == this.containerNode){
+ this.selected = node;
+ winUtils.scrollIntoView(node);
+ this.onSelect(node);
+ }
+ }else if(node){
+ this.onSelect(node);
+ }
+ },
+
+ _getSelectedAttr: function(){
+ // summary:
+ // Returns the selected node.
+ var v = this.selected;
+ return (v && v.parentNode == this.containerNode) ? v : (this.selected = null);
+ }
+});
+
+});
diff --git a/lib/dijit/form/_ListMouseMixin.js b/lib/dijit/form/_ListMouseMixin.js
new file mode 100644
index 000000000..8c731e33c
--- /dev/null
+++ b/lib/dijit/form/_ListMouseMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_ListMouseMixin.js.uncompressed.js b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js
new file mode 100644
index 000000000..733a2a63f
--- /dev/null
+++ b/lib/dijit/form/_ListMouseMixin.js.uncompressed.js
@@ -0,0 +1,96 @@
+define("dijit/form/_ListMouseMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/touch",
+ "./_ListBase"
+], function(declare, event, touch, _ListBase){
+
+/*=====
+var _ListBase = dijit.form._ListBase;
+=====*/
+
+// module:
+// dijit/form/_ListMouseMixin
+// summary:
+// a mixin to handle mouse or touch events for a focus-less menu
+
+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.connect(this.domNode, touch.press, "_onMouseDown");
+ this.connect(this.domNode, touch.release, "_onMouseUp");
+ this.connect(this.domNode, "onmouseover", "_onMouseOver");
+ this.connect(this.domNode, "onmouseout", "_onMouseOut");
+ },
+
+ _onMouseDown: function(/*Event*/ evt){
+ event.stop(evt);
+ if(this._hoveredNode){
+ this.onUnhover(this._hoveredNode);
+ this._hoveredNode = null;
+ }
+ this._isDragging = true;
+ this._setSelectedAttr(this._getTarget(evt));
+ },
+
+ _onMouseUp: function(/*Event*/ evt){
+ event.stop(evt);
+ this._isDragging = false;
+ var selectedNode = this._getSelectedAttr();
+ var target = this._getTarget(evt);
+ 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 ====*/){
+ 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; // cancel in 1 second if no _onMouseOver fires
+ }
+ },
+
+ _onMouseOver: function(/*Event*/ evt){
+ if(this._cancelDrag){
+ var time = (new Date()).getTime();
+ if(time > this._cancelDrag){
+ this._isDragging = false;
+ }
+ this._cancelDrag = null;
+ }
+ var node = this._getTarget(evt);
+ if(!node){ return; }
+ if(this._hoveredNode != node){
+ if(this._hoveredNode){
+ this._onMouseOut({ target: this._hoveredNode });
+ }
+ if(node && node.parentNode == this.containerNode){
+ if(this._isDragging){
+ this._setSelectedAttr(node);
+ }else{
+ this._hoveredNode = node;
+ this.onHover(node);
+ }
+ }
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/form/_RadioButtonMixin.js b/lib/dijit/form/_RadioButtonMixin.js
new file mode 100644
index 000000000..a444f3bd1
--- /dev/null
+++ b/lib/dijit/form/_RadioButtonMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js
new file mode 100644
index 000000000..3ab34f226
--- /dev/null
+++ b/lib/dijit/form/_RadioButtonMixin.js.uncompressed.js
@@ -0,0 +1,70 @@
+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
+ "dojo/_base/window", // win.doc
+ "../registry" // registry.getEnclosingWidget
+], function(array, declare, domAttr, event, lang, query, win, registry){
+
+ // module:
+ // dijit/form/_RadioButtonMixin
+ // summary:
+ // Mixin to provide widget functionality for an HTML radio button
+
+ 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 || win.doc).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);
+ }
+ }));
+ }
+ },
+
+ _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/_Spinner.js b/lib/dijit/form/_Spinner.js
index 37750ffb7..10c6e14a2 100644
--- a/lib/dijit/form/_Spinner.js
+++ b/lib/dijit/form/_Spinner.js
@@ -1,128 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.form._Spinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._Spinner"] = true;
-dojo.provide("dijit.form._Spinner");
-dojo.require("dijit.form.ValidationTextBox");
-
-
-dojo.declare(
- "dijit.form._Spinner",
- dijit.form.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.
- // < 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: dojo.cache("dijit.form", "templates/Spinner.html", "<div class=\"dijit dijitReset dijitInlineTable 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\tdojoAttachPoint=\"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\tdojoAttachPoint=\"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' dojoAttachPoint=\"textbox,focusNode\" type=\"${type}\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\n\t\t\trole=\"spinbutton\" autocomplete=\"off\" ${!nameAttrSetting}\n\t/></div\n></div>\n"),
-
- baseClass: "dijitTextBox dijitSpinner",
-
- // Set classes like dijitUpArrowButtonHover or dijitDownArrowButtonActive depending on
- // mouse action over specified node
- cssStateNodes: {
- "upArrowNode": "dijitUpArrowButton",
- "downArrowNode": "dijitDownArrowButton"
- },
-
- adjust: function(/*Object*/ val, /*Number*/ 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.
- // 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);
- dijit.selectInputText(this.textbox, this.textbox.value.length);
- },
-
- _arrowReleased: function(/*Node*/ node){
- // summary:
- // Handler for arrow button or arrow key being released
- this._wheelTimer = null;
- if(this.disabled || this.readOnly){ return; }
- },
-
- _typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
- var inc=this.smallDelta;
- if(node == this.textbox){
- var k=dojo.keys;
- var key = evt.charOrCode;
- inc = (key == k.PAGE_UP || key == k.PAGE_DOWN) ? this.largeDelta : this.smallDelta;
- node = (key == k.UP_ARROW || key == k.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
-
- dojo.stopEvent(evt);
- // FIXME: Safari bubbles
-
- // be nice to DOH and scroll as much as the event says to
- var scrollAmount = evt.detail ? (evt.detail * -1) : (evt.wheelDelta / 120);
- if(scrollAmount !== 0){
- var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )];
-
- this._arrowPressed(node, scrollAmount, this.smallDelta);
-
- if(!this._wheelTimer){
- clearTimeout(this._wheelTimer);
- }
- this._wheelTimer = setTimeout(dojo.hitch(this,"_arrowReleased",node), 50);
- }
-
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- // extra listeners
- this.connect(this.domNode, !dojo.isMozilla ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
- this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout));
- this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout));
- this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout));
- this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout, this.minimumTimeout));
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/form/_Spinner.js.uncompressed.js b/lib/dijit/form/_Spinner.js.uncompressed.js
new file mode 100644
index 000000000..f2c4aac8f
--- /dev/null
+++ b/lib/dijit/form/_Spinner.js.uncompressed.js
@@ -0,0 +1,141 @@
+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/_base/sniff", // has("mozilla")
+ "dijit/typematic",
+ "./RangeBoundTextBox",
+ "dojo/text!./templates/Spinner.html",
+ "./_TextBoxMixin" // selectInputText
+], function(declare, event, keys, lang, has, typematic, RangeBoundTextBox, template, _TextBoxMixin){
+
+/*=====
+ var RangeBoundTextBox = dijit.form.RangeBoundTextBox;
+=====*/
+
+ // module:
+ // dijit/form/_Spinner
+ // summary:
+ // Mixin for validation widgets with a 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.
+ // < 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){
+ clearTimeout(this._wheelTimer);
+ }
+ this._wheelTimer = setTimeout(lang.hitch(this,"_arrowReleased",node), 50);
+ }
+
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // extra listeners
+ this.connect(this.domNode, !has("mozilla") ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+ this._connects.push(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));
+ this._connects.push(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));
+ this._connects.push(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));
+ this._connects.push(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
new file mode 100644
index 000000000..133074972
--- /dev/null
+++ b/lib/dijit/form/_TextBoxMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_TextBoxMixin.js.uncompressed.js b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js
new file mode 100644
index 000000000..5bf8b7f85
--- /dev/null
+++ b/lib/dijit/form/_TextBoxMixin.js.uncompressed.js
@@ -0,0 +1,408 @@
+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
+ ".." // for exporting dijit._setSelectionRange, dijit.selectInputText
+], function(array, declare, dom, event, keys, lang, dijit){
+
+// module:
+// dijit/form/_TextBoxMixin
+// summary:
+// A mixin for textbox form input widgets
+
+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 && formattedValue != 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 || value === 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 || value == 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(){
+ // 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._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 charCode = e.charOrCode || e.keyCode || 229;
+ if(e.type == "keydown"){
+ switch(charCode){ // ignore "state" keys
+ case keys.SHIFT:
+ case keys.ALT:
+ case keys.CTRL:
+ case keys.META:
+ case keys.CAPS_LOCK:
+ return;
+ default:
+ if(charCode >= 65 && charCode <= 90){ return; } // keydown for A-Z can be processed with keypress
+ }
+ }
+ if(e.type == "keypress" && typeof charCode != "string"){ return; }
+ 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 = lang.mixin({}, e, {
+ charOrCode: charCode,
+ wasConsumed: false,
+ preventDefault: function(){
+ faux.wasConsumed = true;
+ e.preventDefault();
+ },
+ stopPropagation: function(){ e.stopPropagation(); }
+ });
+ // give web page author a chance to consume the event
+ if(this.onInput(faux) === false){
+ event.stop(faux); // return false means stop
+ }
+ if(faux.wasConsumed){ return; } // if preventDefault was called
+ setTimeout(lang.hitch(this, "_onInput", faux), 0); // widget notification after key has posted
+ };
+ array.forEach([ "onkeydown", "onkeypress", "onpaste", "oncut", "oninput", "oncompositionend" ], function(event){
+ this.connect(this.textbox, event, handleEvent);
+ }, this);
+ },
+
+ _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);
+
+ if(this._selectOnClickHandle){
+ this.disconnect(this._selectOnClickHandle);
+ }
+ },
+
+ _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);
+
+ // 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);
+ }
+ });
+ }
+ // 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
new file mode 100644
index 000000000..bffb6a64d
--- /dev/null
+++ b/lib/dijit/form/_ToggleButtonMixin.js
@@ -0,0 +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
diff --git a/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js
new file mode 100644
index 000000000..d044fcc66
--- /dev/null
+++ b/lib/dijit/form/_ToggleButtonMixin.js.uncompressed.js
@@ -0,0 +1,51 @@
+define("dijit/form/_ToggleButtonMixin", [
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr" // domAttr.set
+], function(declare, domAttr){
+
+// module:
+// dijit/form/_ToggleButtonMixin
+// summary:
+// A mixin to provide functionality to allow a button that can be in two states (checked or not).
+
+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);
+ domAttr.set(this.focusNode || this.domNode, "checked", value);
+ (this.focusNode || this.domNode).setAttribute(this._aria_attr, value ? "true" : "false"); // 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 b/lib/dijit/form/nls/ComboBox.js
index 49bba39a0..b76d7e439 100644
--- a/lib/dijit/form/nls/ComboBox.js
+++ b/lib/dijit/form/nls/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Previous choices","nextMessage":"More choices"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ComboBox",{root:({previousMessage:"Previous choices",nextMessage:"More choices"}),"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}); \ No newline at end of file
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 b/lib/dijit/form/nls/Textarea.js
index 4b0e996ad..0363bc093 100644
--- a/lib/dijit/form/nls/Textarea.js
+++ b/lib/dijit/form/nls/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"edit area","iframeFocusTitle":"edit area frame"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/Textarea",{root:({iframeEditTitle:"edit area",iframeFocusTitle:"edit area frame"}),"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}); \ No newline at end of file
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 b/lib/dijit/form/nls/ar/ComboBox.js
index 6a8453183..10a1a7af0 100644
--- a/lib/dijit/form/nls/ar/ComboBox.js
+++ b/lib/dijit/form/nls/ar/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ar/ComboBox",({previousMessage:"الاختيارات السابقة",nextMessage:"مزيد من الاختيارات"})); \ No newline at end of file
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..a9a3200f2
--- /dev/null
+++ b/lib/dijit/form/nls/ar/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/ar/ComboBox", //begin v1.x content
+({
+ previousMessage: "الاختيارات السابقة",
+ nextMessage: "مزيد من الاختيارات"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ar/Textarea.js b/lib/dijit/form/nls/ar/Textarea.js
index fe623c694..6a3b426a8 100644
--- a/lib/dijit/form/nls/ar/Textarea.js
+++ b/lib/dijit/form/nls/ar/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"مساحة التحرير","iframeFocusTitle":"اطار مساحة التحرير"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ar/Textarea",({iframeEditTitle:"مساحة التحرير",iframeFocusTitle:"اطار مساحة التحرير"})); \ No newline at end of file
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..81201afe3
--- /dev/null
+++ b/lib/dijit/form/nls/ar/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/ar/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ar/validate.js b/lib/dijit/form/nls/ar/validate.js
index 615e56b35..73c17bf18 100644
--- a/lib/dijit/form/nls/ar/validate.js
+++ b/lib/dijit/form/nls/ar/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ar/validate",({invalidMessage:"القيمة التي تم ادخالها غير صحيحة.",missingMessage:"يجب ادخال هذه القيمة.",rangeMessage:"هذه القيمة ليس بالمدى الصحيح."})); \ No newline at end of file
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..fb023d28e
--- /dev/null
+++ b/lib/dijit/form/nls/ar/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ar/validate", //begin v1.x content
+({
+ invalidMessage: "القيمة التي تم ادخالها غير صحيحة.",
+ missingMessage: "يجب ادخال هذه القيمة.",
+ rangeMessage: "هذه القيمة ليس بالمدى الصحيح."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/az/ComboBox.js b/lib/dijit/form/nls/az/ComboBox.js
new file mode 100644
index 000000000..40eb2b91e
--- /dev/null
+++ b/lib/dijit/form/nls/az/ComboBox.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/nls/az/ComboBox",({"previousMessage":"Əvvəlki variantlar","nextMessage":"Başqa variantlar"})); \ No newline at end of file
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..e65e9e47b
--- /dev/null
+++ b/lib/dijit/form/nls/az/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/az/ComboBox", //begin v1.x content
+({
+ "previousMessage" : "Əvvəlki variantlar",
+ "nextMessage" : "Başqa variantlar"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/az/Textarea.js b/lib/dijit/form/nls/az/Textarea.js
new file mode 100644
index 000000000..d048287a6
--- /dev/null
+++ b/lib/dijit/form/nls/az/Textarea.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/nls/az/Textarea",({"iframeEditTitle":"Redaktə sahəsi","iframeFocusTitle":"Redaktə sahəsi çərçivəsi"})); \ No newline at end of file
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..6fd34894d
--- /dev/null
+++ b/lib/dijit/form/nls/az/Textarea.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/az/Textarea", //begin v1.x content
+({
+ "iframeEditTitle" : "Redaktə sahəsi",
+ "iframeFocusTitle" : "Redaktə sahəsi çərçivəsi"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/az/validate.js b/lib/dijit/form/nls/az/validate.js
new file mode 100644
index 000000000..c8e183452
--- /dev/null
+++ b/lib/dijit/form/nls/az/validate.js
@@ -0,0 +1,2 @@
+//>>built
+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ı."})); \ No newline at end of file
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..25d65cd7c
--- /dev/null
+++ b/lib/dijit/form/nls/az/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/az/validate", //begin v1.x content
+({
+ "rangeMessage" : "Bu dəyər aralıq xaricində.",
+ "invalidMessage" : "Girilən dəyər keçərli deyil.",
+ "missingMessage" : "Bu deyər lazımlı."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ca/ComboBox.js b/lib/dijit/form/nls/ca/ComboBox.js
index 1a3786881..4153bf7b6 100644
--- a/lib/dijit/form/nls/ca/ComboBox.js
+++ b/lib/dijit/form/nls/ca/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ca/ComboBox",({previousMessage:"Opcions anteriors",nextMessage:"Més opcions"})); \ No newline at end of file
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..6dd7f93d5
--- /dev/null
+++ b/lib/dijit/form/nls/ca/ComboBox.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ca/ComboBox", //begin v1.x content
+({
+ previousMessage: "Opcions anteriors",
+ nextMessage: "Més opcions"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ca/Textarea.js b/lib/dijit/form/nls/ca/Textarea.js
index 357f92389..fb64883e2 100644
--- a/lib/dijit/form/nls/ca/Textarea.js
+++ b/lib/dijit/form/nls/ca/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"àrea d'edició","iframeFocusTitle":"Marc de l'àrea d'edició"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ca/Textarea",({iframeEditTitle:"àrea d'edició",iframeFocusTitle:"Marc de l'àrea d'edició"})); \ No newline at end of file
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..af65a94dd
--- /dev/null
+++ b/lib/dijit/form/nls/ca/Textarea.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dijit/form/nls/ca/Textarea", //begin v1.x content
+/* 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
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ca/validate.js b/lib/dijit/form/nls/ca/validate.js
index a0a592ed6..5152362ae 100644
--- a/lib/dijit/form/nls/ca/validate.js
+++ b/lib/dijit/form/nls/ca/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"}) \ No newline at end of file
+//>>built
+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"})); \ No newline at end of file
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..93315bf7f
--- /dev/null
+++ b/lib/dijit/form/nls/ca/validate.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/ca/validate", //begin v1.x content
+({
+ invalidMessage: "El valor introduït no és vàlid",
+ missingMessage: "Aquest valor és necessari",
+ rangeMessage: "Aquest valor és fora de l'interval"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/cs/ComboBox.js b/lib/dijit/form/nls/cs/ComboBox.js
index 84e084139..e034c1a35 100644
--- a/lib/dijit/form/nls/cs/ComboBox.js
+++ b/lib/dijit/form/nls/cs/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Předchozí volby","nextMessage":"Další volby"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/cs/ComboBox",({previousMessage:"Předchozí volby",nextMessage:"Další volby"})); \ No newline at end of file
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..72727c73c
--- /dev/null
+++ b/lib/dijit/form/nls/cs/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/cs/ComboBox", //begin v1.x content
+({
+ previousMessage: "Předchozí volby",
+ nextMessage: "Další volby"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/cs/Textarea.js b/lib/dijit/form/nls/cs/Textarea.js
index 8a75ddc45..53bd01463 100644
--- a/lib/dijit/form/nls/cs/Textarea.js
+++ b/lib/dijit/form/nls/cs/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"oblast úprav","iframeFocusTitle":"rámec oblasti úprav"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/cs/Textarea",({iframeEditTitle:"oblast úprav",iframeFocusTitle:"rámec oblasti úprav"})); \ No newline at end of file
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..9c40ef6ec
--- /dev/null
+++ b/lib/dijit/form/nls/cs/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/cs/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/cs/validate.js b/lib/dijit/form/nls/cs/validate.js
index 7bb7b9e21..6323c21c3 100644
--- a/lib/dijit/form/nls/cs/validate.js
+++ b/lib/dijit/form/nls/cs/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/cs/validate",({invalidMessage:"Zadaná hodnota není platná.",missingMessage:"Tato hodnota je vyžadována.",rangeMessage:"Tato hodnota je mimo rozsah."})); \ No newline at end of file
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..3615adf5e
--- /dev/null
+++ b/lib/dijit/form/nls/cs/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/cs/validate", //begin v1.x content
+({
+ invalidMessage: "Zadaná hodnota není platná.",
+ missingMessage: "Tato hodnota je vyžadována.",
+ rangeMessage: "Tato hodnota je mimo rozsah."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/da/ComboBox.js b/lib/dijit/form/nls/da/ComboBox.js
index 4ddc10dce..3af927d82 100644
--- a/lib/dijit/form/nls/da/ComboBox.js
+++ b/lib/dijit/form/nls/da/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Forrige valg","nextMessage":"Flere valg"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/da/ComboBox",({previousMessage:"Forrige valg",nextMessage:"Flere valg"})); \ No newline at end of file
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..b73523524
--- /dev/null
+++ b/lib/dijit/form/nls/da/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/da/ComboBox", //begin v1.x content
+({
+ previousMessage: "Forrige valg",
+ nextMessage: "Flere valg"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/da/Textarea.js b/lib/dijit/form/nls/da/Textarea.js
index 244c2109f..50f298eea 100644
--- a/lib/dijit/form/nls/da/Textarea.js
+++ b/lib/dijit/form/nls/da/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme om redigeringsområde"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/da/Textarea",({iframeEditTitle:"redigeringsområde",iframeFocusTitle:"ramme om redigeringsområde"})); \ No newline at end of file
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..403f258c8
--- /dev/null
+++ b/lib/dijit/form/nls/da/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/da/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/da/validate.js b/lib/dijit/form/nls/da/validate.js
index b42a99d39..b29f9ccca 100644
--- a/lib/dijit/form/nls/da/validate.js
+++ b/lib/dijit/form/nls/da/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."}) \ No newline at end of file
+//>>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
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..57027fa9a
--- /dev/null
+++ b/lib/dijit/form/nls/da/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/da/validate", //begin v1.x content
+({
+ invalidMessage: "Den angivne værdi er ikke gyldig.",
+ missingMessage: "Værdien er påkrævet.",
+ rangeMessage: "Værdien er uden for intervallet."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/de/ComboBox.js b/lib/dijit/form/nls/de/ComboBox.js
index 6cce34bf5..6a3e1874d 100644
--- a/lib/dijit/form/nls/de/ComboBox.js
+++ b/lib/dijit/form/nls/de/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/de/ComboBox",({previousMessage:"Vorherige Auswahl",nextMessage:"Weitere Auswahlmöglichkeiten"})); \ No newline at end of file
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..4240e9ded
--- /dev/null
+++ b/lib/dijit/form/nls/de/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/de/ComboBox", //begin v1.x content
+({
+ previousMessage: "Vorherige Auswahl",
+ nextMessage: "Weitere Auswahlmöglichkeiten"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/de/Textarea.js b/lib/dijit/form/nls/de/Textarea.js
index 2cf75dbe6..f3f9abbf5 100644
--- a/lib/dijit/form/nls/de/Textarea.js
+++ b/lib/dijit/form/nls/de/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"Editierbereich","iframeFocusTitle":"Rahmen für Editierbereich"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/de/Textarea",({iframeEditTitle:"Editierbereich",iframeFocusTitle:"Rahmen für Editierbereich"})); \ No newline at end of file
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..c068e8904
--- /dev/null
+++ b/lib/dijit/form/nls/de/Textarea.js.uncompressed.js
@@ -0,0 +1,11 @@
+define(
+"dijit/form/nls/de/Textarea", //begin v1.x content
+/* 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/de/validate.js b/lib/dijit/form/nls/de/validate.js
index 597796d52..b5c3daefc 100644
--- a/lib/dijit/form/nls/de/validate.js
+++ b/lib/dijit/form/nls/de/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."}) \ No newline at end of file
+//>>built
+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. "})); \ No newline at end of file
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..0981eeeca
--- /dev/null
+++ b/lib/dijit/form/nls/de/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/de/validate", //begin v1.x content
+({
+ invalidMessage: "Der eingegebene Wert ist ungültig. ",
+ missingMessage: "Dieser Wert ist erforderlich.",
+ rangeMessage: "Dieser Wert liegt außerhalb des gültigen Bereichs. "
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/el/ComboBox.js b/lib/dijit/form/nls/el/ComboBox.js
index ec294d14b..9a7a223f7 100644
--- a/lib/dijit/form/nls/el/ComboBox.js
+++ b/lib/dijit/form/nls/el/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/el/ComboBox",({previousMessage:"Προηγούμενες επιλογές",nextMessage:"Περισσότερες επιλογές"})); \ No newline at end of file
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..f9c33c75d
--- /dev/null
+++ b/lib/dijit/form/nls/el/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/el/ComboBox", //begin v1.x content
+({
+ previousMessage: "Προηγούμενες επιλογές",
+ nextMessage: "Περισσότερες επιλογές"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/el/Textarea.js b/lib/dijit/form/nls/el/Textarea.js
index 9ce37a93c..4966a3615 100644
--- a/lib/dijit/form/nls/el/Textarea.js
+++ b/lib/dijit/form/nls/el/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"περιοχή επεξεργασίας","iframeFocusTitle":"πλαίσιο περιοχής επεξεργασίας"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/el/Textarea",({iframeEditTitle:"περιοχή επεξεργασίας",iframeFocusTitle:"πλαίσιο περιοχής επεξεργασίας"})); \ No newline at end of file
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..f39ae1d10
--- /dev/null
+++ b/lib/dijit/form/nls/el/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/el/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/el/validate.js b/lib/dijit/form/nls/el/validate.js
index cc57d55e4..18c54d5fe 100644
--- a/lib/dijit/form/nls/el/validate.js
+++ b/lib/dijit/form/nls/el/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/el/validate",({invalidMessage:"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.",missingMessage:"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί.",rangeMessage:"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών."})); \ No newline at end of file
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..e3b31baee
--- /dev/null
+++ b/lib/dijit/form/nls/el/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/el/validate", //begin v1.x content
+({
+ invalidMessage: "Η τιμή που καταχωρήσατε δεν είναι έγκυρη.",
+ missingMessage: "Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί.",
+ rangeMessage: "Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/es/ComboBox.js b/lib/dijit/form/nls/es/ComboBox.js
index 5bf69f988..20e8af158 100644
--- a/lib/dijit/form/nls/es/ComboBox.js
+++ b/lib/dijit/form/nls/es/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/es/ComboBox",({previousMessage:"Opciones anteriores",nextMessage:"Más opciones"})); \ No newline at end of file
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..408d0249b
--- /dev/null
+++ b/lib/dijit/form/nls/es/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/es/ComboBox", //begin v1.x content
+({
+ previousMessage: "Opciones anteriores",
+ nextMessage: "Más opciones"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/es/Textarea.js b/lib/dijit/form/nls/es/Textarea.js
index f92a50f65..2f9ff0da5 100644
--- a/lib/dijit/form/nls/es/Textarea.js
+++ b/lib/dijit/form/nls/es/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"área de edición","iframeFocusTitle":"marco del área de edición"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/es/Textarea",({iframeEditTitle:"área de edición",iframeFocusTitle:"marco del área de edición"})); \ No newline at end of file
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..a0b43a0b3
--- /dev/null
+++ b/lib/dijit/form/nls/es/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/es/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/es/validate.js b/lib/dijit/form/nls/es/validate.js
index 65e190ec5..4a3c5d8c3 100644
--- a/lib/dijit/form/nls/es/validate.js
+++ b/lib/dijit/form/nls/es/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..090112fd0
--- /dev/null
+++ b/lib/dijit/form/nls/es/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/es/validate", //begin v1.x content
+({
+ invalidMessage: "El valor especificado no es válido.",
+ missingMessage: "Este valor es necesario.",
+ rangeMessage: "Este valor está fuera del intervalo."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/fi/ComboBox.js b/lib/dijit/form/nls/fi/ComboBox.js
index 6d9b830a4..f1b726987 100644
--- a/lib/dijit/form/nls/fi/ComboBox.js
+++ b/lib/dijit/form/nls/fi/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/fi/ComboBox",({previousMessage:"Edelliset valinnat",nextMessage:"Lisää valintoja"})); \ No newline at end of file
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..daa672824
--- /dev/null
+++ b/lib/dijit/form/nls/fi/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/fi/ComboBox", //begin v1.x content
+({
+ previousMessage: "Edelliset valinnat",
+ nextMessage: "Lisää valintoja"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/fi/Textarea.js b/lib/dijit/form/nls/fi/Textarea.js
index 5efaee957..be863528d 100644
--- a/lib/dijit/form/nls/fi/Textarea.js
+++ b/lib/dijit/form/nls/fi/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"muokkausalue","iframeFocusTitle":"muokkausalueen kehys"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/fi/Textarea",({iframeEditTitle:"muokkausalue",iframeFocusTitle:"muokkausalueen kehys"})); \ No newline at end of file
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..b9d4383b4
--- /dev/null
+++ b/lib/dijit/form/nls/fi/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/fi/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/fi/validate.js b/lib/dijit/form/nls/fi/validate.js
index 276efcd29..4f897258f 100644
--- a/lib/dijit/form/nls/fi/validate.js
+++ b/lib/dijit/form/nls/fi/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..5b568bc18
--- /dev/null
+++ b/lib/dijit/form/nls/fi/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/fi/validate", //begin v1.x content
+({
+ invalidMessage: "Annettu arvo ei kelpaa.",
+ missingMessage: "Tämä arvo on pakollinen.",
+ rangeMessage: "Tämä arvo on sallitun alueen ulkopuolella."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/fr/ComboBox.js b/lib/dijit/form/nls/fr/ComboBox.js
index 14b39762d..5b17cf9d6 100644
--- a/lib/dijit/form/nls/fr/ComboBox.js
+++ b/lib/dijit/form/nls/fr/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Choix précédents","nextMessage":"Plus de choix"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/fr/ComboBox",({previousMessage:"Choix précédents",nextMessage:"Plus de choix"})); \ No newline at end of file
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..d5dfd7437
--- /dev/null
+++ b/lib/dijit/form/nls/fr/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/fr/ComboBox", //begin v1.x content
+({
+ previousMessage: "Choix précédents",
+ nextMessage: "Plus de choix"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/fr/Textarea.js b/lib/dijit/form/nls/fr/Textarea.js
index 4abb6c3e9..d959610b3 100644
--- a/lib/dijit/form/nls/fr/Textarea.js
+++ b/lib/dijit/form/nls/fr/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"zone d'édition","iframeFocusTitle":"cadre de la zone d'édition"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/fr/Textarea",({iframeEditTitle:"zone d'édition",iframeFocusTitle:"cadre de la zone d'édition"})); \ No newline at end of file
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..c5d32d7e4
--- /dev/null
+++ b/lib/dijit/form/nls/fr/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/fr/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/fr/validate.js b/lib/dijit/form/nls/fr/validate.js
index 95a016947..c5fecdcef 100644
--- a/lib/dijit/form/nls/fr/validate.js
+++ b/lib/dijit/form/nls/fr/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..cc4981ce2
--- /dev/null
+++ b/lib/dijit/form/nls/fr/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/fr/validate", //begin v1.x content
+({
+ 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."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/he/ComboBox.js b/lib/dijit/form/nls/he/ComboBox.js
index 169d0f5ad..49eed434b 100644
--- a/lib/dijit/form/nls/he/ComboBox.js
+++ b/lib/dijit/form/nls/he/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/he/ComboBox",({previousMessage:"האפשרויות הקודמות",nextMessage:"אפשרויות נוספות"})); \ No newline at end of file
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..907faf18b
--- /dev/null
+++ b/lib/dijit/form/nls/he/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/he/ComboBox", //begin v1.x content
+({
+ previousMessage: "האפשרויות הקודמות",
+ nextMessage: "אפשרויות נוספות"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/he/Textarea.js b/lib/dijit/form/nls/he/Textarea.js
index 809eadfa7..8276f545d 100644
--- a/lib/dijit/form/nls/he/Textarea.js
+++ b/lib/dijit/form/nls/he/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"אזור עריכה","iframeFocusTitle":"מסגרת אזור עריכה"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/he/Textarea",({iframeEditTitle:"אזור עריכה",iframeFocusTitle:"מסגרת אזור עריכה"})); \ No newline at end of file
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..92a762002
--- /dev/null
+++ b/lib/dijit/form/nls/he/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/he/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/he/validate.js b/lib/dijit/form/nls/he/validate.js
index 3d778e2c9..097e29c25 100644
--- a/lib/dijit/form/nls/he/validate.js
+++ b/lib/dijit/form/nls/he/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/he/validate",({invalidMessage:"הערך שצוין אינו חוקי.",missingMessage:"זהו ערך דרוש.",rangeMessage:"הערך מחוץ לטווח."})); \ No newline at end of file
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..c4121d1a7
--- /dev/null
+++ b/lib/dijit/form/nls/he/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/he/validate", //begin v1.x content
+({
+ invalidMessage: "הערך שצוין אינו חוקי.",
+ missingMessage: "זהו ערך דרוש.",
+ rangeMessage: "הערך מחוץ לטווח."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/hr/ComboBox.js b/lib/dijit/form/nls/hr/ComboBox.js
new file mode 100644
index 000000000..9b4e3c1c1
--- /dev/null
+++ b/lib/dijit/form/nls/hr/ComboBox.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/nls/hr/ComboBox",({previousMessage:"Prethodni izbori",nextMessage:"Više izbora"})); \ No newline at end of file
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 b/lib/dijit/form/nls/hr/Textarea.js
new file mode 100644
index 000000000..1b0e3e44f
--- /dev/null
+++ b/lib/dijit/form/nls/hr/Textarea.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/nls/hr/Textarea",({iframeEditTitle:"područje uređivanja",iframeFocusTitle:"okvir područja uređivanja"})); \ No newline at end of file
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 b/lib/dijit/form/nls/hr/validate.js
new file mode 100644
index 000000000..e32be74df
--- /dev/null
+++ b/lib/dijit/form/nls/hr/validate.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/form/nls/hr/validate",({invalidMessage:"Unesena vrijednost nije važeća.",missingMessage:"Potrebna je ova vrijednost.",rangeMessage:"Ova vrijednost je izvan raspona."})); \ No newline at end of file
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 b/lib/dijit/form/nls/hu/ComboBox.js
index 4b6a620ad..0ac77e96b 100644
--- a/lib/dijit/form/nls/hu/ComboBox.js
+++ b/lib/dijit/form/nls/hu/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/hu/ComboBox",({previousMessage:"Előző menüpontok",nextMessage:"További menüpontok"})); \ No newline at end of file
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..0ed25acfa
--- /dev/null
+++ b/lib/dijit/form/nls/hu/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/hu/ComboBox", //begin v1.x content
+({
+ previousMessage: "Előző menüpontok",
+ nextMessage: "További menüpontok"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/hu/Textarea.js b/lib/dijit/form/nls/hu/Textarea.js
index 9b4ca01a0..48d1249bf 100644
--- a/lib/dijit/form/nls/hu/Textarea.js
+++ b/lib/dijit/form/nls/hu/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"szerkesztési terület","iframeFocusTitle":"szerkesztési terület keret"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/hu/Textarea",({iframeEditTitle:"szerkesztési terület",iframeFocusTitle:"szerkesztési terület keret"})); \ No newline at end of file
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..02afcf4e7
--- /dev/null
+++ b/lib/dijit/form/nls/hu/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/hu/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/hu/validate.js b/lib/dijit/form/nls/hu/validate.js
index b6d7996a8..76a108340 100644
--- a/lib/dijit/form/nls/hu/validate.js
+++ b/lib/dijit/form/nls/hu/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Az érték kívül van a megengedett tartományon.","invalidMessage":"A megadott érték érvénytelen.","missingMessage":"Meg kell adni egy értéket."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..919b15034
--- /dev/null
+++ b/lib/dijit/form/nls/hu/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/hu/validate", //begin v1.x content
+({
+ 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."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/it/ComboBox.js b/lib/dijit/form/nls/it/ComboBox.js
index 9f6707235..80392837a 100644
--- a/lib/dijit/form/nls/it/ComboBox.js
+++ b/lib/dijit/form/nls/it/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/it/ComboBox",({previousMessage:"Scelte precedenti",nextMessage:"Altre scelte"})); \ 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..e5826b345
--- /dev/null
+++ b/lib/dijit/form/nls/it/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/it/ComboBox", //begin v1.x content
+({
+ previousMessage: "Scelte precedenti",
+ nextMessage: "Altre scelte"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/it/Textarea.js b/lib/dijit/form/nls/it/Textarea.js
index 1b14ecc0c..ecf107197 100644
--- a/lib/dijit/form/nls/it/Textarea.js
+++ b/lib/dijit/form/nls/it/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"modifica area","iframeFocusTitle":"modifica frame area"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/it/Textarea",({iframeEditTitle:"modifica area",iframeFocusTitle:"modifica frame area"})); \ No newline at end of file
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..6df02c030
--- /dev/null
+++ b/lib/dijit/form/nls/it/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/it/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/it/validate.js b/lib/dijit/form/nls/it/validate.js
index af7227fde..4d439d539 100644
--- a/lib/dijit/form/nls/it/validate.js
+++ b/lib/dijit/form/nls/it/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."}) \ No newline at end of file
+//>>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
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..115674276
--- /dev/null
+++ b/lib/dijit/form/nls/it/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/it/validate", //begin v1.x content
+({
+ invalidMessage: "Il valore immesso non è valido.",
+ missingMessage: "Questo valore è obbligatorio.",
+ rangeMessage: "Questo valore non è compreso nell'intervallo."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ja/ComboBox.js b/lib/dijit/form/nls/ja/ComboBox.js
index 6b34170b6..349f3f1df 100644
--- a/lib/dijit/form/nls/ja/ComboBox.js
+++ b/lib/dijit/form/nls/ja/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ja/ComboBox",({previousMessage:"以前の選択項目",nextMessage:"追加の選択項目"})); \ No newline at end of file
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..f8d08892c
--- /dev/null
+++ b/lib/dijit/form/nls/ja/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/ja/ComboBox", //begin v1.x content
+({
+ previousMessage: "以前の選択項目",
+ nextMessage: "追加の選択項目"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ja/Textarea.js b/lib/dijit/form/nls/ja/Textarea.js
index 8a52f4a36..eb2a3d465 100644
--- a/lib/dijit/form/nls/ja/Textarea.js
+++ b/lib/dijit/form/nls/ja/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"編集域","iframeFocusTitle":"編集域フレーム"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ja/Textarea",({iframeEditTitle:"編集域",iframeFocusTitle:"編集域フレーム"})); \ No newline at end of file
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..87230ac19
--- /dev/null
+++ b/lib/dijit/form/nls/ja/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/ja/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ja/validate.js b/lib/dijit/form/nls/ja/validate.js
index 450cd7e3e..4c4d9ef01 100644
--- a/lib/dijit/form/nls/ja/validate.js
+++ b/lib/dijit/form/nls/ja/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ja/validate",({invalidMessage:"入力した値は無効です。",missingMessage:"この値は必須です。",rangeMessage:"この値は範囲外です。"})); \ No newline at end of file
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..2ec91882e
--- /dev/null
+++ b/lib/dijit/form/nls/ja/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ja/validate", //begin v1.x content
+({
+ invalidMessage: "入力した値は無効です。",
+ missingMessage: "この値は必須です。",
+ rangeMessage: "この値は範囲外です。"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/kk/ComboBox.js b/lib/dijit/form/nls/kk/ComboBox.js
index edb918a9c..54debcefe 100644
--- a/lib/dijit/form/nls/kk/ComboBox.js
+++ b/lib/dijit/form/nls/kk/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Алдыңғы нұсқалар","nextMessage":"Басқа нұсқалар"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/kk/ComboBox",({previousMessage:"Алдыңғы нұсқалар",nextMessage:"Басқа нұсқалар"})); \ No newline at end of file
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..b213b9c87
--- /dev/null
+++ b/lib/dijit/form/nls/kk/ComboBox.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/kk/ComboBox", //begin v1.x content
+({
+ previousMessage: "Алдыңғы нұсқалар",
+ nextMessage: "Басқа нұсқалар"
+})
+//end v1.x content
+);
+
diff --git a/lib/dijit/form/nls/kk/Textarea.js b/lib/dijit/form/nls/kk/Textarea.js
index 617fcb91e..45ee0dcfa 100644
--- a/lib/dijit/form/nls/kk/Textarea.js
+++ b/lib/dijit/form/nls/kk/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"өңдеу аумағы","iframeFocusTitle":"өңдеу аумағының жақтауы"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/kk/Textarea",({iframeEditTitle:"өңдеу аумағы",iframeFocusTitle:"өңдеу аумағының жақтауы"})); \ No newline at end of file
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..44bccd3ae
--- /dev/null
+++ b/lib/dijit/form/nls/kk/Textarea.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dijit/form/nls/kk/Textarea", //begin v1.x content
+/* 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
+})
+//end v1.x content
+);
+
diff --git a/lib/dijit/form/nls/kk/validate.js b/lib/dijit/form/nls/kk/validate.js
index d67612119..26b667317 100644
--- a/lib/dijit/form/nls/kk/validate.js
+++ b/lib/dijit/form/nls/kk/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Бұл мән ауқымнан тыс.","invalidMessage":"Енгізілген мән жарамды емес.","missingMessage":"Бұл мән міндетті."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/kk/validate",({invalidMessage:"Енгізілген мән жарамды емес.",missingMessage:"Бұл мән міндетті.",rangeMessage:"Бұл мән ауқымнан тыс."})); \ No newline at end of file
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..1d0bb1b1d
--- /dev/null
+++ b/lib/dijit/form/nls/kk/validate.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/kk/validate", //begin v1.x content
+({
+ invalidMessage: "Енгізілген мән жарамды емес.",
+ missingMessage: "Бұл мән міндетті.",
+ rangeMessage: "Бұл мән ауқымнан тыс."
+})
+//end v1.x content
+);
+
diff --git a/lib/dijit/form/nls/ko/ComboBox.js b/lib/dijit/form/nls/ko/ComboBox.js
index 87d0f0649..a35baf820 100644
--- a/lib/dijit/form/nls/ko/ComboBox.js
+++ b/lib/dijit/form/nls/ko/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ko/ComboBox",({previousMessage:"이전 선택사항",nextMessage:"기타 선택사항"})); \ No newline at end of file
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..97b209cda
--- /dev/null
+++ b/lib/dijit/form/nls/ko/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/ko/ComboBox", //begin v1.x content
+({
+ previousMessage: "이전 선택사항",
+ nextMessage: "기타 선택사항"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ko/Textarea.js b/lib/dijit/form/nls/ko/Textarea.js
index 5c4e91622..9232a0753 100644
--- a/lib/dijit/form/nls/ko/Textarea.js
+++ b/lib/dijit/form/nls/ko/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"편집 영역","iframeFocusTitle":"편집 영역 프레임"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ko/Textarea",({iframeEditTitle:"편집 영역",iframeFocusTitle:"편집 영역 프레임"})); \ No newline at end of file
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..1ac40771e
--- /dev/null
+++ b/lib/dijit/form/nls/ko/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/ko/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ko/validate.js b/lib/dijit/form/nls/ko/validate.js
index c76c67640..233702921 100644
--- a/lib/dijit/form/nls/ko/validate.js
+++ b/lib/dijit/form/nls/ko/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ko/validate",({invalidMessage:"입력된 값이 올바르지 않습니다.",missingMessage:"이 값은 필수입니다.",rangeMessage:"이 값은 범위를 벗어납니다."})); \ No newline at end of file
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..e0df76239
--- /dev/null
+++ b/lib/dijit/form/nls/ko/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ko/validate", //begin v1.x content
+({
+ invalidMessage: "입력된 값이 올바르지 않습니다.",
+ missingMessage: "이 값은 필수입니다.",
+ rangeMessage: "이 값은 범위를 벗어납니다."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/nb/ComboBox.js b/lib/dijit/form/nls/nb/ComboBox.js
index de145542f..9a69fcbf3 100644
--- a/lib/dijit/form/nls/nb/ComboBox.js
+++ b/lib/dijit/form/nls/nb/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Tidligere valg","nextMessage":"Flere valg"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/nb/ComboBox",({previousMessage:"Tidligere valg",nextMessage:"Flere valg"})); \ No newline at end of file
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..a0bfbd944
--- /dev/null
+++ b/lib/dijit/form/nls/nb/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/nb/ComboBox", //begin v1.x content
+({
+ previousMessage: "Tidligere valg",
+ nextMessage: "Flere valg"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/nb/Textarea.js b/lib/dijit/form/nls/nb/Textarea.js
index 16fadf59c..8708bd7f8 100644
--- a/lib/dijit/form/nls/nb/Textarea.js
+++ b/lib/dijit/form/nls/nb/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"ramme for redigeringsområde"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/nb/Textarea",({iframeEditTitle:"redigeringsområde",iframeFocusTitle:"ramme for redigeringsområde"})); \ No newline at end of file
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..79a0a5072
--- /dev/null
+++ b/lib/dijit/form/nls/nb/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/nb/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/nb/validate.js b/lib/dijit/form/nls/nb/validate.js
index 2fe96f263..2c82655c5 100644
--- a/lib/dijit/form/nls/nb/validate.js
+++ b/lib/dijit/form/nls/nb/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Denne verdien er utenfor gyldig område.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..061c798b1
--- /dev/null
+++ b/lib/dijit/form/nls/nb/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/nb/validate", //begin v1.x content
+({
+ invalidMessage: "Den angitte verdien er ikke gyldig.",
+ missingMessage: "Denne verdien er obligatorisk.",
+ rangeMessage: "Denne verdien er utenfor gyldig område."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/nl/ComboBox.js b/lib/dijit/form/nls/nl/ComboBox.js
index b5885d75e..2c332212e 100644
--- a/lib/dijit/form/nls/nl/ComboBox.js
+++ b/lib/dijit/form/nls/nl/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Eerdere opties","nextMessage":"Meer opties"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/nl/ComboBox",({previousMessage:"Eerdere opties",nextMessage:"Meer opties"})); \ No newline at end of file
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..6cfa476f1
--- /dev/null
+++ b/lib/dijit/form/nls/nl/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/nl/ComboBox", //begin v1.x content
+({
+ previousMessage: "Eerdere opties",
+ nextMessage: "Meer opties"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/nl/Textarea.js b/lib/dijit/form/nls/nl/Textarea.js
index d13c3a6e5..78115bc3f 100644
--- a/lib/dijit/form/nls/nl/Textarea.js
+++ b/lib/dijit/form/nls/nl/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"veld bewerken","iframeFocusTitle":"veldkader bewerken"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/nl/Textarea",({iframeEditTitle:"veld bewerken",iframeFocusTitle:"veldkader bewerken"})); \ No newline at end of file
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..0d1d8b3ec
--- /dev/null
+++ b/lib/dijit/form/nls/nl/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/nl/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/nl/validate.js b/lib/dijit/form/nls/nl/validate.js
index b3062c145..f92fac025 100644
--- a/lib/dijit/form/nls/nl/validate.js
+++ b/lib/dijit/form/nls/nl/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/nl/validate",({invalidMessage:"De opgegeven waarde is ongeldig.",missingMessage:"Deze waarde is verplicht.",rangeMessage:"Deze waarde is niet toegestaan."})); \ No newline at end of file
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..269cf4d45
--- /dev/null
+++ b/lib/dijit/form/nls/nl/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/nl/validate", //begin v1.x content
+({
+ invalidMessage: "De opgegeven waarde is ongeldig.",
+ missingMessage: "Deze waarde is verplicht.",
+ rangeMessage: "Deze waarde is niet toegestaan."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pl/ComboBox.js b/lib/dijit/form/nls/pl/ComboBox.js
index f2b4b08a3..9dbfe8352 100644
--- a/lib/dijit/form/nls/pl/ComboBox.js
+++ b/lib/dijit/form/nls/pl/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/pl/ComboBox",({previousMessage:"Poprzednie wybory",nextMessage:"Więcej wyborów"})); \ No newline at end of file
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..ab668c282
--- /dev/null
+++ b/lib/dijit/form/nls/pl/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/pl/ComboBox", //begin v1.x content
+({
+ previousMessage: "Poprzednie wybory",
+ nextMessage: "Więcej wyborów"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pl/Textarea.js b/lib/dijit/form/nls/pl/Textarea.js
index 33b050a1d..1e83b604a 100644
--- a/lib/dijit/form/nls/pl/Textarea.js
+++ b/lib/dijit/form/nls/pl/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"edycja obszaru","iframeFocusTitle":"edycja ramki obszaru"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/pl/Textarea",({iframeEditTitle:"edycja obszaru",iframeFocusTitle:"edycja ramki obszaru"})); \ No newline at end of file
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..bb7a13e55
--- /dev/null
+++ b/lib/dijit/form/nls/pl/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/pl/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pl/validate.js b/lib/dijit/form/nls/pl/validate.js
index cf05d2f95..2a6a12893 100644
--- a/lib/dijit/form/nls/pl/validate.js
+++ b/lib/dijit/form/nls/pl/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."}) \ No newline at end of file
+//>>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
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..91dc973cb
--- /dev/null
+++ b/lib/dijit/form/nls/pl/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/pl/validate", //begin v1.x content
+({
+ invalidMessage: "Wprowadzona wartość jest niepoprawna.",
+ missingMessage: "Ta wartość jest wymagana.",
+ rangeMessage: "Ta wartość jest spoza zakresu."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pt-pt/ComboBox.js b/lib/dijit/form/nls/pt-pt/ComboBox.js
index 254054241..8d7421cd4 100644
--- a/lib/dijit/form/nls/pt-pt/ComboBox.js
+++ b/lib/dijit/form/nls/pt-pt/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/pt-pt/ComboBox",({previousMessage:"Opções anteriores",nextMessage:"Mais opções"})); \ No newline at end of file
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..2a24c4cb7
--- /dev/null
+++ b/lib/dijit/form/nls/pt-pt/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/pt-pt/ComboBox", //begin v1.x content
+({
+ previousMessage: "Opções anteriores",
+ nextMessage: "Mais opções"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pt-pt/Textarea.js b/lib/dijit/form/nls/pt-pt/Textarea.js
index bcd75e781..d9390a2f0 100644
--- a/lib/dijit/form/nls/pt-pt/Textarea.js
+++ b/lib/dijit/form/nls/pt-pt/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"área de edição","iframeFocusTitle":"painel da área de edição"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/pt-pt/Textarea",({iframeEditTitle:"área de edição",iframeFocusTitle:"painel da área de edição"})); \ No newline at end of file
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..b2cf2f453
--- /dev/null
+++ b/lib/dijit/form/nls/pt-pt/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/pt-pt/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pt-pt/validate.js b/lib/dijit/form/nls/pt-pt/validate.js
index 3d921704d..85492c62c 100644
--- a/lib/dijit/form/nls/pt-pt/validate.js
+++ b/lib/dijit/form/nls/pt-pt/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..625b062b9
--- /dev/null
+++ b/lib/dijit/form/nls/pt-pt/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/pt-pt/validate", //begin v1.x content
+({
+ invalidMessage: "O valor introduzido não é válido.",
+ missingMessage: "Este valor é requerido.",
+ rangeMessage: "Este valor encontra-se fora do intervalo."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pt/ComboBox.js b/lib/dijit/form/nls/pt/ComboBox.js
index 254054241..10ea3f67d 100644
--- a/lib/dijit/form/nls/pt/ComboBox.js
+++ b/lib/dijit/form/nls/pt/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Opções anteriores","nextMessage":"Mais opções"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/pt/ComboBox",({previousMessage:"Opções anteriores",nextMessage:"Mais opções"})); \ No newline at end of file
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..b4c8367be
--- /dev/null
+++ b/lib/dijit/form/nls/pt/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/pt/ComboBox", //begin v1.x content
+({
+ previousMessage: "Opções anteriores",
+ nextMessage: "Mais opções"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pt/Textarea.js b/lib/dijit/form/nls/pt/Textarea.js
index b4a0b0fad..8fd88d871 100644
--- a/lib/dijit/form/nls/pt/Textarea.js
+++ b/lib/dijit/form/nls/pt/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"editar área","iframeFocusTitle":"editar quadro da área"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/pt/Textarea",({iframeEditTitle:"editar área",iframeFocusTitle:"editar quadro da área"})); \ No newline at end of file
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..08bd6d6ed
--- /dev/null
+++ b/lib/dijit/form/nls/pt/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/pt/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/pt/validate.js b/lib/dijit/form/nls/pt/validate.js
index 3b4357999..014847826 100644
--- a/lib/dijit/form/nls/pt/validate.js
+++ b/lib/dijit/form/nls/pt/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."}) \ No newline at end of file
+//>>built
+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. "})); \ No newline at end of file
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..592caf7db
--- /dev/null
+++ b/lib/dijit/form/nls/pt/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/pt/validate", //begin v1.x content
+({
+ invalidMessage: "O valor inserido não é válido.",
+ missingMessage: "Este valor é necessário.",
+ rangeMessage: "Este valor está fora do intervalo. "
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ro/ComboBox.js b/lib/dijit/form/nls/ro/ComboBox.js
index f491a1135..a2d5810a2 100644
--- a/lib/dijit/form/nls/ro/ComboBox.js
+++ b/lib/dijit/form/nls/ro/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Alegeri anterioare","nextMessage":"Mai multe alegeri"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ro/ComboBox",({previousMessage:"Alegeri anterioare",nextMessage:"Mai multe alegeri"})); \ No newline at end of file
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..05864f56e
--- /dev/null
+++ b/lib/dijit/form/nls/ro/ComboBox.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ro/ComboBox", //begin v1.x content
+({
+ previousMessage: "Alegeri anterioare",
+ nextMessage: "Mai multe alegeri"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ro/Textarea.js b/lib/dijit/form/nls/ro/Textarea.js
index 2e029d964..30409dfa5 100644
--- a/lib/dijit/form/nls/ro/Textarea.js
+++ b/lib/dijit/form/nls/ro/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"zonă de editare","iframeFocusTitle":"cadru zonă de editare"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ro/Textarea",({iframeEditTitle:"zonă de editare",iframeFocusTitle:"cadru zonă de editare"})); \ No newline at end of file
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..ca92074f9
--- /dev/null
+++ b/lib/dijit/form/nls/ro/Textarea.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dijit/form/nls/ro/Textarea", //begin v1.x content
+/* 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
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ro/validate.js b/lib/dijit/form/nls/ro/validate.js
index f0892c76a..94eefb49f 100644
--- a/lib/dijit/form/nls/ro/validate.js
+++ b/lib/dijit/form/nls/ro/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Această valoare este în afara intervalului. ","invalidMessage":"Valoarea introdusă nu este validă.","missingMessage":"Această valoare este necesară."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ro/validate",({invalidMessage:"Valoarea introdusă nu este validă.",missingMessage:"Această valoare este necesară.",rangeMessage:"Această valoare este în afara intervalului. "})); \ No newline at end of file
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..165ed83fa
--- /dev/null
+++ b/lib/dijit/form/nls/ro/validate.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/ro/validate", //begin v1.x content
+({
+ invalidMessage: "Valoarea introdusă nu este validă.",
+ missingMessage: "Această valoare este necesară.",
+ rangeMessage: "Această valoare este în afara intervalului. "
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ru/ComboBox.js b/lib/dijit/form/nls/ru/ComboBox.js
index 193f4ee33..7c1c483f4 100644
--- a/lib/dijit/form/nls/ru/ComboBox.js
+++ b/lib/dijit/form/nls/ru/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ru/ComboBox",({previousMessage:"Предыдущие варианты",nextMessage:"Следующие варианты"})); \ No newline at end of file
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..f807e9e0d
--- /dev/null
+++ b/lib/dijit/form/nls/ru/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/ru/ComboBox", //begin v1.x content
+({
+ previousMessage: "Предыдущие варианты",
+ nextMessage: "Следующие варианты"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ru/Textarea.js b/lib/dijit/form/nls/ru/Textarea.js
index ad7ad22fa..0f11acfec 100644
--- a/lib/dijit/form/nls/ru/Textarea.js
+++ b/lib/dijit/form/nls/ru/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"область редактирования","iframeFocusTitle":"фрейм области редактирования"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ru/Textarea",({iframeEditTitle:"область редактирования",iframeFocusTitle:"фрейм области редактирования"})); \ No newline at end of file
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..e1d7da6a9
--- /dev/null
+++ b/lib/dijit/form/nls/ru/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/ru/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/ru/validate.js b/lib/dijit/form/nls/ru/validate.js
index 35fb5ca29..72e41ac20 100644
--- a/lib/dijit/form/nls/ru/validate.js
+++ b/lib/dijit/form/nls/ru/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/ru/validate",({invalidMessage:"Указано недопустимое значение.",missingMessage:"Это обязательное значение.",rangeMessage:"Это значение вне диапазона."})); \ No newline at end of file
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..bcacc1116
--- /dev/null
+++ b/lib/dijit/form/nls/ru/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/ru/validate", //begin v1.x content
+({
+ invalidMessage: "Указано недопустимое значение.",
+ missingMessage: "Это обязательное значение.",
+ rangeMessage: "Это значение вне диапазона."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sk/ComboBox.js b/lib/dijit/form/nls/sk/ComboBox.js
index a45c7f236..798051638 100644
--- a/lib/dijit/form/nls/sk/ComboBox.js
+++ b/lib/dijit/form/nls/sk/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Predchádzajúce voľby","nextMessage":"Ďalšie voľby"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sk/ComboBox",({previousMessage:"Predchádzajúce voľby",nextMessage:"Ďalšie voľby"})); \ 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..2ce093a9b
--- /dev/null
+++ b/lib/dijit/form/nls/sk/ComboBox.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/sk/ComboBox", //begin v1.x content
+({
+ previousMessage: "Predchádzajúce voľby",
+ nextMessage: "Ďalšie voľby"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sk/Textarea.js b/lib/dijit/form/nls/sk/Textarea.js
index 3ee98c355..003b04757 100644
--- a/lib/dijit/form/nls/sk/Textarea.js
+++ b/lib/dijit/form/nls/sk/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"upraviť oblasť","iframeFocusTitle":"upraviť rám oblasti"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sk/Textarea",({iframeEditTitle:"upraviť oblasť",iframeFocusTitle:"upraviť rám 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..6386d33c9
--- /dev/null
+++ b/lib/dijit/form/nls/sk/Textarea.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dijit/form/nls/sk/Textarea", //begin v1.x content
+/* 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ám 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
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sk/validate.js b/lib/dijit/form/nls/sk/validate.js
index 612dab57e..d5b9883a5 100644
--- a/lib/dijit/form/nls/sk/validate.js
+++ b/lib/dijit/form/nls/sk/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."}) \ No newline at end of file
+//>>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
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..a9efd9c1c
--- /dev/null
+++ b/lib/dijit/form/nls/sk/validate.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/sk/validate", //begin v1.x content
+({
+ invalidMessage: "Zadaná hodnota nie je platná.",
+ missingMessage: "Táto hodnota je vyžadovaná.",
+ rangeMessage: "Táto hodnota je mimo rozsah."
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sl/ComboBox.js b/lib/dijit/form/nls/sl/ComboBox.js
index 61d4469c6..1f72eee5a 100644
--- a/lib/dijit/form/nls/sl/ComboBox.js
+++ b/lib/dijit/form/nls/sl/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Prejšnje izbire","nextMessage":"Dodatne izbire"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sl/ComboBox",({previousMessage:"Prejšnje izbire",nextMessage:"Dodatne izbire"})); \ No newline at end of file
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..4b28199f7
--- /dev/null
+++ b/lib/dijit/form/nls/sl/ComboBox.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/sl/ComboBox", //begin v1.x content
+({
+ previousMessage: "Prejšnje izbire",
+ nextMessage: "Dodatne izbire"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sl/Textarea.js b/lib/dijit/form/nls/sl/Textarea.js
index 0e0d51175..6f9717d44 100644
--- a/lib/dijit/form/nls/sl/Textarea.js
+++ b/lib/dijit/form/nls/sl/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"urejevalno področje","iframeFocusTitle":"okvir urejevalnega področja"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sl/Textarea",({iframeEditTitle:"urejevalno področje",iframeFocusTitle:"okvir urejevalnega področja"})); \ No newline at end of file
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..ce65dc984
--- /dev/null
+++ b/lib/dijit/form/nls/sl/Textarea.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dijit/form/nls/sl/Textarea", //begin v1.x content
+/* 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
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sl/validate.js b/lib/dijit/form/nls/sl/validate.js
index b84b35350..4cbe99bef 100644
--- a/lib/dijit/form/nls/sl/validate.js
+++ b/lib/dijit/form/nls/sl/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sl/validate",({invalidMessage:"Vnesena vrednost ni veljavna.",missingMessage:"Ta vrednost je zahtevana.",rangeMessage:"Ta vrednost je izven območja."})); \ No newline at end of file
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..ffa3e0fd4
--- /dev/null
+++ b/lib/dijit/form/nls/sl/validate.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/sl/validate", //begin v1.x content
+({
+ invalidMessage: "Vnesena vrednost ni veljavna.",
+ missingMessage: "Ta vrednost je zahtevana.",
+ rangeMessage: "Ta vrednost je izven območja."
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sv/ComboBox.js b/lib/dijit/form/nls/sv/ComboBox.js
index 860bf75a7..804ca0fb5 100644
--- a/lib/dijit/form/nls/sv/ComboBox.js
+++ b/lib/dijit/form/nls/sv/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Föregående alternativ","nextMessage":"Fler alternativ"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sv/ComboBox",({previousMessage:"Föregående alternativ",nextMessage:"Fler alternativ"})); \ 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..6c1dad3ec
--- /dev/null
+++ b/lib/dijit/form/nls/sv/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/sv/ComboBox", //begin v1.x content
+({
+ previousMessage: "Föregående alternativ",
+ nextMessage: "Fler alternativ"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sv/Textarea.js b/lib/dijit/form/nls/sv/Textarea.js
index 9e508ac7b..d7110e6d3 100644
--- a/lib/dijit/form/nls/sv/Textarea.js
+++ b/lib/dijit/form/nls/sv/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"redigeringsområde","iframeFocusTitle":"redigeringsområdesram"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/sv/Textarea",({iframeEditTitle:"redigeringsområde",iframeFocusTitle:"redigeringsområdesram"})); \ No newline at end of file
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..ec08afa29
--- /dev/null
+++ b/lib/dijit/form/nls/sv/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/sv/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/sv/validate.js b/lib/dijit/form/nls/sv/validate.js
index 8c1b537bd..3cccc47dc 100644
--- a/lib/dijit/form/nls/sv/validate.js
+++ b/lib/dijit/form/nls/sv/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."}) \ No newline at end of file
+//>>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
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..0c4c74757
--- /dev/null
+++ b/lib/dijit/form/nls/sv/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/sv/validate", //begin v1.x content
+({
+ invalidMessage: "Det angivna värdet är ogiltigt.",
+ missingMessage: "Värdet är obligatoriskt.",
+ rangeMessage: "Värdet är utanför intervallet."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/th/ComboBox.js b/lib/dijit/form/nls/th/ComboBox.js
index ff32a4fe7..9ea370d79 100644
--- a/lib/dijit/form/nls/th/ComboBox.js
+++ b/lib/dijit/form/nls/th/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/th/ComboBox",({previousMessage:"การเลือกก่อนหน้า",nextMessage:"การเลือกเพิ่มเติม"})); \ No newline at end of file
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..e9288d8eb
--- /dev/null
+++ b/lib/dijit/form/nls/th/ComboBox.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/th/ComboBox", //begin v1.x content
+({
+ previousMessage: "การเลือกก่อนหน้า",
+ nextMessage: "การเลือกเพิ่มเติม"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/th/Textarea.js b/lib/dijit/form/nls/th/Textarea.js
index 436118314..a5a4ea132 100644
--- a/lib/dijit/form/nls/th/Textarea.js
+++ b/lib/dijit/form/nls/th/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"แก้ไขพื้นที่","iframeFocusTitle":"แก้ไขกรอบพื้นที่"}) \ No newline at end of file
+//>>built
+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..0ca1b672d
--- /dev/null
+++ b/lib/dijit/form/nls/th/Textarea.js.uncompressed.js
@@ -0,0 +1,12 @@
+define(
+"dijit/form/nls/th/Textarea", //begin v1.x content
+/* 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
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/th/validate.js b/lib/dijit/form/nls/th/validate.js
index 86606b774..337e33372 100644
--- a/lib/dijit/form/nls/th/validate.js
+++ b/lib/dijit/form/nls/th/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/th/validate",({invalidMessage:"ค่าที่ป้อนไม่ถูกต้อง",missingMessage:"จำเป็นต้องมีค่านี้",rangeMessage:"ค่านี้เกินช่วง"})); \ No newline at end of file
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..e0b3a04a6
--- /dev/null
+++ b/lib/dijit/form/nls/th/validate.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/th/validate", //begin v1.x content
+({
+ invalidMessage: "ค่าที่ป้อนไม่ถูกต้อง",
+ missingMessage: "จำเป็นต้องมีค่านี้",
+ rangeMessage: "ค่านี้เกินช่วง"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/tr/ComboBox.js b/lib/dijit/form/nls/tr/ComboBox.js
index 46f71dc8a..ce24c2df4 100644
--- a/lib/dijit/form/nls/tr/ComboBox.js
+++ b/lib/dijit/form/nls/tr/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/tr/ComboBox",({previousMessage:"Önceki seçenekler",nextMessage:"Diğer seçenekler"})); \ No newline at end of file
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..6c4f31957
--- /dev/null
+++ b/lib/dijit/form/nls/tr/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/tr/ComboBox", //begin v1.x content
+({
+ previousMessage: "Önceki seçenekler",
+ nextMessage: "Diğer seçenekler"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/tr/Textarea.js b/lib/dijit/form/nls/tr/Textarea.js
index 3f2b5e71d..637c3ac5a 100644
--- a/lib/dijit/form/nls/tr/Textarea.js
+++ b/lib/dijit/form/nls/tr/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"düzenleme alanı","iframeFocusTitle":"düzenleme alanı çerçevesi"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/tr/Textarea",({iframeEditTitle:"düzenleme alanı",iframeFocusTitle:"düzenleme alanı çerçevesi"})); \ No newline at end of file
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..6406bd177
--- /dev/null
+++ b/lib/dijit/form/nls/tr/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/tr/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/tr/validate.js b/lib/dijit/form/nls/tr/validate.js
index 838dbdaed..fc1b859a5 100644
--- a/lib/dijit/form/nls/tr/validate.js
+++ b/lib/dijit/form/nls/tr/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."}) \ No newline at end of file
+//>>built
+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."})); \ No newline at end of file
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..acee03a0a
--- /dev/null
+++ b/lib/dijit/form/nls/tr/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/tr/validate", //begin v1.x content
+({
+ invalidMessage: "Girilen değer geçersiz.",
+ missingMessage: "Bu değer gerekli.",
+ rangeMessage: "Bu değer aralık dışında."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/validate.js b/lib/dijit/form/nls/validate.js
index 29a1a476b..d1219b98c 100644
--- a/lib/dijit/form/nls/validate.js
+++ b/lib/dijit/form/nls/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/validate",{root:({invalidMessage:"The value entered is not valid.",missingMessage:"This value is required.",rangeMessage:"This value is out of range."}),"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}); \ No newline at end of file
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 b/lib/dijit/form/nls/zh-tw/ComboBox.js
index ead5fa6b2..344747db7 100644
--- a/lib/dijit/form/nls/zh-tw/ComboBox.js
+++ b/lib/dijit/form/nls/zh-tw/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/zh-tw/ComboBox",({previousMessage:"前一個選擇項",nextMessage:"其他選擇項"})); \ No newline at end of file
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..dbcf05530
--- /dev/null
+++ b/lib/dijit/form/nls/zh-tw/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/zh-tw/ComboBox", //begin v1.x content
+({
+ previousMessage: "前一個選擇項",
+ nextMessage: "其他選擇項"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/zh-tw/Textarea.js b/lib/dijit/form/nls/zh-tw/Textarea.js
index cb7abda29..df98f9eab 100644
--- a/lib/dijit/form/nls/zh-tw/Textarea.js
+++ b/lib/dijit/form/nls/zh-tw/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"編輯區","iframeFocusTitle":"編輯區框"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/zh-tw/Textarea",({iframeEditTitle:"編輯區",iframeFocusTitle:"編輯區框"})); \ No newline at end of file
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..825ebbbd4
--- /dev/null
+++ b/lib/dijit/form/nls/zh-tw/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/zh-tw/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/zh-tw/validate.js b/lib/dijit/form/nls/zh-tw/validate.js
index b398a31ae..7e0352175 100644
--- a/lib/dijit/form/nls/zh-tw/validate.js
+++ b/lib/dijit/form/nls/zh-tw/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/zh-tw/validate",({invalidMessage:"輸入的值無效。",missingMessage:"必須提供此值。",rangeMessage:"此值超出範圍。"})); \ No newline at end of file
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..7cc5e08fb
--- /dev/null
+++ b/lib/dijit/form/nls/zh-tw/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/zh-tw/validate", //begin v1.x content
+({
+ invalidMessage: "輸入的值無效。",
+ missingMessage: "必須提供此值。",
+ rangeMessage: "此值超出範圍。"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/zh/ComboBox.js b/lib/dijit/form/nls/zh/ComboBox.js
index 7cc92cf1d..2fc14ae0d 100644
--- a/lib/dijit/form/nls/zh/ComboBox.js
+++ b/lib/dijit/form/nls/zh/ComboBox.js
@@ -1 +1,2 @@
-({"previousMessage":"先前选项","nextMessage":"更多选项"}) \ No newline at end of file
+//>>built
+define("dijit/form/nls/zh/ComboBox",({previousMessage:"先前选项",nextMessage:"更多选项"})); \ No newline at end of file
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..346794a3a
--- /dev/null
+++ b/lib/dijit/form/nls/zh/ComboBox.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/form/nls/zh/ComboBox", //begin v1.x content
+({
+ previousMessage: "先前选项",
+ nextMessage: "更多选项"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/zh/Textarea.js b/lib/dijit/form/nls/zh/Textarea.js
index e1cf172ad..917b5cd68 100644
--- a/lib/dijit/form/nls/zh/Textarea.js
+++ b/lib/dijit/form/nls/zh/Textarea.js
@@ -1 +1,2 @@
-({"iframeEditTitle":"编辑区","iframeFocusTitle":"编辑区框架"}) \ No newline at end of file
+//>>built
+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..e1aca268a
--- /dev/null
+++ b/lib/dijit/form/nls/zh/Textarea.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/form/nls/zh/Textarea", //begin v1.x content
+({
+ 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
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/nls/zh/validate.js b/lib/dijit/form/nls/zh/validate.js
index e2c01f55b..7a78d23c6 100644
--- a/lib/dijit/form/nls/zh/validate.js
+++ b/lib/dijit/form/nls/zh/validate.js
@@ -1 +1,2 @@
-({"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"}) \ No newline at end of file
+//>>built
+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..8044a7633
--- /dev/null
+++ b/lib/dijit/form/nls/zh/validate.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/form/nls/zh/validate", //begin v1.x content
+({
+ invalidMessage: "输入的值无效。",
+ missingMessage: "此值是必需值。",
+ rangeMessage: "此值超出范围。"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/form/templates/Button.html b/lib/dijit/form/templates/Button.html
new file mode 100644
index 000000000..d167ac0d0
--- /dev/null
+++ b/lib/dijit/form/templates/Button.html
@@ -0,0 +1,17 @@
+<span class="dijit dijitReset dijitInline" role="presentation"
+ ><span class="dijitReset dijitInline dijitButtonNode"
+ data-dojo-attach-event="ondijitclick:_onClick" role="presentation"
+ ><span class="dijitReset dijitStretch dijitButtonContents"
+ data-dojo-attach-point="titleNode,focusNode"
+ role="button" aria-labelledby="${id}_label"
+ ><span class="dijitReset dijitInline dijitIcon" data-dojo-attach-point="iconNode"></span
+ ><span class="dijitReset dijitToggleButtonIconChar">&#x25CF;</span
+ ><span class="dijitReset dijitInline dijitButtonText"
+ id="${id}_label"
+ data-dojo-attach-point="containerNode"
+ ></span
+ ></span
+ ></span
+ ><input ${!nameAttrSetting} type="${type}" value="${value}" class="dijitOffScreen"
+ tabIndex="-1" role="presentation" data-dojo-attach-point="valueNode"
+/></span>
diff --git a/lib/dijit/form/templates/CheckBox.html b/lib/dijit/form/templates/CheckBox.html
new file mode 100644
index 000000000..fd81fc226
--- /dev/null
+++ b/lib/dijit/form/templates/CheckBox.html
@@ -0,0 +1,7 @@
+<div class="dijit dijitReset dijitInline" role="presentation"
+ ><input
+ ${!nameAttrSetting} type="${type}" ${checkedAttrSetting}
+ class="dijitReset dijitCheckBoxInput"
+ data-dojo-attach-point="focusNode"
+ data-dojo-attach-event="onclick:_onClick"
+/></div>
diff --git a/lib/dijit/form/templates/ComboButton.html b/lib/dijit/form/templates/ComboButton.html
new file mode 100644
index 000000000..49eed10a8
--- /dev/null
+++ b/lib/dijit/form/templates/ComboButton.html
@@ -0,0 +1,23 @@
+<table class="dijit dijitReset dijitInline dijitLeft"
+ cellspacing='0' cellpadding='0' role="presentation"
+ ><tbody role="presentation"><tr role="presentation"
+ ><td class="dijitReset dijitStretch dijitButtonNode" data-dojo-attach-point="buttonNode" data-dojo-attach-event="ondijitclick:_onClick,onkeypress:_onButtonKeyPress"
+ ><div id="${id}_button" class="dijitReset dijitButtonContents"
+ data-dojo-attach-point="titleNode"
+ role="button" aria-labelledby="${id}_label"
+ ><div class="dijitReset dijitInline dijitIcon" data-dojo-attach-point="iconNode" role="presentation"></div
+ ><div class="dijitReset dijitInline dijitButtonText" id="${id}_label" data-dojo-attach-point="containerNode" role="presentation"></div
+ ></div
+ ></td
+ ><td id="${id}_arrow" class='dijitReset dijitRight dijitButtonNode dijitArrowButton'
+ data-dojo-attach-point="_popupStateNode,focusNode,_buttonNode"
+ data-dojo-attach-event="onkeypress:_onArrowKeyPress"
+ title="${optionsTitle}"
+ role="button" aria-haspopup="true"
+ ><div class="dijitReset dijitArrowButtonInner" role="presentation"></div
+ ><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"
+ /></td></tr></tbody
+></table>
diff --git a/lib/dijit/form/templates/DropDownBox.html b/lib/dijit/form/templates/DropDownBox.html
new file mode 100644
index 000000000..0314ad951
--- /dev/null
+++ b/lib/dijit/form/templates/DropDownBox.html
@@ -0,0 +1,16 @@
+<div class="dijit dijitReset dijitInline dijitLeft"
+ id="widget_${id}"
+ 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"
+ ${_buttonInputDisabled}
+ /></div
+ ><div class='dijitReset dijitValidationContainer'
+ ><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' ${!nameAttrSetting} type="text" autocomplete="off"
+ data-dojo-attach-point="textbox,focusNode" role="textbox" aria-haspopup="true"
+ /></div
+></div>
diff --git a/lib/dijit/form/templates/DropDownButton.html b/lib/dijit/form/templates/DropDownButton.html
new file mode 100644
index 000000000..56d2618f4
--- /dev/null
+++ b/lib/dijit/form/templates/DropDownButton.html
@@ -0,0 +1,20 @@
+<span class="dijit dijitReset dijitInline"
+ ><span class='dijitReset dijitInline dijitButtonNode'
+ data-dojo-attach-event="ondijitclick:_onClick" data-dojo-attach-point="_buttonNode"
+ ><span class="dijitReset dijitStretch dijitButtonContents"
+ data-dojo-attach-point="focusNode,titleNode,_arrowWrapperNode"
+ role="button" aria-haspopup="true" aria-labelledby="${id}_label"
+ ><span class="dijitReset dijitInline dijitIcon"
+ data-dojo-attach-point="iconNode"
+ ></span
+ ><span class="dijitReset dijitInline dijitButtonText"
+ data-dojo-attach-point="containerNode,_popupStateNode"
+ id="${id}_label"
+ ></span
+ ><span class="dijitReset dijitInline dijitArrowButtonInner"></span
+ ><span class="dijitReset dijitInline dijitArrowButtonChar">&#9660;</span
+ ></span
+ ></span
+ ><input ${!nameAttrSetting} type="${type}" value="${value}" class="dijitOffScreen" tabIndex="-1"
+ data-dojo-attach-point="valueNode"
+/></span>
diff --git a/lib/dijit/form/templates/HorizontalSlider.html b/lib/dijit/form/templates/HorizontalSlider.html
new file mode 100644
index 000000000..9fd16d4ea
--- /dev/null
+++ b/lib/dijit/form/templates/HorizontalSlider.html
@@ -0,0 +1,37 @@
+<table class="dijit dijitReset dijitSlider dijitSliderH" cellspacing="0" cellpadding="0" border="0" rules="none" data-dojo-attach-event="onkeypress:_onKeyPress,onkeyup:_onKeyUp"
+ ><tr class="dijitReset"
+ ><td class="dijitReset" colspan="2"></td
+ ><td data-dojo-attach-point="topDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationT dijitSliderDecorationH"></td
+ ><td class="dijitReset" colspan="2"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH"
+ ><div class="dijitSliderDecrementIconH" style="display:none" data-dojo-attach-point="decrementButton"><span class="dijitSliderButtonInner">-</span></div
+ ></td
+ ><td class="dijitReset"
+ ><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderLeftBumper" data-dojo-attach-event="press:_onClkDecBumper"></div
+ ></td
+ ><td class="dijitReset"
+ ><input data-dojo-attach-point="valueNode" type="hidden" ${!nameAttrSetting}
+ /><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
+ ></div
+ ><div role="presentation" data-dojo-attach-point="remainingBar" class="dijitSliderBar dijitSliderBarH dijitSliderRemainingBar dijitSliderRemainingBarH" data-dojo-attach-event="press:_onBarClick"></div
+ ></div
+ ></td
+ ><td class="dijitReset"
+ ><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperH dijitSliderRightBumper" data-dojo-attach-event="press:_onClkIncBumper"></div
+ ></td
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerH"
+ ><div class="dijitSliderIncrementIconH" style="display:none" data-dojo-attach-point="incrementButton"><span class="dijitSliderButtonInner">+</span></div
+ ></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset" colspan="2"></td
+ ><td data-dojo-attach-point="containerNode,bottomDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationB dijitSliderDecorationH"></td
+ ><td class="dijitReset" colspan="2"></td
+ ></tr
+></table>
diff --git a/lib/dijit/form/templates/Select.html b/lib/dijit/form/templates/Select.html
new file mode 100644
index 000000000..9e917ab92
--- /dev/null
+++ b/lib/dijit/form/templates/Select.html
@@ -0,0 +1,14 @@
+<table class="dijit dijitReset dijitInline dijitLeft"
+ data-dojo-attach-point="_buttonNode,tableNode,focusNode" cellspacing='0' cellpadding='0'
+ role="combobox" 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
+ ><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
+ ></tr></tbody
+></table>
diff --git a/lib/dijit/form/templates/Spinner.html b/lib/dijit/form/templates/Spinner.html
new file mode 100644
index 000000000..468613d01
--- /dev/null
+++ b/lib/dijit/form/templates/Spinner.html
@@ -0,0 +1,27 @@
+<div class="dijit dijitReset dijitInline dijitLeft"
+ id="widget_${id}" role="presentation"
+ ><div class="dijitReset dijitButtonNode dijitSpinnerButtonContainer"
+ ><input class="dijitReset dijitInputField dijitSpinnerButtonInner" type="text" tabIndex="-1" readonly="readonly" role="presentation"
+ /><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"
+ ${_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"
+ ${_buttonInputDisabled}
+ /></div
+ ></div
+ ></div
+ ><div class='dijitReset dijitValidationContainer'
+ ><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"
+ role="spinbutton" autocomplete="off" ${!nameAttrSetting}
+ /></div
+></div>
diff --git a/lib/dijit/form/templates/TextBox.html b/lib/dijit/form/templates/TextBox.html
new file mode 100644
index 000000000..fd543c695
--- /dev/null
+++ b/lib/dijit/form/templates/TextBox.html
@@ -0,0 +1,6 @@
+<div class="dijit dijitReset dijitInline dijitLeft" id="widget_${id}" role="presentation"
+ ><div class="dijitReset dijitInputField dijitInputContainer"
+ ><input class="dijitReset dijitInputInner" data-dojo-attach-point='textbox,focusNode' autocomplete="off"
+ ${!nameAttrSetting} type='${type}'
+ /></div
+></div>
diff --git a/lib/dijit/form/templates/ValidationTextBox.html b/lib/dijit/form/templates/ValidationTextBox.html
new file mode 100644
index 000000000..d49dd8c59
--- /dev/null
+++ b/lib/dijit/form/templates/ValidationTextBox.html
@@ -0,0 +1,10 @@
+<div class="dijit dijitReset dijitInline dijitLeft"
+ id="widget_${id}" role="presentation"
+ ><div class='dijitReset dijitValidationContainer'
+ ><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' autocomplete="off"
+ ${!nameAttrSetting} type='${type}'
+ /></div
+></div>
diff --git a/lib/dijit/form/templates/VerticalSlider.html b/lib/dijit/form/templates/VerticalSlider.html
new file mode 100644
index 000000000..0c72ed90a
--- /dev/null
+++ b/lib/dijit/form/templates/VerticalSlider.html
@@ -0,0 +1,45 @@
+<table class="dijit dijitReset dijitSlider dijitSliderV" cellspacing="0" cellpadding="0" border="0" rules="none" data-dojo-attach-event="onkeypress:_onKeyPress,onkeyup:_onKeyUp"
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
+ ><div class="dijitSliderIncrementIconV" style="display:none" data-dojo-attach-point="decrementButton"><span class="dijitSliderButtonInner">+</span></div
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset"
+ ><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderTopBumper" data-dojo-attach-event="press:_onClkIncBumper"></div></center
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td data-dojo-attach-point="leftDecoration" class="dijitReset 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
+ ></div
+ ></center
+ ></td
+ ><td data-dojo-attach-point="containerNode,rightDecoration" class="dijitReset dijitSliderDecoration dijitSliderDecorationR dijitSliderDecorationV"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset"
+ ><center><div class="dijitSliderBar dijitSliderBumper dijitSliderBumperV dijitSliderBottomBumper" data-dojo-attach-event="press:_onClkDecBumper"></div></center
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+ ><tr class="dijitReset"
+ ><td class="dijitReset"></td
+ ><td class="dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV"
+ ><div class="dijitSliderDecrementIconV" style="display:none" data-dojo-attach-point="incrementButton"><span class="dijitSliderButtonInner">-</span></div
+ ></td
+ ><td class="dijitReset"></td
+ ></tr
+></table>
diff --git a/lib/dijit/hccss.js b/lib/dijit/hccss.js
new file mode 100644
index 000000000..162ea1c3a
--- /dev/null
+++ b/lib/dijit/hccss.js
@@ -0,0 +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
diff --git a/lib/dijit/hccss.js.uncompressed.js b/lib/dijit/hccss.js.uncompressed.js
new file mode 100644
index 000000000..80ea79231
--- /dev/null
+++ b/lib/dijit/hccss.js.uncompressed.js
@@ -0,0 +1,52 @@
+define("dijit/hccss", [
+ "require", // require.toUrl
+ "dojo/_base/config", // config.blankGif
+ "dojo/dom-class", // domClass.add domConstruct.create domStyle.getComputedStyle
+ "dojo/dom-construct", // domClass.add domConstruct.create domStyle.getComputedStyle
+ "dojo/dom-style", // domClass.add domConstruct.create domStyle.getComputedStyle
+ "dojo/ready", // ready
+ "dojo/_base/sniff", // has("ie") has("mozilla")
+ "dojo/_base/window" // win.body
+], function(require, config, domClass, domConstruct, domStyle, ready, has, win){
+
+ // module:
+ // dijit/hccss
+ // summary:
+ // Test if computer is in high contrast mode, and sets dijit_a11y flag on <body> if it is.
+
+ if(has("ie") || has("mozilla")){ // NOTE: checking in Safari messes things up
+ // priority is 90 to run ahead of parser priority of 100
+ ready(90, function(){
+ // summary:
+ // Detects if we are in high-contrast mode or not
+
+ // create div for testing if high contrast mode is on or images are turned off
+ var div = domConstruct.create("div",{
+ id: "a11yTestNode",
+ style:{
+ cssText:'border: 1px solid;'
+ + 'border-color:red green;'
+ + 'position: absolute;'
+ + 'height: 5px;'
+ + 'top: -999px;'
+ + 'background-image: url("' + (config.blankGif || require.toUrl("dojo/resources/blank.gif")) + '");'
+ }
+ }, win.body());
+
+ // test it
+ var cs = domStyle.getComputedStyle(div);
+ if(cs){
+ var bkImg = cs.backgroundImage;
+ var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
+ if(needsA11y){
+ domClass.add(win.body(), "dijit_a11y");
+ }
+ if(has("ie")){
+ div.outerHTML = ""; // prevent mixed-content warning, see http://support.microsoft.com/kb/925014
+ }else{
+ win.body().removeChild(div);
+ }
+ }
+ });
+ }
+});
diff --git a/lib/dijit/icons/commonIcons.css b/lib/dijit/icons/commonIcons.css
index 6f2749240..8d0060e85 100644
--- a/lib/dijit/icons/commonIcons.css
+++ b/lib/dijit/icons/commonIcons.css
@@ -123,7 +123,7 @@ The 16 x 16px icons in these sprites are action and object type images which can
}
/*Action icons*/
-.dijitIconSave { background-position: 0px; }
+.dijitIconSave { background-position: 0; }
.dijitIconPrint { background-position: -16px; }
.dijitIconCut { background-position: -32px; }
.dijitIconCopy { background-position: -48px; }
@@ -139,7 +139,6 @@ The 16 x 16px icons in these sprites are action and object type images which can
.dijitIconConfigure { background-position: -208px; }
.dijitIconSearch { background-position: -224px; }
.dijitIconError { background-position: -496px; }
-/* .dijitIconError is also called .dijitContentPaneError icon in the claro/common.css and is applied to HREF url errors that render in a dialog box with the error messsage */
/*Object icons*/
.dijitIconApplication { background-position: -240px; }
@@ -162,3 +161,11 @@ The 16 x 16px icons in these sprites are action and object type images which can
.dijitIconFolderClosed, .dijitFolderClosed { background-position: -464px; }
.dijitIconFolderOpen, .dijitFolderOpened { background-position: -480px; }
+/*Loading animation*/
+.dijitIconLoading {
+ background:url('images/loadingAnimation_rtl.gif') no-repeat;
+ height: 20px;
+ width: 20px;
+}
+
+
diff --git a/lib/dijit/icons/commonIcons_rtl.css b/lib/dijit/icons/commonIcons_rtl.css
index 4d4c26f2d..8d3ea03b7 100644
--- a/lib/dijit/icons/commonIcons_rtl.css
+++ b/lib/dijit/icons/commonIcons_rtl.css
@@ -38,7 +38,7 @@ The 16 x 16px icons in these sprites are action and object type images which can
.dijitRtl .dijitIconFolderClosed,
.dijitRtl .dijitFolderOpened,
.dijitRtl .dijitIconFolderOpen,
-.dijitRtl .dijitIconError, .dijitRtl .dijitContentPaneError {
+.dijitRtl .dijitIconError {
background-image: url('images/commonIconsObjActEnabled_rtl.png'); /* Contains both object and action icons in a sprite image for the enabled state. */
width: 16px;
height: 16px;
@@ -78,7 +78,7 @@ The 16 x 16px icons in these sprites are action and object type images which can
.dj_ie6 .dijitRtl .dijitIconFolderClosed,
.dj_ie6 .dijitRtl .dijitFolderOpened,
.dj_ie6 .dijitRtl .dijitIconFolderOpen,
-.dj_ie6 .dijitRtl .dijitIconError, .dj_ie6 .dijitRtl .dijitContentPaneError {
+.dj_ie6 .dijitRtl .dijitIconError {
background-image: url('images/commonIconsObjActEnabled8bit_rtl.png');
}
@@ -116,12 +116,6 @@ The 16 x 16px icons in these sprites are action and object type images which can
.dijitRtl .dijitDisabled .dijitIconFolderClosed,
.dijitRtl .dijitDisabled .dijitFolderOpened,
.dijitRtl .dijitDisabled .dijitIconFolderOpen,
-.dijitRtl .dijitDisabled .dijitIconError, .dijitRtl .dijitDisabled .dijitContentPaneError {
+.dijitRtl .dijitDisabled .dijitIconError {
background-image: url('images/commonIconsObjActDisabled_rtl.png'); /* Contains both object and action icons as a sprite image for the disabled state. These would be used by buttons and menus. */
}
-
-
-/*For Claro and future themes.*/
-.dijitRtl .dijitContentPaneLoading {
- background:url('images/loadingAnimation_rtl.gif') no-repeat;
-}
diff --git a/lib/dijit/icons/editorIcons.css b/lib/dijit/icons/editorIcons.css
index 8c667ac7d..1889e992b 100644
--- a/lib/dijit/icons/editorIcons.css
+++ b/lib/dijit/icons/editorIcons.css
@@ -19,7 +19,7 @@ editorIcons.css contains references to the dijit editor widget icons. There are
}
-.dijitEditorIconSep { background-position: 0px; }
+.dijitEditorIconSep { background-position: 0; }
.dijitEditorIconSave { background-position: -18px; }
.dijitEditorIconPrint { background-position: -36px; }
.dijitEditorIconCut { background-position: -54px; }
diff --git a/lib/dijit/layout/AccordionContainer.js b/lib/dijit/layout/AccordionContainer.js
index 6177583ba..3470e5426 100644
--- a/lib/dijit/layout/AccordionContainer.js
+++ b/lib/dijit/layout/AccordionContainer.js
@@ -1,498 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.AccordionContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.AccordionContainer"] = true;
-dojo.provide("dijit.layout.AccordionContainer");
-dojo.require("dijit._Container");
-dojo.require("dijit._Templated");
-dojo.require("dijit._CssStateMixin");
-dojo.require("dijit.layout.StackContainer");
-dojo.require("dijit.layout.ContentPane");
-dojo.require("dijit.layout.AccordionPane");
-
-
-//dojo.require("dijit.layout.AccordionPane "); // for back compat, remove for 2.0
-
-// 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.
-
-dojo.declare(
- "dijit.layout.AccordionContainer",
- dijit.layout.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 dojoType="dijit.layout.AccordionContainer">
- // | <div dojoType="dijit.layout.ContentPane" title="pane 1">
- // | </div>
- // | <div dojoType="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: dijit.defaultDuration,
-
- // buttonWidget: [const] String
- // The name of the widget used to display the title of each pane
- buttonWidget: "dijit.layout._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
- dijit.setWaiRole(this.domNode, "tablist"); // TODO: put this in template
- },
-
- startup: function(){
- if(this._started){ return; }
- this.inherited(arguments);
- if(this.selectedChildWidget){
- var style = this.selectedChildWidget.containerNode.style;
- style.display = "";
- style.overflow = "auto";
- 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 = dojo._getMarginExtents(wrapperDomNode),
- wrapperDomNodePadBorder = dojo._getPadBorderExtents(wrapperDomNode),
- wrapperContainerNode = openPane._wrapperWidget.containerNode,
- wrapperContainerNodeMargin = dojo._getMarginExtents(wrapperContainerNode),
- wrapperContainerNodePadBorder = dojo._getPadBorderExtents(wrapperContainerNode),
- mySize = this._contentBox;
-
- // get cumulative height of all the unselected title bars
- var totalCollapsedHeight = 0;
- dojo.forEach(this.getChildren(), function(child){
- if(child != openPane){
- totalCollapsedHeight += dojo._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 = new dijit.layout._AccordionInnerContainer({
- contentWidget: child,
- buttonWidget: this.buttonWidget,
- id: child.id + "_wrapper",
- dir: child.dir,
- lang: child.lang,
- parent: this
- });
-
- this.inherited(arguments);
- },
-
- addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
- 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
- dojo.place(child.domNode, this.containerNode, insertIndex);
-
- if(!child._started){
- child.startup();
- }
-
- // Then stick the wrapper widget around the child widget
- this._setupChild(child);
-
- // Code below copied from StackContainer
- dojo.publish(this.id+"-addChild", [child, insertIndex]);
- 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){
- dojo.place(child.domNode, child._wrapperWidget.domNode, "after");
- child._wrapperWidget.destroy();
- delete child._wrapperWidget;
- }
-
- dojo.removeClass(child.domNode, "dijitHidden");
-
- this.inherited(arguments);
- },
-
- getChildren: function(){
- // Overrides _Container.getChildren() to return content panes rather than internal AccordionInnerContainer panes
- return dojo.map(this.inherited(arguments), function(child){
- return child.declaredClass == "dijit.layout._AccordionInnerContainer" ? child.contentWidget : child;
- }, this);
- },
-
- destroy: function(){
- if(this._animation){
- this._animation.stop();
- }
- dojo.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._Widget?*/ newWidget, /*dijit._Widget?*/ oldWidget, /*Boolean*/ animate){
- // Overrides StackContainer._transition() to provide sliding of title bars etc.
-
- if(dojo.isIE < 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 = dojo._getMarginExtents(wrapperContainerNode),
- wrapperContainerNodePadBorder = dojo._getPadBorderExtents(wrapperContainerNode),
- animationHeightOverhead = wrapperContainerNodeMargin.h + wrapperContainerNodePadBorder.h;
-
- oldContents.style.height = (self._verticalSpace - animationHeightOverhead) + "px";
-
- this._animation = new dojo.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._Widget*/ 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 k = dojo.keys,
- c = e.charOrCode;
- if((fromTitle && (c == k.LEFT_ARROW || c == k.UP_ARROW)) ||
- (e.ctrlKey && c == k.PAGE_UP)){
- this._adjacent(false)._buttonWidget._onTitleClick();
- dojo.stopEvent(e);
- }else if((fromTitle && (c == k.RIGHT_ARROW || c == k.DOWN_ARROW)) ||
- (e.ctrlKey && (c == k.PAGE_DOWN || c == k.TAB))){
- this._adjacent(true)._buttonWidget._onTitleClick();
- dojo.stopEvent(e);
- }
- }
- }
-);
-
-dojo.declare("dijit.layout._AccordionInnerContainer",
- [dijit._Widget, dijit._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: String
- // Name of 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._Widget
- // Pointer to the real child widget
- contentWidget: null,
-=====*/
-
- baseClass: "dijitAccordionInnerContainer",
-
- // tell nested layout widget that we will take care of sizing
- isContainer: true,
- 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 = dojo.place("<div class='" + this.baseClass + "'>", this.contentWidget.domNode, "after");
-
- // wrapper div's first child is the button widget (ie, the title bar)
- var child = this.contentWidget,
- cls = dojo.getObject(this.buttonWidget);
- this.button = child._buttonWidget = (new cls({
- contentWidget: child,
- label: child.title,
- title: child.tooltip,
- dir: child.dir,
- lang: child.lang,
- 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 = dojo.place("<div class='dijitAccordionChildWrapper' style='display:none'>", this.domNode);
- dojo.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', dojo.hitch(this, function(name, oldValue, newValue){
- button.set("label", newValue);
- })),
- this.contentWidget.watch('tooltip', dojo.hitch(this, function(name, oldValue, newValue){
- button.set("title", newValue);
- })),
- this.contentWidget.watch('iconClass', dojo.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();
-
- dojo.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); });
-
- delete this.contentWidget._buttonWidget;
- delete this.contentWidget._wrapperWidget;
-
- this.inherited(arguments);
- },
-
- destroyDescendants: function(){
- // since getChildren isn't working for me, have to code this manually
- this.contentWidget.destroyRecursive();
- }
-});
-
-dojo.declare("dijit.layout._AccordionButton",
- [dijit._Widget, dijit._Templated, dijit._CssStateMixin],
- {
- // summary:
- // The title bar to click to open up an accordion pane.
- // Internal widget used by AccordionContainer.
- // tags:
- // private
-
- templateString: dojo.cache("dijit.layout", "templates/AccordionButton.html", "<div dojoAttachEvent='onclick:_onTitleClick' class='dijitAccordionTitle'>\n\t<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='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\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"),
- attributeMap: dojo.mixin(dojo.clone(dijit.layout.ContentPane.prototype.attributeMap), {
- label: {node: "titleTextNode", type: "innerHTML" },
- title: {node: "titleTextNode", type: "attribute", attribute: "title"},
- iconClass: { 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(' ','_');
- dojo.attr(this.titleTextNode, "id", titleTextNodeId+"_title");
- dijit.setWaiState(this.focusNode, "labelledby", dojo.attr(this.titleTextNode, "id"));
- dojo.setSelectable(this.domNode, false);
- },
-
- getTitleHeight: function(){
- // summary:
- // Returns the height of the title dom node.
- return dojo._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);
- dijit.focus(this.focusNode);
- },
-
- _onTitleKeyPress: function(/*Event*/ evt){
- return this.getParent()._onKeyPress(evt, this.contentWidget);
- },
-
- _setSelectedAttr: function(/*Boolean*/ isSelected){
- this._set("selected", isSelected);
- dijit.setWaiState(this.focusNode, "expanded", isSelected);
- dijit.setWaiState(this.focusNode, "selected", isSelected);
- this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/AccordionContainer.js.uncompressed.js b/lib/dijit/layout/AccordionContainer.js.uncompressed.js
new file mode 100644
index 000000000..a4da71b3d
--- /dev/null
+++ b/lib/dijit/layout/AccordionContainer.js.uncompressed.js
@@ -0,0 +1,555 @@
+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/_base/kernel",
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.getObject lang.hitch
+ "dojo/_base/sniff", // has("ie")
+ "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,
+ kernel, keys, lang, has, topic, focus, manager, ready,
+ _Widget, _Container, _TemplatedMixin, _CssStateMixin, StackContainer, ContentPane, template){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _Container = dijit._Container;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _CssStateMixin = dijit._CssStateMixin;
+ var StackContainer = dijit.layout.StackContainer;
+ var ContentPane = dijit.layout.ContentPane;
+=====*/
+
+ // module:
+ // dijit/layout/AccordionContainer
+ // 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.
+
+
+ // 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);
+ this.focusNode.setAttribute("aria-selected", isSelected);
+ 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._Widget
+ // 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){
+ var style = this.selectedChildWidget.containerNode.style;
+ style.display = "";
+ style.overflow = "auto";
+ 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._Widget*/ child, /*Integer?*/ insertIndex){
+ 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._Widget?*/ newWidget, /*dijit._Widget?*/ 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._Widget*/ 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(!kernel.isAsync){
+ 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 b/lib/dijit/layout/AccordionPane.js
index 394ba346c..07608671f 100644
--- a/lib/dijit/layout/AccordionPane.js
+++ b/lib/dijit/layout/AccordionPane.js
@@ -1,30 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.AccordionPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.AccordionPane"] = true;
-dojo.provide("dijit.layout.AccordionPane");
-dojo.require("dijit.layout.ContentPane");
-
-
-dojo.declare("dijit.layout.AccordionPane", dijit.layout.ContentPane, {
- // summary:
- // Deprecated widget. Use `dijit.layout.ContentPane` instead.
- // tags:
- // deprecated
-
- constructor: function(){
- dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead", "", "2.0");
- },
-
- onSelected: function(){
- // summary:
- // called when this pane is selected
- }
-});
-
-}
+//>>built
+define("dijit/layout/AccordionPane",["dojo/_base/declare","dojo/_base/kernel","./ContentPane"],function(_1,_2,_3){return _1("dijit.layout.AccordionPane",_3,{constructor:function(){_2.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead","","2.0");},onSelected:function(){}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/AccordionPane.js.uncompressed.js b/lib/dijit/layout/AccordionPane.js.uncompressed.js
new file mode 100644
index 000000000..4459329f8
--- /dev/null
+++ b/lib/dijit/layout/AccordionPane.js.uncompressed.js
@@ -0,0 +1,31 @@
+define("dijit/layout/AccordionPane", [
+ "dojo/_base/declare", // declare
+ "dojo/_base/kernel", // kernel.deprecated
+ "./ContentPane"
+], function(declare, kernel, ContentPane){
+
+/*=====
+ var ContentPane = dijit.layout.ContentPane;
+=====*/
+
+ // module:
+ // dijit/layout/AccordionPane
+ // summary:
+ // Deprecated widget. Use `dijit.layout.ContentPane` instead.
+
+ 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 c053256d4..db41c9cb6 100644
--- a/lib/dijit/layout/BorderContainer.js
+++ b/lib/dijit/layout/BorderContainer.js
@@ -1,527 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.BorderContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.BorderContainer"] = true;
-dojo.provide("dijit.layout.BorderContainer");
-dojo.require("dijit.layout._LayoutWidget");
-dojo.require("dojo.cookie");
-dojo.require("dijit._Templated");
-
-
-dojo.declare(
- "dijit.layout.BorderContainer",
- dijit.layout._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 conrol layout precedence of horizontal vs. vertical panes.
- // example:
- // | <div dojoType="dijit.layout.BorderContainer" design="sidebar" gutters="false"
- // | style="width: 400px; height: 300px;">
- // | <div dojoType="dijit.layout.ContentPane" region="top">header text</div>
- // | <div dojoType="dijit.layout.ContentPane" region="right" splitter="true" style="width: 200px;">table of contents</div>
- // | <div dojoType="dijit.layout.ContentPane" 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: String
- // Optional hook to override the default Splitter widget used by BorderContainer
- _splitterClass: "dijit.layout._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; }
- dojo.forEach(this.getChildren(), this._setupChild, this);
- this.inherited(arguments);
- },
-
- _setupChild: function(/*dijit._Widget*/ child){
- // Override _LayoutWidget._setupChild().
-
- var region = child.region;
- if(region){
- this.inherited(arguments);
-
- dojo.addClass(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 = dojo.getObject(child.splitter ? this._splitterClass : "dijit.layout._Gutter");
- var splitter = new _Splitter({
- id: child.id + "_splitter",
- container: this,
- child: child,
- region: region,
- live: this.liveSplitters
- });
- splitter.isSplitter = true;
- child._splitterWidget = splitter;
-
- dojo.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._Widget*/ child, /*Integer?*/ insertIndex){
- // Override _LayoutWidget.addChild().
- this.inherited(arguments);
- if(this._started){
- this.layout(); //OPT
- }
- },
-
- removeChild: function(/*dijit._Widget*/ 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.
- dojo.removeClass(child.domNode, this.baseClass+"Pane");
- dojo.style(child.domNode, {
- top: "auto",
- bottom: "auto",
- left: "auto",
- right: "auto",
- position: "static"
- });
- dojo.style(child.domNode, region == "top" || region == "bottom" ? "width" : "height", "auto");
- },
-
- getChildren: function(){
- // Override _LayoutWidget.getChildren() to only return real children, not the splitters.
- return dojo.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 dojo.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 = dojo.getComputedStyle(node);
- this.pe = dojo._getPadExtents(node, this.cs);
- this.pe.r = dojo._toPixelValue(node, this.cs.paddingRight);
- this.pe.b = dojo._toPixelValue(node, this.cs.paddingBottom);
-
- dojo.style(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 = dojo.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 = [];
- dojo.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
- dijit.layout.layoutChildren(this.domNode, dim, childrenAndSplitters,
- changedChildId, changedChildSize);
- },
-
- destroyRecursive: function(){
- // Destroy splitters first, while getChildren() still works
- dojo.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);
- }
-});
-
-// This argument can be specified for the children of a BorderContainer.
-// 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.)
-dojo.extend(dijit._Widget, {
- // region: [const] String
- // Parameter for children of `dijit.layout.BorderContainer`.
- // Values: "top", "bottom", "leading", "trailing", "left", "right", "center".
- // See the `dijit.layout.BorderContainer` description for details.
- region: '',
-
- // layoutPriority: [const] Number
- // Parameter for children of `dijit.layout.BorderContainer`.
- // 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 child of `dijit.layout.BorderContainer` 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
- // Parameter for children of `dijit.layout.BorderContainer`.
- // Specifies a minimum size (in pixels) for this widget when resized by a splitter.
- minSize: 0,
-
- // maxSize: [const] Number
- // Parameter for children of `dijit.layout.BorderContainer`.
- // Specifies a maximum size (in pixels) for this widget when resized by a splitter.
- maxSize: Infinity
-});
-
-dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
-{
- // 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" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" role="separator"><div class="dijitSplitterThumb"></div></div>',
-
- 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);
-
- dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V"));
-
- if(this.container.persist){
- // restore old size
- var persistSize = dojo.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 = dojo.marginBox(this.child.domNode)[dim],
- center = dojo.filter(this.container.getChildren(), function(child){ return child.region == "center";})[0],
- spaceAvailable = dojo.marginBox(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 = dojo.doc.createElement('div');
- dojo.addClass(this.cover, "dijitSplitterCover");
- dojo.place(this.cover, this.child.domNode, "after");
- }
- dojo.addClass(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){ dojo.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");
- dojo.addClass(this.domNode, "dijitSplitterShadow");
- dojo.place(this.fake, this.domNode, "after");
- }
- dojo.addClass(this.domNode, "dijitSplitterActive dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
- if(this.fake){
- dojo.removeClass(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 = dojo.marginBox(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 = dojo.hitch(this.container, "_layoutChildren", this.child.id),
- de = dojo.doc;
-
- this._handlers = (this._handlers || []).concat([
- dojo.connect(de, "onmousemove", 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";
- }),
- dojo.connect(de, "ondragstart", dojo.stopEvent),
- dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent),
- dojo.connect(de, "onmouseup", this, "_stopDrag")
- ]);
- dojo.stopEvent(e);
- },
-
- _onMouse: function(e){
- var o = (e.type == "mouseover" || e.type == "mouseenter");
- dojo.toggleClass(this.domNode, "dijitSplitterHover", o);
- dojo.toggleClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover", o);
- },
-
- _stopDrag: function(e){
- try{
- if(this.cover){
- dojo.removeClass(this.cover, "dijitSplitterCoverActive");
- }
- if(this.fake){ dojo.destroy(this.fake); }
- dojo.removeClass(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){
- dojo.cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"], {expires:365});
- }
- },
-
- _cleanupHandlers: function(){
- dojo.forEach(this._handlers, dojo.disconnect);
- delete this._handlers;
- },
-
- _onKeyPress: function(/*Event*/ e){
- // should we apply typematic to this?
- this._resize = true;
- var horizontal = this.horizontal;
- var tick = 1;
- var dk = dojo.keys;
- switch(e.charOrCode){
- case horizontal ? dk.UP_ARROW : dk.LEFT_ARROW:
- tick *= -1;
-// break;
- case horizontal ? dk.DOWN_ARROW : dk.RIGHT_ARROW:
- break;
- default:
-// this.inherited(arguments);
- return;
- }
- var childSize = dojo._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));
- dojo.stopEvent(e);
- },
-
- destroy: function(){
- this._cleanupHandlers();
- delete this.child;
- delete this.container;
- delete this.cover;
- delete this.fake;
- this.inherited(arguments);
- }
-});
-
-dojo.declare("dijit.layout._Gutter", [dijit._Widget, dijit._Templated],
-{
- // 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);
- dojo.addClass(this.domNode, "dijitGutter" + (this.horizontal ? "H" : "V"));
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/BorderContainer.js.uncompressed.js b/lib/dijit/layout/BorderContainer.js.uncompressed.js
new file mode 100644
index 000000000..3ae97c0e7
--- /dev/null
+++ b/lib/dijit/layout/BorderContainer.js.uncompressed.js
@@ -0,0 +1,556 @@
+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",
+ "dojo/_base/window", // win.body win.doc win.doc.createElement
+ "../_WidgetBase",
+ "../_Widget",
+ "../_TemplatedMixin",
+ "./_LayoutWidget",
+ "./utils" // layoutUtils.layoutChildren
+], function(array, cookie, declare, domClass, domConstruct, domGeometry, domStyle, event, keys, lang, on, touch, win,
+ _WidgetBase, _Widget, _TemplatedMixin, _LayoutWidget, layoutUtils){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _LayoutWidget = dijit.layout._LayoutWidget;
+=====*/
+
+// module:
+// dijit/layout/BorderContainer
+// summary:
+// Provides layout in up to 5 regions, a mandatory center with optional borders along its 4 sides.
+
+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 = win.doc.createElement('div');
+ domClass.add(this.cover, "dijitSplitterCover");
+ domConstruct.place(this.cover, 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 = win.doc;
+
+ 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(win.body(), "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.
+ // 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._Widget*/ 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._Widget*/ child, /*Integer?*/ insertIndex){
+ // Override _LayoutWidget.addChild().
+ this.inherited(arguments);
+ if(this._started){
+ this.layout(); //OPT
+ }
+ },
+
+ removeChild: function(/*dijit._Widget*/ 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);
+ }
+});
+
+// This argument can be specified for the children of a BorderContainer.
+// 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.)
+lang.extend(_WidgetBase, {
+ // region: [const] String
+ // Parameter for children of `dijit.layout.BorderContainer`.
+ // Values: "top", "bottom", "leading", "trailing", "left", "right", "center".
+ // See the `dijit.layout.BorderContainer` description for details.
+ region: '',
+
+ // layoutPriority: [const] Number
+ // Parameter for children of `dijit.layout.BorderContainer`.
+ // 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 child of `dijit.layout.BorderContainer` 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
+ // Parameter for children of `dijit.layout.BorderContainer`.
+ // Specifies a minimum size (in pixels) for this widget when resized by a splitter.
+ minSize: 0,
+
+ // maxSize: [const] Number
+ // Parameter for children of `dijit.layout.BorderContainer`.
+ // Specifies a maximum size (in pixels) for this widget when resized by a splitter.
+ maxSize: Infinity
+});
+
+// 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 399ec1bc9..1e2a2036b 100644
--- a/lib/dijit/layout/ContentPane.js
+++ b/lib/dijit/layout/ContentPane.js
@@ -1,593 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.ContentPane"] = true;
-dojo.provide("dijit.layout.ContentPane");
-dojo.require("dijit._Widget");
-dojo.require("dijit.layout._ContentPaneResizeMixin");
-dojo.require("dojo.string");
-dojo.require("dojo.html");
-dojo.requireLocalization("dijit", "loading", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare(
- "dijit.layout.ContentPane", [dijit._Widget, dijit.layout._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: dojo._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'>${loadingState}</span>",
-
- // errorMessage: String
- // Message that shows if an error occurs
- errorMessage: "<span class='dijitContentPaneError'>${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",
-
- // ioArgs: Object
- // Parameters to pass to xhrGet() request, for example:
- // | <div dojoType="dijit.layout.ContentPane" href="./bar" ioArgs="{timeout: 500}">
- ioArgs: {},
-
- // onLoadDeferred: [readonly] dojo.Deferred
- // This is the `dojo.Deferred` returned by set('href', ...) and refresh().
- // Calling onLoadDeferred.addCallback() or addErrback() 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,
-
- // Override _Widget's attributeMap 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.
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- title: []
- }),
-
- // 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)){
- var df = dojo.doc.createDocumentFragment();
- srcNodeRef = dojo.byId(srcNodeRef)
- while(srcNodeRef.firstChild){
- df.appendChild(srcNodeRef.firstChild);
- }
- params = dojo.delegate(params, {content: df});
- }
- this.inherited(arguments, [params, srcNodeRef]);
- },
-
- postMixInProperties: function(){
- this.inherited(arguments);
- var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang);
- this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages);
- this.errorMessage = dojo.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(!dojo.attr(this.domNode,"role")){
- dijit.setWaiRole(this.domNode, "group");
- }
- },
-
- _startChildren: 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){
- dojo.forEach(this._contentSetter.parseResults, function(obj){
- if(!obj._started && !obj._destroyed && dojo.isFunction(obj.startup)){
- obj.startup();
- obj._started = true;
- }
- }, this);
- }
- },
-
- setHref: function(/*String|Uri*/ href){
- // summary:
- // Deprecated. Use set('href', ...) instead.
- dojo.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 dojo.Deferred(dojo.hitch(this, "cancel"));
- this.onLoadDeferred.addCallback(dojo.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; // dojo.Deferred
- },
-
- setContent: function(/*String|DomNode|Nodelist*/data){
- // summary:
- // Deprecated. Use set('content', ...) instead.
- dojo.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 dojo.Deferred(dojo.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 dojoType=ContentPane>...</div>)
- // or as initialization parameter (ie: new ContentPane({content: ...})
- this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad"));
- }
-
- this._setContent(data || "");
-
- this._isDownloaded = false; // mark that content is from a set('content') not a set('href')
-
- return this.onLoadDeferred; // dojo.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;
- },
-
- uninitialize: function(){
- if(this._beingDestroyed){
- 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 dojo.Deferred(dojo.hitch(this, "cancel"));
- this.onLoadDeferred.addCallback(dojo.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(dojo.isObject(this.ioArgs)){
- dojo.mixin(getArgs, this.ioArgs);
- }
-
- var hand = (this._xhrDfd = (this.ioMethod || dojo.xhrGet)(getArgs));
-
- hand.addCallback(function(html){
- try{
- self._isDownloaded = true;
- self._setContent(html, false);
- self.onDownloadEnd();
- }catch(err){
- self._onError('Content', err); // onContentError
- }
- delete self._xhrDfd;
- return html;
- });
-
- hand.addErrback(function(err){
- if(!hand.canceled){
- // show error message in the pane
- self._onError('Download', err); // onDownloadError
- }
- delete self._xhrDfd;
- return err;
- });
-
- // 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.callback(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(){
- // 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;
- dojo.forEach(this.getChildren(), function(widget){
- if(widget.destroyRecursive){
- widget.destroyRecursive();
- }
- });
- 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
- dojo.forEach(setter.parseResults, function(widget){
- if(widget.destroyRecursive && widget.domNode && widget.domNode.parentNode == dojo.body()){
- widget.destroyRecursive();
- }
- });
- delete setter.parseResults;
- }
-
- // And then clear away all the DOM nodes
- dojo.html._emptyNode(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
-
- // first get rid of child widgets
- this.destroyDescendants();
-
- // dojo.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 dojo.html._ContentSetter)){
- setter = this._contentSetter = new dojo.html._ContentSetter({
- node: this.containerNode,
- _onError: dojo.hitch(this, this._onError),
- onContentError: dojo.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 = dojo.mixin({
- cleanContent: this.cleanContent,
- extractContent: this.extractContent,
- parseContent: this.parseOnLoad,
- parserScope: this.parserScope,
- startup: false,
- dir: this.dir,
- lang: this.lang
- }, this._contentSetterParams || {});
-
- setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams );
-
- // setter params must be pulled afresh from the ContentPane each time
- delete this._contentSetterParams;
-
- if(this.doLayout){
- this._checkIfSingleChild();
- }
-
- if(!isFakeContent){
- if(this._started){
- // Startup each top level child widget (and they will start their children, recursively)
- this._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
- this._scheduleLayout();
- }
-
- this._onLoadHandler(cont);
- }
- },
-
- _onError: function(type, err, consoleText){
- this.onLoadDeferred.errback(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
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/ContentPane.js.uncompressed.js b/lib/dijit/layout/ContentPane.js.uncompressed.js
new file mode 100644
index 000000000..eb57db2e0
--- /dev/null
+++ b/lib/dijit/layout/ContentPane.js.uncompressed.js
@@ -0,0 +1,611 @@
+define("dijit/layout/ContentPane", [
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/lang", // lang.mixin lang.delegate lang.hitch lang.isFunction lang.isObject
+ "../_Widget",
+ "./_ContentPaneResizeMixin",
+ "dojo/string", // string.substitute
+ "dojo/html", // html._ContentSetter html._emptyNode
+ "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/_base/window", // win.body win.doc.createDocumentFragment
+ "dojo/_base/xhr", // xhr.get
+ "dojo/i18n" // i18n.getLocalization
+], function(kernel, lang, _Widget, _ContentPaneResizeMixin, string, html, nlsLoading,
+ array, declare, Deferred, dom, domAttr, win, xhr, i18n){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _ContentPaneResizeMixin = dijit.layout._ContentPaneResizeMixin;
+=====*/
+
+// module:
+// dijit/layout/ContentPane
+// summary:
+// A widget containing an HTML fragment, specified inline
+// or by uri. Fragment may include widgets.
+
+
+return declare("dijit.layout.ContentPane", [_Widget, _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.xhrGet|dojo.xhrPost
+ // 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.addCallback() or addErrback() 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)){
+ var df = win.doc.createDocumentFragment();
+ srcNodeRef = dom.byId(srcNodeRef);
+ 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);
+ }
+ },
+
+ 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.addCallback(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.addCallback(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;
+ },
+
+ uninitialize: function(){
+ if(this._beingDestroyed){
+ 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.addCallback(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));
+
+ hand.addCallback(function(html){
+ try{
+ self._isDownloaded = true;
+ self._setContent(html, false);
+ self.onDownloadEnd();
+ }catch(err){
+ self._onError('Content', err); // onContentError
+ }
+ delete self._xhrDfd;
+ return html;
+ });
+
+ hand.addErrback(function(err){
+ if(!hand.canceled){
+ // show error message in the pane
+ self._onError('Download', err); // onDownloadError
+ }
+ delete self._xhrDfd;
+ return err;
+ });
+
+ // 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.callback(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){
+ widget.destroyRecursive(preserveDom);
+ }
+ });
+ 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.destroyRecursive && widget.domNode && widget.domNode.parentNode == win.body()){
+ widget.destroyRecursive(preserveDom);
+ }
+ });
+ delete setter.parseResults;
+ }
+
+ // And then clear away all the DOM nodes
+ if(!preserveDom){
+ html._emptyNode(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
+
+ // 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 || {});
+
+ setter.set( (lang.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams );
+
+ // setter params must be pulled afresh from the ContentPane each time
+ delete this._contentSetterParams;
+
+ if(this.doLayout){
+ this._checkIfSingleChild();
+ }
+
+ if(!isFakeContent){
+ if(this._started){
+ // Startup each top level child widget (and they will start their children, recursively)
+ delete this._started;
+ this.startup();
+
+ // 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
+ this._scheduleLayout();
+ }
+
+ this._onLoadHandler(cont);
+ }
+ },
+
+ _onError: function(type, err, consoleText){
+ this.onLoadDeferred.errback(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 11204346f..bc4f3a618 100644
--- a/lib/dijit/layout/LayoutContainer.js
+++ b/lib/dijit/layout/LayoutContainer.js
@@ -1,86 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.LayoutContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.LayoutContainer"] = true;
-dojo.provide("dijit.layout.LayoutContainer");
-dojo.require("dijit.layout._LayoutWidget");
-
-
-dojo.declare("dijit.layout.LayoutContainer",
- dijit.layout._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.
- //
- // example:
- // | <style>
- // | html, body{ height: 100%; width: 100%; }
- // | </style>
- // | <div dojoType="dijit.layout.LayoutContainer" style="width: 100%; height: 100%">
- // | <div dojoType="dijit.layout.ContentPane" layoutAlign="top">header text</div>
- // | <div dojoType="dijit.layout.ContentPane" layoutAlign="left" style="width: 200px;">table of contents</div>
- // | <div dojoType="dijit.layout.ContentPane" 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(){
- dojo.deprecated("dijit.layout.LayoutContainer is deprecated", "use BorderContainer instead", 2.0);
- },
-
- layout: function(){
- dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
- },
-
- addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
- this.inherited(arguments);
- if(this._started){
- dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
- }
- },
-
- removeChild: function(/*dijit._Widget*/ widget){
- this.inherited(arguments);
- if(this._started){
- dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
- }
- }
-});
-
-// This argument can be specified for the children of a LayoutContainer.
-// 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.)
-dojo.extend(dijit._Widget, {
- // layoutAlign: String
- // "none", "left", "right", "bottom", "top", and "client".
- // See the LayoutContainer description for details on this parameter.
- layoutAlign: 'none'
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/LayoutContainer.js.uncompressed.js b/lib/dijit/layout/LayoutContainer.js.uncompressed.js
new file mode 100644
index 000000000..0881ba5a1
--- /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){
+
+/*=====
+ var _WidgetBase = dijit._WidgetBase;
+ var _LayoutWidget = dijit.layout._LayoutWidget;
+=====*/
+
+// module:
+// dijit/layout/LayoutContainer
+// summary:
+// Deprecated. Use `dijit.layout.BorderContainer` instead.
+
+
+// This argument can be specified for the children of a LayoutContainer.
+// 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.)
+lang.extend(_WidgetBase, {
+ // layoutAlign: String
+ // "none", "left", "right", "bottom", "top", and "client".
+ // See the LayoutContainer description for details on this parameter.
+ layoutAlign: 'none'
+});
+
+return 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.
+ //
+ // 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._Widget*/ child, /*Integer?*/ insertIndex){
+ this.inherited(arguments);
+ if(this._started){
+ layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ }
+ },
+
+ removeChild: function(/*dijit._Widget*/ widget){
+ this.inherited(arguments);
+ if(this._started){
+ layoutUtils.layoutChildren(this.domNode, this._contentBox, this.getChildren());
+ }
+ }
+});
+
+});
diff --git a/lib/dijit/layout/LinkPane.js b/lib/dijit/layout/LinkPane.js
index 34e2d92bb..b3714bb04 100644
--- a/lib/dijit/layout/LinkPane.js
+++ b/lib/dijit/layout/LinkPane.js
@@ -1,51 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.LinkPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.LinkPane"] = true;
-dojo.provide("dijit.layout.LinkPane");
-dojo.require("dijit.layout.ContentPane");
-dojo.require("dijit._Templated");
-
-
-dojo.declare("dijit.layout.LinkPane",
- [dijit.layout.ContentPane, dijit._Templated],
- {
- // 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" dojoAttachPoint="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(/*DomNode*/ source){
- // 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
- }
-});
-
-}
+//>>built
+define("dijit/layout/LinkPane",["./ContentPane","../_TemplatedMixin","dojo/_base/declare"],function(_1,_2,_3){return _3("dijit.layout.LinkPane",[_1,_2],{templateString:"<div class=\"dijitLinkPane\" data-dojo-attach-point=\"containerNode\"></div>",postMixInProperties:function(){if(this.srcNodeRef){this.title+=this.srcNodeRef.innerHTML;}this.inherited(arguments);},_fillContent:function(){}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/LinkPane.js.uncompressed.js b/lib/dijit/layout/LinkPane.js.uncompressed.js
new file mode 100644
index 000000000..f70607185
--- /dev/null
+++ b/lib/dijit/layout/LinkPane.js.uncompressed.js
@@ -0,0 +1,52 @@
+define("dijit/layout/LinkPane", [
+ "./ContentPane",
+ "../_TemplatedMixin",
+ "dojo/_base/declare" // declare
+], function(ContentPane, _TemplatedMixin, declare){
+
+/*=====
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var ContentPane = dijit.layout.ContentPane;
+=====*/
+
+ // module:
+ // dijit/layout/LinkPane
+ // summary:
+ // A ContentPane with an href where (when declared in markup)
+ // the title is specified as innerHTML rather than as a title attribute.
+
+
+ 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 a91c526de..aa4bc7626 100644
--- a/lib/dijit/layout/ScrollingTabController.js
+++ b/lib/dijit/layout/ScrollingTabController.js
@@ -1,483 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.ScrollingTabController"] = true;
-dojo.provide("dijit.layout.ScrollingTabController");
-dojo.require("dijit.layout.TabController");
-dojo.require("dijit.Menu");
-dojo.require("dijit.form.Button");
-dojo.require("dijit._HasDropDown");
-
-
-dojo.declare("dijit.layout.ScrollingTabController",
- dijit.layout.TabController,
- {
- // 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
-
- templateString: dojo.cache("dijit.layout", "templates/ScrollingTabController.html", "<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" containerId=\"${containerId}\" iconClass=\"dijitTabStripMenuIcon\"\n\t\t\tdropDownPosition=\"below-alt, above-alt\"\n\t\t\tdojoAttachPoint=\"_menuBtn\" showLabel=\"false\">&#9660;</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\" iconClass=\"dijitTabStripSlideLeftIcon\"\n\t\t\tdojoAttachPoint=\"_leftBtn\" dojoAttachEvent=\"onClick: doSlideLeft\" showLabel=\"false\">&#9664;</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\" iconClass=\"dijitTabStripSlideRightIcon\"\n\t\t\tdojoAttachPoint=\"_rightBtn\" dojoAttachEvent=\"onClick: doSlideRight\" showLabel=\"false\">&#9654;</div>\n\t<div class='dijitTabListWrapper' dojoAttachPoint='tablistWrapper'>\n\t\t<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'\n\t\t\t\tdojoAttachPoint='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>\n"),
-
- // 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,
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- "class": "containerNode"
- }),
-
- 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";
- dojo.addClass(n, "tabStrip-disabled")
- }
-
- dojo.addClass(this.tablistWrapper, this.tabStripClass);
- },
-
- onStartup: function(){
- this.inherited(arguments);
-
- // Do not show the TabController until the related
- // StackController has added it's children. This gives
- // a less visually jumpy instantiation.
- dojo.style(this.domNode, "visibility", "visible");
- this._postStartup = true;
- },
-
- onAddChild: function(page, insertIndex){
- this.inherited(arguments);
-
- // changes to the tab button label or iconClass will have changed the width of the
- // buttons, so do a resize
- dojo.forEach(["label", "iconClass"], function(attr){
- this.pane2watches[page.id].push(
- this.pane2button[page.id].watch(attr, dojo.hitch(this, function(name, oldValue, newValue){
- if(this._postStartup && this._dim){
- this.resize(this._dim);
- }
- }))
- );
- }, this);
-
- // 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.
- dojo.style(this.containerNode, "width",
- (dojo.style(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 = dojo.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 += dojo._getMarginSize(btn).w;
- return true;
- }else{
- dojo.style(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 + dojo.style(rightTab, "width") - 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 || dojo.style(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.
-
- if(this.domNode.offsetWidth == 0){
- return;
- }
-
- // 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";
- this._contentBox = dijit.layout.marginBox2contentBox(this.domNode, {h: 0, w: dim.w});
- this._contentBox.h = this.scrollNode.offsetHeight;
- dojo.contentBox(this.domNode, this._contentBox);
-
- // 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";
- dijit.layout.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();
- }
- var w = this.scrollNode,
- sl = this._convertToScrollLeft(this._getScrollForSelectedTab());
- w.scrollLeft = sl;
- }
-
- // 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"
- var sl = (this.isLeftToRight() || dojo.isIE < 8 || (dojo.isIE && dojo.isQuirks) || dojo.isWebKit) ? this.scrollNode.scrollLeft :
- dojo.style(this.containerNode, "width") - dojo.style(this.scrollNode, "width")
- + (dojo.isIE == 8 ? -1 : 1) * this.scrollNode.scrollLeft;
- return sl;
- },
-
- _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() || dojo.isIE < 8 || (dojo.isIE && dojo.isQuirks) || dojo.isWebKit){
- return val;
- }else{
- var maxScroll = dojo.style(this.containerNode, "width") - dojo.style(this.scrollNode, "width");
- return (dojo.isIE == 8 ? -1 : 1) * (val - maxScroll);
- }
- },
-
- onSelectChild: function(/*dijit._Widget*/ page){
- // summary:
- // Smoothly scrolls to a tab when it is selected.
-
- var tab = this.pane2button[page.id];
- if(!tab || !page){return;}
-
- // Scroll to the selected tab, except on startup, when scrolling is handled in resize()
- var node = tab.domNode;
- if(this._postResize && node != this._selectedTab){
- this._selectedTab = node;
-
- var sl = this._getScroll();
-
- if(sl > node.offsetLeft ||
- sl + dojo.style(this.scrollNode, "width") <
- node.offsetLeft + dojo.style(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 = dojo.style(this.scrollNode, "width"), // about 500px
- containerWidth = dojo.style(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 + dojo.style(children[children.length-1].domNode, "width")) - 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 = dojo.style(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 + dojo.style(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 dojo._Animation({
- beforeBegin: function(){
- if(this.curve){ delete this.curve; }
- var oldS = w.scrollLeft,
- newS = self._convertToScrollLeft(x);
- anim.curve = new dojo._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._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 && !dojo.hasClass(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 && dojo.hasClass(node, "dijitTabDisabled")){return;}
-
- var sWidth = dojo.style(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);
- }
-});
-
-
-dojo.declare("dijit.layout._ScrollingTabControllerButtonMixin", null, {
- baseClass: "dijitTab tabStripButton",
-
- templateString: dojo.cache("dijit.layout", "templates/_ScrollingTabControllerButton.html", "<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" dojoAttachPoint=\"iconNode\"/>\n\t\t\t<span dojoAttachPoint=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>\n"),
-
- // 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; }
-});
-
-dojo.declare("dijit.layout._ScrollingTabControllerButton",
- [dijit.form.Button, dijit.layout._ScrollingTabControllerButtonMixin]);
-
-dojo.declare(
- "dijit.layout._ScrollingTabControllerMenuButton",
- [dijit.form.Button, dijit._HasDropDown, dijit.layout._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 dijit.Menu({
- id: this.containerId + "_menu",
- dir: this.dir,
- lang: this.lang
- });
- var container = dijit.byId(this.containerId);
- dojo.forEach(container.getChildren(), function(page){
- var menuItem = new dijit.MenuItem({
- id: page.id + "_stcMi",
- label: page.title,
- iconClass: page.iconClass,
- dir: page.dir,
- lang: page.lang,
- 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;
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/ScrollingTabController.js.uncompressed.js b/lib/dijit/layout/ScrollingTabController.js.uncompressed.js
new file mode 100644
index 000000000..6a37f2189
--- /dev/null
+++ b/lib/dijit/layout/ScrollingTabController.js.uncompressed.js
@@ -0,0 +1,514 @@
+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", // 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/query", // query
+ "dojo/_base/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, query, has,
+ registry, tabControllerTemplate, buttonTemplate, TabController, layoutUtils, _WidgetsInTemplateMixin,
+ Menu, MenuItem, Button, _HasDropDown){
+
+/*=====
+var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin;
+var Menu = dijit.Menu;
+var _HasDropDown = dijit._HasDropDown;
+var TabController = dijit.layout.TabController;
+=====*/
+
+
+// module:
+// dijit/layout/ScrollingTabController
+// summary:
+// Set of tabs with left/right arrow keys and a menu to switch between tabs not
+// all fitting on a single row.
+
+
+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;
+ },
+
+ onAddChild: function(page, insertIndex){
+ this.inherited(arguments);
+
+ // changes to the tab button label or iconClass will have changed the width of the
+ // buttons, so do a resize
+ array.forEach(["label", "iconClass"], function(attr){
+ this.pane2watches[page.id].push(
+ this.pane2button[page.id].watch(attr, lang.hitch(this, function(){
+ if(this._postStartup && this._dim){
+ this.resize(this._dim);
+ }
+ }))
+ );
+ }, this);
+
+ // 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 + domStyle.get(rightTab, "width") - 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._Widget*/ 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 + domStyle.get(children[children.length-1].domNode, "width")) - 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._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; }
+});
+/*=====
+ScrollingTabControllerButtonMixin = dijit.layout._ScrollingTabControllerButtonMixin;
+=====*/
+
+// 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",
+ 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,
+ 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 cb18273e4..165ba9e2e 100644
--- a/lib/dijit/layout/SplitContainer.js
+++ b/lib/dijit/layout/SplitContainer.js
@@ -1,589 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.SplitContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.SplitContainer"] = true;
-dojo.provide("dijit.layout.SplitContainer");
-dojo.require("dojo.cookie");
-dojo.require("dijit.layout._LayoutWidget");
-
-
-//
-// FIXME: make it prettier
-// FIXME: active dragging upwards doesn't always shift other bars (direction calculation is wrong in this case)
-//
-
-
-dojo.declare("dijit.layout.SplitContainer",
- dijit.layout._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.
- // tags:
- // deprecated
-
- constructor: function(){
- dojo.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, // FIXME: this should be a CSS attribute (at 7 because css wants it to be 7 until we fix to css)
-
- // 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(dojo.isMozilla){
- 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 = dojo.doc.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);
- dojo.setSelectable(sizer, false);
- },
-
- destroy: function(){
- delete this.virtualSizer;
- dojo.forEach(this._ownconnects, dojo.disconnect);
- this.inherited(arguments);
- },
- startup: function(){
- if(this._started){ return; }
-
- dojo.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._Widget*/ child){
- this.inherited(arguments);
- child.domNode.style.position = "absolute";
- dojo.addClass(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 = dojo.doc.createElement('div');
- sizer.id=dijit.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 = dojo.doc.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');
-
- dojo.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=dojo.indexOf(this.getChildren(), widget)
- if(i != -1){
- if(i == this.sizers.length){
- i--;
- }
- dojo.destroy(this.sizers[i]);
- this.sizers.splice(i,1);
- }
- }
-
- // Remove widget and repaint
- this.inherited(arguments);
- if(this._started){
- this.layout();
- }
- },
-
- addChild: function(/*dijit._Widget*/ 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;
- dojo.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;
- dojo.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;
- }
-
- dojo.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){
- 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;
- var box = {w: size, h: this.paneHeight};
- if(panel.resize){
- panel.resize(box);
- }else{
- dojo.marginBox(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';
- var box = {w: this.paneWidth, h: size};
- if(panel.resize){
- panel.resize(box);
- }else{
- dojo.marginBox(panel.domNode, box);
- }
- }
- },
-
- _moveSlider: function(slider, pos, size){
- if(this.isHorizontal){
- slider.style.left = pos + 'px';
- slider.style.top = 0;
- dojo.marginBox(slider, { w: size, h: this.paneHeight });
- }else{
- slider.style.left = 0;
- slider.style.top = pos + 'px';
- dojo.marginBox(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();
-
- dojo.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;
-
- dojo.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;
- dojo.forEach(list, function(child){
- growth = this._growPane(growth, child);
- }, this);
- }
- }else{
- dojo.forEach(children, function(child){
- child.sizeActual = Math.round(totalSize * (child.sizeMin / totalMinSize));
- });
- }
- },
-
- beginSizing: function(e, i){
- var children = this.getChildren();
- this.paneBefore = children[i];
- this.paneAfter = children[i+1];
-
- this.isSizing = true;
- this.sizingSplitter = this.sizers[i];
-
- if(!this.cover){
- this.cover = dojo.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;
-
- // TODO: REVISIT - we want MARGIN_BOX and core hasn't exposed that yet (but can't we use it anyway if we pay attention? we do elsewhere.)
- this.originPos = dojo.position(children[0].domNode, true);
- if(this.isHorizontal){
- var client = e.layerX || e.offsetX || 0;
- var screen = e.pageX;
- this.originPos = this.originPos.x;
- }else{
- var client = e.layerY || e.offsetY || 0;
- var screen = e.pageY;
- this.originPos = this.originPos.y;
- }
- this.startPoint = this.lastPoint = screen;
- this.screenToClientOffset = screen - client;
- this.dragOffset = this.lastPoint - this.paneBefore.sizeActual - this.originPos - this.paneBefore.position;
-
- if(!this.activeSizing){
- this._showSizingLine();
- }
-
- //
- // attach mouse events
- //
- this._ownconnects = [];
- this._ownconnects.push(dojo.connect(dojo.doc.documentElement, "onmousemove", this, "changeSizing"));
- this._ownconnects.push(dojo.connect(dojo.doc.documentElement, "onmouseup", this, "endSizing"));
-
- dojo.stopEvent(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();
- }
- dojo.stopEvent(e);
- },
-
- endSizing: function(e){
- 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);
- }
-
- dojo.forEach(this._ownconnects, dojo.disconnect);
- },
-
- movePoint: function(){
-
- // make sure lastPoint is a legal point to drag to
- 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(){
- //FIXME: sometimes this.lastPoint is NaN
- var pos = this.lastPoint - this.dragOffset - this.originPos;
-
- var start_region = this.paneBefore.position;
- var end_region = this.paneAfter.position + this.paneAfter.sizeActual;
-
- this.paneBefore.sizeActual = pos - start_region;
- this.paneAfter.position = pos + this.sizerWidth;
- this.paneAfter.sizeActual = end_region - this.paneAfter.position;
-
- dojo.forEach(this.getChildren(), function(child){
- child.sizeShare = child.sizeActual;
- });
-
- if(this._started){
- this.layout();
- }
- },
-
- _showSizingLine: function(){
-
- this._moveSizingLine();
-
- dojo.marginBox(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;
- dojo.style(this.virtualSizer,(this.isHorizontal ? "left" : "top"),pos+"px");
- // this.virtualSizer.style[ this.isHorizontal ? "left" : "top" ] = pos + 'px'; // FIXME: remove this line if the previous is better
- },
-
- _getCookieName: function(i){
- return this.id + "_" + i;
- },
-
- _restoreState: function(){
- dojo.forEach(this.getChildren(), function(child, i){
- var cookieName = this._getCookieName(i);
- var cookieValue = dojo.cookie(cookieName);
- if(cookieValue){
- var pos = parseInt(cookieValue);
- if(typeof pos == "number"){
- child.sizeShare = pos;
- }
- }
- }, this);
- },
-
- _saveState: function(){
- if(!this.persist){
- return;
- }
- dojo.forEach(this.getChildren(), function(child, i){
- dojo.cookie(this._getCookieName(i), child.sizeShare, {expires:365});
- }, this);
- }
-});
-
-// These arguments can be specified for the children of a SplitContainer.
-// 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.)
-dojo.extend(dijit._Widget, {
- // sizeMin: [deprecated] Integer
- // Deprecated. Parameter for children of `dijit.layout.SplitContainer`.
- // 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
- // Deprecated. Parameter for children of `dijit.layout.SplitContainer`.
- // 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
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/SplitContainer.js.uncompressed.js b/lib/dijit/layout/SplitContainer.js.uncompressed.js
new file mode 100644
index 000000000..5b411c931
--- /dev/null
+++ b/lib/dijit/layout/SplitContainer.js.uncompressed.js
@@ -0,0 +1,611 @@
+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/_base/sniff", // has("mozilla")
+ "dojo/_base/window", // win.doc.createElement win.doc.documentElement
+ "../registry", // registry.getUniqueId()
+ "../_WidgetBase",
+ "./_LayoutWidget"
+], function(array, cookie, declare, dom, domClass, domConstruct, domGeometry, domStyle,
+ event, kernel, lang, on, has, win, registry, _WidgetBase, _LayoutWidget){
+
+/*=====
+var _WidgetBase = dijit._WidgetBase;
+var _LayoutWidget = dijit.layout._LayoutWidget;
+=====*/
+
+// module:
+// dijit/layout/SplitContainer
+// summary:
+// Deprecated. Use `dijit.layout.BorderContainer` instead.
+
+//
+// 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)
+//
+
+// These arguments can be specified for the children of a SplitContainer.
+// 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.)
+lang.extend(_WidgetBase, {
+ // sizeMin: [deprecated] Integer
+ // Deprecated. Parameter for children of `dijit.layout.SplitContainer`.
+ // 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
+ // Deprecated. Parameter for children of `dijit.layout.SplitContainer`.
+ // 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
+});
+
+return 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.
+ // 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 = win.doc.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._Widget*/ 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 = win.doc.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 = win.doc.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._Widget*/ 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){
+ var children = this.getChildren();
+ this.paneBefore = children[i];
+ this.paneAfter = children[i+1];
+
+ this.isSizing = true;
+ this.sizingSplitter = this.sizers[i];
+
+ 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;
+
+ // TODO: REVISIT - we want MARGIN_BOX and core hasn't exposed that yet (but can't we use it anyway if we pay attention? we do elsewhere.)
+ this.originPos = domGeometry.position(children[0].domNode, true);
+ var client, screen;
+ if(this.isHorizontal){
+ client = e.layerX || e.offsetX || 0;
+ screen = e.pageX;
+ this.originPos = this.originPos.x;
+ }else{
+ client = e.layerY || e.offsetY || 0;
+ screen = e.pageY;
+ this.originPos = this.originPos.y;
+ }
+ this.startPoint = this.lastPoint = screen;
+ this.screenToClientOffset = screen - client;
+ this.dragOffset = this.lastPoint - this.paneBefore.sizeActual - this.originPos - this.paneBefore.position;
+
+ if(!this.activeSizing){
+ this._showSizingLine();
+ }
+
+ //
+ // attach mouse events
+ //
+ this._ownconnects = [
+ on(win.doc.documentElement, "mousemove", lang.hitch(this, "changeSizing")),
+ on(win.doc.documentElement, "mouseup", lang.hitch(this, "endSizing"))
+ ];
+
+ event.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();
+ }
+ event.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(){
+
+ // make sure lastPoint is a legal point to drag to
+ 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(){
+ //FIXME: sometimes this.lastPoint is NaN
+ var pos = this.lastPoint - this.dragOffset - this.originPos;
+
+ var start_region = this.paneBefore.position;
+ var end_region = this.paneAfter.position + this.paneAfter.sizeActual;
+
+ this.paneBefore.sizeActual = pos - start_region;
+ this.paneAfter.position = pos + this.sizerWidth;
+ this.paneAfter.sizeActual = end_region - this.paneAfter.position;
+
+ array.forEach(this.getChildren(), function(child){
+ child.sizeShare = child.sizeActual;
+ });
+
+ if(this._started){
+ this.layout();
+ }
+ },
+
+ _showSizingLine: function(){
+
+ this._moveSizingLine();
+
+ 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(){
+ var pos = (this.lastPoint - this.startPoint) + this.sizingSplitter.position;
+ domStyle.set(this.virtualSizer,(this.isHorizontal ? "left" : "top"),pos+"px");
+ // this.virtualSizer.style[ this.isHorizontal ? "left" : "top" ] = pos + 'px'; // FIXME: remove this line if the previous is better
+ },
+
+ _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);
+ }
+});
+
+});
diff --git a/lib/dijit/layout/StackContainer.js b/lib/dijit/layout/StackContainer.js
index 98af4c942..b3e5ac15c 100644
--- a/lib/dijit/layout/StackContainer.js
+++ b/lib/dijit/layout/StackContainer.js
@@ -1,336 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.StackContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.StackContainer"] = true;
-dojo.provide("dijit.layout.StackContainer");
-dojo.require("dijit._Templated");
-dojo.require("dijit.layout._LayoutWidget");
-dojo.requireLocalization("dijit", "common", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.require("dojo.cookie");
-dojo.require("dijit.layout.StackController");
-
-
-dojo.declare(
- "dijit.layout.StackContainer",
- dijit.layout._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.
-
- // 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);
- dojo.addClass(this.domNode, "dijitLayoutContainer");
- dijit.setWaiRole(this.containerNode, "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
- dojo.forEach(children, this._setupChild, this);
-
- // Figure out which child to initially display, defaulting to first one
- if(this.persist){
- this.selectedChildWidget = dijit.byId(dojo.cookie(this.id + "_selectedChild"));
- }else{
- dojo.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.
- dojo.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(){
- // 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.
- var selected = this.selectedChildWidget;
- if(selected && !this._hasBeenShown){
- this._hasBeenShown = true;
- this._showChild(selected);
- }
- this.inherited(arguments);
- },
-
- _setupChild: function(/*dijit._Widget*/ child){
- // Overrides _LayoutWidget._setupChild()
-
- this.inherited(arguments);
-
- dojo.replaceClass(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._Widget*/ child, /*Integer?*/ insertIndex){
- // Overrides _Container.addChild() to do layout and publish events
-
- this.inherited(arguments);
-
- if(this._started){
- dojo.publish(this.id+"-addChild", [child, insertIndex]);
-
- // 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()
- this.layout();
-
- // if this is the first child, then select it
- if(!this.selectedChildWidget){
- this.selectChild(child);
- }
- }
- },
-
- removeChild: function(/*dijit._Widget*/ 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
- dojo.publish(this.id + "-removeChild", [page]);
- }
-
- // If we 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._beingDestroyed){ 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._Widget|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 = dijit.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);
- dojo.publish(this.id+"-selectChild", [page]);
-
- if(this.persist){
- dojo.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(/*dijit._Widget*/ newWidget, /*dijit._Widget*/ oldWidget, /*Boolean*/ animate){
- // summary:
- // Hide the old widget and display the new widget.
- // Subclasses should override this.
- // 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.
- var children = this.getChildren();
- var index = dojo.indexOf(children, this.selectedChildWidget);
- index += forward ? 1 : children.length - 1;
- return children[ index % children.length ]; // dijit._Widget
- },
-
- 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){
- dojo.publish(this.id+"-containerKeyPress", [{ e: e, page: this}]);
- },
-
- layout: function(){
- // Implement _LayoutWidget.layout() virtual method.
- if(this.doLayout && this.selectedChildWidget && this.selectedChildWidget.resize){
- this.selectedChildWidget.resize(this._containerContentBox || this._contentBox);
- }
- },
-
- _showChild: function(/*dijit._Widget*/ 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);
-
- dojo.replaceClass(page.domNode, "dijitVisible", "dijitHidden");
-
- return page._onShow() || true;
- },
-
- _hideChild: function(/*dijit._Widget*/ page){
- // summary:
- // Hide the specified child by changing it's CSS, and call _onHide() so
- // it's notified.
- page._set("selected", false);
- dojo.replaceClass(page.domNode, "dijitHidden", "dijitVisible");
-
- page.onHide();
- },
-
- closeChild: function(/*dijit._Widget*/ 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){
- dojo.forEach(this.getChildren(), function(child){
- this.removeChild(child);
- child.destroyRecursive(preserveDom);
- }, this);
- }
-});
-
-// For back-compat, remove for 2.0
-
-
-// These arguments can be specified for the children of a StackContainer.
-// 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.)
-dojo.extend(dijit._Widget, {
- // selected: Boolean
- // Parameter for children of `dijit.layout.StackContainer` or subclasses.
- // Specifies that this widget should be the initially displayed pane.
- // Note: to change the selected child use `dijit.layout.StackContainer.selectChild`
- selected: false,
-
- // closable: Boolean
- // Parameter for children of `dijit.layout.StackContainer` or subclasses.
- // True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
- closable: false,
-
- // iconClass: String
- // Parameter for children of `dijit.layout.StackContainer` or subclasses.
- // CSS Class specifying icon to use in label associated with this pane.
- iconClass: "",
-
- // showTitle: Boolean
- // Parameter for children of `dijit.layout.StackContainer` or subclasses.
- // When true, display title of this widget as tab label etc., rather than just using
- // icon specified in iconClass
- showTitle: true
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/StackContainer.js.uncompressed.js b/lib/dijit/layout/StackContainer.js.uncompressed.js
new file mode 100644
index 000000000..fad72813b
--- /dev/null
+++ b/lib/dijit/layout/StackContainer.js.uncompressed.js
@@ -0,0 +1,368 @@
+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/_base/kernel", // kernel.isAsync
+ "dojo/_base/lang", // lang.extend
+ "dojo/ready",
+ "dojo/topic", // publish
+ "../registry", // registry.byId
+ "../_WidgetBase",
+ "./_LayoutWidget",
+ "dojo/i18n!../nls/common"
+], function(array, cookie, declare, domClass, kernel, lang, ready, topic,
+ registry, _WidgetBase, _LayoutWidget){
+
+/*=====
+var _WidgetBase = dijit._WidgetBase;
+var _LayoutWidget = dijit.layout._LayoutWidget;
+var StackController = dijit.layout.StackController;
+=====*/
+
+// module:
+// dijit/layout/StackContainer
+// summary:
+// A container that has multiple children, but shows only one child at a time.
+
+// Back compat w/1.6, remove for 2.0
+if(!kernel.isAsync){
+ ready(0, function(){
+ var requires = ["dijit/layout/StackController"];
+ require(requires); // use indirection so modules not rolled into a build
+ });
+}
+
+// These arguments can be specified for the children of a StackContainer.
+// 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.)
+lang.extend(_WidgetBase, {
+ // selected: Boolean
+ // Parameter for children of `dijit.layout.StackContainer` or subclasses.
+ // Specifies that this widget should be the initially displayed pane.
+ // Note: to change the selected child use `dijit.layout.StackContainer.selectChild`
+ selected: false,
+
+ // closable: Boolean
+ // Parameter for children of `dijit.layout.StackContainer` or subclasses.
+ // True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
+ closable: false,
+
+ // iconClass: String
+ // Parameter for children of `dijit.layout.StackContainer` or subclasses.
+ // CSS Class specifying icon to use in label associated with this pane.
+ iconClass: "dijitNoIcon",
+
+ // showTitle: Boolean
+ // Parameter for children of `dijit.layout.StackContainer` or subclasses.
+ // When true, display title of this widget as tab label etc., rather than just using
+ // icon specified in iconClass
+ showTitle: true
+});
+
+return 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.
+
+ // 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(){
+ // 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._Widget*/ 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._Widget*/ 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._Widget*/ 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._Widget|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._Widget
+ // The newly selected widget.
+ // oldWidget: dijit._Widget
+ // 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.
+ var children = this.getChildren();
+ var index = array.indexOf(children, this.selectedChildWidget);
+ index += forward ? 1 : children.length - 1;
+ return children[ index % children.length ]; // dijit._Widget
+ },
+
+ 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._Widget*/ 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._Widget*/ 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._Widget*/ 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;
+ }
+});
+
+});
diff --git a/lib/dijit/layout/StackController.js b/lib/dijit/layout/StackController.js
index e0d2075bb..504a9d717 100644
--- a/lib/dijit/layout/StackController.js
+++ b/lib/dijit/layout/StackController.js
@@ -1,334 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.StackController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.StackController"] = true;
-dojo.provide("dijit.layout.StackController");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dijit._Container");
-dojo.require("dijit.form.ToggleButton");
-dojo.requireLocalization("dijit", "common", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-dojo.declare(
- "dijit.layout.StackController",
- [dijit._Widget, dijit._Templated, dijit._Container],
- {
- // summary:
- // Set of buttons to select a page in a page list.
- // description:
- // Monitors the specified StackContainer, and whenever a page is
- // added, deleted, or selected, updates itself accordingly.
-
- templateString: "<span role='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",
-
- // containerId: [const] String
- // The id of the page container that I point to
- containerId: "",
-
- // buttonWidget: [const] String
- // The name of the button widget to create to correspond to each page
- buttonWidget: "dijit.layout._StackButton",
-
- constructor: function(){
- this.pane2button = {}; // mapping from pane id to buttons
- this.pane2connects = {}; // mapping from pane id to this.connect() handles
- this.pane2watches = {}; // mapping from pane id to watch() handles
- },
-
- buildRendering: function(){
- this.inherited(arguments);
- dijit.setWaiRole(this.domNode, "tablist"); // TODO: unneeded? it's in template above.
- },
-
- postCreate: function(){
- this.inherited(arguments);
-
- // Listen to notifications from StackContainer
- 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(/*Object*/ info){
- // summary:
- // Called after StackContainer has finished initializing
- // tags:
- // private
- dojo.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);
- }
- },
-
- destroy: function(){
- for(var pane in this.pane2button){
- this.onRemoveChild(dijit.byId(pane));
- }
- this.inherited(arguments);
- },
-
- onAddChild: function(/*dijit._Widget*/ 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
- var cls = dojo.getObject(this.buttonWidget);
- var button = new cls({
- id: this.id + "_" + page.id,
- label: page.title,
- dir: page.dir,
- lang: page.lang,
- showLabel: page.showTitle,
- iconClass: page.iconClass,
- closeButton: page.closable,
- title: page.tooltip
- });
- dijit.setWaiState(button.focusNode,"selected", "false");
-
-
- // map from page attribute to corresponding tab button attribute
- var pageAttrList = ["title", "showTitle", "iconClass", "closable", "tooltip"],
- buttonAttrList = ["label", "showLabel", "iconClass", "closeButton", "title"];
-
- // watch() so events like page title changes are reflected in tab button
- this.pane2watches[page.id] = dojo.map(pageAttrList, function(pageAttr, idx){
- return page.watch(pageAttr, function(name, oldVal, newVal){
- button.set(buttonAttrList[idx], newVal);
- });
- });
-
- // connections so that clicking a tab button selects the corresponding page
- this.pane2connects[page.id] = [
- this.connect(button, 'onClick', dojo.hitch(this,"onButtonClick", page)),
- this.connect(button, 'onClickCloseButton', dojo.hitch(this,"onCloseButtonClick", 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){ // put the first child into the tab order
- button.focusNode.setAttribute("tabIndex", "0");
- dijit.setWaiState(button.focusNode, "selected", "true");
- this._currentChild = page;
- }
- // make sure all tabs have the same length
- if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){
- this._rectifyRtlTabList();
- }
- },
-
- onRemoveChild: function(/*dijit._Widget*/ 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; }
-
- // disconnect/unwatch connections/watches related to page being removed
- dojo.forEach(this.pane2connects[page.id], dojo.hitch(this, "disconnect"));
- delete this.pane2connects[page.id];
- dojo.forEach(this.pane2watches[page.id], function(w){ w.unwatch(); });
- delete this.pane2watches[page.id];
-
- var button = this.pane2button[page.id];
- if(button){
- this.removeChild(button);
- delete this.pane2button[page.id];
- button.destroy();
- }
- delete page.controlButton;
- },
-
- onSelectChild: function(/*dijit._Widget*/ 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);
- dijit.setWaiState(oldButton.focusNode, "selected", "false");
- oldButton.focusNode.setAttribute("tabIndex", "-1");
- }
-
- var newButton=this.pane2button[page.id];
- newButton.set('checked', true);
- dijit.setWaiState(newButton.focusNode, "selected", "true");
- this._currentChild = page;
- newButton.focusNode.setAttribute("tabIndex", "0");
- var container = dijit.byId(this.containerId);
- dijit.setWaiState(container.containerNode, "labelledby", newButton.id);
- },
-
- onButtonClick: function(/*dijit._Widget*/ page){
- // summary:
- // Called whenever one of my child buttons is pressed in an attempt to select a page
- // tags:
- // private
-
- var container = dijit.byId(this.containerId);
- container.selectChild(page);
- },
-
- onCloseButtonClick: function(/*dijit._Widget*/ page){
- // summary:
- // Called whenever one of my child buttons [X] is pressed in an attempt to close a page
- // tags:
- // private
-
- var container = dijit.byId(this.containerId);
- container.closeChild(page);
- if(this._currentChild){
- var b = this.pane2button[this._currentChild.id];
- if(b){
- dijit.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 current = dojo.indexOf(children, this.pane2button[this._currentChild.id]);
- // pick next button to focus on
- var offset = forward ? 1 : children.length - 1;
- return children[ (current + offset) % children.length ]; // dijit._Widget
- },
-
- 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){
- var k = dojo.keys;
- switch(e.charOrCode){
- case k.LEFT_ARROW:
- case k.UP_ARROW:
- if(!e._djpage){ forward = false; }
- break;
- case k.PAGE_UP:
- if(e.ctrlKey){ forward = false; }
- break;
- case k.RIGHT_ARROW:
- case k.DOWN_ARROW:
- if(!e._djpage){ forward = true; }
- break;
- case k.PAGE_DOWN:
- if(e.ctrlKey){ forward = true; }
- break;
- case k.HOME:
- case k.END:
- var children = this.getChildren();
- if(children && children.length){
- children[e.charOrCode == k.HOME ? 0 : children.length-1].onClick();
- }
- dojo.stopEvent(e);
- break;
- case k.DELETE:
- if(this._currentChild.closable){
- this.onCloseButtonClick(this._currentChild);
- }
- dojo.stopEvent(e);
- break;
- default:
- if(e.ctrlKey){
- if(e.charOrCode === k.TAB){
- this.adjacent(!e.shiftKey).onClick();
- dojo.stopEvent(e);
- }else if(e.charOrCode == "w"){
- if(this._currentChild.closable){
- this.onCloseButtonClick(this._currentChild);
- }
- dojo.stopEvent(e); // avoid browser tab closing.
- }
- }
- }
- // handle next/previous page navigation (left/right arrow, etc.)
- if(forward !== null){
- this.adjacent(forward).onClick();
- dojo.stopEvent(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);
- }
- });
-
-
-dojo.declare("dijit.layout._StackButton",
- dijit.form.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",
-
- buildRendering: function(/*Event*/ evt){
- this.inherited(arguments);
- dijit.setWaiRole((this.focusNode || this.domNode), "tab");
- },
-
- onClick: function(/*Event*/ evt){
- // summary:
- // This is for TabContainer where the tabs are <span> rather than button,
- // so need to set focus explicitly (on some browsers)
- // Note that you shouldn't override this method, but you can connect to it.
- dijit.focus(this.focusNode);
-
- // ... now let StackController catch the event and tell me what to do
- },
-
- onClickCloseButton: function(/*Event*/ evt){
- // summary:
- // StackContainer connects to this function; if your widget contains a close button
- // then clicking it should call this function.
- // Note that you shouldn't override this method, but you can connect to it.
- evt.stopPropagation();
- }
- });
-
-}
+//>>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
diff --git a/lib/dijit/layout/StackController.js.uncompressed.js b/lib/dijit/layout/StackController.js.uncompressed.js
new file mode 100644
index 000000000..8e5432cdd
--- /dev/null
+++ b/lib/dijit/layout/StackController.js.uncompressed.js
@@ -0,0 +1,356 @@
+define("dijit/layout/StackController", [
+ "dojo/_base/array", // array.forEach array.indexOf array.map
+ "dojo/_base/declare", // declare
+ "dojo/_base/event", // event.stop
+ "dojo/keys", // keys
+ "dojo/_base/lang", // lang.getObject
+ "dojo/_base/sniff", // has("ie")
+ "../focus", // focus.focus()
+ "../registry", // registry.byId
+ "../_Widget",
+ "../_TemplatedMixin",
+ "../_Container",
+ "../form/ToggleButton",
+ "dojo/i18n!../nls/common"
+], function(array, declare, event, keys, lang, has,
+ focus, registry, _Widget, _TemplatedMixin, _Container, ToggleButton){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+ var _Container = dijit._Container;
+ var ToggleButton = dijit.form.ToggleButton;
+=====*/
+
+ // module:
+ // dijit/layout/StackController
+ // summary:
+ // Set of buttons to select a page in a `dijit.layout.StackContainer`
+
+ 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,
+
+ _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){
+ this.inherited(arguments);
+ this.focusNode.removeAttribute("aria-pressed");
+ },
+
+ buildRendering: function(/*Event*/ evt){
+ this.inherited(arguments);
+ (this.focusNode || this.domNode).setAttribute("role", "tab");
+ },
+
+ onClick: function(/*Event*/ /*===== evt =====*/){
+ // summary:
+ // This is for TabContainer where the tabs are <span> rather than button,
+ // so need to set focus explicitly (on some browsers)
+ // Note that you shouldn't override this method, but you can connect to it.
+ focus.focus(this.focusNode);
+
+ // ... now let StackController catch the event and tell me what to do
+ },
+
+ onClickCloseButton: function(/*Event*/ evt){
+ // summary:
+ // StackContainer connects to this function; if your widget contains a close button
+ // then clicking it should call this function.
+ // Note that you shouldn't override this method, but you can connect to it.
+ evt.stopPropagation();
+ }
+ });
+
+
+ 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,
+
+ constructor: function(){
+ this.pane2button = {}; // mapping from pane id to buttons
+ this.pane2connects = {}; // mapping from pane id to this.connect() handles
+ this.pane2watches = {}; // mapping from pane id to watch() handles
+ },
+
+ postCreate: function(){
+ this.inherited(arguments);
+
+ // Listen to notifications from StackContainer
+ 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(/*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);
+ }
+ },
+
+ destroy: function(){
+ for(var pane in this.pane2button){
+ this.onRemoveChild(registry.byId(pane));
+ }
+ this.inherited(arguments);
+ },
+
+ onAddChild: function(/*dijit._Widget*/ 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,
+ label: page.title,
+ dir: page.dir,
+ lang: page.lang,
+ textDir: page.textDir,
+ showLabel: page.showTitle,
+ iconClass: page.iconClass,
+ closeButton: page.closable,
+ title: page.tooltip
+ });
+ button.focusNode.setAttribute("aria-selected", "false");
+
+
+ // map from page attribute to corresponding tab button attribute
+ var pageAttrList = ["title", "showTitle", "iconClass", "closable", "tooltip"],
+ buttonAttrList = ["label", "showLabel", "iconClass", "closeButton", "title"];
+
+ // watch() so events like page title changes are reflected in tab button
+ this.pane2watches[page.id] = array.map(pageAttrList, function(pageAttr, idx){
+ return page.watch(pageAttr, function(name, oldVal, newVal){
+ button.set(buttonAttrList[idx], newVal);
+ });
+ });
+
+ // connections so that clicking a tab button selects the corresponding page
+ this.pane2connects[page.id] = [
+ this.connect(button, 'onClick', lang.hitch(this,"onButtonClick", page)),
+ this.connect(button, 'onClickCloseButton', lang.hitch(this,"onCloseButtonClick", 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){ // put the first child into the tab order
+ button.focusNode.setAttribute("tabIndex", "0");
+ button.focusNode.setAttribute("aria-selected", "true");
+ this._currentChild = page;
+ }
+ // make sure all tabs have the same length
+ if(!this.isLeftToRight() && has("ie") && this._rectifyRtlTabList){
+ this._rectifyRtlTabList();
+ }
+ },
+
+ onRemoveChild: function(/*dijit._Widget*/ 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; }
+
+ // disconnect/unwatch connections/watches related to page being removed
+ array.forEach(this.pane2connects[page.id], lang.hitch(this, "disconnect"));
+ delete this.pane2connects[page.id];
+ array.forEach(this.pane2watches[page.id], function(w){ w.unwatch(); });
+ delete this.pane2watches[page.id];
+
+ var button = this.pane2button[page.id];
+ if(button){
+ this.removeChild(button);
+ delete this.pane2button[page.id];
+ button.destroy();
+ }
+ delete page.controlButton;
+ },
+
+ onSelectChild: function(/*dijit._Widget*/ 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("aria-selected", "false");
+ oldButton.focusNode.setAttribute("tabIndex", "-1");
+ }
+
+ var newButton=this.pane2button[page.id];
+ newButton.set('checked', true);
+ newButton.focusNode.setAttribute("aria-selected", "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._Widget*/ page){
+ // summary:
+ // Called whenever one of my child buttons is pressed in an attempt to select a page
+ // tags:
+ // private
+
+ if(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.
+ var button=this.pane2button[page.id];
+ button.set('checked', true);
+ }
+ var container = registry.byId(this.containerId);
+ container.selectChild(page);
+ },
+
+ onCloseButtonClick: function(/*dijit._Widget*/ 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 current = array.indexOf(children, this.pane2button[this._currentChild.id]);
+ // pick next button to focus on
+ var offset = forward ? 1 : children.length - 1;
+ return children[ (current + offset) % children.length ]; // dijit._Widget
+ },
+
+ 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:
+ case keys.END:
+ var children = this.getChildren();
+ if(children && children.length){
+ children[e.charOrCode == keys.HOME ? 0 : children.length-1].onClick();
+ }
+ 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.adjacent(!e.shiftKey).onClick();
+ 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.adjacent(forward).onClick();
+ 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 009422464..a78ec4422 100644
--- a/lib/dijit/layout/TabContainer.js
+++ b/lib/dijit/layout/TabContainer.js
@@ -1,76 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.TabContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.TabContainer"] = true;
-dojo.provide("dijit.layout.TabContainer");
-dojo.require("dijit.layout._TabContainerBase");
-dojo.require("dijit.layout.TabController");
-dojo.require("dijit.layout.ScrollingTabController");
-
-
-dojo.declare("dijit.layout.TabContainer",
- dijit.layout._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.
-
- // 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: String
- // 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
-
- var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"),
- TabController = dojo.getObject(this.controllerWidget);
-
- return new TabController({
- id: this.id + "_tablist",
- dir: this.dir,
- lang: this.lang,
- 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 ?
- "dijit.layout.ScrollingTabController" : "dijit.layout.TabController";
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/TabContainer.js.uncompressed.js b/lib/dijit/layout/TabContainer.js.uncompressed.js
new file mode 100644
index 000000000..109ace0f1
--- /dev/null
+++ b/lib/dijit/layout/TabContainer.js.uncompressed.js
@@ -0,0 +1,79 @@
+define("dijit/layout/TabContainer", [
+ "dojo/_base/lang", // lang.getObject
+ "dojo/_base/declare", // declare
+ "./_TabContainerBase",
+ "./TabController",
+ "./ScrollingTabController"
+], function(lang, declare, _TabContainerBase, TabController, ScrollingTabController){
+
+/*=====
+ var _TabContainerBase = dijit.layout._TabContainerBase;
+ var TabController = dijit.layout.TabController;
+ var ScrollingTabController = dijit.layout.ScrollingTabController;
+=====*/
+
+ // module:
+ // dijit/layout/TabContainer
+ // summary:
+ // A Container with tabs to select each child (only one of which is displayed at a time).
+
+
+ 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.
+
+ // 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: String
+ // 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
+
+ var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"),
+ TabController = lang.getObject(this.controllerWidget);
+
+ return new TabController({
+ id: this.id + "_tablist",
+ 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 ?
+ "dijit.layout.ScrollingTabController" : "dijit.layout.TabController";
+ }
+ }
+ });
+});
diff --git a/lib/dijit/layout/TabController.js b/lib/dijit/layout/TabController.js
index 0a2276aca..28c26d91e 100644
--- a/lib/dijit/layout/TabController.js
+++ b/lib/dijit/layout/TabController.js
@@ -1,161 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout.TabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout.TabController"] = true;
-dojo.provide("dijit.layout.TabController");
-dojo.require("dijit.layout.StackController");
-dojo.require("dijit.Menu");
-dojo.require("dijit.MenuItem");
-dojo.requireLocalization("dijit", "common", null, "ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,kk,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-tw");
-
-
-// Menu is used for an accessible close button, would be nice to have a lighter-weight solution
-
-
-dojo.declare("dijit.layout.TabController",
- dijit.layout.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
-
- templateString: "<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",
-
- // tabPosition: String
- // Defines where tabs go relative to the content.
- // "top", "bottom", "left-h", "right-h"
- tabPosition: "top",
-
- // buttonWidget: String
- // The name of the tab widget to create to correspond to each page
- buttonWidget: "dijit.layout._TabButton",
-
- _rectifyRtlTabList: function(){
- // summary:
- // For left/right TabContainer when page is RTL mode, rectify the width of all tabs to be equal, otherwise the tab widths are different in IE
-
- if(0 >= this.tabPosition.indexOf('-h')){ return; }
- if(!this.pane2button){ return; }
-
- var maxWidth = 0;
- for(var pane in this.pane2button){
- var ow = this.pane2button[pane].innerDiv.scrollWidth;
- maxWidth = Math.max(maxWidth, ow);
- }
- //unify the length of all the tabs
- for(pane in this.pane2button){
- this.pane2button[pane].innerDiv.style.width = maxWidth + 'px';
- }
- }
-});
-
-dojo.declare("dijit.layout._TabButton",
- dijit.layout._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: dojo.cache("dijit.layout", "templates/_TabButton.html", "<div role=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div role=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" dojoAttachPoint='iconNode' />\n\t\t <span dojoAttachPoint='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" dojoAttachPoint='closeNode'\n\t\t \t\tdojoAttachEvent='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span dojoAttachPoint='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n"),
-
- // Override _FormWidget.scrollOnFocus.
- // Don't scroll the whole tab container into view when the button is focused.
- scrollOnFocus: false,
-
- buildRendering: function(){
- this.inherited(arguments);
-
- dojo.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.
- setTimeout(function(){
- n.className = n.className;
- }, 1);
- },
-
- _setCloseButtonAttr: function(/*Boolean*/ disp){
- // summary:
- // Hide/show close button
- this._set("closeButton", disp);
- dojo.toggleClass(this.innerDiv, "dijitClosable", disp);
- this.closeNode.style.display = disp ? "" : "none";
- if(disp){
- var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
- if(this.closeNode){
- dojo.attr(this.closeNode,"title", _nlsResources.itemClose);
- }
- // add context menu onto title button
- var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
- this._closeMenu = new dijit.Menu({
- id: this.id+"_Menu",
- dir: this.dir,
- lang: this.lang,
- targetNodeIds: [this.domNode]
- });
-
- this._closeMenu.addChild(new dijit.MenuItem({
- label: _nlsResources.itemClose,
- dir: this.dir,
- lang: this.lang,
- onClick: dojo.hitch(this, "onClickCloseButton")
- }));
- }else{
- if(this._closeMenu){
- this._closeMenu.destroyRecursive();
- delete this._closeMenu;
- }
- }
- },
- _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 == false && !this.params.title){
- this.iconNode.alt = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
- }
- },
-
- destroy: function(){
- if(this._closeMenu){
- this._closeMenu.destroyRecursive();
- delete this._closeMenu;
- }
- this.inherited(arguments);
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/TabController.js.uncompressed.js b/lib/dijit/layout/TabController.js.uncompressed.js
new file mode 100644
index 000000000..d62a4038d
--- /dev/null
+++ b/lib/dijit/layout/TabController.js.uncompressed.js
@@ -0,0 +1,172 @@
+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", // 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",
+ "../Menu",
+ "../MenuItem",
+ "dojo/text!./templates/_TabButton.html",
+ "dojo/i18n!../nls/common"
+], function(declare, dom, domAttr, domClass, i18n, lang, StackController, Menu, MenuItem, template){
+
+/*=====
+ var StackController = dijit.layout.StackController;
+ var Menu = dijit.Menu;
+ var MenuItem = dijit.MenuItem;
+=====*/
+
+ // module:
+ // dijit/layout/TabController
+ // 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`.
+
+ 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.
+ setTimeout(function(){
+ n.className = n.className;
+ }, 1);
+ },
+
+ _setCloseButtonAttr: function(/*Boolean*/ disp){
+ // summary:
+ // Hide/show close button
+ this._set("closeButton", disp);
+ domClass.toggle(this.innerDiv, "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);
+ }
+ // add context menu onto title button
+ this._closeMenu = new Menu({
+ id: this.id+"_Menu",
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir,
+ targetNodeIds: [this.domNode]
+ });
+
+ this._closeMenu.addChild(new MenuItem({
+ label: _nlsResources.itemClose,
+ dir: this.dir,
+ lang: this.lang,
+ textDir: this.textDir,
+ onClick: lang.hitch(this, "onClickCloseButton")
+ }));
+ }else{
+ if(this._closeMenu){
+ this._closeMenu.destroyRecursive();
+ delete this._closeMenu;
+ }
+ }
+ },
+ _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 || '');
+ }
+ },
+
+ destroy: function(){
+ if(this._closeMenu){
+ this._closeMenu.destroyRecursive();
+ delete this._closeMenu;
+ }
+ this.inherited(arguments);
+ }
+ });
+
+ 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,
+
+ _rectifyRtlTabList: function(){
+ // summary:
+ // For left/right TabContainer when page is RTL mode, rectify the width of all tabs to be equal, otherwise the tab widths are different in IE
+
+ if(0 >= this.tabPosition.indexOf('-h')){ return; }
+ if(!this.pane2button){ return; }
+
+ var maxWidth = 0;
+ for(var pane in this.pane2button){
+ var ow = this.pane2button[pane].innerDiv.scrollWidth;
+ maxWidth = Math.max(maxWidth, ow);
+ }
+ //unify the length of all the tabs
+ for(pane in this.pane2button){
+ this.pane2button[pane].innerDiv.style.width = maxWidth + 'px';
+ }
+ }
+ });
+
+ TabController.TabButton = TabButton; // for monkey patching
+
+ return TabController;
+});
diff --git a/lib/dijit/layout/_ContentPaneResizeMixin.js b/lib/dijit/layout/_ContentPaneResizeMixin.js
index fe361bee5..e0dd49e96 100644
--- a/lib/dijit/layout/_ContentPaneResizeMixin.js
+++ b/lib/dijit/layout/_ContentPaneResizeMixin.js
@@ -1,260 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout._ContentPaneResizeMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout._ContentPaneResizeMixin"] = true;
-dojo.provide("dijit.layout._ContentPaneResizeMixin");
-dojo.require("dijit._Contained");
-dojo.require("dijit.layout._LayoutWidget");
-
-
-dojo.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,
-
- // isContainer: [protected] Boolean
- // Indicates that this widget acts as a "parent" to the descendant widgets.
- // When the parent is started it will call startup() on the child widgets.
- // See also `isLayoutContainer`.
- isContainer: true,
-
- // isLayoutContainer: [protected] Boolean
- // Indicates that this widget will call resize() on it's child widgets
- // when they become visible.
- isLayoutContainer: true,
-
- _startChildren: function(){
- // summary:
- // Call startup() on all children including non _Widget ones like dojo.dnd.Source objects
-
- // This starts all the widgets
- dojo.forEach(this.getChildren(), function(child){
- child.startup();
- child._started = 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 = dijit._Contained.prototype.getParent.call(this);
- 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);
-
- this._startChildren();
-
- if(this._isShown()){
- this._onShow();
- }
-
- if(!this._childOfLayoutWidget){
- // If my parent isn't a layout container, since my style *may be* width=height=100%
- // or something similar (either set directly or via a CSS class),
- // monitor when my size changes so that I can re-layout.
- // For browsers where I can't directly monitor when my size changes,
- // monitor when the viewport changes size, which *may* indicate a size change for me.
- this.connect(dojo.isIE ? this.domNode : dojo.global, 'onresize', function(){
- // Using function(){} closure to ensure no arguments to resize.
- this._needLayout = !this._childOfLayoutWidget;
- 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 childNodes = dojo.query("> *", this.containerNode).filter(function(node){
- return node.tagName !== "SCRIPT"; // or a regexp for hidden elements like script|area|map|etc..
- }),
- childWidgetNodes = childNodes.filter(function(node){
- return dojo.hasAttr(node, "data-dojo-type") || dojo.hasAttr(node, "dojoType") || dojo.hasAttr(node, "widgetId");
- }),
- candidateWidgets = dojo.filter(childWidgetNodes.map(dijit.byNode), function(widget){
- return widget && widget.domNode && widget.resize;
- });
-
- if(
- // all child nodes are widgets
- childNodes.length == childWidgetNodes.length &&
-
- // all but one are invisible (like dojo.data)
- candidateWidgets.length == 1
- ){
- this._singleChild = candidateWidgets[0];
- }else{
- delete this._singleChild;
- }
-
- // So we can set overflow: hidden to avoid a safari bug w/scrollbars showing up (#9449)
- dojo.toggleClass(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.
-
- // For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is
- // never called, 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();
- }
-
- 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 a Container widget, each of my children expects me to
- // call resize() or layout() on them.
- //
- // 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
-
- // Set margin box size, unless it wasn't specified, in which case use current size.
- if(changeSize){
- dojo.marginBox(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 || {};
- dojo.mixin(mb, changeSize || {}); // changeSize overrides resultSize
- if(!("h" in mb) || !("w" in mb)){
- mb = dojo.mixin(dojo.marginBox(cn), mb); // just use dojo.marginBox() to fill in missing values
- }
- this._contentBox = dijit.layout.marginBox2contentBox(cn, mb);
- }else{
- this._contentBox = dojo.contentBox(cn);
- }
-
- this._layoutChildren();
-
- delete this._needLayout;
- },
-
- _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 || dojo.contentBox(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.
- dojo.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') && !dojo.hasClass(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)
-
- 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);
-
- // Need to keep track of whether ContentPane has been shown (which is different than
- // whether or not it's currently visible).
- this._wasShown = true;
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js b/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js
new file mode 100644
index 000000000..fbeb3c6eb
--- /dev/null
+++ b/lib/dijit/layout/_ContentPaneResizeMixin.js.uncompressed.js
@@ -0,0 +1,255 @@
+define("dijit/layout/_ContentPaneResizeMixin", [
+ "dojo/_base/array", // array.filter array.forEach
+ "dojo/_base/declare", // declare
+ "dojo/dom-attr", // domAttr.has
+ "dojo/dom-class", // domClass.contains domClass.toggle
+ "dojo/dom-geometry",// domGeometry.contentBox domGeometry.marginBox
+ "dojo/_base/lang", // lang.mixin
+ "dojo/query", // query
+ "dojo/_base/sniff", // has("ie")
+ "dojo/_base/window", // win.global
+ "../registry", // registry.byId
+ "./utils", // marginBox2contextBox
+ "../_Contained"
+], function(array, declare, domAttr, domClass, domGeometry, lang, query, has, win,
+ registry, layoutUtils, _Contained){
+
+/*=====
+var _Contained = dijit._Contained;
+=====*/
+
+// module:
+// dijit/layout/_ContentPaneResizeMixin
+// 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.
+
+
+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){
+ // If my parent isn't a layout container, since my style *may be* width=height=100%
+ // or something similar (either set directly or via a CSS class),
+ // monitor when my size changes so that I can re-layout.
+ // For browsers where I can't directly monitor when my size changes,
+ // monitor when the viewport changes size, which *may* indicate a size change for me.
+ this.connect(has("ie") ? this.domNode : win.global, 'onresize', function(){
+ // Using function(){} closure to ensure no arguments to resize.
+ this._needLayout = !this._childOfLayoutWidget;
+ 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 childNodes = query("> *", this.containerNode).filter(function(node){
+ return node.tagName !== "SCRIPT"; // or a regexp for hidden elements like script|area|map|etc..
+ }),
+ childWidgetNodes = childNodes.filter(function(node){
+ return domAttr.has(node, "data-dojo-type") || domAttr.has(node, "dojoType") || domAttr.has(node, "widgetId");
+ }),
+ candidateWidgets = array.filter(childWidgetNodes.map(registry.byNode), function(widget){
+ return widget && widget.domNode && widget.resize;
+ });
+
+ if(
+ // all child nodes are widgets
+ childNodes.length == childWidgetNodes.length &&
+
+ // all but one are invisible (like dojo.data)
+ candidateWidgets.length == 1
+ ){
+ this._singleChild = candidateWidgets[0];
+ }else{
+ delete this._singleChild;
+ }
+
+ // 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.
+
+ // For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is
+ // never called, 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();
+ }
+
+ 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 a Container widget, each of my children expects me to
+ // call resize() or layout() on them.
+ //
+ // 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
+
+ // 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();
+
+ delete this._needLayout;
+ },
+
+ _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)
+
+ 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);
+
+ // Need to keep track of whether ContentPane has been shown (which is different than
+ // whether or not it's currently visible).
+ this._wasShown = true;
+ }
+});
+
+});
diff --git a/lib/dijit/layout/_LayoutWidget.js b/lib/dijit/layout/_LayoutWidget.js
index cbbf71009..7ac78de47 100644
--- a/lib/dijit/layout/_LayoutWidget.js
+++ b/lib/dijit/layout/_LayoutWidget.js
@@ -1,313 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout._LayoutWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout._LayoutWidget"] = true;
-dojo.provide("dijit.layout._LayoutWidget");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Container");
-dojo.require("dijit._Contained");
-
-
-dojo.declare("dijit.layout._LayoutWidget",
- [dijit._Widget, dijit._Container, dijit._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);
- dojo.addClass(this.domNode, "dijitContainer");
- },
-
- startup: function(){
- // summary:
- // Called after all the widgets have been instantiated and their
- // dom nodes have been inserted somewhere under dojo.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 my size changes so that I can re-layout.
- // For browsers where I can't directly monitor when my size changes,
- // monitor when the viewport changes size, which *may* indicate a size change for me.
- this.connect(dojo.isIE ? this.domNode : dojo.global, 'onresize', function(){
- // Using function(){} closure to ensure no arguments to resize.
- 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 relayout 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 relayout 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){
- dojo.marginBox(node, changeSize);
-
- // set offset of the node
- if(changeSize.t){ node.style.top = changeSize.t + "px"; }
- if(changeSize.l){ node.style.left = changeSize.l + "px"; }
- }
-
- // 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 || {};
- dojo.mixin(mb, changeSize || {}); // changeSize overrides resultSize
- if( !("h" in mb) || !("w" in mb) ){
- mb = dojo.mixin(dojo.marginBox(node), mb); // just use dojo.marginBox() to fill in missing values
- }
-
- // Compute and save the size of my border box and content box
- // (w/out calling dojo.contentBox() since that may fail if size was recently set)
- var cs = dojo.getComputedStyle(node);
- var me = dojo._getMarginExtents(node, cs);
- var be = dojo._getBorderExtents(node, cs);
- var bb = (this._borderBox = {
- w: mb.w - (me.w + be.w),
- h: mb.h - (me.h + be.h)
- });
- var pe = dojo._getPadExtents(node, cs);
- this._contentBox = {
- l: dojo._toPixelValue(node, cs.paddingLeft),
- t: dojo._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._Widget*/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 : "");
- dojo.addClass(child.domNode, cls);
- },
-
- addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
- // Overrides _Container.addChild() to call _setupChild()
- this.inherited(arguments);
- if(this._started){
- this._setupChild(child);
- }
- },
-
- removeChild: function(/*dijit._Widget*/ child){
- // Overrides _Container.removeChild() to remove class added by _setupChild()
- var cls = this.baseClass + "-child"
- + (child.baseClass ?
- " " + this.baseClass + "-" + child.baseClass : "");
- dojo.removeClass(child.domNode, cls);
-
- this.inherited(arguments);
- }
- }
-);
-
-dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
- // summary:
- // Given the margin-box size of a node, return its content box size.
- // Functions like dojo.contentBox() but is more reliable since it doesn't have
- // to wait for the browser to compute sizes.
- var cs = dojo.getComputedStyle(node);
- var me = dojo._getMarginExtents(node, cs);
- var pb = dojo._getPadBorderExtents(node, cs);
- return {
- l: dojo._toPixelValue(node, cs.paddingLeft),
- t: dojo._toPixelValue(node, cs.paddingTop),
- w: mb.w - (me.w + pb.w),
- h: mb.h - (me.h + pb.h)
- };
-};
-
-(function(){
- var capitalize = function(word){
- return word.substring(0,1).toUpperCase() + word.substring(1);
- };
-
- var size = function(widget, dim){
- // size the child
- var newSize = widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim);
-
- // record child's size
- if(newSize){
- // if the child returned it's new size then use that
- dojo.mixin(widget, newSize);
- }else{
- // otherwise, call marginBox(), but favor our own numbers when we have them.
- // the browser lies sometimes
- dojo.mixin(widget, dojo.marginBox(widget.domNode));
- dojo.mixin(widget, dim);
- }
- };
-
- dijit.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 = dojo.mixin({}, dim);
-
- dojo.addClass(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 = dojo.filter(children, function(item){ return item.region != "center" && item.layoutAlign != "client"; })
- .concat(dojo.filter(children, function(item){ return item.region == "center" || item.layoutAlign == "client"; }));
-
- // set positions/sizes
- dojo.forEach(children, function(child){
- var elm = child.domNode,
- pos = (child.region || child.layoutAlign);
-
- // 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";
-
- dojo.addClass(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);
- }
- });
- };
-
-})();
-
-}
+//>>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
diff --git a/lib/dijit/layout/_LayoutWidget.js.uncompressed.js b/lib/dijit/layout/_LayoutWidget.js.uncompressed.js
new file mode 100644
index 000000000..1111d2539
--- /dev/null
+++ b/lib/dijit/layout/_LayoutWidget.js.uncompressed.js
@@ -0,0 +1,197 @@
+define("dijit/layout/_LayoutWidget", [
+ "dojo/_base/lang", // lang.mixin
+ "../_Widget",
+ "../_Container",
+ "../_Contained",
+ "dojo/_base/declare", // declare
+ "dojo/dom-class", // domClass.add domClass.remove
+ "dojo/dom-geometry", // domGeometry.marginBox
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/_base/sniff", // has("ie")
+ "dojo/_base/window" // win.global
+], function(lang, _Widget, _Container, _Contained,
+ declare, domClass, domGeometry, domStyle, has, win){
+
+/*=====
+ var _Widget = dijit._Widget;
+ var _Container = dijit._Container;
+ var _Contained = dijit._Contained;
+=====*/
+
+ // module:
+ // dijit/layout/_LayoutWidget
+ // summary:
+ // _LayoutWidget 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.
+
+
+ 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.connect(win.global, 'onresize', function(){
+ // Using function(){} closure to ensure no arguments passed to resize().
+ 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 relayout 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 relayout 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._Widget*/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._Widget*/ child, /*Integer?*/ insertIndex){
+ // Overrides _Container.addChild() to call _setupChild()
+ this.inherited(arguments);
+ if(this._started){
+ this._setupChild(child);
+ }
+ },
+
+ removeChild: function(/*dijit._Widget*/ 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 b/lib/dijit/layout/_TabContainerBase.js
index 5e07cb653..27e4f86be 100644
--- a/lib/dijit/layout/_TabContainerBase.js
+++ b/lib/dijit/layout/_TabContainerBase.js
@@ -1,145 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.layout._TabContainerBase"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.layout._TabContainerBase"] = true;
-dojo.provide("dijit.layout._TabContainerBase");
-dojo.require("dijit.layout.StackContainer");
-dojo.require("dijit._Templated");
-
-
-dojo.declare("dijit.layout._TabContainerBase",
- [dijit.layout.StackContainer, dijit._Templated],
- {
- // 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: dojo.cache("dijit.layout", "templates/TabContainer.html", "<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n"),
-
- 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 && dojo.style(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){ dojo.addClass(this.domNode, "dijitTabContainerNoLayout"); }
-
- if(this.nested){
- /* workaround IE's lack of support for "a > b" selectors by
- * tagging each node in the template.
- */
- dojo.addClass(this.domNode, "dijitTabContainerNested");
- dojo.addClass(this.tablist.containerNode, "dijitTabContainerTabListNested");
- dojo.addClass(this.tablistSpacer, "dijitTabContainerSpacerNested");
- dojo.addClass(this.containerNode, "dijitTabPaneWrapperNested");
- }else{
- dojo.addClass(this.domNode, "tabStrip-" + (this.tabStrip ? "enabled" : "disabled"));
- }
- },
-
- _setupChild: function(/*dijit._Widget*/ tab){
- // Overrides StackContainer._setupChild().
- dojo.addClass(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"
- }];
- dijit.layout.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 = dijit.layout.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 = dojo.contentBox(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);
- }
-});
-
-}
+//>>built
+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","../_TemplatedMixin","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style"],function(_1,_2,_3,_4,_5,_6,_7,_8){return _5("dijit.layout._TabContainerBase",[_2,_4],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:_1,postMixInProperties:function(){this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");this.srcNodeRef&&_8.set(this.srcNodeRef,"visibility","hidden");this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.tablist=this._makeController(this.tablistNode);if(!this.doLayout){_6.add(this.domNode,"dijitTabContainerNoLayout");}if(this.nested){_6.add(this.domNode,"dijitTabContainerNested");_6.add(this.tablist.containerNode,"dijitTabContainerTabListNested");_6.add(this.tablistSpacer,"dijitTabContainerSpacerNested");_6.add(this.containerNode,"dijitTabPaneWrapperNested");}else{_6.add(this.domNode,"tabStrip-"+(this.tabStrip?"enabled":"disabled"));}},_setupChild:function(_9){_6.add(_9.domNode,"dijitTabPane");this.inherited(arguments);},startup:function(){if(this._started){return;}this.tablist.startup();this.inherited(arguments);},layout:function(){if(!this._contentBox||typeof (this._contentBox.l)=="undefined"){return;}var sc=this.selectedChildWidget;if(this.doLayout){var _a=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_a;var _b=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_a},{domNode:this.containerNode,layoutAlign:"client"}];_3.layoutChildren(this.domNode,this._contentBox,_b);this._containerContentBox=_3.marginBox2contentBox(this.containerNode,_b[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){var s=this.tablist.domNode.style;s.width="0";var _c=_7.getContentBox(this.domNode).w;s.width="";this.tablist.resize({w:_c});}if(sc&&sc.resize){sc.resize();}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});}); \ No newline at end of file
diff --git a/lib/dijit/layout/_TabContainerBase.js.uncompressed.js b/lib/dijit/layout/_TabContainerBase.js.uncompressed.js
new file mode 100644
index 000000000..5a6090429
--- /dev/null
+++ b/lib/dijit/layout/_TabContainerBase.js.uncompressed.js
@@ -0,0 +1,155 @@
+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){
+
+
+/*=====
+ var StackContainer = dijit.layout.StackContainer;
+ var _TemplatedMixin = dijit._TemplatedMixin;
+=====*/
+
+// module:
+// dijit/layout/_TabContainerBase
+// summary:
+// Abstract base class for TabContainer. Must define _makeController() to instantiate
+// and return the widget that displays the tab labels
+
+
+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._Widget*/ 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/AccordionButton.html b/lib/dijit/layout/templates/AccordionButton.html
new file mode 100644
index 000000000..d2a9eee40
--- /dev/null
+++ b/lib/dijit/layout/templates/AccordionButton.html
@@ -0,0 +1,10 @@
+<div data-dojo-attach-event='onclick:_onTitleClick' class='dijitAccordionTitle' role="presentation">
+ <div data-dojo-attach-point='titleNode,focusNode' data-dojo-attach-event='onkeypress:_onTitleKeyPress'
+ class='dijitAccordionTitleFocus' role="tab" aria-expanded="false"
+ ><span class='dijitInline dijitAccordionArrow' role="presentation"></span
+ ><span class='arrowTextUp' role="presentation">+</span
+ ><span class='arrowTextDown' role="presentation">-</span
+ ><img src="${_blankGif}" alt="" class="dijitIcon" data-dojo-attach-point='iconNode' style="vertical-align: middle" role="presentation"/>
+ <span role="presentation" data-dojo-attach-point='titleTextNode' class='dijitAccordionText'></span>
+ </div>
+</div>
diff --git a/lib/dijit/layout/templates/ScrollingTabController.html b/lib/dijit/layout/templates/ScrollingTabController.html
new file mode 100644
index 000000000..505b92fc8
--- /dev/null
+++ b/lib/dijit/layout/templates/ScrollingTabController.html
@@ -0,0 +1,22 @@
+<div class="dijitTabListContainer-${tabPosition}" style="visibility:hidden">
+ <div data-dojo-type="dijit.layout._ScrollingTabControllerMenuButton"
+ class="tabStripButton-${tabPosition}"
+ id="${id}_menuBtn"
+ data-dojo-props="containerId: '${containerId}', iconClass: 'dijitTabStripMenuIcon',
+ dropDownPosition: ['below-alt', 'above-alt']"
+ data-dojo-attach-point="_menuBtn" showLabel="false" title="">&#9660;</div>
+ <div data-dojo-type="dijit.layout._ScrollingTabControllerButton"
+ class="tabStripButton-${tabPosition}"
+ id="${id}_leftBtn"
+ data-dojo-props="iconClass:'dijitTabStripSlideLeftIcon', showLabel:false, title:''"
+ data-dojo-attach-point="_leftBtn" data-dojo-attach-event="onClick: doSlideLeft">&#9664;</div>
+ <div data-dojo-type="dijit.layout._ScrollingTabControllerButton"
+ class="tabStripButton-${tabPosition}"
+ id="${id}_rightBtn"
+ data-dojo-props="iconClass:'dijitTabStripSlideRightIcon', showLabel:false, title:''"
+ data-dojo-attach-point="_rightBtn" data-dojo-attach-event="onClick: doSlideRight">&#9654;</div>
+ <div class='dijitTabListWrapper' data-dojo-attach-point='tablistWrapper'>
+ <div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'
+ data-dojo-attach-point='containerNode' class='nowrapTabStrip'></div>
+ </div>
+</div> \ No newline at end of file
diff --git a/lib/dijit/layout/templates/TabContainer.html b/lib/dijit/layout/templates/TabContainer.html
new file mode 100644
index 000000000..4630dbcba
--- /dev/null
+++ b/lib/dijit/layout/templates/TabContainer.html
@@ -0,0 +1,5 @@
+<div class="dijitTabContainer">
+ <div class="dijitTabListWrapper" data-dojo-attach-point="tablistNode"></div>
+ <div data-dojo-attach-point="tablistSpacer" class="dijitTabSpacer ${baseClass}-spacer"></div>
+ <div class="dijitTabPaneWrapper ${baseClass}-container" data-dojo-attach-point="containerNode"></div>
+</div>
diff --git a/lib/dijit/layout/templates/_ScrollingTabControllerButton.html b/lib/dijit/layout/templates/_ScrollingTabControllerButton.html
new file mode 100644
index 000000000..c7ef933a1
--- /dev/null
+++ b/lib/dijit/layout/templates/_ScrollingTabControllerButton.html
@@ -0,0 +1,8 @@
+<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> \ No newline at end of file
diff --git a/lib/dijit/layout/templates/_TabButton.html b/lib/dijit/layout/templates/_TabButton.html
new file mode 100644
index 000000000..7d6570e73
--- /dev/null
+++ b/lib/dijit/layout/templates/_TabButton.html
@@ -0,0 +1,14 @@
+<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>
diff --git a/lib/dijit/layout/utils.js b/lib/dijit/layout/utils.js
new file mode 100644
index 000000000..d0a4cd101
--- /dev/null
+++ b/lib/dijit/layout/utils.js
@@ -0,0 +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
diff --git a/lib/dijit/layout/utils.js.uncompressed.js b/lib/dijit/layout/utils.js.uncompressed.js
new file mode 100644
index 000000000..4c2845332
--- /dev/null
+++ b/lib/dijit/layout/utils.js.uncompressed.js
@@ -0,0 +1,141 @@
+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
+ ".." // for exporting symbols to dijit, remove in 2.0
+], function(array, domClass, domGeometry, domStyle, lang, dijit){
+
+ // module:
+ // dijit/layout/utils
+ // summary:
+ // marginBox2contentBox() and layoutChildren()
+
+ var layout = lang.getObject("layout", true, dijit);
+ /*===== layout = dijit.layout =====*/
+
+ 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/lib/main.js b/lib/dijit/lib/main.js
deleted file mode 100644
index 28f1164e9..000000000
--- a/lib/dijit/lib/main.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-// AMD module id = dijit
-//
-// This is a package main module for the dijit package. The dijit package is somewhat unusual
-// in that is it currently constructed to just provide an empty object.
-//
-
-// for now, we publish dijit into the global namespace because so many tests and apps expect it.
-define(["dojo"], function(dojo) {
- // the current dojo bootstrap defines dijit; this may change and this module provides a little
- // future-proof with the disjunction.
- dijit= dojo._dijit || {};
- return dijit;
-});
diff --git a/lib/dijit/main.js b/lib/dijit/main.js
new file mode 100644
index 000000000..2ce399275
--- /dev/null
+++ b/lib/dijit/main.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/main",["dojo/_base/kernel"],function(_1){return _1.dijit;}); \ No newline at end of file
diff --git a/lib/dijit/main.js.uncompressed.js b/lib/dijit/main.js.uncompressed.js
new file mode 100644
index 000000000..159bb4276
--- /dev/null
+++ b/lib/dijit/main.js.uncompressed.js
@@ -0,0 +1,10 @@
+define("dijit/main", [
+ "dojo/_base/kernel"
+], function(dojo){
+ // module:
+ // dijit
+ // summary:
+ // The dijit package main module
+
+ return dojo.dijit;
+});
diff --git a/lib/dijit/nls/ar/common.js b/lib/dijit/nls/ar/common.js
index 99af50893..6bc0aecd0 100644
--- a/lib/dijit/nls/ar/common.js
+++ b/lib/dijit/nls/ar/common.js
@@ -1 +1,2 @@
-({"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ar/common",({buttonOk:"حسنا",buttonCancel:"الغاء",buttonSave:"حفظ",itemClose:"اغلاق"})); \ No newline at end of file
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..2dfcc3257
--- /dev/null
+++ b/lib/dijit/nls/ar/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/ar/common", //begin v1.x content
+({
+ buttonOk: "حسنا",
+ buttonCancel: "الغاء",
+ buttonSave: "حفظ",
+ itemClose: "اغلاق"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ar/loading.js b/lib/dijit/nls/ar/loading.js
index f8bb535fa..55c02319a 100644
--- a/lib/dijit/nls/ar/loading.js
+++ b/lib/dijit/nls/ar/loading.js
@@ -1 +1,2 @@
-({"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ar/loading",({loadingState:"جاري التحميل...",errorState:"عفوا، حدث خطأ"})); \ No newline at end of file
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..bde1e1863
--- /dev/null
+++ b/lib/dijit/nls/ar/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ar/loading", //begin v1.x content
+({
+ loadingState: "جاري التحميل...",
+ errorState: "عفوا، حدث خطأ"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/az/common.js b/lib/dijit/nls/az/common.js
new file mode 100644
index 000000000..d42a01a28
--- /dev/null
+++ b/lib/dijit/nls/az/common.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/nls/az/common",({"buttonOk":"Ok","buttonCancel":"Ləğv et","buttonSave":"Saxla","itemClose":"Bağla"})); \ No newline at end of file
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..65b35efda
--- /dev/null
+++ b/lib/dijit/nls/az/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/az/common", //begin v1.x content
+({
+ "buttonOk" : "Ok",
+ "buttonCancel" : "Ləğv et",
+ "buttonSave" : "Saxla",
+ "itemClose" : "Bağla"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/az/loading.js b/lib/dijit/nls/az/loading.js
new file mode 100644
index 000000000..9e08ea6cd
--- /dev/null
+++ b/lib/dijit/nls/az/loading.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/nls/az/loading",({"loadingState":"Yüklənir...","errorState":"Problem yarandı"})); \ No newline at end of file
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..37e09b227
--- /dev/null
+++ b/lib/dijit/nls/az/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/az/loading", //begin v1.x content
+({
+ "loadingState" : "Yüklənir...",
+ "errorState" : "Problem yarandı"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ca/common.js b/lib/dijit/nls/ca/common.js
index b9cd06500..b6b43f630 100644
--- a/lib/dijit/nls/ca/common.js
+++ b/lib/dijit/nls/ca/common.js
@@ -1 +1,2 @@
-({"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ca/common",({buttonOk:"D'acord",buttonCancel:"Cancel·la",buttonSave:"Desa",itemClose:"Tanca"})); \ No newline at end of file
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..58a22bcc9
--- /dev/null
+++ b/lib/dijit/nls/ca/common.js.uncompressed.js
@@ -0,0 +1,11 @@
+define(
+"dijit/nls/ca/common", //begin v1.x content
+({
+ buttonOk: "D'acord",
+ buttonCancel: "Cancel·la",
+ buttonSave: "Desa",
+ itemClose: "Tanca"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ca/loading.js b/lib/dijit/nls/ca/loading.js
index cd368cc5c..3a2aab13f 100644
--- a/lib/dijit/nls/ca/loading.js
+++ b/lib/dijit/nls/ca/loading.js
@@ -1 +1,2 @@
-({"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."}) \ No newline at end of file
+//>>built
+define("dijit/nls/ca/loading",({loadingState:"S'està carregant...",errorState:"Ens sap greu. S'ha produït un error."})); \ No newline at end of file
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..ce522f532
--- /dev/null
+++ b/lib/dijit/nls/ca/loading.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/nls/ca/loading", //begin v1.x content
+({
+ loadingState: "S'està carregant...",
+ errorState: "Ens sap greu. S'ha produït un error."
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/common.js b/lib/dijit/nls/common.js
index 6573dcde8..7072fe237 100644
--- a/lib/dijit/nls/common.js
+++ b/lib/dijit/nls/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}) \ No newline at end of file
+//>>built
+define("dijit/nls/common",{root:({buttonOk:"OK",buttonCancel:"Cancel",buttonSave:"Save",itemClose:"Close"}),"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}); \ No newline at end of file
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 b/lib/dijit/nls/cs/common.js
index 83b3682ce..0c567437e 100644
--- a/lib/dijit/nls/cs/common.js
+++ b/lib/dijit/nls/cs/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"}) \ No newline at end of file
+//>>built
+define("dijit/nls/cs/common",({buttonOk:"OK",buttonCancel:"Storno",buttonSave:"Uložit",itemClose:"Zavřít"})); \ No newline at end of file
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..a484bf07d
--- /dev/null
+++ b/lib/dijit/nls/cs/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/cs/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Storno",
+ buttonSave: "Uložit",
+ itemClose: "Zavřít"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/cs/loading.js b/lib/dijit/nls/cs/loading.js
index c611926e5..f88c33b8f 100644
--- a/lib/dijit/nls/cs/loading.js
+++ b/lib/dijit/nls/cs/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"}) \ No newline at end of file
+//>>built
+define("dijit/nls/cs/loading",({loadingState:"Probíhá načítání...",errorState:"Omlouváme se, došlo k chybě"})); \ No newline at end of file
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..32ca48f61
--- /dev/null
+++ b/lib/dijit/nls/cs/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/cs/loading", //begin v1.x content
+({
+ loadingState: "Probíhá načítání...",
+ errorState: "Omlouváme se, došlo k chybě"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/da/common.js b/lib/dijit/nls/da/common.js
index 8c51ed8c8..ab99fa7c9 100644
--- a/lib/dijit/nls/da/common.js
+++ b/lib/dijit/nls/da/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"}) \ No newline at end of file
+//>>built
+define("dijit/nls/da/common",({buttonOk:"OK",buttonCancel:"Annullér",buttonSave:"Gem",itemClose:"Luk"})); \ No newline at end of file
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..d46deeeb3
--- /dev/null
+++ b/lib/dijit/nls/da/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/da/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Annullér",
+ buttonSave: "Gem",
+ itemClose: "Luk"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/da/loading.js b/lib/dijit/nls/da/loading.js
index 5088eaf51..7304c9f78 100644
--- a/lib/dijit/nls/da/loading.js
+++ b/lib/dijit/nls/da/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"}) \ No newline at end of file
+//>>built
+define("dijit/nls/da/loading",({loadingState:"Indlæser...",errorState:"Der er opstået en fejl"})); \ No newline at end of file
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..974256380
--- /dev/null
+++ b/lib/dijit/nls/da/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/da/loading", //begin v1.x content
+({
+ loadingState: "Indlæser...",
+ errorState: "Der er opstået en fejl"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/de/common.js b/lib/dijit/nls/de/common.js
index cd60c45d2..4798e61fd 100644
--- a/lib/dijit/nls/de/common.js
+++ b/lib/dijit/nls/de/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"}) \ No newline at end of file
+//>>built
+define("dijit/nls/de/common",({buttonOk:"OK",buttonCancel:"Abbrechen",buttonSave:"Speichern",itemClose:"Schließen"})); \ No newline at end of file
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..44aafedaf
--- /dev/null
+++ b/lib/dijit/nls/de/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/de/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Abbrechen",
+ buttonSave: "Speichern",
+ itemClose: "Schließen"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/de/loading.js b/lib/dijit/nls/de/loading.js
index 4989983da..9bf4d4fbf 100644
--- a/lib/dijit/nls/de/loading.js
+++ b/lib/dijit/nls/de/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."}) \ No newline at end of file
+//>>built
+define("dijit/nls/de/loading",({loadingState:"Wird geladen...",errorState:"Es ist ein Fehler aufgetreten."})); \ No newline at end of file
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..507511db6
--- /dev/null
+++ b/lib/dijit/nls/de/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/de/loading", //begin v1.x content
+({
+ loadingState: "Wird geladen...",
+ errorState: "Es ist ein Fehler aufgetreten."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/el/common.js b/lib/dijit/nls/el/common.js
index 8e7a36af7..3aaa577ce 100644
--- a/lib/dijit/nls/el/common.js
+++ b/lib/dijit/nls/el/common.js
@@ -1 +1,2 @@
-({"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"}) \ No newline at end of file
+//>>built
+define("dijit/nls/el/common",({buttonOk:"ΟΚ",buttonCancel:"Ακύρωση",buttonSave:"Αποθήκευση",itemClose:"Κλείσιμο"})); \ No newline at end of file
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..1b81b8964
--- /dev/null
+++ b/lib/dijit/nls/el/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/el/common", //begin v1.x content
+({
+ buttonOk: "ΟΚ",
+ buttonCancel: "Ακύρωση",
+ buttonSave: "Αποθήκευση",
+ itemClose: "Κλείσιμο"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/el/loading.js b/lib/dijit/nls/el/loading.js
index 9567b3cec..c4afec6d5 100644
--- a/lib/dijit/nls/el/loading.js
+++ b/lib/dijit/nls/el/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"}) \ No newline at end of file
+//>>built
+define("dijit/nls/el/loading",({loadingState:"Φόρτωση...",errorState:"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"})); \ No newline at end of file
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..cb0b51146
--- /dev/null
+++ b/lib/dijit/nls/el/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/el/loading", //begin v1.x content
+({
+ loadingState: "Φόρτωση...",
+ errorState: "Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/es/common.js b/lib/dijit/nls/es/common.js
index b4feef98b..adb44f89d 100644
--- a/lib/dijit/nls/es/common.js
+++ b/lib/dijit/nls/es/common.js
@@ -1 +1,2 @@
-({"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"}) \ No newline at end of file
+//>>built
+define("dijit/nls/es/common",({buttonOk:"Aceptar",buttonCancel:"Cancelar",buttonSave:"Guardar",itemClose:"Cerrar"})); \ No newline at end of file
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..55e8580f4
--- /dev/null
+++ b/lib/dijit/nls/es/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/es/common", //begin v1.x content
+({
+ buttonOk: "Aceptar",
+ buttonCancel: "Cancelar",
+ buttonSave: "Guardar",
+ itemClose: "Cerrar"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/es/loading.js b/lib/dijit/nls/es/loading.js
index dc969a3bf..342eca2f4 100644
--- a/lib/dijit/nls/es/loading.js
+++ b/lib/dijit/nls/es/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"}) \ No newline at end of file
+//>>built
+define("dijit/nls/es/loading",({loadingState:"Cargando...",errorState:"Lo siento, se ha producido un error"})); \ No newline at end of file
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..4a1ecc5bf
--- /dev/null
+++ b/lib/dijit/nls/es/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/es/loading", //begin v1.x content
+({
+ loadingState: "Cargando...",
+ errorState: "Lo siento, se ha producido un error"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/fi/common.js b/lib/dijit/nls/fi/common.js
index 8b2fc2679..a9a5a50c1 100644
--- a/lib/dijit/nls/fi/common.js
+++ b/lib/dijit/nls/fi/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"}) \ No newline at end of file
+//>>built
+define("dijit/nls/fi/common",({buttonOk:"OK",buttonCancel:"Peruuta",buttonSave:"Tallenna",itemClose:"Sulje"})); \ No newline at end of file
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..103932746
--- /dev/null
+++ b/lib/dijit/nls/fi/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/fi/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Peruuta",
+ buttonSave: "Tallenna",
+ itemClose: "Sulje"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/fi/loading.js b/lib/dijit/nls/fi/loading.js
index 73e10a140..1610ad2b9 100644
--- a/lib/dijit/nls/fi/loading.js
+++ b/lib/dijit/nls/fi/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."}) \ No newline at end of file
+//>>built
+define("dijit/nls/fi/loading",({loadingState:"Lataus on meneillään...",errorState:"On ilmennyt virhe."})); \ No newline at end of file
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..d55f60a7b
--- /dev/null
+++ b/lib/dijit/nls/fi/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/fi/loading", //begin v1.x content
+({
+ loadingState: "Lataus on meneillään...",
+ errorState: "On ilmennyt virhe."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/fr/common.js b/lib/dijit/nls/fr/common.js
index 9f6aabe4d..3041351f7 100644
--- a/lib/dijit/nls/fr/common.js
+++ b/lib/dijit/nls/fr/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"}) \ No newline at end of file
+//>>built
+define("dijit/nls/fr/common",({buttonOk:"OK",buttonCancel:"Annuler",buttonSave:"Sauvegarder",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..74bc30b74
--- /dev/null
+++ b/lib/dijit/nls/fr/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/fr/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Annuler",
+ buttonSave: "Sauvegarder",
+ itemClose: "Fermer"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/fr/loading.js b/lib/dijit/nls/fr/loading.js
index ec7192baf..d5f0cda42 100644
--- a/lib/dijit/nls/fr/loading.js
+++ b/lib/dijit/nls/fr/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Chargement...","errorState":"Une erreur est survenue"}) \ No newline at end of file
+//>>built
+define("dijit/nls/fr/loading",({loadingState:"Chargement...",errorState:"Une erreur est survenue"})); \ No newline at end of file
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..e761fe628
--- /dev/null
+++ b/lib/dijit/nls/fr/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/fr/loading", //begin v1.x content
+({
+ loadingState: "Chargement...",
+ errorState: "Une erreur est survenue"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/he/common.js b/lib/dijit/nls/he/common.js
index b04d1cc3a..8ba85db93 100644
--- a/lib/dijit/nls/he/common.js
+++ b/lib/dijit/nls/he/common.js
@@ -1 +1,2 @@
-({"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"}) \ No newline at end of file
+//>>built
+define("dijit/nls/he/common",({buttonOk:"אישור",buttonCancel:"ביטול",buttonSave:"שמירה",itemClose:"סגירה"})); \ No newline at end of file
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..566219cf6
--- /dev/null
+++ b/lib/dijit/nls/he/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/he/common", //begin v1.x content
+({
+ buttonOk: "אישור",
+ buttonCancel: "ביטול",
+ buttonSave: "שמירה",
+ itemClose: "סגירה"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/he/loading.js b/lib/dijit/nls/he/loading.js
index 7b1d5f3a0..1b092c760 100644
--- a/lib/dijit/nls/he/loading.js
+++ b/lib/dijit/nls/he/loading.js
@@ -1 +1,2 @@
-({"loadingState":"טעינה...‏","errorState":"אירעה שגיאה"}) \ No newline at end of file
+//>>built
+define("dijit/nls/he/loading",({loadingState:"טעינה...",errorState:"אירעה שגיאה"})); \ No newline at end of file
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..a9d24dcf4
--- /dev/null
+++ b/lib/dijit/nls/he/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/he/loading", //begin v1.x content
+({
+ loadingState: "טעינה...‏",
+ errorState: "אירעה שגיאה"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/hr/common.js b/lib/dijit/nls/hr/common.js
new file mode 100644
index 000000000..aeb8473c2
--- /dev/null
+++ b/lib/dijit/nls/hr/common.js
@@ -0,0 +1,2 @@
+//>>built
+define("dijit/nls/hr/common",({buttonOk:"OK",buttonCancel:"Opoziv",buttonSave:"Spremi",itemClose:"Zatvori"})); \ No newline at end of file
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
new file mode 100644
index 000000000..2d3730e2d
--- /dev/null
+++ b/lib/dijit/nls/hr/loading.js
@@ -0,0 +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
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..4c1faaae3
--- /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 pogreške"
+})
+);
diff --git a/lib/dijit/nls/hu/common.js b/lib/dijit/nls/hu/common.js
index 21a773f49..edc33c91c 100644
--- a/lib/dijit/nls/hu/common.js
+++ b/lib/dijit/nls/hu/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"}) \ No newline at end of file
+//>>built
+define("dijit/nls/hu/common",({buttonOk:"OK",buttonCancel:"Mégse",buttonSave:"Mentés",itemClose:"Bezárás"})); \ No newline at end of file
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..8ba9694de
--- /dev/null
+++ b/lib/dijit/nls/hu/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/hu/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Mégse",
+ buttonSave: "Mentés",
+ itemClose: "Bezárás"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/hu/loading.js b/lib/dijit/nls/hu/loading.js
index d61e9a2aa..ba82604ca 100644
--- a/lib/dijit/nls/hu/loading.js
+++ b/lib/dijit/nls/hu/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"}) \ No newline at end of file
+//>>built
+define("dijit/nls/hu/loading",({loadingState:"Betöltés...",errorState:"Sajnálom, hiba történt"})); \ No newline at end of file
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..e408bfc0c
--- /dev/null
+++ b/lib/dijit/nls/hu/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/hu/loading", //begin v1.x content
+({
+ loadingState: "Betöltés...",
+ errorState: "Sajnálom, hiba történt"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/it/common.js b/lib/dijit/nls/it/common.js
index 6b3dc74e2..25d45843c 100644
--- a/lib/dijit/nls/it/common.js
+++ b/lib/dijit/nls/it/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"}) \ No newline at end of file
+//>>built
+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..cebfa9d6d
--- /dev/null
+++ b/lib/dijit/nls/it/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/it/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Annulla",
+ buttonSave: "Salva",
+ itemClose: "Chiudi"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/it/loading.js b/lib/dijit/nls/it/loading.js
index 60d05e007..3edc0137e 100644
--- a/lib/dijit/nls/it/loading.js
+++ b/lib/dijit/nls/it/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"}) \ No newline at end of file
+//>>built
+define("dijit/nls/it/loading",({loadingState:"Caricamento in corso...",errorState:"Si è verificato un errore"})); \ No newline at end of file
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..972595375
--- /dev/null
+++ b/lib/dijit/nls/it/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/it/loading", //begin v1.x content
+({
+ loadingState: "Caricamento in corso...",
+ errorState: "Si è verificato un errore"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ja/common.js b/lib/dijit/nls/ja/common.js
index b0b48c617..6fd4bfa5c 100644
--- a/lib/dijit/nls/ja/common.js
+++ b/lib/dijit/nls/ja/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ja/common",({buttonOk:"OK",buttonCancel:"キャンセル",buttonSave:"保存",itemClose:"閉じる"})); \ No newline at end of file
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..892c31fc7
--- /dev/null
+++ b/lib/dijit/nls/ja/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/ja/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "キャンセル",
+ buttonSave: "保存",
+ itemClose: "閉じる"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ja/loading.js b/lib/dijit/nls/ja/loading.js
index fa67d67cc..fdbebc085 100644
--- a/lib/dijit/nls/ja/loading.js
+++ b/lib/dijit/nls/ja/loading.js
@@ -1 +1,2 @@
-({"loadingState":"ロード中...","errorState":"エラーが発生しました。"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ja/loading",({loadingState:"ロード中...",errorState:"エラーが発生しました。"})); \ No newline at end of file
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..f19588954
--- /dev/null
+++ b/lib/dijit/nls/ja/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ja/loading", //begin v1.x content
+({
+ loadingState: "ロード中...",
+ errorState: "エラーが発生しました。"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/kk/common.js b/lib/dijit/nls/kk/common.js
index 2ac0faf64..6baed3cab 100644
--- a/lib/dijit/nls/kk/common.js
+++ b/lib/dijit/nls/kk/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Болдырмау","buttonSave":"Сақтау","itemClose":"Жабу"}) \ No newline at end of file
+//>>built
+define("dijit/nls/kk/common",({buttonOk:"OK",buttonCancel:"Болдырмау",buttonSave:"Сақтау",itemClose:"Жабу"})); \ No newline at end of file
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..c5cf437f0
--- /dev/null
+++ b/lib/dijit/nls/kk/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/kk/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Болдырмау",
+ buttonSave: "Сақтау",
+ itemClose: "Жабу"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/kk/loading.js b/lib/dijit/nls/kk/loading.js
index ba14287a2..80274cd1c 100644
--- a/lib/dijit/nls/kk/loading.js
+++ b/lib/dijit/nls/kk/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Жүктелуде...","errorState":"Кешіріңіз, қате орын алды"}) \ No newline at end of file
+//>>built
+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..632dbdbb7
--- /dev/null
+++ b/lib/dijit/nls/kk/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/kk/loading", //begin v1.x content
+({
+ loadingState: "Жүктелуде...",
+ errorState: "Кешіріңіз, қате орын алды"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ko/common.js b/lib/dijit/nls/ko/common.js
index 8e12bbff2..96150dd7d 100644
--- a/lib/dijit/nls/ko/common.js
+++ b/lib/dijit/nls/ko/common.js
@@ -1 +1,2 @@
-({"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ko/common",({buttonOk:"확인",buttonCancel:"취소",buttonSave:"저장",itemClose:"닫기"})); \ No newline at end of file
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..a76172a31
--- /dev/null
+++ b/lib/dijit/nls/ko/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/ko/common", //begin v1.x content
+({
+ buttonOk: "확인",
+ buttonCancel: "취소",
+ buttonSave: "저장",
+ itemClose: "닫기"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ko/loading.js b/lib/dijit/nls/ko/loading.js
index 5d1ca128b..1b362fef4 100644
--- a/lib/dijit/nls/ko/loading.js
+++ b/lib/dijit/nls/ko/loading.js
@@ -1 +1,2 @@
-({"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."}) \ No newline at end of file
+//>>built
+define("dijit/nls/ko/loading",({loadingState:"로드 중...",errorState:"죄송합니다. 오류가 발생했습니다."})); \ No newline at end of file
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..2f6e352d9
--- /dev/null
+++ b/lib/dijit/nls/ko/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ko/loading", //begin v1.x content
+({
+ loadingState: "로드 중...",
+ errorState: "죄송합니다. 오류가 발생했습니다."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/loading.js b/lib/dijit/nls/loading.js
index 1d6fa9b7d..73061d8c6 100644
--- a/lib/dijit/nls/loading.js
+++ b/lib/dijit/nls/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Loading...","errorState":"Sorry, an error occurred"}) \ No newline at end of file
+//>>built
+define("dijit/nls/loading",{root:({loadingState:"Loading...",errorState:"Sorry, an error occurred"}),"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}); \ No newline at end of file
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 b/lib/dijit/nls/nb/common.js
index 73e38c782..375d1823d 100644
--- a/lib/dijit/nls/nb/common.js
+++ b/lib/dijit/nls/nb/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"}) \ No newline at end of file
+//>>built
+define("dijit/nls/nb/common",({buttonOk:"OK",buttonCancel:"Avbryt",buttonSave:"Lagre",itemClose:"Lukk"})); \ No newline at end of file
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..8f3243ff2
--- /dev/null
+++ b/lib/dijit/nls/nb/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/nb/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Avbryt",
+ buttonSave: "Lagre",
+ itemClose: "Lukk"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/nb/loading.js b/lib/dijit/nls/nb/loading.js
index dbc314dfa..ad0cc9322 100644
--- a/lib/dijit/nls/nb/loading.js
+++ b/lib/dijit/nls/nb/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Laster inn...","errorState":"Det oppsto en feil"}) \ No newline at end of file
+//>>built
+define("dijit/nls/nb/loading",({loadingState:"Laster inn...",errorState:"Det oppsto en feil"})); \ No newline at end of file
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..17ef714a4
--- /dev/null
+++ b/lib/dijit/nls/nb/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/nb/loading", //begin v1.x content
+({
+ loadingState: "Laster inn...",
+ errorState: "Det oppsto en feil"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/nl/common.js b/lib/dijit/nls/nl/common.js
index fa4c66e7a..6aa433b6e 100644
--- a/lib/dijit/nls/nl/common.js
+++ b/lib/dijit/nls/nl/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"}) \ No newline at end of file
+//>>built
+define("dijit/nls/nl/common",({buttonOk:"OK",buttonCancel:"Annuleren",buttonSave:"Opslaan",itemClose:"Sluiten"})); \ No newline at end of file
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..9cd3ddd02
--- /dev/null
+++ b/lib/dijit/nls/nl/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/nl/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Annuleren",
+ buttonSave: "Opslaan",
+ itemClose: "Sluiten"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/nl/loading.js b/lib/dijit/nls/nl/loading.js
index c9870fd51..1a869e6e7 100644
--- a/lib/dijit/nls/nl/loading.js
+++ b/lib/dijit/nls/nl/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"}) \ No newline at end of file
+//>>built
+define("dijit/nls/nl/loading",({loadingState:"Bezig met laden...",errorState:"Er is een fout opgetreden"})); \ No newline at end of file
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..10bcfe663
--- /dev/null
+++ b/lib/dijit/nls/nl/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/nl/loading", //begin v1.x content
+({
+ loadingState: "Bezig met laden...",
+ errorState: "Er is een fout opgetreden"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/pl/common.js b/lib/dijit/nls/pl/common.js
index c84e5390e..20b19bbb9 100644
--- a/lib/dijit/nls/pl/common.js
+++ b/lib/dijit/nls/pl/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"}) \ No newline at end of file
+//>>built
+define("dijit/nls/pl/common",({buttonOk:"OK",buttonCancel:"Anuluj",buttonSave:"Zapisz",itemClose:"Zamknij"})); \ No newline at end of file
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..2faafe547
--- /dev/null
+++ b/lib/dijit/nls/pl/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/pl/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Anuluj",
+ buttonSave: "Zapisz",
+ itemClose: "Zamknij"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/pl/loading.js b/lib/dijit/nls/pl/loading.js
index eed3c3e4c..dbf47f912 100644
--- a/lib/dijit/nls/pl/loading.js
+++ b/lib/dijit/nls/pl/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"}) \ No newline at end of file
+//>>built
+define("dijit/nls/pl/loading",({loadingState:"Ładowanie...",errorState:"Niestety, wystąpił błąd"})); \ No newline at end of file
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..63da029cb
--- /dev/null
+++ b/lib/dijit/nls/pl/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/pl/loading", //begin v1.x content
+({
+ loadingState: "Ładowanie...",
+ errorState: "Niestety, wystąpił błąd"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/pt-pt/common.js b/lib/dijit/nls/pt-pt/common.js
index 799270516..15c1f1e8b 100644
--- a/lib/dijit/nls/pt-pt/common.js
+++ b/lib/dijit/nls/pt-pt/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"}) \ No newline at end of file
+//>>built
+define("dijit/nls/pt-pt/common",({buttonOk:"OK",buttonCancel:"Cancelar",buttonSave:"Guardar",itemClose:"Fechar"})); \ No newline at end of file
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..5b8b5325c
--- /dev/null
+++ b/lib/dijit/nls/pt-pt/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/pt-pt/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Cancelar",
+ buttonSave: "Guardar",
+ itemClose: "Fechar"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/pt-pt/loading.js b/lib/dijit/nls/pt-pt/loading.js
index 80257d372..b01a0d609 100644
--- a/lib/dijit/nls/pt-pt/loading.js
+++ b/lib/dijit/nls/pt-pt/loading.js
@@ -1 +1,2 @@
-({"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"}) \ No newline at end of file
+//>>built
+define("dijit/nls/pt-pt/loading",({loadingState:"A carregar...",errorState:"Lamentamos, mas ocorreu um erro"})); \ No newline at end of file
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..bc125a7f4
--- /dev/null
+++ b/lib/dijit/nls/pt-pt/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/pt-pt/loading", //begin v1.x content
+({
+ loadingState: "A carregar...",
+ errorState: "Lamentamos, mas ocorreu um erro"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/pt/common.js b/lib/dijit/nls/pt/common.js
index b94e6bc51..b6cf73c3b 100644
--- a/lib/dijit/nls/pt/common.js
+++ b/lib/dijit/nls/pt/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"}) \ No newline at end of file
+//>>built
+define("dijit/nls/pt/common",({buttonOk:"OK",buttonCancel:"Cancelar",buttonSave:"Salvar",itemClose:"Fechar"})); \ No newline at end of file
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..227aebdba
--- /dev/null
+++ b/lib/dijit/nls/pt/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/pt/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Cancelar",
+ buttonSave: "Salvar",
+ itemClose: "Fechar"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/pt/loading.js b/lib/dijit/nls/pt/loading.js
index 88cda7a2e..8873525ad 100644
--- a/lib/dijit/nls/pt/loading.js
+++ b/lib/dijit/nls/pt/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"}) \ No newline at end of file
+//>>built
+define("dijit/nls/pt/loading",({loadingState:"Carregando...",errorState:"Desculpe, ocorreu um erro"})); \ No newline at end of file
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..a9790dbff
--- /dev/null
+++ b/lib/dijit/nls/pt/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/pt/loading", //begin v1.x content
+({
+ loadingState: "Carregando...",
+ errorState: "Desculpe, ocorreu um erro"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ro/common.js b/lib/dijit/nls/ro/common.js
index e28d4e700..489b06488 100644
--- a/lib/dijit/nls/ro/common.js
+++ b/lib/dijit/nls/ro/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Anulare","buttonSave":"Salvare","itemClose":"Închidere"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ro/common",({buttonOk:"OK",buttonCancel:"Anulare",buttonSave:"Salvare",itemClose:"Închidere"})); \ No newline at end of file
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..031f94dce
--- /dev/null
+++ b/lib/dijit/nls/ro/common.js.uncompressed.js
@@ -0,0 +1,11 @@
+define(
+"dijit/nls/ro/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Anulare",
+ buttonSave: "Salvare",
+ itemClose: "Închidere"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ro/loading.js b/lib/dijit/nls/ro/loading.js
index 273efb444..3d92724cc 100644
--- a/lib/dijit/nls/ro/loading.js
+++ b/lib/dijit/nls/ro/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Încărcare...","errorState":"Ne pare rău, a apărut o eroare "}) \ No newline at end of file
+//>>built
+define("dijit/nls/ro/loading",({loadingState:"Încărcare...",errorState:"Ne pare rău, a apărut o eroare "})); \ No newline at end of file
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..b3928cc2f
--- /dev/null
+++ b/lib/dijit/nls/ro/loading.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/nls/ro/loading", //begin v1.x content
+({
+ loadingState: "Încărcare...",
+ errorState: "Ne pare rău, a apărut o eroare "
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ru/common.js b/lib/dijit/nls/ru/common.js
index 9a76d095e..f733d663c 100644
--- a/lib/dijit/nls/ru/common.js
+++ b/lib/dijit/nls/ru/common.js
@@ -1 +1,2 @@
-({"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ru/common",({buttonOk:"ОК",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..c89a1ab08
--- /dev/null
+++ b/lib/dijit/nls/ru/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/ru/common", //begin v1.x content
+({
+ buttonOk: "ОК",
+ buttonCancel: "Отмена",
+ buttonSave: "Сохранить",
+ itemClose: "Закрыть"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/ru/loading.js b/lib/dijit/nls/ru/loading.js
index 55cd03b63..a8f2b3ab4 100644
--- a/lib/dijit/nls/ru/loading.js
+++ b/lib/dijit/nls/ru/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"}) \ No newline at end of file
+//>>built
+define("dijit/nls/ru/loading",({loadingState:"Загрузка...",errorState:"Извините, возникла ошибка"})); \ No newline at end of file
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..3a0cfcca7
--- /dev/null
+++ b/lib/dijit/nls/ru/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/ru/loading", //begin v1.x content
+({
+ loadingState: "Загрузка...",
+ errorState: "Извините, возникла ошибка"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/sk/common.js b/lib/dijit/nls/sk/common.js
index 59a12d11e..3d86f70c7 100644
--- a/lib/dijit/nls/sk/common.js
+++ b/lib/dijit/nls/sk/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Zrušiť","buttonSave":"Uložiť","itemClose":"Zatvoriť"}) \ No newline at end of file
+//>>built
+define("dijit/nls/sk/common",({buttonOk:"OK",buttonCancel:"Zrušiť",buttonSave:"Uložiť",itemClose:"Zatvoriť"})); \ No newline at end of file
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..906671e30
--- /dev/null
+++ b/lib/dijit/nls/sk/common.js.uncompressed.js
@@ -0,0 +1,11 @@
+define(
+"dijit/nls/sk/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Zrušiť",
+ buttonSave: "Uložiť",
+ itemClose: "Zatvoriť"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/sk/loading.js b/lib/dijit/nls/sk/loading.js
index e805bd809..758716db6 100644
--- a/lib/dijit/nls/sk/loading.js
+++ b/lib/dijit/nls/sk/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Zavádzanie...","errorState":"Nastala chyba"}) \ No newline at end of file
+//>>built
+define("dijit/nls/sk/loading",({loadingState:"Zavádzanie...",errorState:"Nastala 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..b34068a6f
--- /dev/null
+++ b/lib/dijit/nls/sk/loading.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/nls/sk/loading", //begin v1.x content
+({
+ loadingState: "Zavádzanie...",
+ errorState: "Nastala chyba"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/sl/common.js b/lib/dijit/nls/sl/common.js
index 4704cc51f..86315459d 100644
--- a/lib/dijit/nls/sl/common.js
+++ b/lib/dijit/nls/sl/common.js
@@ -1 +1,2 @@
-({"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"}) \ No newline at end of file
+//>>built
+define("dijit/nls/sl/common",({buttonOk:"V redu",buttonCancel:"Prekliči",buttonSave:"Shrani",itemClose:"Zapri"})); \ No newline at end of file
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..e1499b5c1
--- /dev/null
+++ b/lib/dijit/nls/sl/common.js.uncompressed.js
@@ -0,0 +1,11 @@
+define(
+"dijit/nls/sl/common", //begin v1.x content
+({
+ buttonOk: "V redu",
+ buttonCancel: "Prekliči",
+ buttonSave: "Shrani",
+ itemClose: "Zapri"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/sl/loading.js b/lib/dijit/nls/sl/loading.js
index bae0ab0c9..e70006196 100644
--- a/lib/dijit/nls/sl/loading.js
+++ b/lib/dijit/nls/sl/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Nalaganje ...","errorState":"Oprostite, prišlo je do napake."}) \ No newline at end of file
+//>>built
+define("dijit/nls/sl/loading",({loadingState:"Nalaganje ...",errorState:"Oprostite, prišlo je do napake."})); \ No newline at end of file
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..5d38ddf49
--- /dev/null
+++ b/lib/dijit/nls/sl/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/sl/loading", //begin v1.x content
+({
+ loadingState: "Nalaganje ...",
+ errorState: "Oprostite, prišlo je do napake."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/sv/common.js b/lib/dijit/nls/sv/common.js
index cd3444f43..aa991050f 100644
--- a/lib/dijit/nls/sv/common.js
+++ b/lib/dijit/nls/sv/common.js
@@ -1 +1,2 @@
-({"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"}) \ No newline at end of file
+//>>built
+define("dijit/nls/sv/common",({buttonOk:"OK",buttonCancel:"Avbryt",buttonSave:"Spara",itemClose:"Stäng"})); \ No newline at end of file
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..e6334b65e
--- /dev/null
+++ b/lib/dijit/nls/sv/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/sv/common", //begin v1.x content
+({
+ buttonOk: "OK",
+ buttonCancel: "Avbryt",
+ buttonSave: "Spara",
+ itemClose: "Stäng"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/sv/loading.js b/lib/dijit/nls/sv/loading.js
index 95b90d263..966ebd102 100644
--- a/lib/dijit/nls/sv/loading.js
+++ b/lib/dijit/nls/sv/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Läser in...","errorState":"Det uppstod ett fel."}) \ No newline at end of file
+//>>built
+define("dijit/nls/sv/loading",({loadingState:"Läser in...",errorState:"Det uppstod 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..6407d3835
--- /dev/null
+++ b/lib/dijit/nls/sv/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/sv/loading", //begin v1.x content
+({
+ loadingState: "Läser in...",
+ errorState: "Det uppstod ett fel."
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/th/common.js b/lib/dijit/nls/th/common.js
index be06dd04f..af1046e7c 100644
--- a/lib/dijit/nls/th/common.js
+++ b/lib/dijit/nls/th/common.js
@@ -1 +1,2 @@
-({"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"}) \ No newline at end of file
+//>>built
+define("dijit/nls/th/common",({buttonOk:"ตกลง",buttonCancel:"ยกเลิก",buttonSave:"บันทึก",itemClose:"ปิด"})); \ No newline at end of file
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..98251409b
--- /dev/null
+++ b/lib/dijit/nls/th/common.js.uncompressed.js
@@ -0,0 +1,11 @@
+define(
+"dijit/nls/th/common", //begin v1.x content
+({
+ buttonOk: "ตกลง",
+ buttonCancel: "ยกเลิก",
+ buttonSave: "บันทึก",
+ itemClose: "ปิด"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/th/loading.js b/lib/dijit/nls/th/loading.js
index bb6b75d3a..4027ea59e 100644
--- a/lib/dijit/nls/th/loading.js
+++ b/lib/dijit/nls/th/loading.js
@@ -1 +1,2 @@
-({"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"}) \ No newline at end of file
+//>>built
+define("dijit/nls/th/loading",({loadingState:"กำลังโหลด...",errorState:"ขออภัย เกิดข้อผิดพลาด"})); \ No newline at end of file
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..79d7260ed
--- /dev/null
+++ b/lib/dijit/nls/th/loading.js.uncompressed.js
@@ -0,0 +1,9 @@
+define(
+"dijit/nls/th/loading", //begin v1.x content
+({
+ loadingState: "กำลังโหลด...",
+ errorState: "ขออภัย เกิดข้อผิดพลาด"
+})
+
+//end v1.x content
+);
diff --git a/lib/dijit/nls/tr/common.js b/lib/dijit/nls/tr/common.js
index e89e645e0..4322a8c6c 100644
--- a/lib/dijit/nls/tr/common.js
+++ b/lib/dijit/nls/tr/common.js
@@ -1 +1,2 @@
-({"buttonOk":"Tamam","buttonCancel":"İptal","buttonSave":"Kaydet","itemClose":"Kapat"}) \ No newline at end of file
+//>>built
+define("dijit/nls/tr/common",({buttonOk:"Tamam",buttonCancel:"İptal",buttonSave:"Kaydet",itemClose:"Kapat"})); \ No newline at end of file
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..6a42ab30f
--- /dev/null
+++ b/lib/dijit/nls/tr/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/tr/common", //begin v1.x content
+({
+ buttonOk: "Tamam",
+ buttonCancel: "İptal",
+ buttonSave: "Kaydet",
+ itemClose: "Kapat"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/tr/loading.js b/lib/dijit/nls/tr/loading.js
index b0ed738a8..5a0cac4ff 100644
--- a/lib/dijit/nls/tr/loading.js
+++ b/lib/dijit/nls/tr/loading.js
@@ -1 +1,2 @@
-({"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"}) \ No newline at end of file
+//>>built
+define("dijit/nls/tr/loading",({loadingState:"Yükleniyor...",errorState:"Üzgünüz, bir hata oluştu"})); \ No newline at end of file
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..432f2aa06
--- /dev/null
+++ b/lib/dijit/nls/tr/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/tr/loading", //begin v1.x content
+({
+ loadingState: "Yükleniyor...",
+ errorState: "Üzgünüz, bir hata oluştu"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/zh-tw/common.js b/lib/dijit/nls/zh-tw/common.js
index 5d3fee069..ddc508e66 100644
--- a/lib/dijit/nls/zh-tw/common.js
+++ b/lib/dijit/nls/zh-tw/common.js
@@ -1 +1,2 @@
-({"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"}) \ No newline at end of file
+//>>built
+define("dijit/nls/zh-tw/common",({buttonOk:"確定",buttonCancel:"取消",buttonSave:"儲存",itemClose:"關閉"})); \ No newline at end of file
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..cfe45c2b2
--- /dev/null
+++ b/lib/dijit/nls/zh-tw/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/zh-tw/common", //begin v1.x content
+({
+ buttonOk: "確定",
+ buttonCancel: "取消",
+ buttonSave: "儲存",
+ itemClose: "關閉"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/zh-tw/loading.js b/lib/dijit/nls/zh-tw/loading.js
index 00785410b..40de01e53 100644
--- a/lib/dijit/nls/zh-tw/loading.js
+++ b/lib/dijit/nls/zh-tw/loading.js
@@ -1 +1,2 @@
-({"loadingState":"載入中...","errorState":"抱歉,發生錯誤"}) \ No newline at end of file
+//>>built
+define("dijit/nls/zh-tw/loading",({loadingState:"載入中...",errorState:"抱歉,發生錯誤"})); \ No newline at end of file
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..a4401f2cd
--- /dev/null
+++ b/lib/dijit/nls/zh-tw/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/zh-tw/loading", //begin v1.x content
+({
+ loadingState: "載入中...",
+ errorState: "抱歉,發生錯誤"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/zh/common.js b/lib/dijit/nls/zh/common.js
index 0bb6267e1..00e02d467 100644
--- a/lib/dijit/nls/zh/common.js
+++ b/lib/dijit/nls/zh/common.js
@@ -1 +1,2 @@
-({"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"}) \ No newline at end of file
+//>>built
+define("dijit/nls/zh/common",({buttonOk:"确定",buttonCancel:"取消",buttonSave:"保存",itemClose:"关闭"})); \ No newline at end of file
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..ff30575c0
--- /dev/null
+++ b/lib/dijit/nls/zh/common.js.uncompressed.js
@@ -0,0 +1,10 @@
+define(
+"dijit/nls/zh/common", //begin v1.x content
+({
+ buttonOk: "确定",
+ buttonCancel: "取消",
+ buttonSave: "保存",
+ itemClose: "关闭"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/nls/zh/loading.js b/lib/dijit/nls/zh/loading.js
index c4b6fd758..792ac1552 100644
--- a/lib/dijit/nls/zh/loading.js
+++ b/lib/dijit/nls/zh/loading.js
@@ -1 +1,2 @@
-({"loadingState":"正在加载...","errorState":"对不起,发生了错误"}) \ No newline at end of file
+//>>built
+define("dijit/nls/zh/loading",({loadingState:"正在加载...",errorState:"对不起,发生了错误"})); \ No newline at end of file
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..c04d8cb94
--- /dev/null
+++ b/lib/dijit/nls/zh/loading.js.uncompressed.js
@@ -0,0 +1,8 @@
+define(
+"dijit/nls/zh/loading", //begin v1.x content
+({
+ loadingState: "正在加载...",
+ errorState: "对不起,发生了错误"
+})
+//end v1.x content
+);
diff --git a/lib/dijit/package.json b/lib/dijit/package.json
index 9ca942316..70cf90e0e 100644
--- a/lib/dijit/package.json
+++ b/lib/dijit/package.json
@@ -1,24 +1,23 @@
{
- "name": "dijit",
- "directories": {
- "lib": "."
- },
- "main":"./lib/main",
- "mappings": {
- "dojo": "https://github.com/dojo/dojo/zipball/1.0.2"
- },
- "description": "Dijit is Dojo�s UI Library",
- "licenses": [
- {
- "type": "AFLv2.1",
- "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L43"
- },
- {
- "type": "BSD",
- "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L13"
- }
- ],
- "bugs": "http://bugs.dojotoolkit.org/",
- "keywords": ["JavaScript", "Dojo", "Widget"],
- "homepage": "http://dojotoolkit.org/"
-} \ No newline at end of file
+ "name": "dijit",
+ "version":"1.7.3",
+ "main":"main",
+ "dependencies": {
+ "dojo": "current"
+ },
+ "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": [
+ {
+ "type": "AFLv2.1",
+ "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L43"
+ },
+ {
+ "type": "BSD",
+ "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L13"
+ }
+ ],
+ "bugs": "http://bugs.dojotoolkit.org/",
+ "keywords": ["JavaScript", "Dojo", "Widget"],
+ "homepage": "http://dojotoolkit.org/",
+ "dojoBuild": "dijit.profile.js"
+}
diff --git a/lib/dijit/place.js b/lib/dijit/place.js
new file mode 100644
index 000000000..7808c6e05
--- /dev/null
+++ b/lib/dijit/place.js
@@ -0,0 +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
diff --git a/lib/dijit/place.js.uncompressed.js b/lib/dijit/place.js.uncompressed.js
new file mode 100644
index 000000000..5283da478
--- /dev/null
+++ b/lib/dijit/place.js.uncompressed.js
@@ -0,0 +1,369 @@
+define("dijit/place", [
+ "dojo/_base/array", // array.forEach array.map array.some
+ "dojo/dom-geometry", // domGeometry.getMarginBox domGeometry.position
+ "dojo/dom-style", // domStyle.getComputedStyle
+ "dojo/_base/kernel", // kernel.deprecated
+ "dojo/_base/window", // win.body
+ "dojo/window", // winUtils.getBox
+ "." // dijit (defining dijit.place to match API doc)
+], function(array, domGeometry, domStyle, kernel, win, winUtils, dijit){
+
+ // module:
+ // dijit/place
+ // summary:
+ // Code to place a popup relative to another node
+
+
+ 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();
+
+ // 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().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)]
+ };
+
+ // 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 mb = domGeometry. getMarginBox(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 - mb.w,
+ 'M': Math.max(view.l, Math.min(view.l + view.w, pos.x + (mb.w >> 1)) - mb.w) // M orientation is more flexible
+ }[corner.charAt(1)],
+ startYpos = {
+ 'T': pos.y,
+ 'B': pos.y - mb.h,
+ 'M': Math.max(view.t, Math.min(view.t + view.h, pos.y + (mb.h >> 1)) - mb.h)
+ }[corner.charAt(0)],
+ startX = Math.max(view.l, startXpos),
+ startY = Math.max(view.t, startYpos),
+ endX = Math.min(view.l + view.w, startXpos + mb.w),
+ endY = Math.min(view.t + view.h, startYpos + mb.h),
+ width = endX - startX,
+ height = endY - startY;
+
+ overflow += (mb.w - width) + (mb.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(),
+ 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;
+ }
+
+ /*=====
+ dijit.place.__Position = function(){
+ // x: Integer
+ // horizontal coordinate in pixels, relative to document body
+ // y: Integer
+ // vertical coordinate in pixels, relative to document body
+
+ this.x = x;
+ this.y = y;
+ };
+ =====*/
+
+ /*=====
+ dijit.place.__Rectangle = function(){
+ // 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" from backwards-compatibility.
+
+ this.x = x;
+ this.y = y;
+ this.w = w;
+ this.h = h;
+ };
+ =====*/
+
+ return (dijit.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;
+
+ // Adjust anchor positioning for the case that a parent node has overflw hidden, therefore cuasing the anchor not to be completely visible
+ if(anchor.parentNode){
+ var parent = anchor.parentNode;
+ while(parent && parent.nodeType == 1 && parent.nodeName != "BODY"){ //ignoring the body will help performance
+ var parentPos = domGeometry.position(parent, true);
+ var parentStyleOverflow = domStyle.getComputedStyle(parent).overflow;
+ if(parentStyleOverflow == "hidden" || parentStyleOverflow == "auto" || parentStyleOverflow == "scroll"){
+ 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;
+ }
+ 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;
+ }
+ });
+});
diff --git a/lib/dijit/popup.js b/lib/dijit/popup.js
new file mode 100644
index 000000000..53dacbaf0
--- /dev/null
+++ b/lib/dijit/popup.js
@@ -0,0 +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
diff --git a/lib/dijit/popup.js.uncompressed.js b/lib/dijit/popup.js.uncompressed.js
new file mode 100644
index 000000000..3470df0b6
--- /dev/null
+++ b/lib/dijit/popup.js.uncompressed.js
@@ -0,0 +1,379 @@
+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/_base/sniff", // has("ie") has("mozilla")
+ "dojo/_base/window", // win.body
+ "./place",
+ "./BackgroundIframe",
+ "." // dijit (defining dijit.popup to match API doc)
+], function(array, aspect, connect, declare, dom, domAttr, domConstruct, domGeometry, domStyle, event, keys, lang, on, has, win,
+ place, BackgroundIframe, dijit){
+
+ // module:
+ // dijit/popup
+ // summary:
+ // Used to show drop downs (ex: the select list of a ComboBox)
+ // or popups (ex: right-click context menus)
+
+
+ /*=====
+ dijit.popup.__OpenArgs = function(){
+ // 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: dijit.__Position
+ // adding a buffer around the opening position. This is only useful when around is not set.
+ this.popup = popup;
+ this.parent = parent;
+ this.around = around;
+ this.x = x;
+ this.y = y;
+ this.orient = orient;
+ this.onCancel = onCancel;
+ this.onClose = onClose;
+ this.onExecute = onExecute;
+ this.padding = padding;
+ }
+ =====*/
+
+ /*=====
+ dijit.popup = {
+ // summary:
+ // Used to show drop downs (ex: the select list of a ComboBox)
+ // or popups (ex: right-click context menus).
+ //
+ // Access via require(["dijit/popup"], function(popup){ ... }).
+
+ moveOffScreen: function(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.
+ // widget: dijit._WidgetBase
+ // The widget
+ },
+
+ hide: function(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.
+ // widget: dijit._WidgetBase
+ // The widget
+ },
+
+ open: function(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.
+ // args: dijit.popup.__OpenArgs
+ // Parameters
+ return {}; // Object specifying which position was chosen
+ },
+
+ close: function(popup){
+ // summary:
+ // Close specified popup and any popups that it parented.
+ // If no popup is specified, closes all popups.
+ // widget: dijit._WidgetBase?
+ // The widget, optional
+ }
+ };
+ =====*/
+
+ var PopupManager = declare(null, {
+ // _stack: dijit._Widget[]
+ // 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"
+ }, win.body());
+ wrapper.appendChild(node);
+
+ var s = node.style;
+ s.display = "";
+ s.visibility = "";
+ s.position = "";
+ s.top = "0px";
+
+ widget._popupWrapper = wrapper;
+ aspect.after(widget, "destroy", function(){
+ domConstruct.destroy(wrapper);
+ delete widget._popupWrapper;
+ });
+ }
+
+ 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(/*dijit.popup.__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(),
+ 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
new file mode 100644
index 000000000..48d6f7238
--- /dev/null
+++ b/lib/dijit/registry.js
@@ -0,0 +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
diff --git a/lib/dijit/registry.js.uncompressed.js b/lib/dijit/registry.js.uncompressed.js
new file mode 100644
index 000000000..c571f15bb
--- /dev/null
+++ b/lib/dijit/registry.js.uncompressed.js
@@ -0,0 +1,174 @@
+define("dijit/registry", [
+ "dojo/_base/array", // array.forEach array.map
+ "dojo/_base/sniff", // has("ie")
+ "dojo/_base/unload", // unload.addOnWindowUnload
+ "dojo/_base/window", // win.body
+ "." // dijit._scopeName
+], function(array, has, unload, win, dijit){
+
+ // module:
+ // dijit/registry
+ // summary:
+ // Registry of existing widget on page, plus some utility methods.
+ // Must be accessed through AMD api, ex:
+ // require(["dijit/registry"], function(registry){ registry.byId("foo"); })
+
+ var _widgetTypeCtr = {}, hash = {};
+
+ var registry = {
+ // summary:
+ // A set of widgets indexed by id
+
+ length: 0,
+
+ add: function(/*dijit._Widget*/ widget){
+ // summary:
+ // Add a widget to the registry. If a duplicate ID is detected, a error is thrown.
+ //
+ // widget: dijit._Widget
+ // Any dijit._Widget 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._Widget
+ },
+
+ byNode: function(/*DOMNode*/ node){
+ // summary:
+ // Returns the widget corresponding to the given DOMNode
+ return hash[node.getAttribute("widgetId")]; // dijit._Widget
+ },
+
+ toArray: function(){
+ // summary:
+ // Convert registry into a true Array
+ //
+ // example:
+ // Work with the widget .domNodes in a real Array
+ // | array.map(dijit.registry.toArray(), function(w){ return w.domNode; });
+
+ var ar = [];
+ for(var id in hash){
+ ar.push(hash[id]);
+ }
+ return ar; // dijit._Widget[]
+ },
+
+ 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(/*DomNode*/ root){
+ // summary:
+ // Search subtree under root returning widgets found.
+ // Doesn't search for nested widgets (ie, widgets inside other widgets).
+
+ 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{
+ 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.getAttribute && 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
+ };
+
+ if(has("ie")){
+ // Only run _destroyAll() for IE because we think it's only necessary in that case,
+ // and because it causes problems on FF. See bug #3531 for details.
+ unload.addOnWindowUnload(function(){
+ registry._destroyAll();
+ });
+ }
+
+ /*=====
+ dijit.registry = {
+ // summary:
+ // A list of widgets on a page.
+ };
+ =====*/
+ dijit.registry = registry;
+
+ return registry;
+});
diff --git a/lib/dijit/resources/_modules.js b/lib/dijit/resources/_modules.js
index 0470c8e9b..e75636f1c 100644
--- a/lib/dijit/resources/_modules.js
+++ b/lib/dijit/resources/_modules.js
@@ -1,10 +1,3 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
/*=====
// dijit fallback for key summaries otherwise not covered by the doc parser
diff --git a/lib/dijit/robot.js b/lib/dijit/robot.js
deleted file mode 100644
index 09be04d03..000000000
--- a/lib/dijit/robot.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.robot"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.robot"] = true;
-dojo.provide("dijit.robot");
-dojo.require("dojo.robot");
-
-
-
-}
diff --git a/lib/dijit/robotx.js b/lib/dijit/robotx.js
deleted file mode 100644
index e5ef90641..000000000
--- a/lib/dijit/robotx.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.robotx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.robotx"] = true;
-dojo.provide("dijit.robotx");
-dojo.require("dijit.robot");
-dojo.require("dojo.robotx");
-
-
-//WARNING: This module depends on GLOBAL dijit being set for v1.5 code; therefore the lexical variable that
-//references "dijit" has been renamed to "dijit_"
-
-dojo.experimental("dijit.robotx");
-(function(){
-var __updateDocument = doh.robot._updateDocument;
-
-dojo.mixin(doh.robot,{
- _updateDocument: function(){
- __updateDocument();
- var win = dojo.global;
- if(win["dijit"]){
- window.dijit = win.dijit; // window reference needed for IE
- }
- }
-});
-
-})();
-
-}
diff --git a/lib/dijit/templates/Calendar.html b/lib/dijit/templates/Calendar.html
new file mode 100644
index 000000000..a3428f5c7
--- /dev/null
+++ b/lib/dijit/templates/Calendar.html
@@ -0,0 +1,35 @@
+<table cellspacing="0" cellpadding="0" class="dijitCalendarContainer" role="grid" aria-labelledby="${id}_mddb ${id}_year">
+ <thead>
+ <tr class="dijitReset dijitCalendarMonthContainer" valign="top">
+ <th class='dijitReset dijitCalendarArrow' data-dojo-attach-point="decrementMonth">
+ <img src="${_blankGif}" alt="" class="dijitCalendarIncrementControl dijitCalendarDecrease" role="presentation"/>
+ <span data-dojo-attach-point="decreaseArrowNode" class="dijitA11ySideArrow">-</span>
+ </th>
+ <th class='dijitReset' colspan="5">
+ <div data-dojo-attach-point="monthNode">
+ </div>
+ </th>
+ <th class='dijitReset dijitCalendarArrow' data-dojo-attach-point="incrementMonth">
+ <img src="${_blankGif}" alt="" class="dijitCalendarIncrementControl dijitCalendarIncrease" role="presentation"/>
+ <span data-dojo-attach-point="increaseArrowNode" class="dijitA11ySideArrow">+</span>
+ </th>
+ </tr>
+ <tr>
+ ${!dayCellsHtml}
+ </tr>
+ </thead>
+ <tbody data-dojo-attach-point="dateRowsNode" data-dojo-attach-event="onclick: _onDayClick" class="dijitReset dijitCalendarBodyContainer">
+ ${!dateRowsHtml}
+ </tbody>
+ <tfoot class="dijitReset dijitCalendarYearContainer">
+ <tr>
+ <td class='dijitReset' valign="top" colspan="7" role="presentation">
+ <div class="dijitCalendarYearLabel">
+ <span data-dojo-attach-point="previousYearLabelNode" class="dijitInline dijitCalendarPreviousYear" role="button"></span>
+ <span data-dojo-attach-point="currentYearLabelNode" class="dijitInline dijitCalendarSelectedYear" role="button" id="${id}_year"></span>
+ <span data-dojo-attach-point="nextYearLabelNode" class="dijitInline dijitCalendarNextYear" role="button"></span>
+ </div>
+ </td>
+ </tr>
+ </tfoot>
+</table>
diff --git a/lib/dijit/templates/CheckedMenuItem.html b/lib/dijit/templates/CheckedMenuItem.html
new file mode 100644
index 000000000..8e1bf5773
--- /dev/null
+++ b/lib/dijit/templates/CheckedMenuItem.html
@@ -0,0 +1,10 @@
+<tr class="dijitReset dijitMenuItem" data-dojo-attach-point="focusNode" role="menuitemcheckbox" tabIndex="-1"
+ data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">
+ <td class="dijitReset dijitMenuItemIconCell" role="presentation">
+ <img src="${_blankGif}" alt="" class="dijitMenuItemIcon dijitCheckedMenuItemIcon" data-dojo-attach-point="iconNode"/>
+ <span class="dijitCheckedMenuItemIconChar">&#10003;</span>
+ </td>
+ <td class="dijitReset dijitMenuItemLabel" colspan="2" data-dojo-attach-point="containerNode,labelNode"></td>
+ <td class="dijitReset dijitMenuItemAccelKey" style="display: none" data-dojo-attach-point="accelKeyNode"></td>
+ <td class="dijitReset dijitMenuArrowCell" role="presentation">&#160;</td>
+</tr>
diff --git a/lib/dijit/templates/ColorPalette.html b/lib/dijit/templates/ColorPalette.html
new file mode 100644
index 000000000..3f7f96065
--- /dev/null
+++ b/lib/dijit/templates/ColorPalette.html
@@ -0,0 +1,5 @@
+<div class="dijitInline dijitColorPalette">
+ <table dojoAttachPoint="paletteTableNode" class="dijitPaletteTable" cellSpacing="0" cellPadding="0" role="grid">
+ <tbody data-dojo-attach-point="gridNode"></tbody>
+ </table>
+</div>
diff --git a/lib/dijit/templates/Dialog.html b/lib/dijit/templates/Dialog.html
new file mode 100644
index 000000000..1e4a2237a
--- /dev/null
+++ b/lib/dijit/templates/Dialog.html
@@ -0,0 +1,9 @@
+<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>
+ </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
new file mode 100644
index 000000000..75451e31f
--- /dev/null
+++ b/lib/dijit/templates/InlineEditBox.html
@@ -0,0 +1,10 @@
+<span data-dojo-attach-point="editNode" role="presentation" style="position: absolute; visibility:hidden" class="dijitReset dijitInline"
+ 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'"
+ 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'"
+ 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
new file mode 100644
index 000000000..45e12a011
--- /dev/null
+++ b/lib/dijit/templates/Menu.html
@@ -0,0 +1,3 @@
+<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/MenuBar.html b/lib/dijit/templates/MenuBar.html
new file mode 100644
index 000000000..3ba1ea2b4
--- /dev/null
+++ b/lib/dijit/templates/MenuBar.html
@@ -0,0 +1 @@
+<div class="dijitMenuBar dijitMenuPassive" data-dojo-attach-point="containerNode" role="menubar" tabIndex="${tabIndex}" data-dojo-attach-event="onkeypress: _onKeyPress"></div>
diff --git a/lib/dijit/templates/MenuBarItem.html b/lib/dijit/templates/MenuBarItem.html
new file mode 100644
index 000000000..f5e262966
--- /dev/null
+++ b/lib/dijit/templates/MenuBarItem.html
@@ -0,0 +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">
+ <span data-dojo-attach-point="containerNode"></span>
+</div>
diff --git a/lib/dijit/templates/MenuItem.html b/lib/dijit/templates/MenuItem.html
new file mode 100644
index 000000000..b4fe7d603
--- /dev/null
+++ b/lib/dijit/templates/MenuItem.html
@@ -0,0 +1,14 @@
+<tr class="dijitReset dijitMenuItem" data-dojo-attach-point="focusNode" role="menuitem" tabIndex="-1"
+ data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick">
+ <td class="dijitReset dijitMenuItemIconCell" role="presentation">
+ <img src="${_blankGif}" alt="" class="dijitIcon dijitMenuItemIcon" data-dojo-attach-point="iconNode"/>
+ </td>
+ <td class="dijitReset dijitMenuItemLabel" colspan="2" data-dojo-attach-point="containerNode"></td>
+ <td class="dijitReset dijitMenuItemAccelKey" style="display: none" data-dojo-attach-point="accelKeyNode"></td>
+ <td class="dijitReset dijitMenuArrowCell" role="presentation">
+ <div data-dojo-attach-point="arrowWrapper" style="visibility: hidden">
+ <img src="${_blankGif}" alt="" class="dijitMenuExpand"/>
+ <span class="dijitMenuExpandA11y">+</span>
+ </div>
+ </td>
+</tr>
diff --git a/lib/dijit/templates/MenuSeparator.html b/lib/dijit/templates/MenuSeparator.html
new file mode 100644
index 000000000..77d1d0516
--- /dev/null
+++ b/lib/dijit/templates/MenuSeparator.html
@@ -0,0 +1,10 @@
+<tr class="dijitMenuSeparator">
+ <td class="dijitMenuSeparatorIconCell">
+ <div class="dijitMenuSeparatorTop"></div>
+ <div class="dijitMenuSeparatorBottom"></div>
+ </td>
+ <td colspan="3" class="dijitMenuSeparatorLabelCell">
+ <div class="dijitMenuSeparatorTop dijitMenuSeparatorLabel"></div>
+ <div class="dijitMenuSeparatorBottom"></div>
+ </td>
+</tr> \ No newline at end of file
diff --git a/lib/dijit/templates/ProgressBar.html b/lib/dijit/templates/ProgressBar.html
new file mode 100644
index 000000000..9ed12aff6
--- /dev/null
+++ b/lib/dijit/templates/ProgressBar.html
@@ -0,0 +1,8 @@
+<div class="dijitProgressBar dijitProgressBarEmpty" role="progressbar"
+ ><div data-dojo-attach-point="internalProgress" class="dijitProgressBarFull"
+ ><div class="dijitProgressBarTile" role="presentation"></div
+ ><span style="visibility:hidden">&#160;</span
+ ></div
+ ><div data-dojo-attach-point="labelNode" class="dijitProgressBarLabel" id="${id}_label"></div
+ ><img data-dojo-attach-point="indeterminateHighContrastImage" class="dijitProgressBarIndeterminateHighContrastImage" alt=""
+/></div>
diff --git a/lib/dijit/templates/TimePicker.html b/lib/dijit/templates/TimePicker.html
new file mode 100644
index 000000000..919fbb0d2
--- /dev/null
+++ b/lib/dijit/templates/TimePicker.html
@@ -0,0 +1,9 @@
+<div id="widget_${id}" class="dijitMenu"
+ ><div data-dojo-attach-point="upArrow" class="dijitButtonNode dijitUpArrowButton" data-dojo-attach-event="onmouseenter:_buttonMouse,onmouseleave:_buttonMouse"
+ ><div class="dijitReset dijitInline dijitArrowButtonInner" role="presentation">&#160;</div
+ ><div class="dijitArrowButtonChar">&#9650;</div></div
+ ><div data-dojo-attach-point="timeMenu,focusNode" data-dojo-attach-event="onclick:_onOptionSelected,onmouseover,onmouseout"></div
+ ><div data-dojo-attach-point="downArrow" class="dijitButtonNode dijitDownArrowButton" data-dojo-attach-event="onmouseenter:_buttonMouse,onmouseleave:_buttonMouse"
+ ><div class="dijitReset dijitInline dijitArrowButtonInner" role="presentation">&#160;</div
+ ><div class="dijitArrowButtonChar">&#9660;</div></div
+></div>
diff --git a/lib/dijit/templates/TitlePane.html b/lib/dijit/templates/TitlePane.html
new file mode 100644
index 000000000..4e7aece4f
--- /dev/null
+++ b/lib/dijit/templates/TitlePane.html
@@ -0,0 +1,17 @@
+<div>
+ <div data-dojo-attach-event="onclick:_onTitleClick, onkeypress:_onTitleKey"
+ class="dijitTitlePaneTitle" data-dojo-attach-point="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
+ ><span data-dojo-attach-point="titleNode" class="dijitTitlePaneTextNode"></span>
+ </div>
+ </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">
+ <!-- nested divs because wipeIn()/wipeOut() doesn't work right on node w/padding etc. Put padding on inner div. -->
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/lib/dijit/templates/Tooltip.html b/lib/dijit/templates/Tooltip.html
new file mode 100644
index 000000000..fdb1a8212
--- /dev/null
+++ b/lib/dijit/templates/Tooltip.html
@@ -0,0 +1,4 @@
+<div class="dijitTooltip dijitTooltipLeft" id="dojoTooltip"
+ ><div class="dijitTooltipContainer dijitTooltipContents" data-dojo-attach-point="containerNode" role='alert'></div
+ ><div class="dijitTooltipConnector" data-dojo-attach-point="connectorNode"></div
+></div>
diff --git a/lib/dijit/templates/TooltipDialog.html b/lib/dijit/templates/TooltipDialog.html
new file mode 100644
index 000000000..00a6022e2
--- /dev/null
+++ b/lib/dijit/templates/TooltipDialog.html
@@ -0,0 +1,6 @@
+<div role="presentation" tabIndex="-1">
+ <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>
diff --git a/lib/dijit/templates/Tree.html b/lib/dijit/templates/Tree.html
new file mode 100644
index 000000000..4e1b9432e
--- /dev/null
+++ b/lib/dijit/templates/Tree.html
@@ -0,0 +1,4 @@
+<div class="dijitTree dijitTreeContainer" role="tree"
+ data-dojo-attach-event="onkeypress:_onKeyPress">
+ <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
new file mode 100644
index 000000000..f55450cc3
--- /dev/null
+++ b/lib/dijit/templates/TreeNode.html
@@ -0,0 +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"
+ ><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
+ ></div>
+ <div data-dojo-attach-point="containerNode" class="dijitTreeContainer" role="presentation" style="display: none;"></div>
+</div>
diff --git a/lib/dijit/themes/claro/Calendar.css b/lib/dijit/themes/claro/Calendar.css
index ff8e64fa7..a0f959759 100644
--- a/lib/dijit/themes/claro/Calendar.css
+++ b/lib/dijit/themes/claro/Calendar.css
@@ -41,6 +41,7 @@
padding: 6px 5px 3px 5px;
-moz-border-radius: 4px;
border-radius: 4px;
+ border-collapse: separate;
}
.dj_ie6 .claro .dijitCalendar {
background-image: none;
@@ -48,13 +49,13 @@
.claro .dijitCalendar img {
border: none;
}
-.claro .dijitCalendarHover, .claro .dijitCalendarActive {
+.claro .dijitCalendarHover, .claro .dijitCalendar:hover, .claro .dijitCalendarActive {
/* treat dijitCalenderActive like hover since there's
* no concept of clicking a Calendar as a whole (although you can click things inside the calendar)
*/
background-color: #abd6ff;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
}
.claro .dijitCalendarMonthContainer th {
text-align: center;
@@ -79,16 +80,16 @@
.claro .dijitCalendarIncrease {
background-position: -18px 0;
}
-.claro .dijitCalendarArrowHover .dijitCalendarDecrease {
+.claro .dijitCalendarArrowHover .dijitCalendarDecrease, .claro .dijitCalendarArrow:hover .dijitCalendarDecrease {
background-position: -36px 0;
}
-.claro .dijitCalendarArrowHover .dijitCalendarIncrease {
+.claro .dijitCalendarArrowHover .dijitCalendarIncrease, .claro .dijitCalendarArrow:hover .dijitCalendarIncrease {
background-position: -55px 0;
}
-.claro .dijitCalendarArrowActive .dijitCalendarDecrease {
+.claro .dijitCalendarArrowActive .dijitCalendarDecrease, .claro .dijitCalendarArrow:active .dijitCalendarDecrease {
background-position: -72px 0;
}
-.claro .dijitCalendarArrowActive .dijitCalendarIncrease {
+.claro .dijitCalendarArrowActive .dijitCalendarIncrease, .claro .dijitCalendarArrow:active .dijitCalendarIncrease {
background-position: -91px 0;
}
.claro .dijitA11ySideArrow {
@@ -96,18 +97,19 @@
display: none;
}
-.claro .dijitDayLabels th {
- padding: 0 4px 0 4px;
- font-weight: bold;
- text-align: center;
-}
.claro .dijitCalendarDayLabelTemplate {
padding-bottom: 0;
text-align: center;
border-bottom: 1px solid #b5bcc7;
- font-size: 0.909em;
padding: 0 3px 2px;
}
+.claro .dijitCalendarDayLabel {
+ padding: 0 4px 0 4px;
+ font-weight: bold;
+ font-size: 0.909em;
+ text-align: center;
+ color: #000000;
+}
.claro .dijitCalendarDateTemplate {
text-align: center;
background-color: #ffffff;
@@ -121,12 +123,13 @@
font-weight: bold;
letter-spacing: .05em;
text-align: center;
+ color: #000000;
}
.dj_ie6 .claro .dijitCalendarDateTemplate {
background-image: none;
}
.claro .dijitCalendarPreviousMonth, .claro .dijitCalendarNextMonth {
- background-color: #e9f4fe;
+ background-color: #e5f2fe;
background-image: none;
border-bottom: solid 1px #d3d3d3;
/* todo: redundant with above .dijitCalendarDateTemplate rule */
@@ -149,8 +152,8 @@
transition-duration: 0.35s;
}
.claro .dijitCalendarPreviousMonth .dijitCalendarDateLabel, .claro .dijitCalendarNextMonth .dijitCalendarDateLabel {
- color: #769dc0;
- border-color: #e9f4fe;
+ color: #759dc0;
+ border-color: #e5f2fe;
/* intentionally matches background-color, no visible border until hover/selection */
}
@@ -163,6 +166,7 @@
.claro .dijitCalendarYearLabel {
padding: 2px 0 0 0;
margin: 0;
+ font-size: 1.17em;
}
.claro .dijitCalendarYearLabel span {
/* trying to center next/current/previous year vertically, doesn't work on IE6/7 though */
@@ -182,35 +186,38 @@
}
/* End Normal Calendar Style */
/* Hovered Calendar Style */
-.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel {
+.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel, .claro .dijitCalendarEnabledDate:hover .dijitCalendarDateLabel {
background-color: #abd6ff;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
color: #000000;
-webkit-transition-duration: 0.2s;
-moz-transition-duration: 0.2s;
transition-duration: 0.2s;
}
-.claro .dijitCalendarNextYearHover, .claro .dijitCalendarPreviousYearHover {
+.claro .dijitCalendarNextYearHover,
+.claro .dijitCalendarNextYear:hover,
+.claro .dijitCalendarPreviousYearHover,
+.claro .dijitCalendarPreviousYear:hover {
color: #000000;
border: solid 1px #ffffff;
padding: 0 5px 0 5px;
/* reduced by 1 to make room for border */
- background-color: #e9f4fe;
+ background-color: #e5f2fe;
}
/* End Hovered Calendar Style */
/* Active Calendar Style */
-.claro .dijitCalendarNextYearActive, .claro .dijitCalendarPreviousYearActive {
- border: solid 1px #769dc0;
+.claro .dijitCalendarNextYearActive, .claro .dijitCalendarNextYear:active.claro .dijitCalendarPreviousYearActive, .claro .dijitCalendarPreviousYear:active {
+ border: solid 1px #759dc0;
padding: 0 5px 0 5px;
/* reduced by 1 to make room for border */
- background-color: #cfe5fa;
+ background-color: #7dbdfa;
}
-.claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
+.claro .dijitCalendarActiveDate .dijitCalendarDateLabel, .claro .dijitCalendarEnabledDate:active .dijitCalendarDateLabel {
background-image: url("images/calendarContainerImages.png");
background-position: 0 -300px;
- background-color: #7dbefa;
+ background-color: #7dbdfa;
border: solid 1px #ffffff;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
@@ -224,18 +231,13 @@
.claro .dijitCalendarSelectedDate .dijitCalendarDateLabel {
color: #000000;
background-color: #abd6ff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
/* End Selected Calendar Style */
/* Disabled Calendar Style*/
.claro .dijitCalendarDisabledDate .dijitCalendarDateLabel {
- text-decoration: line-through;
- /* override hover effects above, hover and click on disabled date should have no effect */
-
- background-color: transparent;
- border-width: 0;
- padding: 4px 6px 4px 5px;
color: #818181;
+ text-decoration: line-through;
}
/* End Disabled Calendar Style */
/* Styling for month DropDownButton */
@@ -255,13 +257,13 @@
-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
}
-.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode {
- background-color: #e9f4fe;
+.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode, .claro .dijitCalendar .dijitDropDownButton:hover .dijitButtonNode {
+ background-color: #e5f2fe;
border: solid 1px #ffffff;
}
/* Styling for month drop down list */
.claro .dijitCalendarMonthMenu {
- border-color: #769dc0;
+ border-color: #759dc0;
background-color: #ffffff;
text-align: center;
background-image: none;
@@ -273,9 +275,9 @@
border-bottom: solid 1px #ffffff;
padding: 2px 0;
}
-.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover, .claro .dijitCalendarMonthMenu .dijitCalendarMonthLabel:hover {
background-color: #abd6ff;
- border-color: #769dc0;
+ border-color: #759dc0;
border-width: 1px 0;
background-image: url("images/commonHighlight.png");
background-repeat: repeat-x;
diff --git a/lib/dijit/themes/claro/Calendar.less b/lib/dijit/themes/claro/Calendar.less
index ec6aa4696..55decd3b4 100644
--- a/lib/dijit/themes/claro/Calendar.less
+++ b/lib/dijit/themes/claro/Calendar.less
@@ -37,12 +37,13 @@
.claro .dijitCalendar {
border:solid 1px @border-color;
background-color: @calendar-background-color;
- background-image:url("images/calendarContainerImages.png");
+ background-image:url(@image-calendar-container);
background-position:0 -448px;
background-repeat:repeat-x;
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;
@@ -50,7 +51,7 @@
.claro .dijitCalendar img {
border:none;
}
-.claro .dijitCalendarHover,
+.claro .dijitCalendarHover, .claro .dijitCalendar:hover,
.claro .dijitCalendarActive {
/* treat dijitCalenderActive like hover since there's
* no concept of clicking a Calendar as a whole (although you can click things inside the calendar)
@@ -73,25 +74,29 @@
.claro .dijitCalendarIncrementControl {
width:18px;
height:16px;
- background-image: url("images/calendarArrows.png");
+ background-image: url(@image-calendar-arrows);
background-repeat: no-repeat;
}
.dj_ie6 .claro .dijitCalendarIncrementControl {
- background-image: url("images/calendarArrows8bit.png");
+ background-image: url(@image-calendar-arrows-ie6);
}
.claro .dijitCalendarIncrease {
background-position:-18px 0;
}
-.claro .dijitCalendarArrowHover .dijitCalendarDecrease {
+.claro .dijitCalendarArrowHover .dijitCalendarDecrease,
+.claro .dijitCalendarArrow:hover .dijitCalendarDecrease {
background-position:-36px 0;
}
-.claro .dijitCalendarArrowHover .dijitCalendarIncrease {
+.claro .dijitCalendarArrowHover .dijitCalendarIncrease,
+.claro .dijitCalendarArrow:hover .dijitCalendarIncrease {
background-position:-55px 0;
}
-.claro .dijitCalendarArrowActive .dijitCalendarDecrease {
+.claro .dijitCalendarArrowActive .dijitCalendarDecrease,
+.claro .dijitCalendarArrow:active .dijitCalendarDecrease {
background-position:-72px 0;
}
-.claro .dijitCalendarArrowActive .dijitCalendarIncrease {
+.claro .dijitCalendarArrowActive .dijitCalendarIncrease,
+.claro .dijitCalendarArrow:active .dijitCalendarIncrease {
background-position:-91px 0;
}
.claro .dijitA11ySideArrow {
@@ -99,23 +104,23 @@
display: none;
}
-
-.claro .dijitDayLabels th {
- padding:0 4px 0 4px;
- font-weight:bold;
- text-align:center;
-}
.claro .dijitCalendarDayLabelTemplate {
padding-bottom:0;
text-align:center;
border-bottom:1px solid @border-color;
- font-size:0.909em;
padding:0 3px 2px;
}
+.claro .dijitCalendarDayLabel {
+ padding:0 4px 0 4px;
+ font-weight:bold;
+ font-size:0.909em;
+ text-align:center;
+ color: @text-color;
+}
.claro .dijitCalendarDateTemplate {
text-align:center;
background-color:@calendar-currentmonth-background-color;
- background-image:url("images/calendarContainerImages.png");
+ background-image:url(@image-calendar-container);
background-position:0 0;
background-repeat:repeat-x;
border-bottom: 1px solid @minor-border-color;
@@ -125,6 +130,7 @@
font-weight:bold;
letter-spacing:.05em;
text-align:center;
+ color: @text-color;
}
.dj_ie6 .claro .dijitCalendarDateTemplate {
background-image: none;
@@ -157,8 +163,9 @@
padding: 1px 2px 2px 2px;
}
.claro .dijitCalendarYearLabel {
- padding:2px 0 0 0;
- margin:0;
+ padding: 2px 0 0 0;
+ margin: 0;
+ font-size: 1.17em;
}
.claro .dijitCalendarYearLabel span {
/* trying to center next/current/previous year vertically, doesn't work on IE6/7 though */
@@ -178,14 +185,15 @@
}
/* End Normal Calendar Style */
/* Hovered Calendar Style */
-.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel{
+.claro .dijitCalendarHoveredDate .dijitCalendarDateLabel,
+.claro .dijitCalendarEnabledDate:hover .dijitCalendarDateLabel {
background-color:@hovered-background-color;
border:solid 1px @hovered-border-color;
color:@hovered-text-color;
.transition-duration(.2s);
}
-.claro .dijitCalendarNextYearHover,
-.claro .dijitCalendarPreviousYearHover {
+.claro .dijitCalendarNextYearHover, .claro .dijitCalendarNextYear:hover,
+.claro .dijitCalendarPreviousYearHover, .claro .dijitCalendarPreviousYear:hover {
color:@hovered-text-color;
border:solid 1px @calendar-button-hovered-border-color;
padding: 0 5px 0 5px; /* reduced by 1 to make room for border */
@@ -193,14 +201,15 @@
}
/* End Hovered Calendar Style */
/* Active Calendar Style */
-.claro .dijitCalendarNextYearActive,
-.claro .dijitCalendarPreviousYearActive {
+.claro .dijitCalendarNextYearActive, .claro .dijitCalendarNextYear:active
+.claro .dijitCalendarPreviousYearActive, .claro .dijitCalendarPreviousYear:active {
border: solid 1px @calendar-button-pressed-border-color;
padding: 0 5px 0 5px; /* reduced by 1 to make room for border */
background-color:@calendar-button-pressed-background-color;
}
-.claro .dijitCalendarActiveDate .dijitCalendarDateLabel {
- background-image:url("images/calendarContainerImages.png");
+.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;
@@ -219,13 +228,8 @@
/* End Selected Calendar Style */
/* Disabled Calendar Style*/
.claro .dijitCalendarDisabledDate .dijitCalendarDateLabel {
- text-decoration:line-through;
-
- /* override hover effects above, hover and click on disabled date should have no effect */
- background-color: transparent;
- border-width: 0;
- padding: 4px 6px 4px 5px;
color: @disabled-text-color;
+ text-decoration:line-through;
}
/* End Disabled Calendar Style */
@@ -246,7 +250,8 @@
border:solid 1px @border-color;
.box-shadow(0 0 0 rgba(0,0,0,0));
}
-.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode {
+.claro .dijitCalendar .dijitDropDownButtonHover .dijitButtonNode,
+.claro .dijitCalendar .dijitDropDownButton:hover .dijitButtonNode {
background-color: @calendar-button-hovered-background-color;
border:solid 1px @calendar-button-hovered-border-color;
}
@@ -264,10 +269,11 @@
border-bottom: solid 1px @menu-background-color;
padding: 2px 0;
}
-.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover,
+.claro .dijitCalendarMonthMenu .dijitCalendarMonthLabel:hover {
background-color: @hovered-background-color;
border-color: @hovered-border-color;
border-width:1px 0;
- background-image: url("images/commonHighlight.png");
+ background-image: url(@image-common-highlight);
background-repeat:repeat-x;
}
diff --git a/lib/dijit/themes/claro/ColorPalette.css b/lib/dijit/themes/claro/ColorPalette.css
index 34d1c72b2..a23b2dfd0 100644
--- a/lib/dijit/themes/claro/ColorPalette.css
+++ b/lib/dijit/themes/claro/ColorPalette.css
@@ -12,11 +12,11 @@
* displays border around a color swatch
*
* 3. hovered swatch
- * .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg
+ * .dijitColorPalette .dijitPaletteCell:hover .dijitPaletteImg
* the hovered state of the color swatch - adds border
*
* 4. active and selected swatch
- * .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg
+ * .dijitColorPalette .dijitPaletteCell:active .dijitPaletteImg
* .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg
* adds border for active or selected state
*/
@@ -33,9 +33,9 @@
border: 1px solid #d3d3d3;
}
-.claro .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
+.claro .dijitColorPalette .dijitPaletteCell:hover .dijitPaletteImg {
border: 1px solid #000000;
}
-.claro .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg, .claro .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
+.claro .dijitColorPalette .dijitPaletteCell:active .dijitPaletteImg, .claro .dijitColorPalette .dijitPaletteTable .dijitPaletteCellSelected .dijitPaletteImg {
border: 2px solid #000000;
}
diff --git a/lib/dijit/themes/claro/ColorPalette.less b/lib/dijit/themes/claro/ColorPalette.less
index e0327334d..ffa3ac051 100644
--- a/lib/dijit/themes/claro/ColorPalette.less
+++ b/lib/dijit/themes/claro/ColorPalette.less
@@ -12,11 +12,11 @@
* displays border around a color swatch
*
* 3. hovered swatch
- * .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg
+ * .dijitColorPalette .dijitPaletteCell:hover .dijitPaletteImg
* the hovered state of the color swatch - adds border
*
* 4. active and selected swatch
- * .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg
+ * .dijitColorPalette .dijitPaletteCell:active .dijitPaletteImg
* .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg
* adds border for active or selected state
*/
@@ -35,10 +35,10 @@
* overrides border color in dijit.css */
border: 1px solid @minor-border-color;
}
-.claro .dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
+.claro .dijitColorPalette .dijitPaletteCell:hover .dijitPaletteImg {
border: 1px solid @swatch-hovered-border-color;
}
-.claro .dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.claro .dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
+.claro .dijitColorPalette .dijitPaletteCell:active .dijitPaletteImg,
+.claro .dijitColorPalette .dijitPaletteTable .dijitPaletteCellSelected .dijitPaletteImg {
border: 2px solid @swatch-selected-border-color;
}
diff --git a/lib/dijit/themes/claro/Common.css b/lib/dijit/themes/claro/Common.css
index 110b303e2..83f6128c1 100644
--- a/lib/dijit/themes/claro/Common.css
+++ b/lib/dijit/themes/claro/Common.css
@@ -18,21 +18,11 @@
.claro .dijitFocusedLabel {
/* for checkboxes or radio buttons, hatch border around the corresponding label, to indicate focus */
- outline: 1px dotted #4a4a4a;
-}
-.claro .dijitContentPaneLoading {
- background: url('images/loadingAnimation.gif') no-repeat left center;
- padding-left: 25px;
-}
-/* .dijitContentPaneError icon renders in a dialog box with the error messsage when there is an error in a HREF url */
-.claro .dijitContentPaneError {
- background: url('../../icons/images/commonIconsObjActEnabled.png') no-repeat left center;
- background-position: -496px;
- padding-left: 25px;
+ outline: 1px dotted #494949;
}
/* Drag and Drop */
.claro .dojoDndItemBefore, .claro .dojoDndItemAfter {
- border-top: 1px solid #769dc0;
+ border-top: 1px solid #759dc0;
}
.claro .dojoDndItemOver {
cursor: pointer;
@@ -50,7 +40,7 @@
padding-left: 21px;
}
.claro.dojoDndMove .dojoDndAvatarHeader, .claro.dojoDndCopy .dojoDndAvatarHeader {
- background-image: url(images/dnd.png);
+ background-image: url("images/dnd.png");
background-repeat: no-repeat;
background-position: 2px -122px;
}
diff --git a/lib/dijit/themes/claro/Common.less b/lib/dijit/themes/claro/Common.less
index 872cf8913..248fc1ab8 100644
--- a/lib/dijit/themes/claro/Common.less
+++ b/lib/dijit/themes/claro/Common.less
@@ -20,18 +20,6 @@
outline: 1px dotted @focus-outline-color;
}
-.claro .dijitContentPaneLoading {
- background:url('images/loadingAnimation.gif') no-repeat left center;
- padding-left:25px;
-}
-
-/* .dijitContentPaneError icon renders in a dialog box with the error messsage when there is an error in a HREF url */
-.claro .dijitContentPaneError {
- background:url('../../icons/images/commonIconsObjActEnabled.png') no-repeat left center;
- background-position: -496px;
- padding-left:25px;
-}
-
/* Drag and Drop */
.claro .dojoDndItemBefore,
.claro .dojoDndItemAfter{
@@ -51,7 +39,7 @@
padding-left:21px;
}
.claro.dojoDndMove .dojoDndAvatarHeader, .claro.dojoDndCopy .dojoDndAvatarHeader {
- background-image: url(images/dnd.png);
+ background-image: url(@image-dnd);
background-repeat: no-repeat;
background-position:2px -122px;
}
diff --git a/lib/dijit/themes/claro/Dialog.css b/lib/dijit/themes/claro/Dialog.css
index 119900eca..ae0b18df6 100644
--- a/lib/dijit/themes/claro/Dialog.css
+++ b/lib/dijit/themes/claro/Dialog.css
@@ -29,14 +29,14 @@
* .dijitTooltipConnector - tooltip anchor includes 4 direction(up, down, left, right)
*/
.claro .dijitDialog {
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
-webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);
-moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.25);
}
.claro .dijitDialogPaneContent {
background: #ffffff repeat-x top left;
- border-top: 1px solid #769dc0;
+ border-top: 1px solid #759dc0;
padding: 10px 8px;
position: relative;
}
@@ -74,6 +74,7 @@
padding: 0 1px;
font-size: 1.091em;
+ color: #000000;
}
.claro .dijitDialogCloseIcon {
/* the default close icon for the dialog */
@@ -123,7 +124,7 @@
background-image: url("images/tooltipGradient.png");
background-repeat: repeat-x;
background-position: bottom;
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
padding: 6px 8px;
-moz-border-radius: 4px;
border-radius: 4px;
@@ -131,6 +132,7 @@
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
font-size: 1em;
+ color: #000000;
}
.dj_ie6 .claro .dijitTooltipContainer {
background-image: none;
diff --git a/lib/dijit/themes/claro/Dialog.less b/lib/dijit/themes/claro/Dialog.less
index ff5c1e656..5e74be747 100644
--- a/lib/dijit/themes/claro/Dialog.less
+++ b/lib/dijit/themes/claro/Dialog.less
@@ -68,7 +68,7 @@
border: 1px solid @dialog-titlebar-border-color;
border-top:none;
background-color: @dialog-titlebar-background-color;
- background-image: url("images/titlebar.png");
+ background-image: url(@image-titlebar);
background-repeat:repeat-x;
padding: 5px 7px 4px 7px;
}
@@ -77,11 +77,12 @@
/* typography and styling of the dialog title */
padding: 0 1px;
font-size:1.091em;
+ color: @text-color;
}
.claro .dijitDialogCloseIcon {
/* the default close icon for the dialog */
- background: url("images/dialogCloseIcon.png");
+ background: url(@image-dialog-close);
background-repeat:no-repeat;
position: absolute;
right: 5px;
@@ -89,7 +90,7 @@
width: 21px;
}
.dj_ie6 .claro .dijitDialogCloseIcon {
- background-image: url("images/dialogCloseIcon8bit.png");
+ background-image: url(@image-dialog-close-ie6);
}
.claro .dijitDialogCloseIconHover {
background-position:-21px;
@@ -122,7 +123,7 @@
.claro .dijitTooltipContainer {
/* the part with the text */
background-color:@popup-background-color;
- background-image:url("images/tooltipGradient.png");
+ background-image:url(@image-tooltip-gradient);
background-repeat:repeat-x;
background-position:bottom;
border:1px solid @popup-border-color;
@@ -130,6 +131,7 @@
.border-radius(4px);
.box-shadow(0 1px 3px rgba(0,0,0,0.25));
font-size: 1em;
+ color: @text-color;
}
.dj_ie6 .claro .dijitTooltipContainer {
@@ -139,13 +141,13 @@
/* the arrow piece */
border: 0;
z-index: 2;
- background-image:url("images/tooltip.png");
+ background-image:url(@image-tooltip);
background-repeat:no-repeat;
width:16px;
height:14px;
}
.dj_ie6 .claro .dijitTooltipConnector {
- background-image:url("images/tooltip8bit.png");
+ background-image:url(@image-tooltip-ie6);
}
.claro .dijitTooltipABRight .dijitTooltipConnector {
/* above or below tooltip, but the arrow appears on the right,
diff --git a/lib/dijit/themes/claro/Editor.css b/lib/dijit/themes/claro/Editor.css
index 641990a09..9f167f921 100644
--- a/lib/dijit/themes/claro/Editor.css
+++ b/lib/dijit/themes/claro/Editor.css
@@ -25,14 +25,14 @@
}
.claro .dijitEditor .dijitEditorIFrameContainer {
background-color: #ffffff;
- background-image: url('form/images/textBox_back.png');
+ 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: #e9f4fe;
+ background-color: #e5f2fe;
}
.claro .dijitEditorFocused .dijitEditorIFrameContainer, .claro .dijitEditorFocused .dijitEditorIFrameContainer .dijitEditorIFrame {
/* TODO: contradicts rule above, which background-color do you want? */
diff --git a/lib/dijit/themes/claro/Editor.less b/lib/dijit/themes/claro/Editor.less
index 43e6d39ae..f74a5d462 100644
--- a/lib/dijit/themes/claro/Editor.less
+++ b/lib/dijit/themes/claro/Editor.less
@@ -28,7 +28,7 @@
}
.claro .dijitEditor .dijitEditorIFrameContainer{
background-color: @textbox-background-color;
- background-image: url('form/images/textBox_back.png');
+ background-image: url(@image-form-textbox-background);
background-repeat:repeat-x;
}
.dj_ie6 .claro .dijitEditor .dijitEditorIFrameContainer{
@@ -56,4 +56,4 @@
.claro .dijitDisabled .dijitEditorIFrameContainer .dijitEditorIFrame {
background-color: @textbox-disabled-background-color;
background-image: none;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/claro/InlineEditBox.css b/lib/dijit/themes/claro/InlineEditBox.css
index e6058f780..0cd14579d 100644
--- a/lib/dijit/themes/claro/InlineEditBox.css
+++ b/lib/dijit/themes/claro/InlineEditBox.css
@@ -12,8 +12,8 @@
border: 1px solid transparent;
}
.claro .dijitInlineEditBoxDisplayModeHover {
- background-color: #e9f4fe;
- border: solid 1px #769dc0;
+ background-color: #e5f2fe;
+ border: solid 1px #759dc0;
}
.dj_ie6 .claro .dijitInlineEditBoxDisplayMode {
border: none;
diff --git a/lib/dijit/themes/claro/Menu.css b/lib/dijit/themes/claro/Menu.css
index c55176d54..e1c1562e8 100644
--- a/lib/dijit/themes/claro/Menu.css
+++ b/lib/dijit/themes/claro/Menu.css
@@ -44,7 +44,7 @@ There are three areas of styling for the Menu:
.claro .dijitMenu {
background-repeat: repeat-y;
background-color: #ffffff;
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
/* so adjoining borders of MenuBar/ComboBox and Menu overlap, avoiding double border */
margin: -1px 0;
@@ -57,13 +57,13 @@ There are three areas of styling for the Menu:
.claro .dijitMenuBar .dijitMenuItem {
padding: 6px 10px 7px;
background-position: 0 100px;
- color: #4a4a4a;
margin: -1px;
}
.claro .dijitMenuItem {
background-image: url("images/menuHighlight.png");
background-position: 0 -40px;
background-repeat: repeat-x;
+ color: #000000;
}
/* this prevents jiggling upon hover of a menu item */
.claro .dijitMenuTable {
@@ -77,7 +77,7 @@ There are three areas of styling for the Menu:
/* hover over a MenuBarItem */
.claro .dijitMenuPassive .dijitMenuItemHover, .claro .dijitMenuPassive .dijitMenuItemSelected {
background-color: #abd6ff;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
background-position: 0 0;
color: #000000;
padding: 5px 9px 6px;
@@ -90,7 +90,7 @@ There are three areas of styling for the Menu:
}
/* MenuBarItem that has been selected and menu drops down from it */
.claro .dijitMenuActive .dijitMenuItemHover, .claro .dijitMenuActive .dijitMenuItemSelected {
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
padding: 5px 9px 6px;
background-color: #abd6ff;
background-position: 0 0;
@@ -105,7 +105,7 @@ There are three areas of styling for the Menu:
margin-top: -3px;
}
.claro .dijitMenuActive .dijitMenuItemActive {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
background-position: 0 -177px;
}
.claro .dijitMenuItemActive {
@@ -122,7 +122,7 @@ There are three areas of styling for the Menu:
.claro .dijitMenuExpand {
width: 7px;
height: 7px;
- background-image: url('images/spriteArrows.png');
+ background-image: url("images/spriteArrows.png");
background-position: -14px 0;
margin-right: 3px;
}
@@ -145,14 +145,14 @@ There are three areas of styling for the Menu:
display: none;
}
.claro .dijitCheckedMenuItemIcon {
- background-image: url('form/images/checkboxRadioButtonStates.png');
+ background-image: url("form/images/checkboxRadioButtonStates.png");
background-repeat: no-repeat;
background-position: -15px 50%;
width: 15px;
height: 16px;
}
.dj_ie6 .claro .dijitCheckedMenuItemIcon {
- background-image: url('form/images/checkboxAndRadioButtons_IE6.png');
+ background-image: url("form/images/checkboxAndRadioButtons_IE6.png");
}
.claro .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
background-position: 0 50%;
@@ -170,12 +170,18 @@ There are three areas of styling for the Menu:
}
.claro .dijitComboBoxMenu .dijitMenuItemSelected {
color: #000000;
+ border-color: #759dc0;
+ background-color: #abd6ff;
+}
+.claro .dijitComboBoxMenu .dijitMenuItemHover {
+ color: #000000;
border-color: #769dc0;
background-color: #abd6ff;
+ background-position: 0 0;
}
.claro .dijitComboBoxMenuActive .dijitMenuItemSelected {
background-position: 0 -177px;
- background-color: #7dbefa;
+ 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 1528df40b..80467a5b6 100644
--- a/lib/dijit/themes/claro/Menu.less
+++ b/lib/dijit/themes/claro/Menu.less
@@ -37,7 +37,7 @@ There are three areas of styling for the Menu:
margin: 0;
padding: 0;
background-color: @bar-background-color;
- background-image: url("images/commonHighlight.png");
+ background-image: url(@image-common-highlight);
background-position:0 0;
background-repeat:repeat-x;
}
@@ -58,13 +58,13 @@ There are three areas of styling for the Menu:
.claro .dijitMenuBar .dijitMenuItem {
padding: 6px 10px 7px;
background-position:0 100px;
- color:@unselected-text-color;
margin:-1px;
}
.claro .dijitMenuItem {
- background-image: url("images/menuHighlight.png");
+ background-image: url(@image-menu-highlight);
background-position:0 -40px;
background-repeat:repeat-x;
+ color: @text-color;
}
/* this prevents jiggling upon hover of a menu item */
@@ -128,7 +128,7 @@ There are three areas of styling for the Menu:
.claro .dijitMenuExpand {
width: 7px;
height: 7px;
- background-image: url('images/spriteArrows.png');
+ background-image: url(@image-arrow-sprite);
background-position: -14px 0;
margin-right:3px;
}
@@ -149,14 +149,14 @@ There are three areas of styling for the Menu:
display: none;
}
.claro .dijitCheckedMenuItemIcon {
- background-image: url('form/images/checkboxRadioButtonStates.png');
+ background-image: url(@image-form-checkbox-and-radios);
background-repeat:no-repeat;
background-position: -15px 50%;
width:15px;
height:16px;
}
.dj_ie6 .claro .dijitCheckedMenuItemIcon {
- background-image: url('form/images/checkboxAndRadioButtons_IE6.png');
+ background-image: url(@image-form-checkbox-and-radios-ie6);
}
.claro .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
background-position: 0 50%;
@@ -179,6 +179,12 @@ There are three areas of styling for the Menu:
border-color:@hovered-border-color;
background-color:@hovered-background-color;
}
+.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? */
diff --git a/lib/dijit/themes/claro/ProgressBar.css b/lib/dijit/themes/claro/ProgressBar.css
index c735e5c2f..925021f7a 100644
--- a/lib/dijit/themes/claro/ProgressBar.css
+++ b/lib/dijit/themes/claro/ProgressBar.css
@@ -30,8 +30,8 @@
.claro .dijitProgressBarEmpty {
/* outer container and background of the bar that's not finished yet*/
- background: #ffffff url("images/progressBarEmpty.png") repeat-none left;
- border-color: #769dc0;
+ background: #ffffff url("images/progressBarEmpty.png") no-repeat left;
+ border-color: #759dc0;
}
.claro .dijitProgressBarTile {
/* inner container for finished portion when in 'tile' (image) mode */
@@ -42,7 +42,13 @@
background-image: none;
}
.claro .dijitProgressBarFull {
- border-right: 1px solid #769dc0;
+ border-right: 1px solid #759dc0;
+ -webkit-transition-property: width;
+ -moz-transition-property: width;
+ transition-property: width;
+ -webkit-transition-duration: 0.25s;
+ -moz-transition-duration: 0.25s;
+ transition-duration: 0.25s;
}
.claro .dijitProgressBarLabel {
/* Set to a color that contrasts with both the "Empty" and "Full" parts. */
diff --git a/lib/dijit/themes/claro/ProgressBar.less b/lib/dijit/themes/claro/ProgressBar.less
index d361952ee..8edf426a0 100644
--- a/lib/dijit/themes/claro/ProgressBar.less
+++ b/lib/dijit/themes/claro/ProgressBar.less
@@ -32,18 +32,20 @@
}
.claro .dijitProgressBarEmpty {
/* outer container and background of the bar that's not finished yet*/
- background: @progressbar-empty-background-color url("images/progressBarEmpty.png") repeat-none left;
+ background: @progressbar-empty-background-color url(@image-progressbar-empty) no-repeat left;
border-color: @progressbar-border-color;
}
.claro .dijitProgressBarTile {
/* inner container for finished portion when in 'tile' (image) mode */
- background: @progressbar-full-background-color url("images/progressBarFull.png") repeat-x top;
+ background: @progressbar-full-background-color url(@image-progressbar-full) repeat-x top;
}
.dj_ie6 .claro .dijitProgressBarTile {
background-image: none;
}
.claro .dijitProgressBarFull {
border-right:1px solid @progressbar-border-color;
+ .transition-property(width);
+ .transition-duration(.25s);
}
.claro .dijitProgressBarLabel {
/* Set to a color that contrasts with both the "Empty" and "Full" parts. */
@@ -52,5 +54,5 @@
.claro .dijitProgressBarIndeterminate .dijitProgressBarTile {
/* use an animated gif for the progress bar in 'indeterminate' mode;
background-color won't appear unless user has turned off background images */
- background: @bar-background-color url("images/progressBarAnim.gif") repeat-x top;
-} \ No newline at end of file
+ background: @bar-background-color url(@image-progressbar-anim) repeat-x top;
+}
diff --git a/lib/dijit/themes/claro/README b/lib/dijit/themes/claro/README
index 5ef4714ad..3b4b4aa4e 100644
--- a/lib/dijit/themes/claro/README
+++ b/lib/dijit/themes/claro/README
@@ -7,22 +7,13 @@ Installing and running on Windows:
a) Go to https://github.com/ajaxorg/node-builds, press download button, and select "download zip"
b) unzip the file into C:\
-2. Install less:
-
- a) Go to https://github.com/cloudhead/less.js/archives/master, press download button, and select "download zip"
- b) unzip the file into C:\
-
-2. Add node and lessc environment variables:
+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;C:\cloudhead-less.js-7fb09f\bin
-
- d) add new environment variable NODE_PATH with value like this (depending on exact download name):
-
- C:\cloudhead-less.js-7fb09f\lib
+ ;C:\ajaxorg-node-builds-0fcee7d\win32
4. To compile all the files:
@@ -34,31 +25,17 @@ To install/run less version 2 on mac:
1. Install Node.js
Download a built copy from https://github.com/ajaxorg/node-builds.
- Alternately, o to http://nodejs.org/#download (./configure, make, make install).
+ Alternately, go to http://nodejs.org/#download (./configure, make, make install).
-2. Download less from https://github.com/cloudhead/less.js/archives/master
-
-3. Edit .bash_profile etc. to add node to your path, and lessc to NODE_PATH:
+2. Edit .bash_profile etc. to add node to your path
export PATH=$PATH:/opt/less/bin
- export NODE_PATH=$NODE_PATH:/opt/less/lib
To compile all the files:
$ cd dijit/themes/claro
$ node compile.js
-
--------
-Alternately, you can install less version 1, but I'd rather not use it for checked in files
-since it breaks a part a lot of rules into multiple rules, causing spurious diffs.
-
-To install on a mac:
- $ sudo gem install less
-
-On Windows or Linux, make sure you have ruby and ruby-gems installed first.
-If you need help installing ruby please check out ruby-lang.org for more details.
-
-----
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 fb8bf5efa..c8d6bb29d 100644
--- a/lib/dijit/themes/claro/TimePicker.css
+++ b/lib/dijit/themes/claro/TimePicker.css
@@ -58,7 +58,7 @@
.claro .dijitTimePickerMarker {
/* major value - 1:00, 2:00, times on the hour */
- background-color: #e9f4fe;
+ background-color: #e5f2fe;
font-size: 1em;
white-space: nowrap;
}
@@ -66,7 +66,7 @@
.claro .dijitTimePickerMarkerHover,
.claro .dijitTimePickerMarkerSelected,
.claro .dijitTimePickerTickSelected {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
border: solid 1px #b5bcc7;
margin-left: -7px;
margin-right: -7px;
diff --git a/lib/dijit/themes/claro/TimePicker.less b/lib/dijit/themes/claro/TimePicker.less
index cd07a63d8..a6253f7dd 100644
--- a/lib/dijit/themes/claro/TimePicker.less
+++ b/lib/dijit/themes/claro/TimePicker.less
@@ -34,7 +34,7 @@
}
.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-image: url(@image-common-highlight);
background-position:0 -1px;
background-repeat:repeat-x;
border-top:solid 1px @border-color;
@@ -95,7 +95,7 @@
border-right:none;
border-color:@border-color;
background-color: @unselected-background-color;
- background-image: url("images/commonHighlight.png");
+ background-image: url(@image-common-highlight);
background-position:0 -1px;
background-repeat:repeat-x;
}
@@ -104,7 +104,7 @@
}
.claro .dijitTimePicker .dijitArrowButtonInner{
height: 100%; /* hack claro.button.css */
- background-image: url("form/images/commonFormArrows.png");
+ background-image: url(@image-form-common-arrows);
background-repeat: no-repeat;
background-position:-140px 45%;
}
diff --git a/lib/dijit/themes/claro/TitlePane.css b/lib/dijit/themes/claro/TitlePane.css
index 7f0cdbfb7..141561506 100644
--- a/lib/dijit/themes/claro/TitlePane.css
+++ b/lib/dijit/themes/claro/TitlePane.css
@@ -30,11 +30,11 @@
}
.claro .dijitTitlePaneTitleHover {
background-color: #abd6ff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitTitlePaneTitleActive {
- background-color: #7dbefa;
- border-color: #769dc0;
+ background-color: #7dbdfa;
+ border-color: #759dc0;
background-position: 0 -136px;
}
.claro .dijitTitlePaneTitleFocus {
@@ -42,7 +42,7 @@
padding-bottom: 2px;
}
.claro .dijitTitlePane .dijitArrowNode {
- background-image: url('images/spriteArrows.png');
+ background-image: url("images/spriteArrows.png");
background-repeat: no-repeat;
height: 8px;
width: 7px;
@@ -53,10 +53,8 @@
.claro .dijitTitlePane .dijitClosed .dijitArrowNode {
background-position: -14px 0;
}
-.claro .dijitTitlePaneFocused .dijitTitlePaneTextNode {
+.claro .dijitTitlePane .dijitTitlePaneTextNode {
color: #000000;
- /* TODO: do we need this? we usually don't change text color on focus */
-
}
.claro .dijitTitlePaneContentOuter {
background: #ffffff;
diff --git a/lib/dijit/themes/claro/TitlePane.less b/lib/dijit/themes/claro/TitlePane.less
index 22bacca0f..89da9f3d9 100644
--- a/lib/dijit/themes/claro/TitlePane.less
+++ b/lib/dijit/themes/claro/TitlePane.less
@@ -22,7 +22,7 @@
.claro .dijitTitlePaneTitle {
background-color: @unselected-background-color; // TODO: Mailed Jason, shouldn't this toggle to @selected-background-color when pane opened?
- background-image: url("images/titlebar.png");
+ background-image: url(@image-titlebar);
background-repeat:repeat-x;
border:1px solid @border-color;
padding: 0 7px 3px 7px;
@@ -45,7 +45,7 @@
padding-bottom:2px;
}
.claro .dijitTitlePane .dijitArrowNode {
- background-image: url('images/spriteArrows.png');
+ background-image: url(@image-arrow-sprite);
background-repeat: no-repeat;
height: 8px;
width: 7px;
@@ -56,8 +56,8 @@
.claro .dijitTitlePane .dijitClosed .dijitArrowNode {
background-position: -14px 0;
}
-.claro .dijitTitlePaneFocused .dijitTitlePaneTextNode {
- color:@text-color; /* TODO: do we need this? we usually don't change text color on focus */
+.claro .dijitTitlePane .dijitTitlePaneTextNode {
+ color:@text-color;
}
.claro .dijitTitlePaneContentOuter {
background: @pane-background-color;
@@ -71,4 +71,4 @@
margin-left: 4px;
margin-right: 4px;
vertical-align:text-top;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/claro/Toolbar.css b/lib/dijit/themes/claro/Toolbar.css
index a9e6f4f5e..18c605c66 100644
--- a/lib/dijit/themes/claro/Toolbar.css
+++ b/lib/dijit/themes/claro/Toolbar.css
@@ -29,8 +29,12 @@
.claro .dijitToolbar label {
padding: 0 3px 0 6px;
}
-/** override claro/form/Button.css **/
-.claro .dijitToolbar .dijitButtonNode {
+/** override claro/form/Button.css, and also ComboBox down arrow **/
+.claro .dijitToolbar .dijitButton .dijitButtonNode,
+.claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButton .dijitButtonNode,
+.claro .dijitToolbar .dijitToggleButton .dijitButtonNode,
+.claro .dijitToolbar .dijitComboBox .dijitButtonNode {
border-width: 0;
/* on hover/active, border-->1px, padding-->1px */
@@ -51,16 +55,43 @@
background-repeat: repeat-x;
background-color: rgba(171, 214, 255, 0);
}
-.dj_ie .claro .dijitToolbar .dijitButtonNode {
+.dj_ie .claro .dijitToolbar .dijitButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitToggleButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboBox .dijitButtonNode {
background-color: transparent;
/* for IE, which doesn't understand rgba(...) */
}
-.dj_ie6 .claro .dijitToolbar .dijitButtonNode {
+.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 */
+ /* because background-color: transparent above doesn't work on IE*/
}
+/* hover status */
+.dj_ie .claro .dijitToolbar .dijitButtonHover .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitDropDownButtonHover .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboButton .dijitButtonNodeHover,
+.dj_ie .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover,
+.dj_ie .claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode {
+ /* button should still turn blue on hover, so need to override .dj_ie rules above */
+
+ background-color: #abd6ff;
+}
+/* active status */
+.dj_ie .claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
+ /* button should still turn blue on press, so need to override .dj_ie rules above */
+
+ background-color: #abd6ff;
+}
.claro .dijitToolbar .dijitComboButton .dijitStretch {
/* no rounded border on side adjacent to arrow */
@@ -88,7 +119,7 @@
}
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton {
background-position: 0 0;
- background-color: #f4ffff;
+ background-color: #f3ffff;
}
.claro .dijitToolbar .dijitComboButtonHover .dijitButtonNodeHover, .claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButtonHover {
background-color: #abd6ff;
@@ -96,7 +127,7 @@
/* active status */
.claro .dijitToolbar .dijitButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
border-width: 1px;
- background-color: #7dbefa;
+ background-color: #7dbdfa;
background-position: 0 -177px;
padding: 1px;
}
@@ -108,15 +139,15 @@
padding: 0;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode, .claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
- background-color: #f4ffff;
+ background-color: #f3ffff;
background-position: 0 -177px;
padding: 2px;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitButtonNodeActive {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
}
.claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButtonActive {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
}
/* Avoid double border between button and arrow */
.claro .dijitToolbar .dijitComboButtonHover .dijitDownArrowButton, .claro .dijitToolbar .dijitComboButtonActive .dijitDownArrowButton {
@@ -135,7 +166,7 @@
border-width: 1px;
border-style: solid;
background-image: none;
- border-color: #769dc0;
+ border-color: #759dc0;
background-color: #ffffff;
padding: 1px;
}
@@ -145,7 +176,7 @@
.claro .dijitToolbarSeparator {
/* separator icon in the editor sprite */
- background: url('../../icons/images/editorIconsEnabled.png');
+ background: url("../../icons/images/editorIconsEnabled.png");
}
/* Toolbar inside of disabled Editor */
.claro .dijitDisabled .dijitToolbar {
diff --git a/lib/dijit/themes/claro/Toolbar.less b/lib/dijit/themes/claro/Toolbar.less
index eb99f2f23..b61e8191a 100644
--- a/lib/dijit/themes/claro/Toolbar.less
+++ b/lib/dijit/themes/claro/Toolbar.less
@@ -23,7 +23,7 @@
.claro .dijitToolbar {
border-bottom: 1px solid @border-color;
background-color: @bar-background-color;
- background-image: url("images/commonHighlight.png");
+ background-image: url(@image-common-highlight);
background-position:0 0;
background-repeat:repeat-x;
padding: 2px 0 2px 4px;
@@ -34,8 +34,12 @@
padding: 0 3px 0 6px;
}
-/** override claro/form/Button.css **/
-.claro .dijitToolbar .dijitButtonNode {
+/** override claro/form/Button.css, and also ComboBox down arrow **/
+.claro .dijitToolbar .dijitButton .dijitButtonNode,
+.claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
+.claro .dijitToolbar .dijitComboButton .dijitButtonNode,
+.claro .dijitToolbar .dijitToggleButton .dijitButtonNode,
+.claro .dijitToolbar .dijitComboBox .dijitButtonNode {
border-width: 0; /* on hover/active, border-->1px, padding-->1px */
padding: 2px;
.border-radius(@toolbar-button-border-radius);
@@ -43,16 +47,42 @@
.transition-property(background-color);
.transition-duration(.3s, .35s);
- background-image: url("images/commonHighlight.png");
+ background-image: url(@image-common-highlight);
background-position:0 -30px;
background-repeat:repeat-x;
background-color:rgba(171,214,255,0);
}
-.dj_ie .claro .dijitToolbar .dijitButtonNode {
+.dj_ie .claro .dijitToolbar .dijitButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitDropDownButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitToggleButton .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboBox .dijitButtonNode {
background-color: transparent; /* for IE, which doesn't understand rgba(...) */
}
-.dj_ie6 .claro .dijitToolbar .dijitButtonNode {
- background: none; /* because background-color: transparent above doesn't work */
+.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,
+.dj_ie .claro .dijitToolbar .dijitComboButton .dijitButtonNodeHover,
+.dj_ie .claro .dijitToolbar .dijitComboButton .dijitDownArrowButtonHover,
+.dj_ie .claro .dijitToolbar .dijitToggleButtonHover .dijitButtonNode {
+ /* button should still turn blue on hover, so need to override .dj_ie rules above */
+ background-color: @button-hovered-background-color;
+}
+
+/* active status */
+.dj_ie .claro .dijitToolbar .dijitButtonActive .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitDropDownButtonActive .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitComboButtonActive .dijitButtonNode,
+.dj_ie .claro .dijitToolbar .dijitToggleButtonActive .dijitButtonNode {
+ /* button should still turn blue on press, so need to override .dj_ie rules above */
+ background-color: @button-pressed-background-color;
}
.claro .dijitToolbar .dijitComboButton .dijitStretch {
@@ -141,7 +171,7 @@
.claro .dijitToolbarSeparator {
/* separator icon in the editor sprite */
- background: url('../../icons/images/editorIconsEnabled.png');
+ background: url(@image-editor-icons-enabled);
}
/* Toolbar inside of disabled Editor */
diff --git a/lib/dijit/themes/claro/Tree.css b/lib/dijit/themes/claro/Tree.css
index 069deb80a..738bb3313 100644
--- a/lib/dijit/themes/claro/Tree.css
+++ b/lib/dijit/themes/claro/Tree.css
@@ -44,11 +44,11 @@
background-color: none;
background-color: transparent;
background-color: rgba(171, 214, 255, 0);
- background-image: url("images/commonHighlight.png");
background-position: 0 0;
background-repeat: repeat-x;
border-color: rgba(118, 157, 192, 0);
border-width: 0;
+ color: #000000;
-webkit-transition-property: background-color, border-color;
-moz-transition-property: background-color, border-color;
transition-property: background-color, border-color;
@@ -59,36 +59,36 @@
-moz-transition-timing-function: ease-out;
transition-timing-function: ease-out;
}
-.dj_ie6 .claro .dijitTreeRow {
- background-image: none;
-}
.claro .dijitTreeRowSelected {
background-repeat: repeat-x;
background-color: #cfe5fa;
+ background-image: url("images/commonHighlight.png");
padding: 3px 0 1px;
margin: 0;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
color: #000000;
}
.claro .dijitTreeRowHover {
background-color: #abd6ff;
+ background-image: url("images/commonHighlight.png");
padding: 3px 0 1px;
margin: 0;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
color: #000000;
-webkit-transition-duration: 0.25s;
-moz-transition-duration: 0.25s;
transition-duration: 0.25s;
}
.claro .dijitTreeRowActive {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
+ background-image: url("images/commonHighlight.png");
background-position: 0 -177px;
padding: 3px 0 1px;
margin-left: 0;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
color: #000000;
}
-.dj_ie6 .claro .dijitTreeRowActive {
+.dj_ie6 .claro .dijitTreeRow {
background-image: none;
}
.claro .dijitTreeRowFocused {
@@ -96,7 +96,7 @@
}
/* expando (open/closed) icon */
.claro .dijitTreeExpando {
- background-image: url('images/treeExpandImages.png');
+ background-image: url("images/treeExpandImages.png");
width: 16px;
height: 16px;
background-position: -35px 0;
@@ -104,7 +104,7 @@
}
.dj_ie6 .claro .dijitTreeExpando {
- background-image: url('images/treeExpandImages8bit.png');
+ background-image: url("images/treeExpandImages8bit.png");
}
.claro .dijitTreeRowHover .dijitTreeExpandoOpened {
background-position: -53px 0;
@@ -119,7 +119,7 @@
background-image: none;
}
.claro .dijitTreeExpandoLoading {
- background-image: url('images/loadingAnimation.gif');
+ background-image: url("images/loadingAnimation.gif");
}
/* Drag and Drop on TreeNodes
* Put insert line on dijitTreeContent node so it's aligned w/
@@ -127,8 +127,8 @@
* though dijitTreeRowNode is the actual "drag object"
*/
.claro .dijitTreeNode .dojoDndItemBefore .dijitTreeContent {
- border-top: 2px solid #769dc0;
+ border-top: 2px solid #759dc0;
}
.claro .dijitTreeNode .dojoDndItemAfter .dijitTreeContent {
- border-bottom: 2px solid #769dc0;
+ border-bottom: 2px solid #759dc0;
}
diff --git a/lib/dijit/themes/claro/Tree.less b/lib/dijit/themes/claro/Tree.less
index 4e639ca4f..ff6cd5a14 100644
--- a/lib/dijit/themes/claro/Tree.less
+++ b/lib/dijit/themes/claro/Tree.less
@@ -46,24 +46,23 @@
background-color: none; // IE6 doesn't understand rgba() or transparent below
background-color: transparent; // IE8 doesn't understand rgba() below
background-color: rgba(171,214,255,0); // rgba() instead of transparent to prevent flash on hover fade-in
- background-image: url("images/commonHighlight.png");
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;
+ color: @text-color;
+
.transition-property(background-color, border-color);
.transition-duration(.25s);
.transition-timing-function(ease-out);
}
-.dj_ie6 .claro .dijitTreeRow {
- background-image: none;
-}
.claro .dijitTreeRowSelected {
background-repeat:repeat-x;
background-color:@selected-background-color;
+ background-image: url(@image-common-highlight);
padding: 3px 0 1px;
margin: 0;
border:solid 1px @selected-border-color;
@@ -71,6 +70,7 @@
}
.claro .dijitTreeRowHover {
background-color:@hovered-background-color;
+ background-image: url(@image-common-highlight);
padding: 3px 0 1px;
margin: 0;
border:solid 1px @hovered-border-color;
@@ -79,13 +79,14 @@
}
.claro .dijitTreeRowActive {
background-color:@pressed-background-color;
+ background-image: url(@image-common-highlight);
background-position:0 -177px;
padding: 3px 0 1px;
margin-left: 0;
border:solid 1px @pressed-border-color;
color:@selected-text-color;
}
-.dj_ie6 .claro .dijitTreeRowActive {
+.dj_ie6 .claro .dijitTreeRow {
background-image: none;
}
.claro .dijitTreeRowFocused {
@@ -95,13 +96,13 @@
/* expando (open/closed) icon */
.claro .dijitTreeExpando {
- background-image: url('images/treeExpandImages.png');
+ background-image: url(@image-tree-expand);
width: 16px;
height: 16px;
background-position: -35px 0; /* for dijitTreeExpandoOpened */
}
.dj_ie6 .claro .dijitTreeExpando {
- background-image: url('images/treeExpandImages8bit.png');
+ background-image: url(@image-tree-expand-ie6);
}
.claro .dijitTreeRowHover .dijitTreeExpandoOpened {
background-position: -53px 0;
@@ -117,7 +118,7 @@
background-image:none;
}
.claro .dijitTreeExpandoLoading {
- background-image: url('images/loadingAnimation.gif');
+ background-image: url(@image-loading-animation);
}
/* Drag and Drop on TreeNodes
diff --git a/lib/dijit/themes/claro/compile.js b/lib/dijit/themes/claro/compile.js
index 14762b592..08e637561 100644
--- a/lib/dijit/themes/claro/compile.js
+++ b/lib/dijit/themes/claro/compile.js
@@ -1,21 +1,11 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
// Script to process all the less files and convert them to CSS files
// Run from themes/dijit/claro like:
//
// $ node compile.js
-// Some guesses for where to find less
-require.paths.unshift('/opt/less/lib', 'C:/less/lib');
-
var fs = require('fs'), // file system access
path = require('path'), // get directory from file name
- less = require('less'); // less processor
+ less = require('../../../util/less'); // less processor
var options = {
compress: false,
@@ -32,7 +22,7 @@ var allFiles = [].concat(
lessFiles.forEach(function(fname){
console.log("=== " + fname);
- fs.readFile(fname, 'utf-8', function (e, data){
+ fs.readFile(fname, 'utf-8', function(e, data){
if(e){
console.error("lessc: " + e.message);
process.exit(1);
@@ -50,7 +40,7 @@ lessFiles.forEach(function(fname){
try{
var css = tree.toCSS({ compress: options.compress }),
outputFname = fname.replace('.less', '.css');
- fd = fs.openSync(outputFname, "w");
+ var fd = fs.openSync(outputFname, "w");
fs.writeSync(fd, css, 0, "utf8");
}catch(e){
less.writeError(e, options);
diff --git a/lib/dijit/themes/claro/form/Button.css b/lib/dijit/themes/claro/form/Button.css
index e01a1d313..bc7c3dc18 100644
--- a/lib/dijit/themes/claro/form/Button.css
+++ b/lib/dijit/themes/claro/form/Button.css
@@ -41,12 +41,13 @@
.claro .dijitToggleButton .dijitButtonNode {
/* rules for the dijit.form.*Button widgets (see also ComboButton section below) */
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
padding: 2px 4px 4px 4px;
- background-image: url("images/button.png");
+ background-image: url("../form/images/button.png");
background-position: center top;
background-repeat: repeat-x;
- background-color: #e9f4fe;
+ background-color: #e5f2fe;
+ color: #000000;
-moz-border-radius: 4px;
border-radius: 4px;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
@@ -64,7 +65,7 @@
width: 15px;
height: 15px;
margin: 0 auto;
- background-image: url("images/buttonArrows.png");
+ background-image: url("../form/images/buttonArrows.png");
background-repeat: no-repeat;
background-position: -51px 53%;
}
@@ -105,11 +106,12 @@
-moz-transition-duration: 0.2s;
transition-duration: 0.2s;
}
-/* checked status */
+/* active, checked status */
.claro .dijitButtonActive .dijitButtonNode,
.claro .dijitDropDownButtonActive .dijitButtonNode,
.claro .dijitComboButtonActive .dijitButtonNode,
-.claro .dijitToggleButtonActive .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);
diff --git a/lib/dijit/themes/claro/form/Button.less b/lib/dijit/themes/claro/form/Button.less
index b076d2a16..208e4de52 100644
--- a/lib/dijit/themes/claro/form/Button.less
+++ b/lib/dijit/themes/claro/form/Button.less
@@ -41,10 +41,11 @@
/* 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("images/button.png");
+ background-image: url("../@{image-form-button}");
background-position: center top;
background-repeat: repeat-x;
background-color: @button-background-color;
+ color: @text-color;
.border-radius(@button-border-radius);
.box-shadow(0 1px 1px rgba(0,0,0,0.15));
}
@@ -59,7 +60,7 @@
width: 15px;
height: 15px;
margin: 0 auto;
- background-image:url("images/buttonArrows.png");
+ background-image:url("../@{image-form-button-arrows}");
background-repeat:no-repeat;
background-position:-51px 53%;
}
@@ -105,11 +106,12 @@
.transition-duration(.2s);
}
-/* checked status */
+/* active, checked status */
.claro .dijitButtonActive .dijitButtonNode,
.claro .dijitDropDownButtonActive .dijitButtonNode,
.claro .dijitComboButtonActive .dijitButtonNode,
-.claro .dijitToggleButtonActive .dijitButtonNode {
+.claro .dijitToggleButtonActive .dijitButtonNode,
+.claro .dijitStackController .dijitToggleButtonChecked .dijitButtonNode {
background-color: @button-pressed-background-color;
.box-shadow(0 0 0 rgba(0,0,0,0));
.transition-duration(.1s);
diff --git a/lib/dijit/themes/claro/form/Checkbox.css b/lib/dijit/themes/claro/form/Checkbox.css
index 5765bb370..1c1a3c438 100644
--- a/lib/dijit/themes/claro/form/Checkbox.css
+++ b/lib/dijit/themes/claro/form/Checkbox.css
@@ -19,13 +19,13 @@
* .dijitCheckBoxDisabled|.dijitCheckBoxCheckedDisabled - for background image
*/
.claro .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url('../images/checkmarkNoBorder.png');
+ background-image: url("../images/checkmarkNoBorder.png");
}
.dj_ie6 .claro .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url('../images/checkmarkNoBorder.gif');
+ background-image: url("../images/checkmarkNoBorder.gif");
}
.claro .dijitCheckBox, .claro .dijitCheckBoxIcon {
- background-image: url('images/checkboxRadioButtonStates.png');
+ background-image: url("../form/images/checkboxRadioButtonStates.png");
/* checkbox sprite image */
background-repeat: no-repeat;
@@ -35,7 +35,7 @@
padding: 0;
}
.dj_ie6 .claro .dijitCheckBox, .dj_ie6 .claro .dijitCheckBoxIcon {
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
+ background-image: url("../form/images/checkboxAndRadioButtons_IE6.png");
/* checkbox sprite image */
}
diff --git a/lib/dijit/themes/claro/form/Checkbox.less b/lib/dijit/themes/claro/form/Checkbox.less
index 21769dca1..6ce444800 100644
--- a/lib/dijit/themes/claro/form/Checkbox.less
+++ b/lib/dijit/themes/claro/form/Checkbox.less
@@ -22,16 +22,16 @@
@import "../variables";
.claro .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url('../images/checkmarkNoBorder.png');
+ background-image: url("../@{image-checkmark}");
}
.dj_ie6 .claro .dijitToggleButton .dijitCheckBoxIcon {
- background-image: url('../images/checkmarkNoBorder.gif');
+ background-image: url("../@{image-checkmark-ie6}");
}
.claro .dijitCheckBox,
.claro .dijitCheckBoxIcon /* inside a toggle button */ {
- background-image: url('images/checkboxRadioButtonStates.png'); /* checkbox sprite image */
+ background-image: url("../@{image-form-checkbox-and-radios}"); /* checkbox sprite image */
background-repeat: no-repeat;
width: 15px;
height: 16px;
@@ -41,7 +41,7 @@
.dj_ie6 .claro .dijitCheckBox,
.dj_ie6 .claro .dijitCheckBoxIcon /* inside a toggle button */ {
- background-image: url('images/checkboxAndRadioButtons_IE6.png'); /* checkbox sprite image */
+ background-image: url("../@{image-form-checkbox-and-radios-ie6}"); /* checkbox sprite image */
}
.claro .dijitCheckBox,
diff --git a/lib/dijit/themes/claro/form/Common.css b/lib/dijit/themes/claro/form/Common.css
index ab8bb5c3b..ce108c1ae 100644
--- a/lib/dijit/themes/claro/form/Common.css
+++ b/lib/dijit/themes/claro/form/Common.css
@@ -1,9 +1,12 @@
/* claro/form/Common.css */
/*========================= common css =========================*/
/* 'dijitTextBox' refers to 'dijit(TextBox|DateTextBox|CurrencyTextBox|...)' */
+.claro .dijitTextBox, .claro .dijitInputInner {
+ color: #000000;
+}
.claro .dijitTextBoxError .dijitValidationContainer {
background-color: #d46464;
- background-image: url('images/error.png');
+ background-image: url("../form/images/error.png");
background-position: top center;
border: solid #d46464 0;
border-left-width: 1px;
@@ -45,14 +48,14 @@
}
/* hover */
.claro .dijitTextBoxHover, .claro .dijitTextBoxHover .dijitButtonNode {
- border-color: #769dc0;
+ border-color: #759dc0;
-webkit-transition-duration: 0.25s;
-moz-transition-duration: 0.25s;
transition-duration: 0.25s;
}
.claro .dijitTextBoxHover {
- background-color: #e9f4fe;
- background-image: url('images/textBox_back.png');
+ background-color: #e5f2fe;
+ background-image: url("../form/images/textBox_back.png");
background-repeat: repeat-x;
}
/* error state */
@@ -64,21 +67,21 @@
}
/* focused state */
.claro .dijitTextBoxFocused, .claro .dijitTextBoxFocused .dijitButtonNode {
- border-color: #769dc0;
+ border-color: #759dc0;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
transition-duration: 0.1s;
}
.claro .dijitTextBoxFocused {
background-color: #ffffff;
- background-image: url('images/textBox_back.png');
+ background-image: url("../form/images/textBox_back.png");
background-repeat: repeat-x;
}
.claro .dijitTextBoxFocused .dijitInputContainer {
background: #ffffff;
}
.claro .dijitTextBoxErrorFocused, .claro .dijitTextBoxErrorFocused .dijitButtonNode {
- border-color: #ce4f4f;
+ border-color: #ce5050;
}
/* disabled state */
.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitButtonNode {
@@ -87,12 +90,24 @@
.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputContainer {
background-color: #efefef;
background-image: none;
+}
+.claro .dijitTextBoxDisabled, .claro .dijitTextBoxDisabled .dijitInputInner {
color: #818181;
}
+.dj_webkit .claro .dijitTextBoxDisabled input {
+ /* because WebKit lightens disabled input/textarea no matter what color you specify */
+
+ color: #757575;
+}
+.dj_webkit .claro textarea.dijitTextAreaDisabled {
+ /* because WebKit lightens disabled input/textarea no matter what color you specify */
+
+ color: #1b1b1b;
+}
/*========================= for special widgets =========================*/
/* Input boxes with an arrow (for a drop down) */
.claro .dijitComboBox .dijitArrowButtonInner {
- background-image: url("images/commonFormArrows.png");
+ background-image: url("../form/images/commonFormArrows.png");
background-position: -35px 53%;
background-repeat: no-repeat;
margin: 0;
@@ -112,7 +127,7 @@
}
.claro .dijitComboBox .dijitButtonNode {
background-color: #efefef;
- background-image: url("images/formHighlight.png");
+ background-image: url("../form/images/formHighlight.png");
background-repeat: repeat-x;
}
/* Arrow "hover" effect:
@@ -128,7 +143,7 @@
}
/* Arrow Button change when drop down is open */
.claro .dijitComboBox .dijitHasDropDownOpen {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
background-position: 0 -177px;
padding: 1px;
}
diff --git a/lib/dijit/themes/claro/form/Common.less b/lib/dijit/themes/claro/form/Common.less
index 729867a67..742a43ff7 100644
--- a/lib/dijit/themes/claro/form/Common.less
+++ b/lib/dijit/themes/claro/form/Common.less
@@ -6,9 +6,16 @@
/* 'dijitTextBox' refers to 'dijit(TextBox|DateTextBox|CurrencyTextBox|...)' */
+.claro .dijitTextBox,
+.claro .dijitInputInner {
+ // .dijitInputInner selector needed for ValidationTextBox on IE6 because <input> doesn't inherit
+ // the color setting from the ancestor div.dijitTextBox
+ color: @text-color;
+}
+
.claro .dijitTextBoxError .dijitValidationContainer {
background-color: @erroricon-background-color;
- background-image: url('images/error.png');
+ background-image: url("../@{image-form-error}");
background-position: top center;
border: solid @erroricon-background-color 0;
border-left-width: 1px;
@@ -60,7 +67,7 @@
}
.claro .dijitTextBoxHover {
background-color: @textbox-hovered-background-color;
- background-image: url('images/textBox_back.png');
+ background-image: url("../@{image-form-textbox-background}");
background-repeat: repeat-x;
}
@@ -82,7 +89,7 @@
}
.claro .dijitTextBoxFocused {
background-color: @textbox-focused-background-color;
- background-image: url('images/textBox_back.png');
+ background-image: url("../@{image-form-textbox-background}");
background-repeat: repeat-x;
}
.claro .dijitTextBoxFocused .dijitInputContainer {
@@ -103,15 +110,26 @@
.claro .dijitTextBoxDisabled .dijitInputContainer {
background-color: @textbox-disabled-background-color;
background-image: none;
+}
+.claro .dijitTextBoxDisabled,
+.claro .dijitTextBoxDisabled .dijitInputInner {
color: @disabled-text-color;
}
+.dj_webkit .claro .dijitTextBoxDisabled 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%)
+}
/*========================= for special widgets =========================*/
/* Input boxes with an arrow (for a drop down) */
.claro .dijitComboBox .dijitArrowButtonInner {
- background-image: url("images/commonFormArrows.png");
+ background-image: url("../@{image-form-common-arrows}");
background-position:-35px 53%;
background-repeat: no-repeat;
margin: 0;
@@ -136,7 +154,7 @@
.claro .dijitComboBox .dijitButtonNode {
background-color: @arrowbutton-background-color;
- background-image: url("images/formHighlight.png");
+ background-image: url("../@{image-form-highlight}");
background-repeat:repeat-x;
}
@@ -191,4 +209,4 @@
}
.dj_borderbox .claro .dijitComboBoxFocused .dijitHasDropDownOpen .dijitArrowButtonInner {
width:16px; // when no border, then back to 16px just like content-box sizing
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/claro/form/NumberSpinner.css b/lib/dijit/themes/claro/form/NumberSpinner.css
index bc6e1aeb6..fcc804969 100644
--- a/lib/dijit/themes/claro/form/NumberSpinner.css
+++ b/lib/dijit/themes/claro/form/NumberSpinner.css
@@ -35,7 +35,7 @@
.claro .dijitSpinner .dijitArrowButton {
width: auto;
background-color: #efefef;
- background-image: url("images/formHighlight.png");
+ background-image: url("../form/images/formHighlight.png");
background-position: 0 0;
background-repeat: repeat-x;
overflow: hidden;
@@ -54,7 +54,7 @@
border-bottom-width: 0;
/* 2 top borders = 1 top+bottom border in ComboBox */
- background-image: url("images/commonFormArrows.png");
+ background-image: url("../form/images/commonFormArrows.png");
background-repeat: no-repeat;
height: 100%;
width: 15px;
diff --git a/lib/dijit/themes/claro/form/NumberSpinner.less b/lib/dijit/themes/claro/form/NumberSpinner.less
index ca78afb35..1c79d3a37 100644
--- a/lib/dijit/themes/claro/form/NumberSpinner.less
+++ b/lib/dijit/themes/claro/form/NumberSpinner.less
@@ -37,7 +37,7 @@
.claro .dijitSpinner .dijitArrowButton {
width:auto;
background-color: @arrowbutton-background-color;
- background-image: url("images/formHighlight.png");
+ background-image: url("../@{image-form-highlight}");
background-position:0 0;
background-repeat:repeat-x;
overflow: hidden;
@@ -53,7 +53,7 @@
.claro .dijitSpinner .dijitArrowButtonInner {
border:solid 1px @arrowbutton-inner-border-color;
border-bottom-width: 0; /* 2 top borders = 1 top+bottom border in ComboBox */
- background-image: url("images/commonFormArrows.png");
+ background-image: url("../@{image-form-common-arrows}");
background-repeat: no-repeat;
height: 100%;
width:15px;
@@ -147,4 +147,4 @@
* should be no empty space between dijitInputLayoutContainer and dijitSpinner*/
.dj_ie7 .claro .dijitSpinner {
overflow:visible;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/claro/form/RadioButton.css b/lib/dijit/themes/claro/form/RadioButton.css
index 4dc3ad47d..bad1854b4 100644
--- a/lib/dijit/themes/claro/form/RadioButton.css
+++ b/lib/dijit/themes/claro/form/RadioButton.css
@@ -19,15 +19,15 @@
* .dijitRadioDisabled|.dijitRadioCheckedDisabled - for background image
*/
.claro .dijitToggleButton .dijitRadio, .claro .dijitToggleButton .dijitRadioIcon {
- background-image: url('images/checkboxRadioButtonStates.png');
+ background-image: url("../form/images/checkboxRadioButtonStates.png");
}
.dj_ie6 .claro .dijitToggleButton .dijitRadio, .dj_ie6 .claro .dijitToggleButton .dijitRadioIcon {
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
+ background-image: url("../form/images/checkboxAndRadioButtons_IE6.png");
}
.claro .dijitRadio, .claro .dijitRadioIcon {
/* inside a toggle button */
- background-image: url('images/checkboxRadioButtonStates.png');
+ background-image: url("../form/images/checkboxRadioButtonStates.png");
/* checkbox sprite image */
background-repeat: no-repeat;
@@ -39,7 +39,7 @@
.dj_ie6 .claro .dijitRadio, .dj_ie6 .claro .dijitRadioIcon {
/* inside a toggle button */
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
+ background-image: url("../form/images/checkboxAndRadioButtons_IE6.png");
/* checkbox sprite image */
}
diff --git a/lib/dijit/themes/claro/form/RadioButton.less b/lib/dijit/themes/claro/form/RadioButton.less
index 18f1cc163..f48cb67ec 100644
--- a/lib/dijit/themes/claro/form/RadioButton.less
+++ b/lib/dijit/themes/claro/form/RadioButton.less
@@ -23,17 +23,17 @@
.claro .dijitToggleButton .dijitRadio,
.claro .dijitToggleButton .dijitRadioIcon {
- background-image: url('images/checkboxRadioButtonStates.png');
+ background-image: url("../@{image-form-checkbox-and-radios}");
}
.dj_ie6 .claro .dijitToggleButton .dijitRadio,
.dj_ie6 .claro .dijitToggleButton .dijitRadioIcon {
- background-image: url('images/checkboxAndRadioButtons_IE6.png');
+ background-image: url("../@{image-form-checkbox-and-radios-ie6}");
}
.claro .dijitRadio,
.claro .dijitRadioIcon { /* inside a toggle button */
- background-image: url('images/checkboxRadioButtonStates.png'); /* checkbox sprite image */
+ background-image: url("../@{image-form-checkbox-and-radios}"); /* checkbox sprite image */
background-repeat: no-repeat;
width: 15px;
height: 15px;
@@ -43,7 +43,7 @@
.dj_ie6 .claro .dijitRadio,
.dj_ie6 .claro .dijitRadioIcon { /* inside a toggle button */
- background-image: url('images/checkboxAndRadioButtons_IE6.png'); /* checkbox sprite image */
+ background-image: url("../@{image-form-checkbox-and-radios-ie6}"); /* checkbox sprite image */
}
.claro .dijitRadio{
diff --git a/lib/dijit/themes/claro/form/Select.css b/lib/dijit/themes/claro/form/Select.css
index a30ede640..bfbca4ec8 100644
--- a/lib/dijit/themes/claro/form/Select.css
+++ b/lib/dijit/themes/claro/form/Select.css
@@ -37,11 +37,11 @@
border: 1px solid #ffffff;
border-top: none;
background-color: #efefef;
- background-image: url("images/formHighlight.png");
+ background-image: url("../form/images/formHighlight.png");
background-repeat: repeat-x;
}
.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
- background-image: url("images/commonFormArrows.png");
+ background-image: url("../form/images/commonFormArrows.png");
background-position: -35px 70%;
background-repeat: no-repeat;
width: 16px;
@@ -49,13 +49,13 @@
}
/* hover status */
.claro .dijitSelectHover {
- border: 1px solid #769dc0;
- background-color: #e9f4fe;
- background-image: url('images/textBox_back.png');
+ border: 1px solid #759dc0;
+ background-color: #e5f2fe;
+ background-image: url("../form/images/textBox_back.png");
background-repeat: repeat-x;
}
.claro .dijitSelectHover .dijitButtonContents {
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSelectHover .dijitArrowButton {
background-color: #abd6ff;
@@ -65,10 +65,10 @@
}
/* focused status */
.claro .dijitSelectFocused {
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
}
.claro .dijitSelectFocused .dijitButtonContents {
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSelectFocused .dijitArrowButton {
background-color: #7dbefa;
@@ -105,5 +105,5 @@
padding: 2px;
}
.claro .dijitSelectMenu .dijitMenuSeparatorTop {
- border-bottom: 1px solid #769dc0;
+ border-bottom: 1px solid #759dc0;
}
diff --git a/lib/dijit/themes/claro/form/Select.less b/lib/dijit/themes/claro/form/Select.less
index c429b2e48..0e7426112 100644
--- a/lib/dijit/themes/claro/form/Select.less
+++ b/lib/dijit/themes/claro/form/Select.less
@@ -44,12 +44,12 @@
border: 1px solid @arrowbutton-inner-border-color;
border-top:none;
background-color: @arrowbutton-background-color;
- background-image: url("images/formHighlight.png");
+ background-image: url("../@{image-form-highlight}");
background-repeat:repeat-x;
}
.claro .dijitSelect .dijitArrowButton .dijitArrowButtonInner {
- background-image: url("images/commonFormArrows.png");
+ background-image: url("../@{image-form-common-arrows}");
background-position:-35px 70%;
background-repeat: no-repeat;
width:16px;
@@ -60,7 +60,7 @@
.claro .dijitSelectHover {
border: 1px solid @hovered-border-color;
background-color: @textbox-hovered-background-color;
- background-image: url('images/textBox_back.png');
+ background-image: url("../@{image-form-textbox-background}");
background-repeat: repeat-x;
}
diff --git a/lib/dijit/themes/claro/form/Slider.css b/lib/dijit/themes/claro/form/Slider.css
index 5694e8c76..eb82e17ad 100644
--- a/lib/dijit/themes/claro/form/Slider.css
+++ b/lib/dijit/themes/claro/form/Slider.css
@@ -54,28 +54,31 @@
outline: 1px;
}
.claro .dijitSliderFocused .dijitSliderBar {
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderHover .dijitSliderBar {
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderDisabled .dijitSliderBar {
background-image: none;
border-color: #d3d3d3;
}
+.claro .dijitRuleLabel {
+ color: #000000;
+}
/* Horizontal Slider */
.claro .dijitRuleLabelsContainerH {
padding: 2px 0;
}
.claro .dijitSlider .dijitSliderProgressBarH, .claro .dijitSlider .dijitSliderLeftBumper {
- background-image: url("images/sliderHorizontal.png");
+ background-image: url("../form/images/sliderHorizontal.png");
background-repeat: repeat-x;
background-position: 0 -20px;
border-color: #b5bcc7;
background-color: #cfe5fa;
}
.claro .dijitSlider .dijitSliderRemainingBarH, .claro .dijitSlider .dijitSliderRightBumper {
- background-image: url("images/sliderHorizontal.png");
+ background-image: url("../form/images/sliderHorizontal.png");
background-repeat: repeat-x;
background-position: 0 -11px;
border-color: #b5bcc7;
@@ -90,22 +93,22 @@
.claro .dijitSliderHover .dijitSliderProgressBarH, .claro .dijitSliderHover .dijitSliderLeftBumper {
background-position: 0 -20px;
background-color: #abd6ff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderHover .dijitSliderRemainingBarH, .claro .dijitSliderHover .dijitSliderRightBumper {
background-position: 0 0;
background-color: #ffffff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderFocused .dijitSliderProgressBarH, .claro .dijitSliderFocused .dijitSliderLeftBumper {
background-position: 0 -30px;
background-color: #abd6ff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderFocused .dijitSliderRemainingBarH, .claro .dijitSliderFocused .dijitSliderRightBumper {
background-position: 0 -9px;
background-color: #ffffff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderDisabled .dijitSliderProgressBarH, .claro .dijitSliderDisabled .dijitSliderLeftBumper {
background-color: #d3d3d3;
@@ -121,14 +124,14 @@
padding: 0 2px;
}
.claro .dijitSlider .dijitSliderProgressBarV, .claro .dijitSlider .dijitSliderBottomBumper {
- background-image: url("images/sliderVertical.png");
+ background-image: url("../form/images/sliderVertical.png");
background-repeat: repeat-y;
background-position: -36px 0;
border-color: #b5bcc7;
background-color: #cfe5fa;
}
.claro .dijitSlider .dijitSliderRemainingBarV, .claro .dijitSlider .dijitSliderTopBumper {
- background-image: url("images/sliderVertical.png");
+ background-image: url("../form/images/sliderVertical.png");
background-repeat: repeat-y;
background-position: -3px 0;
border-color: #b5bcc7;
@@ -169,7 +172,7 @@
border: 0;
width: 18px;
height: 16px;
- background-image: url("images/sliderThumbs.png");
+ background-image: url("../form/images/sliderThumbs.png");
background-repeat: no-repeat;
background-position: 0 0;
}
@@ -192,7 +195,7 @@
border: 0;
width: 18px;
height: 16px;
- background-image: url("images/sliderThumbs.png");
+ background-image: url("../form/images/sliderThumbs.png");
background-repeat: no-repeat;
background-position: -289px 0;
}
@@ -222,7 +225,7 @@
.claro .dijitSliderIncrementIconH,
.claro .dijitSliderDecrementIconV,
.claro .dijitSliderIncrementIconV {
- background-image: url('images/commonFormArrows.png');
+ background-image: url("../form/images/commonFormArrows.png");
background-repeat: no-repeat;
background-color: #efefef;
-moz-border-radius: 2px;
@@ -248,7 +251,7 @@
.claro .dijitSliderHover .dijitSliderIncrementIconV {
/* dijitSliderActive should be treated as dijitSliderHover since "clicking the slider" has no meaning */
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
background-color: #ffffff;
}
.claro .dijitSliderDecrementIconH {
@@ -286,7 +289,7 @@
.claro .dijitSliderButtonContainerV .dijitSliderIncrementButtonActive,
.claro .dijitSliderButtonContainerH .dijitSliderIncrementButtonActive {
background-color: #abd6ff;
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitSliderButtonInner {
visibility: hidden;
diff --git a/lib/dijit/themes/claro/form/Slider.less b/lib/dijit/themes/claro/form/Slider.less
index 82451b506..db0f8cb24 100644
--- a/lib/dijit/themes/claro/form/Slider.less
+++ b/lib/dijit/themes/claro/form/Slider.less
@@ -66,6 +66,9 @@
background-image: none;
border-color: @disabled-border-color;
}
+.claro .dijitRuleLabel {
+ color: @text-color;
+}
/* Horizontal Slider */
@@ -74,7 +77,7 @@
}
.claro .dijitSlider .dijitSliderProgressBarH,
.claro .dijitSlider .dijitSliderLeftBumper{
- background-image: url("images/sliderHorizontal.png");
+ background-image: url("../@{image-form-slider-horizontal}");
background-repeat:repeat-x;
background-position:0 -20px;
border-color: @border-color;
@@ -82,7 +85,7 @@
}
.claro .dijitSlider .dijitSliderRemainingBarH,
.claro .dijitSlider .dijitSliderRightBumper{
- background-image: url("images/sliderHorizontal.png");
+ background-image: url("../@{image-form-slider-horizontal}");
background-repeat:repeat-x;
background-position:0 -11px;
border-color: @border-color;
@@ -135,7 +138,7 @@
}
.claro .dijitSlider .dijitSliderProgressBarV,
.claro .dijitSlider .dijitSliderBottomBumper{
- background-image: url("images/sliderVertical.png");
+ background-image: url("../@{image-form-slider-vertical}");
background-repeat:repeat-y;
background-position:-36px 0;
border-color: @border-color;
@@ -143,7 +146,7 @@
}
.claro .dijitSlider .dijitSliderRemainingBarV,
.claro .dijitSlider .dijitSliderTopBumper{
- background-image: url("images/sliderVertical.png");
+ background-image: url("../@{image-form-slider-vertical}");
background-repeat:repeat-y;
background-position:-3px 0;
border-color: @border-color;
@@ -191,7 +194,7 @@
border: 0;
width: 18px;
height: 16px;
- background-image: url("images/sliderThumbs.png");
+ background-image: url("../@{image-form-slider-thumbs}");
background-repeat:no-repeat;
background-position:0 0;
}
@@ -215,7 +218,7 @@
border: 0;
width: 18px;
height: 16px;
- background-image: url("images/sliderThumbs.png");
+ background-image: url("../@{image-form-slider-thumbs}");
background-repeat:no-repeat;
background-position:-289px 0;
}
@@ -248,7 +251,7 @@
.claro .dijitSliderIncrementIconH,
.claro .dijitSliderDecrementIconV,
.claro .dijitSliderIncrementIconV {
- background-image: url('images/commonFormArrows.png');
+ background-image: url("../@{image-form-common-arrows}");
background-repeat:no-repeat;
background-color: @arrowbutton-background-color;
.border-radius(2px);
diff --git a/lib/dijit/themes/claro/layout/AccordionContainer.css b/lib/dijit/themes/claro/layout/AccordionContainer.css
index f76947959..34831764c 100644
--- a/lib/dijit/themes/claro/layout/AccordionContainer.css
+++ b/lib/dijit/themes/claro/layout/AccordionContainer.css
@@ -50,15 +50,12 @@
background-color: transparent;
/* pick up color from dijitAccordionInnerContainer */
- background-image: url("images/accordion.png");
+ background-image: url("../layout/images/accordion.png");
background-position: 0 0;
background-repeat: repeat-x;
padding: 5px 7px 2px 7px;
min-height: 17px;
- color: #4a4a4a;
-}
-.claro .dijitAccordionTitleHover {
- color: #000000;
+ color: #494949;
}
.dj_ie6 .claro .dijitAccordionTitle {
background-image: none;
@@ -69,7 +66,7 @@
*/
background-color: #ffffff;
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
margin: 0 2px 2px;
}
.claro .dijitAccordionContainer .dijitAccordionContainer-child {
@@ -79,8 +76,8 @@
}
/* Active state for closed pane */
.claro .dijitAccordionInnerContainerActive {
- border: 1px solid #769dc0;
- background-color: #7dbefa;
+ border: 1px solid #759dc0;
+ background-color: #7dbdfa;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
transition-duration: 0.1s;
@@ -91,7 +88,7 @@
}
/* Open (a.k.a. selected) pane */
.claro .dijitAccordionInnerContainerSelected {
- border-color: #769dc0;
+ border-color: #759dc0;
background-color: #cfe5fa;
}
.claro .dijitAccordionInnerContainerSelected .dijitAccordionTitle {
@@ -101,7 +98,7 @@
}
/* Hovering open or closed pane */
-.claro .dijitAccordionInnerContainerHover dijitAccordionTitle {
+.claro .dijitAccordionInnerContainerHover .dijitAccordionTitle {
/* both open and closed */
color: #000000;
@@ -109,7 +106,7 @@
.claro .dijitAccordionInnerContainerHover, .claro .dijitAccordionInnerContainerSelectedActive {
/* note: clicking the currently selected Accordion pane should have no effect, so treating same as hover. */
- border: 1px solid #769dc0;
+ border: 1px solid #759dc0;
background-color: #abd6ff;
-webkit-transition-duration: 0.2s;
-moz-transition-duration: 0.2s;
@@ -117,7 +114,7 @@
}
.claro .dijitAccordionInnerContainerSelectedHover .dijitAccordionChildWrapper, .claro .dijitAccordionInnerContainerSelectedActive .dijitAccordionChildWrapper {
background-color: #ffffff;
- border: 1px solid #769dc0 !important;
+ border: 1px solid #759dc0 !important;
-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 01f4427f4..b3aa62248 100644
--- a/lib/dijit/themes/claro/layout/AccordionContainer.less
+++ b/lib/dijit/themes/claro/layout/AccordionContainer.less
@@ -43,16 +43,13 @@
}
.claro .dijitAccordionTitle {
background-color: transparent; /* pick up color from dijitAccordionInnerContainer */
- background-image: url("images/accordion.png");
+ background-image: url("../@{image-layout-accordion}");
background-position:0 0;
background-repeat:repeat-x;
padding: 5px 7px 2px 7px;
min-height:17px;
color:@unselected-text-color;
}
-.claro .dijitAccordionTitleHover {
- color:@hovered-text-color;
-}
.dj_ie6 .claro .dijitAccordionTitle {
background-image: none;
}
@@ -95,7 +92,7 @@
/* Hovering open or closed pane */
-.claro .dijitAccordionInnerContainerHover dijitAccordionTitle {
+.claro .dijitAccordionInnerContainerHover .dijitAccordionTitle {
/* both open and closed */
color:@hovered-text-color;
}
diff --git a/lib/dijit/themes/claro/layout/BorderContainer.css b/lib/dijit/themes/claro/layout/BorderContainer.css
index ede2a56c5..8c0a5fa96 100644
--- a/lib/dijit/themes/claro/layout/BorderContainer.css
+++ b/lib/dijit/themes/claro/layout/BorderContainer.css
@@ -86,17 +86,17 @@ Splitters and gutters:
/* hovered splitter */
.claro .dijitSplitterHHover {
font-size: 1px;
- background: url("images/splitterHorizontalHover.png") no-repeat center top;
+ background: url("../layout/images/splitterHorizontalHover.png") no-repeat center top;
}
.claro .dijitSplitterHHover .dijitSplitterThumb {
- background: #769dc0 none;
+ background: #759dc0 none;
}
.claro .dijitSplitterVHover {
font-size: 1px;
- background: url("images/splitterVerticalHover.png") no-repeat center left;
+ background: url("../layout/images/splitterVerticalHover.png") no-repeat center left;
}
.claro .dijitSplitterVHover .dijitSplitterThumb {
- background: #769dc0 none;
+ background: #759dc0 none;
}
.dj_ie6 .dijitSplitterHHover, .dj_ie6 .claro .dijitSplitterVHover {
background-color: #cfe5fa;
diff --git a/lib/dijit/themes/claro/layout/BorderContainer.less b/lib/dijit/themes/claro/layout/BorderContainer.less
index 17c4b63cb..b7c672e63 100644
--- a/lib/dijit/themes/claro/layout/BorderContainer.less
+++ b/lib/dijit/themes/claro/layout/BorderContainer.less
@@ -97,7 +97,7 @@ Splitters and gutters:
/* hovered splitter */
.claro .dijitSplitterHHover {
font-size: 1px;
- background: url("images/splitterHorizontalHover.png") no-repeat center top;
+ background: url("../@{image-layout-splitter-horizontal-hover}") no-repeat center top;
}
@@ -107,7 +107,7 @@ Splitters and gutters:
.claro .dijitSplitterVHover {
font-size: 1px;
- background: url("images/splitterVerticalHover.png") no-repeat center left;
+ background: url("../@{image-layout-splitter-vertical-hover}") no-repeat center left;
}
.claro .dijitSplitterVHover .dijitSplitterThumb {
diff --git a/lib/dijit/themes/claro/layout/TabContainer.css b/lib/dijit/themes/claro/layout/TabContainer.css
index 030e4b761..641b921ec 100644
--- a/lib/dijit/themes/claro/layout/TabContainer.css
+++ b/lib/dijit/themes/claro/layout/TabContainer.css
@@ -60,7 +60,7 @@
border-color: #b5bcc7;
}
.claro .dijitTabCloseButton {
- background: url("images/tabClose.png") no-repeat;
+ background: url("../layout/images/tabClose.png") no-repeat;
width: 14px;
height: 14px;
margin-left: 5px;
@@ -85,7 +85,7 @@
-webkit-transition-duration: 0.35s;
-moz-transition-duration: 0.35s;
transition-duration: 0.35s;
- color: #4a4a4a;
+ color: #494949;
}
.claro .dijitTabHover .dijitTabInnerDiv {
background-color: #abd6ff;
@@ -95,7 +95,7 @@
color: #000000;
}
.claro .dijitTabActive .dijitTabInnerDiv {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
color: #000000;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
@@ -109,10 +109,10 @@
border: 1px solid #b5bcc7;
}
.claro .dijitTabHover .dijitTabContent {
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitTabActive .dijitTabContent {
- border-color: #769dc0;
+ border-color: #759dc0;
}
.claro .dijitTabChecked .dijitTabContent {
color: #000000;
@@ -140,7 +140,7 @@
.claro .dijitTabContainerTop-tabs .dijitTabContent {
padding: 3px 6px;
border-bottom-width: 0;
- background-image: url("images/tabTop.png");
+ background-image: url("../layout/images/tabTop.png");
background-position: 0 0;
background-repeat: repeat-x;
min-width: 60px;
@@ -152,7 +152,7 @@
}
/* normal status */
.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
- background-image: url("images/tabTop.png");
+ background-image: url("../layout/images/tabTop.png");
background-position: 0 -248px;
background-position: bottom;
background-repeat: repeat-x;
@@ -183,7 +183,7 @@
.claro .dijitTabContainerBottom-tabs .dijitTabContent {
padding: 3px 6px;
border-top-width: 0;
- background-image: url("images/tabBottom.png");
+ background-image: url("../layout/images/tabBottom.png");
background-position: 0 -249px;
background-repeat: repeat-x;
background-position: bottom;
@@ -195,7 +195,7 @@
}
/* normal status */
.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background-image: url("images/tabBottom.png");
+ background-image: url("../layout/images/tabBottom.png");
background-position: top;
background-repeat: repeat-x;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
@@ -228,13 +228,13 @@
}
/* normal status */
.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background-image: url("images/tabLeft.png");
+ 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("images/tabLeft.png");
+ background-image: url("../layout/images/tabLeft.png");
background-repeat: repeat-y;
background-position: 0 0;
}
@@ -262,13 +262,13 @@
}
/* normal status */
.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- background-image: url("images/tabRight.png");
+ 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("images/tabRight.png");
+ background-image: url("../layout/images/tabRight.png");
background-position: right top;
background-repeat: repeat-y;
}
@@ -304,19 +304,19 @@
}
/************ left/right scroll buttons + menu button ************/
.claro .tabStripButton {
- background-color: #e9f4fe;
+ background-color: #e5f2fe;
border: 1px solid #b5bcc7;
}
.claro .dijitTabListContainer-top .tabStripButton {
padding: 4px 3px;
margin-top: 7px;
- background-image: url("images/tabTop.png");
+ background-image: url("../layout/images/tabTop.png");
background-position: 0 0;
}
.claro .dijitTabListContainer-bottom .tabStripButton {
padding: 5px 3px;
margin-bottom: 4px;
- background-image: url("images/tabTop.png");
+ background-image: url("../layout/images/tabTop.png");
background-position: 0 -248px;
background-position: bottom;
}
@@ -324,7 +324,7 @@
background-color: #abd6ff;
}
.claro .tabStripButtonActive {
- background-color: #7dbefa;
+ background-color: #7dbdfa;
}
.claro .dijitTabStripIcon {
height: 15px;
@@ -393,7 +393,7 @@
box-shadow: none;
}
.claro .dijitTabContainerTabListNested .dijitTabHover .dijitTabContent {
- background-color: #e9f4fe;
+ background-color: #e5f2fe;
border: solid 1px #cfe5fa;
padding: 3px;
-webkit-transition-duration: 0.2s;
@@ -404,16 +404,16 @@
text-decoration: none;
}
.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
padding: 3px;
- background: #abd6ff url("images/tabNested.png") repeat-x;
+ background: #abd6ff url("../layout/images/tabNested.png") repeat-x;
-webkit-transition-duration: 0.1s;
-moz-transition-duration: 0.1s;
transition-duration: 0.1s;
}
.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
padding: 3px;
- border: solid 1px #769dc0;
+ border: solid 1px #759dc0;
background-position: 0 105px;
background-color: #cfe5fa;
}
diff --git a/lib/dijit/themes/claro/layout/TabContainer.less b/lib/dijit/themes/claro/layout/TabContainer.less
index 691900eba..16947ff9c 100644
--- a/lib/dijit/themes/claro/layout/TabContainer.less
+++ b/lib/dijit/themes/claro/layout/TabContainer.less
@@ -62,7 +62,7 @@
border-color: @border-color;
}
.claro .dijitTabCloseButton {
- background: url("images/tabClose.png") no-repeat;
+ background: url("../@{image-layout-tab-close}") no-repeat;
width: 14px;
height: 14px;
margin-left: 5px;
@@ -135,7 +135,7 @@
.claro .dijitTabContainerTop-tabs .dijitTabContent {
padding:3px 6px;
border-bottom-width: 0;
- background-image:url("images/tabTop.png");
+ background-image:url("../@{image-layout-tab-top}");
background-position:0 0;
background-repeat:repeat-x;
min-width: 60px;
@@ -148,7 +148,7 @@
/* normal status */
.claro .dijitTabContainerTop-tabs .dijitTabInnerDiv {
- background-image:url("images/tabTop.png");
+ background-image:url("../@{image-layout-tab-top}");
background-position:0 -248px;
background-position:bottom;
background-repeat:repeat-x;
@@ -176,7 +176,7 @@
.claro .dijitTabContainerBottom-tabs .dijitTabContent {
padding:3px 6px;
border-top-width: 0;
- background-image: url("images/tabBottom.png");
+ background-image: url("../@{image-layout-tab-bottom}");
background-position:0 -249px;
background-repeat: repeat-x;
background-position:bottom;
@@ -188,7 +188,7 @@
}
/* normal status */
.claro .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
- background-image: url("images/tabBottom.png");
+ background-image: url("../@{image-layout-tab-bottom}");
background-position: top;
background-repeat: repeat-x;
.box-shadow(0 1px 1px rgba(0, 0, 0, 0.04));
@@ -218,13 +218,13 @@
}
/* normal status */
.claro .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
- background-image: url("images/tabLeft.png");
+ 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("images/tabLeft.png");
+ background-image: url("../@{image-layout-tab-left}");
background-repeat: repeat-y;
background-position:0 0;
}
@@ -249,13 +249,13 @@
}
/* normal status */
.claro .dijitTabContainerRight-tabs .dijitTabInnerDiv {
- background-image: url("images/tabRight.png");
+ 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("images/tabRight.png");
+ background-image: url("../@{image-layout-tab-right}");
background-position:right top;
background-repeat: repeat-y;
}
@@ -298,13 +298,13 @@
.claro .dijitTabListContainer-top .tabStripButton {
padding: 4px 3px;
margin-top:7px;
- background-image: url("images/tabTop.png");
+ background-image: url("../@{image-layout-tab-top}");
background-position:0 0;
}
.claro .dijitTabListContainer-bottom .tabStripButton {
padding:5px 3px;
margin-bottom:4px;
- background-image: url("images/tabTop.png");
+ background-image: url("../@{image-layout-tab-top}");
background-position:0 -248px;
background-position:bottom;
}
@@ -318,7 +318,7 @@
height:15px;
width:15px;
margin: 0 auto;
- background:url("../form/images/buttonArrows.png") no-repeat -75px 50%;
+ background:url("../@{image-form-button-arrows}") no-repeat -75px 50%;
background-color: transparent;
}
.claro .dijitTabStripSlideRightIcon{
@@ -382,7 +382,7 @@
.claro .dijitTabContainerTabListNested .dijitTabActive .dijitTabContent {
border:solid 1px @nestedtab-selected-border-color;
padding: 3px;
- background: @nestedtab-selected-background-color url("images/tabNested.png") repeat-x;
+ background: @nestedtab-selected-background-color url("../@{image-layout-tab-nested}") repeat-x;
.transition-duration(.1s);
}
.claro .dijitTabContainerTabListNested .dijitTabChecked .dijitTabContent {
diff --git a/lib/dijit/themes/claro/variables.less b/lib/dijit/themes/claro/variables.less
index 8d09c2519..ca7d6773c 100644
--- a/lib/dijit/themes/claro/variables.less
+++ b/lib/dijit/themes/claro/variables.less
@@ -1,149 +1,204 @@
// General
-@text-color: #000000; // Text color for enabled widgets
-@border-color: #b5bcc7; // Border color for (enabled, unhovered) TextBox, Slider, Accordion, BorderContainer, TabContainer
-@popup-border-color: #769dc0; // Border for Dialog, Menu, Tooltip. Must also update tooltip.png (the arrow image file) to match
-@minor-border-color: #d3d3d3; // Color of borders inside widgets: horizontal line in Calendar between weeks, around color swatches in ColorPalette, above Dialog action bar
+@primary-color: #cfe5fa; // Base color for entire theme
+@secondary-color: #efefef; // Base color for bar-backgrounds
+@text-color: #000; // Text color for enabled widgets
+@disabled-color: #d3d3d3; // Base for disabled backgrounds and borders
+@error-color: #d46464;
-@disabled-border-color: #d3d3d3; // Border color for disabled/readonly Button, TextBox etc. widgets
-@disabled-background-color: #efefef;// Disabled button, textbox, etc.
-@disabled-text-color: #818181; // Text color for disabled/readonly widgets
+@container-background-color:#fff; // Backgrounds for various content areas such as TitlePane, ContentPane and Inputs
-@unselected-background-color: #efefef;// Background color for unselected/unopened tab button, accordion pane, TitlePane, Menu items
-@unselected-text-color: #4a4a4a; // Text color for unselected/unopened tab button, accordion pane, TitlePane, Menu items
+@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
+@unfocused-clickable-color: spin(saturate(lighten(@primary-color, 5), 10), 0); // Background color for enabled buttons, text inputs
+@border-color: spin(desaturate(darken(@primary-color, 15), 67), 8); // Border color for (enabled, unhovered) TextBox, Slider, Accordion, BorderContainer, TabContainer
+@minor-border-color: @disabled-color; // Color of borders inside widgets: horizontal line in Calendar between weeks, around color swatches in ColorPalette, above Dialog action bar
+@popup-border-color: @base-border-color; // Border for Dialog, Menu, Tooltip. Must also update tooltip.png (the arrow image file) to match
-@hovered-border-color: #769dc0; // Hover of textbox, tab label, BorderContainer splitter, Calendar, etc.
-@hovered-background-color: #abd6ff; // Background color for hover of Button, MenuBar, Accordion pane, Calendar... anything that has a (non-white) color to start with and gets darker on hover
-@hovered-text-color: @text-color; // Used for title of select Accordion pane, label of select tab, hovered Menu item, etc.
-@pressed-border-color: #769dc0; // During click on Calendar day, Slider up/down buttons, tab button, etc.
-@pressed-background-color: #7dbefa; // Background color while clicking on Accordion/TitlePane title bar, tab button, Calendar day, Toolbar button, Tree row.
+@disabled-border-color: @disabled-color; // Border color for disabled/readonly Button, TextBox etc. widgets
+@disabled-background-color: @secondary-color; // Disabled button, textbox, etc.
+@disabled-text-color: darken(@secondary-color, 43); // Text color for disabled/readonly widgets
-@selected-border-color: #769dc0; // Selected AccordionPane, tab of nested TabContainer (but plain TabContainer is special)
-@selected-background-color: #cfe5fa;// Selected Accordion pane, nested tab label, Tree row
-@selected-text-color: @text-color; // title of selected Accordion pane, label of selected tab, hovered Menu item, etc.
+@unselected-background-color: @secondary-color; // Background color for unselected/unopened tab button, accordion pane, TitlePane, Menu items
+@unselected-text-color: darken(@secondary-color, 65); // Text color for unselected/unopened tab button, accordion pane, TitlePane, Menu items
-@bar-background-color: #efefef; // MenuBar, Toolbar, action bar at bottom of dialog
-@pane-background-color: #fff; // Background color of Accordion panes, Dialogs, etc.
-@popup-background-color: #fff; // Background for Dialog. TODO: currently use for ColorPalette, maybe should change.
+@hovered-border-color: @base-border-color; // Hover of textbox, tab label, BorderContainer splitter, Calendar, etc.
+@hovered-background-color: @minor-selected-color; // Background color for hover of Button, MenuBar, Accordion pane, Calendar... anything that has a (non-white) color to start with and gets darker on hover
+@hovered-text-color: @text-color; // Used for title of select Accordion pane, label of select tab, hovered Menu item, etc.
+
+@pressed-border-color: @base-border-color; // During click on Calendar day, Slider up/down buttons, tab button, etc.
+@pressed-background-color: spin(saturate(darken(@primary-color, 16), 12), 0); // Background color while clicking on Accordion/TitlePane title bar, tab button, Calendar day, Toolbar button, Tree row.
+
+@selected-border-color: @base-border-color; // Selected AccordionPane, tab of nested TabContainer (but plain TabContainer is special)
+@selected-background-color: @primary-color; // Selected Accordion pane, nested tab label, Tree row
+@selected-text-color: @text-color; // title of selected Accordion pane, label of selected tab, hovered Menu item, etc.
+
+@bar-background-color: @secondary-color; // MenuBar, Toolbar, action bar at bottom of dialog
+@pane-background-color: @container-background-color; // Background color of Accordion panes, Dialogs, etc.
+@popup-background-color: @container-background-color; // Background for Dialog. TODO: currently use for ColorPalette, maybe should change.
// Buttons
-@button-border-color: #769dc0; // Border for (stand-alone) buttons in normal, hovered, or active state
-@button-background-color: #e9f4fe; // Background color for (unhovered) buttons
-@button-hovered-background-color: #abd6ff; // Background color for hovered buttons
-@button-pressed-background-color: #abd6ff; // Background color for active buttons
-@button-border-radius: 4px; // Rounded corner radius for buttons (except in toolbar)
+@button-border-color: @base-border-color; // Border for (stand-alone) buttons in normal, hovered, or active state
+@button-background-color: @unfocused-clickable-color; // Background color for (unhovered) buttons
+@button-hovered-background-color: @minor-selected-color; // Background color for hovered buttons
+@button-pressed-background-color: @minor-selected-color; // Background color for active buttons
+@button-border-radius: 4px; // Rounded corner radius for buttons (except in toolbar)
// Input widgets
-@focused-border-color: #769dc0; // Focused textbox, editor, select, etc.
-@error-border-color: #d46464; // Border for textbox in error state
-@error-focused-border-color: #ce4f4f; // Border of textbox in error state, and focused
-@erroricon-background-color: #d46464; // Background color for exclamation point validation icon (for TextBox in error state)
-@textbox-background-color: #fff; // Default background color of TextBox based widgets
-@textbox-hovered-background-color: #e9f4fe; // Background color when hovering a unfocused TextBox, Select, Editor, or other input widget
+@focused-border-color: @base-border-color; // Focused textbox, editor, select, etc.
+@error-border-color: @error-color; // Border for textbox in error state
+@error-focused-border-color: darken(@error-color, 5); // Border of textbox in error state, and focused
+@erroricon-background-color: @error-color; // Background color for exclamation point validation icon (for TextBox in error state)
+@textbox-background-color: @container-background-color; // Default background color of TextBox based widgets
+@textbox-hovered-background-color: @unfocused-clickable-color; // Background color when hovering a unfocused TextBox, Select, Editor, or other input widget
@textbox-focused-background-color: @textbox-background-color;
@textbox-error-background-color: @textbox-background-color;
@textbox-disabled-background-color: @disabled-background-color;
-@textbox-padding: 2px; // Padding for Textbox, Textarea, etc.
+@textbox-padding: 2px; // Padding for Textbox, Textarea, etc.
// CheckBox, RadioButton
-@focus-outline-color: #4a4a4a; // Color for artificial focus outline around labels of checkboxes
+@focus-outline-color: darken(@secondary-color, 65); // Color for artificial focus outline around labels of checkboxes
// TabContainer
-@nestedtab-hovered-background-color: @textbox-hovered-background-color;
-@nestedtab-hovered-border-color: #cfe5fa;
+@nestedtab-hovered-background-color: @unfocused-clickable-color;
+@nestedtab-hovered-border-color: @primary-color;
@nestedtab-selected-border-color: @selected-border-color;
-@nestedtab-selected-background-color: #abd6ff;
-@tab-disabled-background-color: #d3d3d3; // For disabled tabs of a TabContainer (not officially supported)
+@nestedtab-selected-background-color: @minor-selected-color;
+@tab-disabled-background-color: @disabled-color; // For disabled tabs of a TabContainer (not officially supported)
// Arrow buttons (stand alone, or inside ComboBox / ComboButton / Spinner / etc.
-@arrowbutton-background-color: #efefef;
-@arrowbutton-hovered-background-color: #abd6ff; // Color of arrow when hovering ComboBox. But hovering Spinner doesn't change arrow color (TODO)
-@arrowbutton-pressed-background-color: #abd6ff;
-@arrowbutton-inner-border-color: #fff; // Typically the arrows have an inner white border (a.k.a. padding) and then an outer black-ish border
+@arrowbutton-background-color: @secondary-color;
+@arrowbutton-hovered-background-color: @minor-selected-color; // Color of arrow when hovering ComboBox. But hovering Spinner doesn't change arrow color (TODO)
+@arrowbutton-pressed-background-color: @minor-selected-color;
+@arrowbutton-inner-border-color: @container-background-color; // Typically the arrows have an inner white border (a.k.a. padding) and then an outer black-ish border
// Slider
// Note: any changes here require corresponding changes in form/images/sliderThumbs.png
-@slider-fullbar-background-color: #cfe5fa; // Background color for part of slider bar before (to the left or below) the handle
-@slider-remainingbar-background-color: #fff; // Background color for part of slider bar after (to the right or above) the handle
-@slider-hovered-fullbar-background-color: #abd6ff; // Background color for part of bar of hovered slider before (to the left or below) the handle
-@slider-hovered-remainingbar-background-color: #fff;// Background color for part of bar of hovered slider after (to the right or above) the handle
-@slider-hoveredButton-background-color: #fff; // Background color of slider increment/decrement buttons when mouse is over slider but not over the buttons
-@slider-focused-fullbar-background-color: #abd6ff; // Background color for part of bar of focused slider before (to the left or below) the handle
-@slider-focused-remainingbar-background-color: #fff;// Background color for part of bar of focused slider after (to the right or above) the handle
-@slider-button-hovered-background-color: #cfe5fa; // Background color of slider increment/decrement buttons when mouse is over the buttons
-@slider-button-pressed-background-color: #abd6ff; // Background color of slider increment/decrement buttons while button is depressed
+@slider-fullbar-background-color: @primary-color; // Background color for part of slider bar before (to the left or below) the handle
+@slider-remainingbar-background-color: @container-background-color; // Background color for part of slider bar after (to the right or above) the handle
+@slider-hovered-fullbar-background-color: @minor-selected-color; // Background color for part of bar of hovered slider before (to the left or below) the handle
+@slider-hovered-remainingbar-background-color: @container-background-color; // Background color for part of bar of hovered slider after (to the right or above) the handle
+@slider-hoveredButton-background-color: @container-background-color; // Background color of slider increment/decrement buttons when mouse is over slider but not over the buttons
+@slider-focused-fullbar-background-color: @minor-selected-color; // Background color for part of bar of focused slider before (to the left or below) the handle
+@slider-focused-remainingbar-background-color: @container-background-color; // Background color for part of bar of focused slider after (to the right or above) the handle
+@slider-button-hovered-background-color: @primary-color; // Background color of slider increment/decrement buttons when mouse is over the buttons
+@slider-button-pressed-background-color: @minor-selected-color; // Background color of slider increment/decrement buttons while button is depressed
// Select, ComboBox
-@select-dropdownitem-background-color: #fff; // Background color for items in the drop down list of a ComboBox/Select
-@select-dropdownitem-hovered-background-color: #7dbefa; // Background color for the hovered item in the drop down list of a ComboBox/Select
-@select-matchedtext-background-color: #abd6ff; // Background color of text in ComboBox drop down that matches typed in phrase
+@select-dropdownitem-background-color: @container-background-color; // Background color for items in the drop down list of a ComboBox/Select
+@select-dropdownitem-hovered-background-color: @pressed-background-color; // Background color for the hovered item in the drop down list of a ComboBox/Select
+@select-matchedtext-background-color: @minor-selected-color; // Background color of text in ComboBox drop down that matches typed in phrase
// Menus
@menu-background-color: @popup-background-color;
// Calendar
-@calendar-background-color: #cfe5fa;
-@calendar-currentmonth-background-color: #fff; // Background color for days of the current month
-@calendar-adjacentmonth-background-color: #e9f4fe; // Background color used for days from previous or next month
-@calendar-adjacentmonth-text-color: #769dc0; // Text color used for days from previous or next month
-@calendar-date-pressed-border-color: #fff; // For some reason pressing a day of the month (as opposed to hovering it) makes the border go away, is this intentional?
+@calendar-background-color: @primary-color;
+@calendar-currentmonth-background-color: @container-background-color; // Background color for days of the current month
+@calendar-adjacentmonth-background-color: @unfocused-clickable-color; // Background color used for days from previous or next month
+@calendar-adjacentmonth-text-color: @base-border-color; // Text color used for days from previous or next month
+@calendar-date-pressed-border-color: @container-background-color; // For some reason pressing a day of the month (as opposed to hovering it) makes the border go away, is this intentional?
@calendar-date-pressed-background-color: @pressed-background-color;
@calendar-date-selected-border-color: @selected-border-color;
-@calendar-date-selected-background-color: #abd6ff;
-@calendar-button-hovered-background-color: #e9f4fe; // for hover or next/previous year, and month drop down (TODO: border and background are built in to calendarArrows.png, can't control from here)
-@calendar-button-hovered-border-color: #fff; // for hover or next/previous year, and month drop down
-@calendar-button-pressed-background-color: #cfe5fa;
+@calendar-date-selected-background-color: @minor-selected-color;
+@calendar-button-hovered-background-color: @unfocused-clickable-color; // for hover or next/previous year, and month drop down (TODO: border and background are built in to calendarArrows.png, can't control from here)
+@calendar-button-hovered-border-color: @container-background-color; // for hover or next/previous year, and month drop down
+@calendar-button-pressed-background-color: @pressed-background-color;
@calendar-button-pressed-border-color: @pressed-border-color;
// ProgressBar
-@progressbar-border-color: @popup-border-color; // Border color of progress bar
-@progressbar-full-background-color:#abd6ff; // Background color for part of progress bar indicating amount completed
-@progressbar-empty-background-color: #fff; // Background color for part of progress bar indicating amount remaining
-@progressbar-text-color: @text-color; // Color of progress bar text (ex: "35%"). Must contrast with both empty and full background colors.
+@progressbar-border-color: @popup-border-color; // Border color of progress bar
+@progressbar-full-background-color:@minor-selected-color; // Background color for part of progress bar indicating amount completed
+@progressbar-empty-background-color: @container-background-color; // Background color for part of progress bar indicating amount remaining
+@progressbar-text-color: @text-color; // Color of progress bar text (ex: "35%"). Must contrast with both empty and full background colors.
// TimePicker
-@timepicker-minorvalue-background-color: #efefef; // For 3:15, 3:30, 3:45 but not 3:00 or 4:00
-@timepicker-minorvalue-text-color: #818181;
-@timepicker-majorvalue-background-color: #e9f4fe; // For 3:00, 4:00, 5:00, etc.
-@timepicker-value-hovered-background-color: #7dbefa;
+@timepicker-minorvalue-background-color: @secondary-color; // For 3:15, 3:30, 3:45 but not 3:00 or 4:00
+@timepicker-minorvalue-text-color: darken(@secondary-color, 43);
+@timepicker-majorvalue-background-color: @unfocused-clickable-color; // For 3:00, 4:00, 5:00, etc.
+@timepicker-value-hovered-background-color: @pressed-background-color;
@timepicker-value-hovered-text-color: @hovered-text-color;
-@timepicker-arrow-hovered-background-color: #abd6ff;
+@timepicker-arrow-hovered-background-color: @minor-selected-color;
// ColorPalette
-@colorpalette-background-color: #fff;
+@colorpalette-background-color: @container-background-color;
@swatch-border-color: @minor-border-color;
@swatch-hovered-border-color: #000;
@swatch-selected-border-color: #000;
// Dialog
-@dialog-underlay-color: #fff; // the thing that grays out the screen when a dialog is shown
-@dialog-titlebar-border-color: #fff; // 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: #abd6ff;
+@dialog-underlay-color: @container-background-color; // the thing that grays out the screen when a dialog is shown
+@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;
// BorderContainer
-@splitter-hovered-background-color: #cfe5fa; // Color of splitter when user hovers it, before mouse down
-@splitter-dragged-background-color: #abd6ff; // Color of splitter while it's being dragged
+@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
// Toolbar
-@toolbar-button-checked-background-color: #fff; // a toggled-on button in the toolbar
-@toolbar-combobutton-hovered-unhoveredsection-background-color: #f4ffff; // when user hovers a ComboButton in a Toolbar, the other half of the button turns this color
+@toolbar-button-checked-background-color: @container-background-color; // a toggled-on button in the toolbar
+@toolbar-combobutton-hovered-unhoveredsection-background-color: spin(saturate(lighten(@primary-color, 8), 19), -29); // when user hovers a ComboButton in a Toolbar, the other half of the button turns this color
@toolbar-button-border-radius: 2px; // Rounded corner radius for buttons for buttons in toolbar
// DnD
-@dnd-avatar-background-color: #fff; // Background color of little Dialog-type box indicating dragged items
+@dnd-avatar-background-color: @container-background-color; // Background color of little Dialog-type box indicating dragged items
@dnd-avatar-header-background-color: #f58383; // Title bar for dragged items
@dnd-avatar-candrop-header-background-color: #97e68d;// Title bar for dragged items when they can be dropped
-@dnd-dropseparator-color: #769dc0; // Color of line indicating that user is about to drop between items A & B
+@dnd-dropseparator-color: @base-border-color; // Color of line indicating that user is about to drop between items A & B
// Document level
-@document-text-color: #131313; // Text color for document itself (text outside of widgets)
+@document-text-color: #131313; // Text color for document itself (text outside of widgets)
@document-shadedsection-background-color: @bar-background-color;// background color used for <pre>, <code>, and table header rows
-@document-border-color: #d3d3d3; // Border for <pre>, <code>, tables, etc.
+@document-border-color: @disabled-color; // Border for <pre>, <code>, tables, etc.
+
+// Images
+@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-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-tree-expand: "images/treeExpandImages.png";
+@image-tree-expand-ie6: "images/treeExpandImages8bit.png";
// Mixins
diff --git a/lib/dijit/themes/dijit.css b/lib/dijit/themes/dijit.css
index b6d57dca1..4c60bf371 100644
--- a/lib/dijit/themes/dijit.css
+++ b/lib/dijit/themes/dijit.css
@@ -39,6 +39,12 @@
#vertical-align: auto; /* makes TextBox,Button line up w/native counterparts on IE6 */
}
+table.dijitInline {
+ /* To inline tables with a given width set */
+ display:inline-table;
+ box-sizing: content-box; -moz-box-sizing: content-box;
+}
+
.dijitHidden {
/* To hide unselected panes in StackContainer etc. */
display: none !important;
@@ -60,8 +66,8 @@
#display: inline;
}
-.dj_ie INPUT.dijitTextBox,
-.dj_ie .dijitTextBox INPUT {
+.dj_ie input.dijitTextBox,
+.dj_ie .dijitTextBox input {
font-size: 100%;
}
.dijitTextBox .dijitSpinnerButtonContainer,
@@ -70,7 +76,7 @@
float: right;
text-align: center;
}
-.dijitTextBox INPUT.dijitInputField {
+.dijitTextBox input.dijitInputField {
/* override unreasonable user styling of buttons and icons */
padding-left: 0 !important;
padding-right: 0 !important;
@@ -78,16 +84,6 @@
.dijitTextBox .dijitValidationContainer {
display: none;
}
-.dijitInlineTable {
- /* To inline tables with a given width set (otherwise, use dijitInline above) */
- display:inline-table;
- display:inline-block; /* webkit and FF3 */
- #zoom: 1; /* set hasLayout:true to mimic inline-block */
- #display:inline; /* don't use .dj_ie since that increases the priority */
- box-sizing: content-box; -moz-box-sizing: content-box;
- border:0;
- padding:0;
-}
.dijitTeeny {
font-size:1px;
@@ -157,16 +153,16 @@
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 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 {
/* 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 */
+ * exception for input.dijitArrowButtonInner, because the icon and character are controlled by the same node */
display: none;
}
-.dijitSpinner DIV.dijitArrowButtonInner {
+.dijitSpinner div.dijitArrowButtonInner {
display: block; /* override previous rule */
}
@@ -183,14 +179,16 @@
*/
.dijit_a11y .dijitCalendarDateLabel {
padding: 1px;
+ border: 0px !important;
}
.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
- border-style: dotted !important;
- border-width: 1px;
+ border-style: solid !important;
+ border-width: 1px !important;
padding: 0;
}
.dijit_a11y .dijitCalendarDateTemplate {
padding-bottom: 0.1em !important; /* otherwise bottom border doesn't appear on IE */
+ border: 0px !important;
}
.dijit_a11y .dijitButtonNode {
border: black outset medium !important;
@@ -201,6 +199,10 @@
padding: 0 !important;
}
+.dijit_a11y .dijitButtonContents{
+ margin: 0.15em; /* Margin needed to make focus outline visible */
+}
+
.dijit_a11y .dijitTextBoxReadOnly .dijitInputField,
.dijit_a11y .dijitTextBoxReadOnly .dijitButtonNode {
border-style: outset!important;
@@ -246,6 +248,9 @@
}
/* Buttons */
+.dj_gecko .dijit_a11y .dijitButtonDisabled .dijitButtonNode {
+ opacity: 0.5;
+}
.dijitToggleButton,
.dijitButton,
@@ -263,7 +268,7 @@ td.dijitButtonContents {
display: table-cell; /* but don't affect Select, ComboButton */
}
-.dijitButtonNode IMG {
+.dijitButtonNode img {
/* make text and images line up cleanly */
vertical-align:middle;
/*margin-bottom:.2em;*/
@@ -331,7 +336,7 @@ td.dijitButtonContents {
overflow: visible;
}
-DIV.dijitArrowButton {
+div.dijitArrowButton {
float: right;
}
@@ -351,14 +356,14 @@ DIV.dijitArrowButton {
.dijitTextBoxDisabled {
color: gray;
}
-.dj_webkit .dijitTextBoxDisabled INPUT {
+.dj_webkit .dijitTextBoxDisabled input {
color: #eee; /* because WebKit lightens disabled input/textarea no matter what color you specify */
}
-.dj_webkit TEXTAREA.dijitTextAreaDisabled {
+.dj_webkit textarea.dijitTextAreaDisabled {
color: #333; /* because WebKit 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 {
+.dj_gecko .dijitTextBoxReadOnly input.dijitInputField, /* disable arrow and validation presentation inputs but allow real input for text selection */
+.dj_gecko .dijitTextBoxDisabled input {
-moz-user-input: none; /* prevent focus of disabled textbox buttons */
}
@@ -377,14 +382,14 @@ DIV.dijitArrowButton {
}
/* rules for webkit to deal with fuzzy blue focus border */
-.dijitTextBox INPUT:focus {
+.dijitTextBox input:focus {
outline: none; /* blue fuzzy line looks wrong on combobox or something w/validation icon showing */
}
.dijitTextBoxFocused {
- outline: auto 5px -webkit-focus-ring-color;
+ outline: 5px -webkit-focus-ring-color;
}
-.dijitTextBox INPUT {
+.dijitTextBox input {
float: left; /* needed by IE to remove secret margin */
}
.dijitInputInner {
@@ -399,11 +404,11 @@ DIV.dijitArrowButton {
margin-left: 0 !important;
margin-right: 0 !important;
}
-.dijit_a11y .dijitTextBox INPUT {
+.dijit_a11y .dijitTextBox input {
margin: 0 !important;
}
-.dijitTextBoxError INPUT.dijitValidationInner,
-.dijitTextBox INPUT.dijitArrowButtonInner {
+.dijitTextBoxError input.dijitValidationInner,
+.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
*/
@@ -415,26 +420,26 @@ DIV.dijitArrowButton {
#letter-spacing: -5em !important;
#text-align: right !important;
}
-.dj_ie .dijitTextBox INPUT,
-.dj_ie INPUT.dijitTextBox {
- overflow-y: visible; /* INPUTs need help expanding when padding is added or line-height is adjusted */
+.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 {
+.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 */
}
-.dj_ie6 .dijitTextBox INPUT,
-.dj_ie6 INPUT.dijitTextBox,
-.dj_iequirks .dijitTextBox INPUT.dijitValidationInner,
-.dj_iequirks .dijitTextBox INPUT.dijitArrowButtonInner,
-.dj_iequirks .dijitTextBox INPUT.dijitSpinnerButtonInner,
-.dj_iequirks .dijitTextBox INPUT.dijitInputInner,
-.dj_iequirks INPUT.dijitTextBox {
+.dj_ie6 .dijitTextBox input,
+.dj_ie6 input.dijitTextBox,
+.dj_iequirks .dijitTextBox input.dijitValidationInner,
+.dj_iequirks .dijitTextBox input.dijitArrowButtonInner,
+.dj_iequirks .dijitTextBox input.dijitSpinnerButtonInner,
+.dj_iequirks .dijitTextBox input.dijitInputInner,
+.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 {
+.dijit_a11y input.dijitValidationInner,
+.dijit_a11y input.dijitArrowButtonInner {
/* (in high contrast mode) revert rules from above so character displays */
text-indent: 0 !important;
width: 1em !important;
@@ -495,7 +500,7 @@ DIV.dijitArrowButton {
}
.dijit_a11y .dijitTextBox .dijitSpinnerButtonContainer,
.dijit_a11y .dijitSpinner .dijitArrowButtonInner,
-.dijit_a11y .dijitSpinnerButtonContainer INPUT {
+.dijit_a11y .dijitSpinnerButtonContainer input {
width: 1em !important;
}
.dijit_a11y .dijitSpinner .dijitArrowButtonInner {
@@ -620,8 +625,8 @@ DIV.dijitArrowButton {
overflow: hidden;
}
-.dijitCheckBox INPUT,
-.dijitRadio INPUT {
+.dijitCheckBox input,
+.dijitRadio input {
margin: 0;
padding: 0;
display: block;
@@ -649,6 +654,11 @@ DIV.dijitArrowButton {
height: auto;
}
+.dijit_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;
+}
/****
dijit.ProgressBar
@@ -683,7 +693,7 @@ DIV.dijitArrowButton {
right:0;
margin:0;
padding:0;
- width:auto;
+ width: 100%; /* needed for IE/quirks */
height:auto;
background-color:#aaa;
background-attachment: fixed;
@@ -775,10 +785,10 @@ DIV.dijitArrowButton {
overflow: hidden;
}
-body .dijitAlignTop,
-body .dijitAlignBottom,
-body .dijitAlignLeft,
-body .dijitAlignRight {
+.dijitAlignTop,
+.dijitAlignBottom,
+.dijitAlignLeft,
+.dijitAlignRight {
position: absolute;
overflow: hidden;
}
@@ -786,7 +796,7 @@ body .dijitAlignRight {
body .dijitAlignClient { position: absolute; }
/*
- * BorderContaienr
+ * BorderContainer
*
* .dijitBorderContainer is a stylized layout where panes have border and margin.
* .dijitBorderContainerNoGutter is a raw layout.
@@ -860,13 +870,13 @@ body .dijitAlignClient { position: absolute; }
height: 7px;
border-top:1px;
border-bottom:1px;
- cursor: ns-resize;
+ cursor: row-resize;
}
.dijitSplitterV {
width: 7px;
border-left:1px;
border-right:1px;
- cursor: ew-resize;
+ cursor: col-resize;
}
.dijitSplitContainer {
position: relative;
@@ -886,8 +896,6 @@ body .dijitAlignClient { position: absolute; }
.dijitSplitContainerSizerV {
position:absolute;
font-size: 1px;
- cursor: move;
- cursor: w-resize;
background-color: ThreeDFace;
border: 1px solid;
border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
@@ -916,11 +924,12 @@ body .dijitAlignClient { position: absolute; }
margin: 0;
}
-.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
- cursor: w-resize;
+.dijitSplitContainerSizerH, .dijitSplitContainerVirtualSizerH {
+ cursor: col-resize;
}
-.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
- cursor: n-resize;
+
+.dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
+ cursor: row-resize;
}
.dijit_a11y .dijitSplitterH {
@@ -947,6 +956,11 @@ body .dijitAlignClient { position: absolute; }
overflow: hidden;
}
+.dijitContentPaneLoading .dijitIconLoading,
+.dijitContentPaneError .dijitIconError {
+ margin-right: 9px;
+}
+
/* TitlePane */
.dijitTitlePane {
@@ -1040,13 +1054,13 @@ body .dijitAlignClient { position: absolute; }
.dijitPaletteTable td {
padding: 0;
}
-.dijitColorPalette .dijitPaletteCellHover .dijitPaletteImg {
+.dijitColorPalette .dijitPaletteCell:hover .dijitPaletteImg {
/* hovered color swatch */
border: 1px solid #000;
}
-.dijitColorPalette .dijitPaletteCellActive .dijitPaletteImg,
-.dijitColorPalette .dijitPaletteCellSelected .dijitPaletteImg {
+.dijitColorPalette .dijitPaletteCell:active .dijitPaletteImg,
+.dijitColorPalette .dijitPaletteTable .dijitPaletteCellSelected .dijitPaletteImg {
border: 2px solid #000;
margin: 1px 0; /* reduce margin to compensate for increased border */
}
@@ -1103,6 +1117,10 @@ body .dijitAlignClient { position: absolute; }
vertical-align: middle;
}
+.dijitCalendarYearLabel {
+ white-space: nowrap; /* make sure previous, current, and next year appear on same row */
+}
+
.dijitCalendarNextYear {
margin:0 0 0 0.55em;
}
@@ -1206,7 +1224,7 @@ body .dijitAlignClient { position: absolute; }
border: 1px dotted black !important;
}
.dj_ff3 .dijit_a11y .dijitMenuItem td {
- padding: none !important;
+ padding: 0 !important;
background:none !important;
}
.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
@@ -1294,6 +1312,7 @@ body .dijitAlignClient { position: absolute; }
width: 50000px;
display: block;
position: relative;
+ text-align: left; /* just in case ancestor has non-standard setting */
}
.dijitTabListWrapper {
overflow: hidden;
@@ -1334,7 +1353,7 @@ body .dijitAlignClient { position: absolute; }
border-right: 0;
}
-DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
+div.dijitTabDisabled, .dj_ie div.dijitTabDisabled {
cursor: auto;
}
@@ -1568,7 +1587,7 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
right:50%;
}
-.dijit_a11y DIV.dijitSliderImageHandle,
+.dijit_a11y div.dijitSliderImageHandle,
.dijitSliderImageHandle {
margin:0;
padding:0;
@@ -1816,7 +1835,7 @@ DIV.dijitTabDisabled, .dj_ie DIV.dijitTabDisabled {
}
/* + and - Slider buttons: override theme settings to display icons */
-.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
+.dijit_a11y .dijitSlider .dijitSliderButtonContainer div {
font-family: monospace; /* otherwise hyphen is larger and more vertically centered */
font-size: 1em;
line-height: 1em;
diff --git a/lib/dijit/themes/dijit_rtl.css b/lib/dijit/themes/dijit_rtl.css
index 8ef3a285d..9c1b69c0d 100644
--- a/lib/dijit/themes/dijit_rtl.css
+++ b/lib/dijit/themes/dijit_rtl.css
@@ -11,7 +11,7 @@
/* Button */
-.dj_iequirks .dijitComboButtonRtl BUTTON {
+.dj_iequirks .dijitComboButtonRtl button {
/* workaround bug where label invisible (themeTesterQuirk.html?dir=rtl) */
float:left;
}
@@ -31,6 +31,11 @@
left: auto;
}
+.dj_ie7 .dijitInputContainer {
+ /* to fix wrong text alignment in rtl text box in IE */
+ display: inline-block;
+}
+
.dijitTextBoxRtl .dijitSpinnerButtonContainer,
.dijitTextBoxRtl .dijitValidationContainer,
.dijitTextBoxRtl .dijitArrowButtonContainer {
@@ -87,13 +92,18 @@
}
/* ContentPane*/
-.dijitRtl .dijitContentPaneLoading, .dijitRtl .dijitContentPaneError {
- background-position:right;
- padding-right:25px;
+
+.dijitRtl .dijitContentPaneLoading .dijitIconLoading,
+.dijitRtl .dijitContentPaneError .dijitIconError {
+ margin-right: 0;
+ margin-left: 9px;
}
/* TabContainer */
+.dijitTabControllerRtl .nowrapTabStrip {
+ text-align: right; /* just in case ancestor has non-standard setting */
+}
.dijitTabRtl .dijitTabCloseButton {
margin-left: 0;
margin-right: 1em;
@@ -115,4 +125,4 @@
/* Select */
.dijitSelectRtl .dijitButtonContents {
text-align: right;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/nihilo/Calendar.css b/lib/dijit/themes/nihilo/Calendar.css
index 2c9248b08..55bb2ccae 100644
--- a/lib/dijit/themes/nihilo/Calendar.css
+++ b/lib/dijit/themes/nihilo/Calendar.css
@@ -119,10 +119,12 @@
margin:0;
padding:0.4em 0 0.25em 0;
text-align:center;
+ font-size: 1.17em;
}
.nihilo .dijitCalendarSelectedYear {
/* label for selected year */
+ font-weight:bolder;
color:black;
padding:0.2em;
padding-bottom:0.1em;
@@ -156,4 +158,4 @@
.nihilo .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
background-color: #ffe284;
color: #243C5F;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/nihilo/Menu.css b/lib/dijit/themes/nihilo/Menu.css
index cad469863..1a8ec139e 100644
--- a/lib/dijit/themes/nihilo/Menu.css
+++ b/lib/dijit/themes/nihilo/Menu.css
@@ -29,6 +29,7 @@
}
.nihilo .dijitMenuPassive .dijitMenuItemHover,
+.nihilo .dijitComboBoxMenu .dijitMenuItemHover,
.nihilo .dijitMenuItemSelected {
background-color: #ffe284; /* #95a0b0; #555555; #aaaaaa; #646464; #60a1ea; #848484; */
color: #243C5F;
diff --git a/lib/dijit/themes/nihilo/form/Button.css b/lib/dijit/themes/nihilo/form/Button.css
index 0be9ea4a3..90e1ee2cc 100644
--- a/lib/dijit/themes/nihilo/form/Button.css
+++ b/lib/dijit/themes/nihilo/form/Button.css
@@ -52,8 +52,8 @@
background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
opacity: 0.60;
}
-.dj_ie6 .nihilo .dijitReadOnly INPUT,
-.dj_ie7 .nihilo .dijitReadOnly INPUT,
+.dj_ie6 .nihilo .dijitReadOnly input,
+.dj_ie7 .nihilo .dijitReadOnly input,
.dj_ie6 .nihilo .dijitComboButtonDisabled .dijitButtonText,
.dj_ie7 .nihilo .dijitComboButtonDisabled .dijitButtonText {
/* opacity doesn't work on table node in IE, work around here */
diff --git a/lib/dijit/themes/nihilo/form/Common.css b/lib/dijit/themes/nihilo/form/Common.css
index 65dddc637..b67195f4b 100644
--- a/lib/dijit/themes/nihilo/form/Common.css
+++ b/lib/dijit/themes/nihilo/form/Common.css
@@ -10,7 +10,7 @@
dijit.form.ComboBox (partial)
****/
-.nihilo .dijitInputContainer INPUT,
+.nihilo .dijitInputContainer input,
.nihilo .dijitTextBox {
margin: 0 0.1em;
}
diff --git a/lib/dijit/themes/nihilo/images/tooltipConnectorRight.png b/lib/dijit/themes/nihilo/images/tooltipConnectorRight.png
index ed6efc46c..3d62dcd40 100644
--- a/lib/dijit/themes/nihilo/images/tooltipConnectorRight.png
+++ b/lib/dijit/themes/nihilo/images/tooltipConnectorRight.png
Binary files differ
diff --git a/lib/dijit/themes/soria/Calendar.css b/lib/dijit/themes/soria/Calendar.css
index 78572dab0..f77acd2eb 100644
--- a/lib/dijit/themes/soria/Calendar.css
+++ b/lib/dijit/themes/soria/Calendar.css
@@ -119,10 +119,12 @@
margin:0;
padding:0.4em 0 0.25em 0;
text-align:center;
+ font-size: 1.17em;
}
.soria .dijitCalendarSelectedYear {
/* label for selected year */
+ font-weight:bolder;
color:black;
padding:0.2em;
padding-bottom:0.1em;
@@ -156,4 +158,4 @@
.soria .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
background-color: #d9e6f9;
color: #243C5F;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/soria/Menu.css b/lib/dijit/themes/soria/Menu.css
index 4d9d06811..ebd2e2885 100644
--- a/lib/dijit/themes/soria/Menu.css
+++ b/lib/dijit/themes/soria/Menu.css
@@ -29,6 +29,7 @@
}
.soria .dijitMenuPassive .dijitMenuItemHover,
+.soria .dijitComboBoxMenu .dijitMenuItemHover,
.soria .dijitMenuItemSelected {
background-color: #d9e6f9; /* #95a0b0; #555555; #aaaaaa; #646464; #60a1ea; #848484; */
color: #243C5F;
diff --git a/lib/dijit/themes/soria/form/Button.css b/lib/dijit/themes/soria/form/Button.css
index 6b813a6dd..9efe7ead8 100644
--- a/lib/dijit/themes/soria/form/Button.css
+++ b/lib/dijit/themes/soria/form/Button.css
@@ -44,8 +44,8 @@
background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
opacity: 0.60;
}
-.dj_ie6 .soria .dijitReadOnly INPUT,
-.dj_ie7 .soria .dijitReadOnly INPUT,
+.dj_ie6 .soria .dijitReadOnly input,
+.dj_ie7 .soria .dijitReadOnly input,
.dj_ie6 .soria .dijitComboButtonDisabled .dijitButtonText,
.dj_ie7 .soria .dijitComboButtonDisabled .dijitButtonText {
/* opacity doesn't work on table node in IE, work around here */
diff --git a/lib/dijit/themes/soria/form/Common.css b/lib/dijit/themes/soria/form/Common.css
index 8e3688e82..42dfefa2e 100644
--- a/lib/dijit/themes/soria/form/Common.css
+++ b/lib/dijit/themes/soria/form/Common.css
@@ -10,7 +10,7 @@
dijit.form.ComboBox (partial)
****/
-.soria .dijitInputContainer INPUT,
+.soria .dijitInputContainer input,
.soria .dijitTextBox {
margin: 0 0.1em;
}
diff --git a/lib/dijit/themes/soria/images/tooltipConnectorRight.png b/lib/dijit/themes/soria/images/tooltipConnectorRight.png
index 64190eef7..3d62dcd40 100644
--- a/lib/dijit/themes/soria/images/tooltipConnectorRight.png
+++ b/lib/dijit/themes/soria/images/tooltipConnectorRight.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/Calendar.css b/lib/dijit/themes/tundra/Calendar.css
index 5fef68ee1..d650d4f57 100644
--- a/lib/dijit/themes/tundra/Calendar.css
+++ b/lib/dijit/themes/tundra/Calendar.css
@@ -120,10 +120,12 @@
margin:0;
padding:0.4em 0 0.25em 0;
text-align:center;
+ font-size: 1.17em;
}
.tundra .dijitCalendarSelectedYear {
/* label for selected year */
+ font-weight:bolder;
color:black;
padding:0.2em;
padding-bottom:0.1em;
@@ -156,4 +158,4 @@
.tundra .dijitCalendarMonthMenu .dijitCalendarMonthLabelHover {
background-color: #3559ac;
color:#fff;
-} \ No newline at end of file
+}
diff --git a/lib/dijit/themes/tundra/Common.css b/lib/dijit/themes/tundra/Common.css
index c339263e1..eb3e341f7 100644
--- a/lib/dijit/themes/tundra/Common.css
+++ b/lib/dijit/themes/tundra/Common.css
@@ -22,12 +22,13 @@
.tundra.dojoDndMove .dojoDndAvatarCanDrop .dojoDndAvatarHeader {background-color: #97e68d; background-image: url(images/dndMove.png); background-repeat: no-repeat; background-position: 2px center;}
.tundra.dojoDndCopy .dojoDndAvatarCanDrop .dojoDndAvatarHeader {background-color: #97e68d; background-image: url(images/dndCopy.png); background-repeat: no-repeat; background-position: 2px center;}
-.tundra .dijitContentPaneLoading {
+.tundra .dijitIconLoading {
background:url('images/loading.gif') no-repeat left center;
- padding-left:25px;
+ width: 24px;
+ height: 24px;
}
-
-.tundra .dijitContentPaneError {
+.tundra .dijitIconError {
background:url('images/warning.png') no-repeat left center;
- padding-left:25px;
+ width: 16px;
+ height: 16px;
}
diff --git a/lib/dijit/themes/tundra/Menu.css b/lib/dijit/themes/tundra/Menu.css
index 6229b1773..884bd490e 100644
--- a/lib/dijit/themes/tundra/Menu.css
+++ b/lib/dijit/themes/tundra/Menu.css
@@ -27,6 +27,7 @@
}
.tundra .dijitMenuPassive .dijitMenuItemHover,
+.tundra .dijitComboBoxMenu .dijitMenuItemHover,
.tundra .dijitMenuItemSelected {
background-color: #3559ac;
color:#fff;
diff --git a/lib/dijit/themes/tundra/form/Common.css b/lib/dijit/themes/tundra/form/Common.css
index 201368639..96899e138 100644
--- a/lib/dijit/themes/tundra/form/Common.css
+++ b/lib/dijit/themes/tundra/form/Common.css
@@ -10,7 +10,7 @@
dijit.form.ComboBox (partial)
****/
-.tundra .dijitInputContainer INPUT,
+.tundra .dijitInputContainer input,
.tundra .dijitTextBox {
margin: 0 0.1em;
}
diff --git a/lib/dijit/themes/tundra/images/checkmark.gif b/lib/dijit/themes/tundra/images/checkmark.gif
index ae6faa95a..ae6faa95a 100644..100755
--- a/lib/dijit/themes/tundra/images/checkmark.gif
+++ b/lib/dijit/themes/tundra/images/checkmark.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/checkmarkNoBorder.gif b/lib/dijit/themes/tundra/images/checkmarkNoBorder.gif
index 324bfb3cd..324bfb3cd 100644..100755
--- a/lib/dijit/themes/tundra/images/checkmarkNoBorder.gif
+++ b/lib/dijit/themes/tundra/images/checkmarkNoBorder.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/checkmarkNoBorder.png b/lib/dijit/themes/tundra/images/checkmarkNoBorder.png
index 9cec0c0aa..9cec0c0aa 100644..100755
--- a/lib/dijit/themes/tundra/images/checkmarkNoBorder.png
+++ b/lib/dijit/themes/tundra/images/checkmarkNoBorder.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/circleIcon.gif b/lib/dijit/themes/tundra/images/circleIcon.gif
index d582290a5..d582290a5 100644..100755
--- a/lib/dijit/themes/tundra/images/circleIcon.gif
+++ b/lib/dijit/themes/tundra/images/circleIcon.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/circleIcon.png b/lib/dijit/themes/tundra/images/circleIcon.png
index 6f059e61e..6f059e61e 100644..100755
--- a/lib/dijit/themes/tundra/images/circleIcon.png
+++ b/lib/dijit/themes/tundra/images/circleIcon.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/dojoTundraGradientBg.gif b/lib/dijit/themes/tundra/images/dojoTundraGradientBg.gif
index 0da12393b..0da12393b 100644..100755
--- a/lib/dijit/themes/tundra/images/dojoTundraGradientBg.gif
+++ b/lib/dijit/themes/tundra/images/dojoTundraGradientBg.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/i.gif b/lib/dijit/themes/tundra/images/i.gif
index ebd95a7aa..ebd95a7aa 100644..100755
--- a/lib/dijit/themes/tundra/images/i.gif
+++ b/lib/dijit/themes/tundra/images/i.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/i_half.gif b/lib/dijit/themes/tundra/images/i_half.gif
index 2947c4fa1..2947c4fa1 100644..100755
--- a/lib/dijit/themes/tundra/images/i_half.gif
+++ b/lib/dijit/themes/tundra/images/i_half.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/loading.gif b/lib/dijit/themes/tundra/images/loading.gif
index 6e7c8e5ec..6e7c8e5ec 100644..100755
--- a/lib/dijit/themes/tundra/images/loading.gif
+++ b/lib/dijit/themes/tundra/images/loading.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/noX.gif b/lib/dijit/themes/tundra/images/noX.gif
index 4a16dc795..4a16dc795 100644..100755
--- a/lib/dijit/themes/tundra/images/noX.gif
+++ b/lib/dijit/themes/tundra/images/noX.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/preciseSliderThumb.gif b/lib/dijit/themes/tundra/images/preciseSliderThumb.gif
index 15d4879cb..15d4879cb 100644..100755
--- a/lib/dijit/themes/tundra/images/preciseSliderThumb.gif
+++ b/lib/dijit/themes/tundra/images/preciseSliderThumb.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/sliderFullFocus.png b/lib/dijit/themes/tundra/images/sliderFullFocus.png
index ee193560d..ee193560d 100644..100755
--- a/lib/dijit/themes/tundra/images/sliderFullFocus.png
+++ b/lib/dijit/themes/tundra/images/sliderFullFocus.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/sliderFullVerticalFocus.png b/lib/dijit/themes/tundra/images/sliderFullVerticalFocus.png
index 3ab37e6cc..3ab37e6cc 100644..100755
--- a/lib/dijit/themes/tundra/images/sliderFullVerticalFocus.png
+++ b/lib/dijit/themes/tundra/images/sliderFullVerticalFocus.png
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/tabClose.gif b/lib/dijit/themes/tundra/images/tabClose.gif
index 2cb0ee1fa..2cb0ee1fa 100644..100755
--- a/lib/dijit/themes/tundra/images/tabClose.gif
+++ b/lib/dijit/themes/tundra/images/tabClose.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/tabCloseHover.gif b/lib/dijit/themes/tundra/images/tabCloseHover.gif
index f59471e6e..f59471e6e 100644..100755
--- a/lib/dijit/themes/tundra/images/tabCloseHover.gif
+++ b/lib/dijit/themes/tundra/images/tabCloseHover.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/tabHover.gif b/lib/dijit/themes/tundra/images/tabHover.gif
index 471e0eee2..471e0eee2 100644..100755
--- a/lib/dijit/themes/tundra/images/tabHover.gif
+++ b/lib/dijit/themes/tundra/images/tabHover.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/treeExpand_minus.gif b/lib/dijit/themes/tundra/images/treeExpand_minus.gif
index 597778237..597778237 100644..100755
--- a/lib/dijit/themes/tundra/images/treeExpand_minus.gif
+++ b/lib/dijit/themes/tundra/images/treeExpand_minus.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/treeExpand_plus.gif b/lib/dijit/themes/tundra/images/treeExpand_plus.gif
index 2b96a5552..2b96a5552 100644..100755
--- a/lib/dijit/themes/tundra/images/treeExpand_plus.gif
+++ b/lib/dijit/themes/tundra/images/treeExpand_plus.gif
Binary files differ
diff --git a/lib/dijit/themes/tundra/images/validationInputBg.gif b/lib/dijit/themes/tundra/images/validationInputBg.gif
index 5a9916a66..5a9916a66 100644..100755
--- a/lib/dijit/themes/tundra/images/validationInputBg.gif
+++ b/lib/dijit/themes/tundra/images/validationInputBg.gif
Binary files differ
diff --git a/lib/dijit/tree/ForestStoreModel.js b/lib/dijit/tree/ForestStoreModel.js
index 5e1b25efb..d0b895335 100644
--- a/lib/dijit/tree/ForestStoreModel.js
+++ b/lib/dijit/tree/ForestStoreModel.js
@@ -1,280 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.tree.ForestStoreModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree.ForestStoreModel"] = true;
-dojo.provide("dijit.tree.ForestStoreModel");
-dojo.require("dijit.tree.TreeStoreModel");
-
-
-dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.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: dojo.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?keywordArgs.scope:dojo.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(/* dojo.dnd.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(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);
- }
- }
- dijit.tree.TreeStoreModel.prototype.pasteItem.call(this, 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: dojo.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 ||
- dojo.some(oldChildren, function(item, idx){ return newChildren[idx] != item;})){
- this.onChildrenChange(this.root, newChildren);
- }
- })
- });
- },
-
- onNewItem: function(/* dojo.data.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(dojo.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);
- }
-
-});
-
-}
+//>>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
diff --git a/lib/dijit/tree/ForestStoreModel.js.uncompressed.js b/lib/dijit/tree/ForestStoreModel.js.uncompressed.js
new file mode 100644
index 000000000..3531b0d10
--- /dev/null
+++ b/lib/dijit/tree/ForestStoreModel.js.uncompressed.js
@@ -0,0 +1,285 @@
+define("dijit/tree/ForestStoreModel", [
+ "dojo/_base/array", // array.indexOf array.some
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.hitch
+ "dojo/_base/window", // win.global
+ "./TreeStoreModel"
+], function(array, declare, lang, win, TreeStoreModel){
+
+/*=====
+var TreeStoreModel = dijit.tree.TreeStoreModel;
+=====*/
+
+// module:
+// dijit/tree/ForestStoreModel
+// 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.
+
+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?keywordArgs.scope:win.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(/* dojo.dnd.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(/* dojo.dnd.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.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/TreeStoreModel.js b/lib/dijit/tree/TreeStoreModel.js
index 5164176b7..f61977c2f 100644
--- a/lib/dijit/tree/TreeStoreModel.js
+++ b/lib/dijit/tree/TreeStoreModel.js
@@ -1,381 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree.TreeStoreModel"] = true;
-dojo.provide("dijit.tree.TreeStoreModel");
-
-
-dojo.declare(
- "dijit.tree.TreeStoreModel",
- null,
- {
- // summary:
- // Implements dijit.Tree.model connecting to a store with a single
- // root item. Any methods passed into the constructor will override
- // the ones defined here.
-
- // store: dojo.data.Store
- // 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
-
- dojo.mixin(this, args);
-
- this.connects = [];
-
- var store = this.store;
- if(!store.getFeatures()['dojo.data.api.Identity']){
- throw new Error("dijit.Tree: 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([
- dojo.connect(store, "onNew", this, "onNewItem"),
- dojo.connect(store, "onDelete", this, "onDeleteItem"),
- dojo.connect(store, "onSet", this, "onSetItem")
- ]);
- }
- },
-
- destroy: function(){
- dojo.forEach(this.connects, dojo.disconnect);
- // 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: dojo.hitch(this, function(items){
- if(items.length != 1){
- throw new Error(this.declaredClass + ": query " + dojo.toJson(this.query) + " returned " + items.length +
- " items, but must return exactly one item");
- }
- 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 dojo.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 = dojo.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){
- dojo.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
- dojo.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(/* dojo.dnd.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.
- // 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){
- dojo.forEach(this.childrenAttrs, function(attr){
- if(store.containsValue(oldParentItem, attr, childItem)){
- if(!bCopy){
- var values = dojo.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(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
- // summary:
- // Callback to do notifications about new, updated, or deleted items.
- // tags:
- // callback
- },
-
- onDelete: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
- // 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, dojo.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 */ item,
- /* attribute-name-string */ attribute,
- /* object | array */ oldValue,
- /* object | array */ 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.
- // tags:
- // extension
-
- if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
- // item's children list changed
- this.getChildren(item, dojo.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);
- }
- }
- });
-
-}
+//>>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
diff --git a/lib/dijit/tree/TreeStoreModel.js.uncompressed.js b/lib/dijit/tree/TreeStoreModel.js.uncompressed.js
new file mode 100644
index 000000000..4e8087c27
--- /dev/null
+++ b/lib/dijit/tree/TreeStoreModel.js.uncompressed.js
@@ -0,0 +1,383 @@
+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/json", // json.stringify
+ "dojo/_base/lang" // lang.hitch
+], function(array, aspect, declare, json, lang){
+
+ // module:
+ // dijit/tree/TreeStoreModel
+ // summary:
+ // Implements dijit.Tree.model connecting to a dojo.data store with a single
+ // root item.
+
+ 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.Store
+ // 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: 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(this.declaredClass + ": query " + json.stringify(this.query) + " returned " + items.length +
+ " items, but must return exactly one item");
+ }
+ 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(/* dojo.dnd.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.
+ // 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 9ee8e32ba..f361278c1 100644
--- a/lib/dijit/tree/_dndContainer.js
+++ b/lib/dijit/tree/_dndContainer.js
@@ -1,187 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.tree._dndContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree._dndContainer"] = true;
-dojo.provide("dijit.tree._dndContainer");
-dojo.require("dojo.dnd.common");
-dojo.require("dojo.dnd.Container");
-
-
-dojo.getObject("tree", true, dojo);
-
-dijit.tree._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");
- }
-};
-
-dojo.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: dijit.tree.__SourceArgs
- // 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
- dojo.mixin(this, params);
-
- // class-specific variables
- this.map = {};
- this.current = null; // current TreeNode's DOM node
-
- // states
- this.containerState = "";
- dojo.addClass(this.node, "dojoDndContainer");
-
- // set up events
- this.events = [
- // container level events
- dojo.connect(this.node, "onmouseenter", this, "onOverEvent"),
- dojo.connect(this.node, "onmouseleave", this, "onOutEvent"),
-
- // switching between TreeNodes
- dojo.connect(this.tree, "_onNodeMouseEnter", this, "onMouseOver"),
- dojo.connect(this.tree, "_onNodeMouseLeave", this, "onMouseOut"),
-
- // cancel text selection and text dragging
- dojo.connect(this.node, "ondragstart", dojo, "stopEvent"),
- dojo.connect(this.node, "onselectstart", dojo, "stopEvent")
- ];
- },
-
- getItem: function(/*String*/ key){
- // summary:
- // Returns the dojo.dnd.Item (representing a dragged node) by it's key (id).
- // Called by dojo.dnd.Source.checkAcceptance().
- // tags:
- // protected
-
- var widget = this.selection[key],
- ret = {
- data: widget,
- type: ["treeNode"]
- };
-
- return ret; // dojo.dnd.Item
- },
-
- destroy: function(){
- // summary:
- // Prepares this object to be garbage-collected
-
- dojo.forEach(this.events, dojo.disconnect);
- // this.clearItems();
- this.node = this.parent = null;
- },
-
- // mouse events
- onMouseOver: function(/*TreeNode*/ widget, /*Event*/ evt){
- // summary:
- // Called when mouse is moved over a TreeNode
- // tags:
- // protected
- this.current = widget;
- },
-
- onMouseOut: function(/*TreeNode*/ widget, /*Event*/ evt){
- // summary:
- // Called when mouse is moved away from a TreeNode
- // 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";
- //dojo.replaceClass(this.node, prefix + newState, prefix + this[state]);
- dojo.replaceClass(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
- dojo.addClass(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
- dojo.removeClass(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", "");
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/tree/_dndContainer.js.uncompressed.js b/lib/dijit/tree/_dndContainer.js.uncompressed.js
new file mode 100644
index 000000000..8f457e6d5
--- /dev/null
+++ b/lib/dijit/tree/_dndContainer.js.uncompressed.js
@@ -0,0 +1,150 @@
+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.getObject lang.mixin lang.hitch
+ "dojo/mouse", // mouse.enter, mouse.leave
+ "dojo/on"
+], function(aspect, declare, domClass, event, lang, mouse, on){
+
+ // module:
+ // dijit/tree/_dndContainer
+ // 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`.
+
+ 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: dijit.tree.__SourceArgs
+ // 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 = [
+ // container level events
+ on(this.node, mouse.enter, lang.hitch(this, "onOverEvent")),
+ on(this.node, mouse.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 5f9310e71..f0567444f 100644
--- a/lib/dijit/tree/_dndSelector.js
+++ b/lib/dijit/tree/_dndSelector.js
@@ -1,287 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.tree._dndSelector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree._dndSelector"] = true;
-dojo.provide("dijit.tree._dndSelector");
-dojo.require("dojo.dnd.common");
-dojo.require("dijit.tree._dndContainer");
-
-
-dojo.declare("dijit.tree._dndSelector",
- dijit.tree._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: Hash<String, DomNode>
- // (id, DomNode) map for every TreeNode that's currently selected.
- // The DOMNode is the TreeNode.rowNode.
- selection: {},
- =====*/
-
- constructor: function(tree, params){
- // summary:
- // Initialization
- // tags:
- // private
-
- this.selection={};
- this.anchor = null;
-
- dijit.setWaiState(this.tree.domNode, "multiselect", !this.singular);
-
- this.events.push(
- dojo.connect(this.tree.domNode, "onmousedown", this,"onMouseDown"),
- dojo.connect(this.tree.domNode, "onmouseup", this,"onMouseUp"),
- dojo.connect(this.tree.domNode, "onmousemove", 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._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._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._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._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();
- dojo.forEach(this._setDifference(oldSelection, newSelection), dojo.hitch(this, function(node){
- node.setSelected(false);
- if(this.anchor == node){
- delete this.anchor;
- }
- delete this.selection[node.id];
- }));
- dojo.forEach(this._setDifference(newSelection, oldSelection), dojo.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.
-
- dojo.forEach(ys, function(y){ y.__exclude__ = true; });
- var ret = dojo.filter(xs, function(x){ return !x.__exclude__; });
-
- // clean up after ourselves.
- dojo.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 = [];
- dojo.forEach(selected, function(node) {
- nodes.push(node);
- paths.push(node.getTreePath());
- });
- var items = dojo.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);
- },
- // mouse events
- onMouseDown: function(e){
- // summary:
- // Event processor for onmousedown
- // e: Event
- // mouse event
- // tags:
- // protected
-
- // ignore click on expando node
- if(!this.current || this.tree.isExpandoNode( e.target, this.current)){ return; }
-
- if(e.button == dojo.mouseButtons.RIGHT){ return; } // ignore right-click
-
- dojo.stopEvent(e);
-
- var treeNode = this.current,
- copy = dojo.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
- // e: Event
- // mouse 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, dojo.isCopyKey( e ), e.shiftKey);
- },
- onMouseMove: function(e){
- // summary
- // event processor for onmousemove
- // e: Event
- // mouse event
- this._doDeselect = false;
- },
-
- 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 = dijit.tree._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;
- }
- 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;
- }
- }
- }
- },
-
- forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
- // summary:
- // Iterates over selected items;
- // see `dojo.dnd.Container.forInItems()` for details
- o = o || dojo.global;
- for(var id in this.selection){
- // console.log("selected item id: " + id);
- f.call(o, this.getItem(id), id, this);
- }
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/tree/_dndSelector.js.uncompressed.js b/lib/dijit/tree/_dndSelector.js.uncompressed.js
new file mode 100644
index 000000000..133ef1924
--- /dev/null
+++ b/lib/dijit/tree/_dndSelector.js.uncompressed.js
@@ -0,0 +1,326 @@
+define("dijit/tree/_dndSelector", [
+ "dojo/_base/array", // array.filter array.forEach array.map
+ "dojo/_base/connect", // connect.isCopyKey
+ "dojo/_base/declare", // declare
+ "dojo/_base/lang", // lang.hitch
+ "dojo/mouse", // mouse.isLeft
+ "dojo/on",
+ "dojo/touch",
+ "dojo/_base/window", // win.global
+ "./_dndContainer"
+], function(array, connect, declare, lang, mouse, on, touch, win, _dndContainer){
+
+ // module:
+ // dijit/tree/_dndSelector
+ // 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`.
+
+
+ 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: Hash<String, DomNode>
+ // (id, 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;
+
+ this.tree.domNode.setAttribute("aria-multiselect", !this.singular);
+
+ 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._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._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._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._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 = [];
+ array.forEach(selected, function(node){
+ nodes.push(node);
+ paths.push(node.getTreePath());
+ });
+ 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);
+ },
+ // 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)){ return; } // ignore right-click
+
+ e.preventDefault();
+
+ 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.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.Item
+ },
+
+ forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
+ // summary:
+ // Iterates over selected items;
+ // see `dojo.dnd.Container.forInItems()` for details
+ o = o || win.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 4fc4660cc..a68af56c4 100644
--- a/lib/dijit/tree/dndSource.js
+++ b/lib/dijit/tree/dndSource.js
@@ -1,544 +1,2 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit.tree.dndSource"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.tree.dndSource"] = true;
-dojo.provide("dijit.tree.dndSource");
-dojo.require("dijit.tree._dndSelector");
-dojo.require("dojo.dnd.Manager");
-
-
-/*=====
-dijit.tree.__SourceArgs = function(){
- // 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
- this.isSource = isSource;
- this.accept = accept;
- this.autoSync = autoSync;
- this.copyOnly = copyOnly;
- this.dragThreshold = dragThreshold;
- this.betweenThreshold = betweenThreshold;
-}
-=====*/
-
-dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, {
- // summary:
- // Handles drag and drop operations (as a source or a target) for `dijit.Tree`
-
- // isSource: [private] 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,
-
- constructor: function(/*dijit.Tree*/ tree, /*dijit.tree.__SourceArgs*/ params){
- // summary:
- // a constructor of the Tree DnD Source
- // tags:
- // private
- if(!params){ params = {}; }
- dojo.mixin(this, params);
- this.isSource = typeof params.isSource == "undefined" ? true : params.isSource;
- 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){
- dojo.addClass(this.node, "dojoDndSource");
- }
- this.targetState = "";
- if(this.accept){
- dojo.addClass(this.node, "dojoDndTarget");
- }
-
- // set up events
- this.topics = [
- dojo.subscribe("/dnd/source/over", this, "onDndSourceOver"),
- dojo.subscribe("/dnd/start", this, "onDndStart"),
- dojo.subscribe("/dnd/drop", this, "onDndDrop"),
- dojo.subscribe("/dnd/cancel", 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("destroy",arguments);
- dojo.forEach(this.topics, dojo.unsubscribe);
- this.targetAnchor = null;
- },
-
- _onDragMouse: function(e){
- // summary:
- // Helper method for processing onmousemove/onmouseover events while drag is in progress.
- // Keeps track of current drop target.
-
- var m = dojo.dnd.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 = dojo.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(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 if(m.source == this && (newTarget.id in this.selection)){
- // Guard against dropping onto yourself (TODO: guard against dropping onto your descendant, #7140)
- 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 events over the Tree
- // e: Event
- // onmousemouse event
- // tags:
- // private
- if(this.isDragging && this.targetState == "Disabled"){ return; }
- this.inherited(arguments);
- var m = dojo.dnd.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 = dojo.map(nodes, function(n){return n.domNode});
- m.startDrag(this, nodes, this.copyState(dojo.isCopyKey(e)));
- }
- }
- }
- },
-
- onMouseDown: function(e){
- // summary:
- // Event processor for onmousedown
- // e: Event
- // onmousedown 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
- // e: Event
- // onmouseup 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 = dojo.dnd.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){
- dojo.dnd.manager().overSource(this);
- }
-
- this.isDragging = true;
- },
-
- itemCreator: function(/*DomNode[]*/ nodes, target, /*dojo.dnd.Source*/ 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.
- // 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
-
- // TODO: for 2.0 refactor so itemCreator() is called once per drag node, and
- // make signature itemCreator(sourceItem, node, target) (or similar).
-
- return dojo.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,
- requeryRoot = false; // set to true iff top level items change
-
- this.isDragging = false;
-
- // Compute the new parent item
- var targetWidget = target;
- var newParentItem;
- var insertIndex;
- newParentItem = (targetWidget && targetWidget.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 = (targetWidget.getParent() && targetWidget.getParent().item) || tree.item;
- // Compute the insert index for reordering
- insertIndex = targetWidget.getIndexInParent();
- if(this.dropPosition == "After"){
- insertIndex = targetWidget.getIndexInParent() + 1;
- }
- }else{
- newParentItem = (targetWidget && targetWidget.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;
-
- dojo.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(dojo.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);
- }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);
- }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);
- }
- }, 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(targetWidget);
- }
- 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);
- dojo.dnd.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 = dojo.dnd.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");
- }
-});
-
-}
+//>>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
diff --git a/lib/dijit/tree/dndSource.js.uncompressed.js b/lib/dijit/tree/dndSource.js.uncompressed.js
new file mode 100644
index 000000000..d161e369f
--- /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`
+
+/*=====
+dijit.tree.__SourceArgs = function(){
+ // 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
+ this.isSource = isSource;
+ this.accept = accept;
+ this.autoSync = autoSync;
+ this.copyOnly = copyOnly;
+ this.dragThreshold = dragThreshold;
+ this.betweenThreshold = betweenThreshold;
+}
+=====*/
+
+return declare("dijit.tree.dndSource", _dndSelector, {
+ // summary:
+ // Handles drag and drop operations (as a source or a target) for `dijit.Tree`
+
+ // isSource: [private] 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,
+
+ constructor: function(/*dijit.Tree*/ tree, /*dijit.tree.__SourceArgs*/ params){
+ // summary:
+ // a constructor of the Tree DnD Source
+ // tags:
+ // private
+ if(!params){ params = {}; }
+ lang.mixin(this, params);
+ this.isSource = typeof params.isSource == "undefined" ? true : params.isSource;
+ 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){
+ // summary:
+ // Helper method for processing onmousemove/onmouseover events while drag is in progress.
+ // Keeps track of current drop target.
+
+ 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(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 model = this.tree.model,
+ 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)));
+ }
+ }
+ }
+ },
+
+ 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: 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
+
+ // 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;
+ 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;
+ }
+ }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);
+ }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);
+ }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);
+ }
+ }, 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");
+ }
+});
+
+});
diff --git a/lib/dijit/tree/model.js b/lib/dijit/tree/model.js
index 46b27c676..5add44298 100644
--- a/lib/dijit/tree/model.js
+++ b/lib/dijit/tree/model.js
@@ -1,135 +1 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-
-
-dojo.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(/*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
- },
-
- getChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){
- // summary:
- // Calls onComplete() with array of child items of given parent item, all loaded.
- // Throws exception on error.
- // tags:
- // extension
- },
-
- // =======================================================================
- // Inspecting items
-
- isItem: function(/* anything */ 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(/* object */ 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 */ item){
- // summary:
- // Returns identity for an item
- // tags:
- // extension
- },
-
- getLabel: function(/*dojo.data.Item*/ item){
- // summary:
- // Get the label for an item
- // tags:
- // extension
- },
-
- // =======================================================================
- // Write interface
-
- newItem: function(/* dojo.dnd.Item */ args, /*Item*/ parent, /*int?*/ insertIndex){
- // summary:
- // Creates a new item. See `dojo.data.api.Write` for details on args.
- // tags:
- // extension
- },
-
- pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
- // 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.
- // tags:
- // extension
- },
-
- // =======================================================================
- // 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(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
- // summary:
- // Callback to do notifications about new, updated, or deleted items.
- // tags:
- // callback
- }
-});
-
+//>>built
diff --git a/lib/dijit/tree/model.js.uncompressed.js b/lib/dijit/tree/model.js.uncompressed.js
new file mode 100644
index 000000000..9345825e2
--- /dev/null
+++ b/lib/dijit/tree/model.js.uncompressed.js
@@ -0,0 +1,142 @@
+
+/*=====
+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){
+ // summary:
+ // Creates a new item. See `dojo.data.api.Write` for details on args.
+ // args: dojo.dnd.Item
+ // parent: Item
+ // insertIndex: int?
+ // tags:
+ // extension
+ },
+
+ pasteItem: function(childItem, oldParentItem, newParentItem, bCopy){
+ // 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
+ // 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
new file mode 100644
index 000000000..a2a017f48
--- /dev/null
+++ b/lib/dijit/typematic.js
@@ -0,0 +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
diff --git a/lib/dijit/typematic.js.uncompressed.js b/lib/dijit/typematic.js.uncompressed.js
new file mode 100644
index 000000000..5dc27a32c
--- /dev/null
+++ b/lib/dijit/typematic.js.uncompressed.js
@@ -0,0 +1,206 @@
+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/_base/sniff", // has("ie")
+ "." // setting dijit.typematic global
+], function(array, connect, event, kernel, lang, on, has, dijit){
+
+// module:
+// 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.
+
+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 (optional):
+ // 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 (optional):
+ // the number of milliseconds until the 2nd event occurs, default=500ms
+ // minDelay (optional):
+ // 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._evt = evt;
+ this._node = node;
+ this._currentTimeout = -1;
+ this._count = -1;
+ this._callback = lang.hitch(_this, callback);
+ this._fireEventAndReload();
+ this._evt = lang.mixin({faux: true}, evt);
+ }
+ },
+
+ 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){
+ event.stop(evt);
+ typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay);
+ })),
+ on(node, "mouseup", lang.hitch(this, function(evt){
+ if(this._obj){
+ event.stop(evt);
+ }
+ typematic.stop();
+ })),
+ on(node, "mouseout", lang.hitch(this, function(evt){
+ event.stop(evt);
+ typematic.stop();
+ })),
+ on(node, "mousemove", lang.hitch(this, function(evt){
+ evt.preventDefault();
+ })),
+ on(node, "dblclick", lang.hitch(this, function(evt){
+ event.stop(evt);
+ if(has("ie")){
+ 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;
+
+});